43 lines
1.6 KiB
Swift
43 lines
1.6 KiB
Swift
import Foundation
|
|
import ObjectiveC
|
|
|
|
private var screenshotLocalizationBundleKey: UInt8 = 0
|
|
|
|
private final class ScreenshotBundle: Bundle, @unchecked Sendable {
|
|
override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
|
|
if let bundle = objc_getAssociatedObject(self, &screenshotLocalizationBundleKey) as? Bundle {
|
|
return bundle.localizedString(forKey: key, value: value, table: tableName)
|
|
}
|
|
return super.localizedString(forKey: key, value: value, table: tableName)
|
|
}
|
|
}
|
|
|
|
public enum ScreenshotLocalization {
|
|
public static func applyIfNeeded() {
|
|
let environment = ProcessInfo.processInfo.environment
|
|
guard let language = environment["SCREENSHOT_LANGUAGE"]?
|
|
.trimmingCharacters(in: .whitespacesAndNewlines),
|
|
!language.isEmpty
|
|
else {
|
|
return
|
|
}
|
|
UserDefaults.standard.set([language], forKey: "AppleLanguages")
|
|
if let locale = environment["SCREENSHOT_LOCALE"]?
|
|
.trimmingCharacters(in: .whitespacesAndNewlines),
|
|
!locale.isEmpty
|
|
{
|
|
UserDefaults.standard.set(locale, forKey: "AppleLocale")
|
|
}
|
|
if let path = Bundle.main.path(forResource: language, ofType: "lproj"),
|
|
let localizedBundle = Bundle(path: path)
|
|
{
|
|
objc_setAssociatedObject(Bundle.main, &screenshotLocalizationBundleKey, localizedBundle, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
|
|
object_setClass(Bundle.main, ScreenshotBundle.self)
|
|
}
|
|
}
|
|
}
|
|
|
|
private let _screenshotLocalizationApplied: Void = {
|
|
ScreenshotLocalization.applyIfNeeded()
|
|
}()
|