我正在尝试建立一个应用程序,用户可以选择语言,我想改变整个应用程序的内容,例如,我有两个标签和两种语言英语和德语。例如,我有两个标签和两种语言英语和德语,两个可本地化的文件(en ,de)。我在这里找到了一些解决方法,但没有成功。类似问题
extension Bundle {
private static var bundle: Bundle!
public static func localizedBundle() -> Bundle! {
if bundle == nil {
let appLang = UserDefaults.standard.string(forKey: "app_lang") ?? "ru"
let path = Bundle.main.path(forResource: appLang, ofType: "lproj")
bundle = Bundle(path: path!)
}
return bundle;
}
public static func setLanguage(lang: String) {
UserDefaults.standard.set(lang, forKey: "app_lang")
let path = Bundle.main.path(forResource: lang, ofType: "lproj")
bundle = Bundle(path: path!)
}}
而这
extension String {
func localized() -> String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.localizedBundle(), value: "", comment: "")
}
func localizeWithFormat(arguments: CVarArg...) -> String{
return String(format: self.localized(), arguments: arguments)
}}
并使用它像
@IBAction func englishAction(_ sender: Any) {
let localisedSt = "en".localized()
Bundle.setLanguage(lang: "en")
}
在这之后,我尝试重新加载应用程序,重新加载视图,但没有任何变化。
NSLocalizedString
将在本地化表中查找适合应用程序的本地化表,这是由设备或设备决定的 UserDefaults
. 有一个自定义的密钥,你可以设置在 UserDefaults
并确定您希望使用的语言,然后在下一次启动应用程序时,它将加载适当的捆绑包。
如果你想改变本地化 里面 在应用程序中(在飞行中),你需要手动查找表从 Bundle
代表着 Locale
. 只需查找文件的扩展名 .lproj
再创 Bundle
与获取的路径,以及生成的查询 Bundle
为本地化的字符串。
let locale = Locale(identifier: "en");
guard let path = Bundle.main.path(forResource: locale.identifier, ofType: "lproj")
else { return };
let localizedBundle = Bundle(path: path)
localizedBundle.localizedString(forKey:_, value:_, table:_) // you can pass NULL in table to look into "Localizable.strings"
但当然,在改变了本地化后,你还需要更新所有当前配置的文本。
我写了一个名为 造型 可以帮助你解决这部分问题(还有插值,ColorFont与设备字体系统的同步)。