如何在应用程序内更改语言和更新内容,而不是从手机上更改?IOS swift 4

问题描述 投票:1回答:1

我正在尝试建立一个应用程序,用户可以选择语言,我想改变整个应用程序的内容,例如,我有两个标签和两种语言英语和德语。例如,我有两个标签和两种语言英语和德语,两个可本地化的文件(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")
}

在这之后,我尝试重新加载应用程序,重新加载视图,但没有任何变化。

ios swift nslocalizedstring
1个回答
0
投票

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与设备字体系统的同步)。

© www.soinside.com 2019 - 2024. All rights reserved.