如何在应用程序内部以编程方式更改语言和更新内容,而不是通过电话?IOS swift 4

如何在应用程序内部以编程方式更改语言和更新内容,而不是通过电话?IOS swift 4,ios,swift,nslocalizedstring,Ios,Swift,Nslocalizedstring,我正在尝试建立一个应用程序,用户可以从中选择语言,我想改变整个应用程序的内容。例如,我有两个标签和两种语言英语和德语。两个可本地化文件(en,de)。在我的屏幕上,用户按turn to german,我想更改应用程序的语言,并想更新UI,但我不想让用户关闭应用程序。我在这里找到了一些解决方案,但结果不是这样 还有这个 extension String { func localized() -> String { return NSLocalizedString(self, tabl

我正在尝试建立一个应用程序,用户可以从中选择语言,我想改变整个应用程序的内容。例如,我有两个标签和两种语言英语和德语。两个可本地化文件(en,de)。在我的屏幕上,用户按turn to german,我想更改应用程序的语言,并想更新UI,但我不想让用户关闭应用程序。我在这里找到了一些解决方案,但结果不是这样

还有这个

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
中设置一个自定义键,确定希望使用的语言,然后在下次启动应用程序时加载相应的捆绑包

如果要更改应用程序内部的本地化(动态),则需要从表示该
区域设置的
包中手动查找表。只需查找扩展名为
.lproj
的文件,并使用获取的路径重新创建另一个
捆绑包
,然后查询生成的
捆绑包
,查找本地化字符串

let locale=locale(标识符:“en”);
guard let path=Bundle.main.path(forResource:locale.identifier,of type:“lproj”)
else{return};
让localizedBundle=Bundle(路径:path)
localizedBundle.localizedString(forKey:_,value:_,table:_)//您可以在表中传递NULL以查看“Localizable.strings”
当然,在更改区域设置后,还需要更新所有当前配置的文本


我编写了一个名为的库,可以帮助您处理该部分(还有插值、颜色/字体与设备字体系统的同步)

NSLocalizedString
将查找适用于应用程序的本地化表,该表由设备或
用户默认值决定。您可以在
UserDefaults
中设置一个自定义键,确定希望使用的语言,然后在下次启动应用程序时加载相应的捆绑包

如果要更改应用程序内部的本地化(动态),则需要从表示该
区域设置的
包中手动查找表。只需查找扩展名为
.lproj
的文件,并使用获取的路径重新创建另一个
捆绑包
,然后查询生成的
捆绑包
,查找本地化字符串

let locale=locale(标识符:“en”);
guard let path=Bundle.main.path(forResource:locale.identifier,of type:“lproj”)
else{return};
让localizedBundle=Bundle(路径:path)
localizedBundle.localizedString(forKey:_,value:_,table:_)//您可以在表中传递NULL以查看“Localizable.strings”
当然,在更改区域设置后,还需要更新所有当前配置的文本

我编写了一个名为的库,可以帮助您处理该部分(还有插值、颜色/字体与设备字体系统的同步)

@IBAction func englishAction(_ sender: Any) {
    let  localisedSt = "en".localized()
    Bundle.setLanguage(lang: "en")
}