swift 中本地化文件的动态变化
Dynamic change of localization file in swift
我在我的应用程序中使用德语,有两种称呼人的方式“Du”和“Sie”。我想在将使用“Du”的项目中添加另一个可本地化的文件。基本上,我想知道是否有可能以某种方式检查是否选择了德语和“Du”地址,如果是,使用“Du”本地化文件?现在项目中只存在“Sie”文件,并从中获取本地化。
找到了此处描述的此问题的解决方案:Forcing iOS localization at runtime。不过重点是Bundle.swizzleLocalization()
在main.swift
文件中应该叫
if Locale.current.languageCode == "de" {
let appConfig = ApplicationConfiguration()
if appConfig.germanLanguageType == "du" {
Bundle.swizzleLocalization()
}
}
因此,在 main.swift 文件中,我检查了设备的首选语言,如果是德语,我检查了我的 appConfig.swift
文件,其中指定了“du”还是“sie”寻址在应用程序中使用,如果它是“du”,我调用 Bundle.swizzleLocalization()
在 Bundle 的扩展中,我只是调整了应该使用的本地化文件的路径(之前在项目中添加)
extension Bundle {
static func swizzleLocalization() {
let orginalSelector = #selector(localizedString(forKey:value:table:))
guard let orginalMethod = class_getInstanceMethod(self, orginalSelector) else { return }
let mySelector = #selector(myLocaLizedString(forKey:value:table:))
guard let myMethod = class_getInstanceMethod(self, mySelector) else { return }
if class_addMethod(self, orginalSelector, method_getImplementation(myMethod), method_getTypeEncoding(myMethod)) {
class_replaceMethod(self, mySelector, method_getImplementation(orginalMethod), method_getTypeEncoding(orginalMethod))
} else {
method_exchangeImplementations(orginalMethod, myMethod)
}
}
@objc func myLocaLizedString(forKey key: String,value: String?, table: String?) -> String {
guard let bundlePath = Bundle.main.path(forResource: "de-DE", ofType: "lproj"),
let bundle = Bundle(path: bundlePath) else {
return Bundle.main.myLocaLizedString(forKey: key, value: value, table: table)
}
return bundle.myLocaLizedString(forKey: key, value: value, table: table)
}
}
我在我的应用程序中使用德语,有两种称呼人的方式“Du”和“Sie”。我想在将使用“Du”的项目中添加另一个可本地化的文件。基本上,我想知道是否有可能以某种方式检查是否选择了德语和“Du”地址,如果是,使用“Du”本地化文件?现在项目中只存在“Sie”文件,并从中获取本地化。
找到了此处描述的此问题的解决方案:Forcing iOS localization at runtime。不过重点是Bundle.swizzleLocalization()
在main.swift
文件中应该叫
if Locale.current.languageCode == "de" {
let appConfig = ApplicationConfiguration()
if appConfig.germanLanguageType == "du" {
Bundle.swizzleLocalization()
}
}
因此,在 main.swift 文件中,我检查了设备的首选语言,如果是德语,我检查了我的 appConfig.swift
文件,其中指定了“du”还是“sie”寻址在应用程序中使用,如果它是“du”,我调用 Bundle.swizzleLocalization()
在 Bundle 的扩展中,我只是调整了应该使用的本地化文件的路径(之前在项目中添加)
extension Bundle {
static func swizzleLocalization() {
let orginalSelector = #selector(localizedString(forKey:value:table:))
guard let orginalMethod = class_getInstanceMethod(self, orginalSelector) else { return }
let mySelector = #selector(myLocaLizedString(forKey:value:table:))
guard let myMethod = class_getInstanceMethod(self, mySelector) else { return }
if class_addMethod(self, orginalSelector, method_getImplementation(myMethod), method_getTypeEncoding(myMethod)) {
class_replaceMethod(self, mySelector, method_getImplementation(orginalMethod), method_getTypeEncoding(orginalMethod))
} else {
method_exchangeImplementations(orginalMethod, myMethod)
}
}
@objc func myLocaLizedString(forKey key: String,value: String?, table: String?) -> String {
guard let bundlePath = Bundle.main.path(forResource: "de-DE", ofType: "lproj"),
let bundle = Bundle(path: bundlePath) else {
return Bundle.main.myLocaLizedString(forKey: key, value: value, table: table)
}
return bundle.myLocaLizedString(forKey: key, value: value, table: table)
}
}