问题描述
大家好,我想以本机解决方案的方式向我的应用添加多语言。我的问题是我做了所有事情,但仍然无法从文件中读取本地化的字符串。
首先,我将Project Localize.string文件添加到我的项目中。
其次,我在项目/基本代码/中添加了第二种语言 还有我的Localized.String文件
有我的扩展名
extension String {
func localized() -> String {
if let _ = UserDefaults.standard.string(forKey: "lang") {} else {
UserDefaults.standard.setValue("en",forKey: "lang")
UserDefaults.standard.synchronize()
}
let lang = UserDefaults.standard.string(forKey: "lang")
let path = Bundle.main.path(forResource: lang,ofType: "lproj")
let bundle = Bundle(path: path!)
return NSLocalizedString(self,tableName: nil,bundle: bundle!,value: "",comment: "")
}}
我尝试使用label.text =“ language” .localized()
但是我的标签输出是“语言”。我也清理了派生数据。但我找不到解决方法
解决方法
1。功能实现的改变
func localized() -> String
的最简单实现就像
func localized() -> String {
return Bundle.main.localizedString(forKey: self,value: nil,table: "Localize") <-- the .strings file name from which you expect your localized value
}
如果计划有多个.strings
资源文件,则可能需要将文件名作为参数传递给该函数。
如果要使用名称为Localizable.strings
的单个资源文件,请改用以下定义。
func localized() -> String {
return NSLocalizedString(self,comment: "") <-- Picks up localized version from `Localizable.strings`
}
由于这是文件I / O操作,因此在获取本地化值时,可以避免每次访问UserDefaults
并将其保存为调用synchronize()
。我也不明白它的用处。
2。在启动选项中将土耳其语作为应用程序语言传递,以查看模拟器上的本地化操作。
在Silutor上运行时,您可能需要从启动选项中将土耳其语作为应用程序语言传递。选择您的Scheme
-> Edit Scheme