ios - 使用错误的 Localizable.string
问题描述
我有一个默认语言(英语)的 iOS 应用程序。它还具有法语本地化功能,并且可以按预期在两种语言中运行。
这是我遇到的问题:将设备设置为英语以外的语言(默认)或提供本地化的语言(例如将设备设置为日语)时;该应用程序未按预期使用默认语言。但它保留了应用程序使用的最后一种语言。这是为什么?我该如何解决?
我发现了一些类似问题的帖子,但提出的解决方案对我不起作用。例如这个,问题与我的相似。
我使用的是 Xcode 11.1 版和 iOS 12.4.2 版。
解决方案
iOS 将有一个基于先前选择的语言的首选语言顺序列表。
因此,如果您从英语更改为未映射的语言(例如 ko),则应用程序将具有 AppleLanguages 数组:
[ko-(ZoneCode), en-(ZoneCode)]。
您可以使用以下代码避免此过程:
let defaultCultureCode: String = "en"
let defaults = UserDefaults.standard
let currentAppleLanguages = defaults.stringArray(forKey: "AppleLanguages")
if let currentLanguages = currentAppleLanguages {
if(!currentLanguages.isEmpty && !(currentLanguages.first?.contains(["en", "fr"]))!) {
defaults.removeObject(forKey: "AppleLanguages")
defaults.set([defaultCultureCode], forKey: "AppleLanguages")
defaults.synchronize()
}
}
我使用这个字符串扩展来检查当前语言是否包含可用语言:
extension String {
public func contains(_ elements: [String]) -> Bool {
var haveElementOnString = false
if elements.count == 0 { return false }
else { elements.forEach{ element in haveElementOnString = haveElementOnString || self.contains(element)} }
return haveElementOnString
}
}
下一步由您来定义最佳策略。
在我的应用程序上下文中,默认情况下它总是被定义为英语,因为它是唯一可用的 .strings 文件。将下载所有其他受支持的字符串,然后将向用户显示一条消息,警告新语言可用并将在下次应用。
StackOverflow 上有很多关于 bundle.localizedStringForKey 或 NSLocalizedString 的信息,可以帮助您找到满足您需求的最佳解决方案。
此外,这只是对当前语言环境和默认语言的验证和更新。这不包括区域部分(例如 ko-KR (KR))。
我发现了一篇关于这个主题的有趣文本,它可能很有用 How not to do localisation。
我希望它能解决你的问题!
推荐阅读
- java - 当测试用例在for循环中执行时,如何使用testNG获取测试用例描述/测试用例名称
- java - FirebaseUI 填充 ListView 文本未显示
- c# - 在 IIS 中执行相同代码的时间比在桌面应用程序中要长
- angularjs - 最初选中的复选框值未在 AngularJS 中的控制器中传递
- asp.net - 将 on-promise 数据库连接到 ASP.NET
- mysql - 如何使用 Codeigniter Rest Api 将多行插入 mysql
- ios - Alamofire:向 unicode 字符添加额外的正斜杠
- php - 使用 php include_once 函数后 AngularJs 将无法工作
- django - 在这种情况下,如何设置uwsgi.ini?
- python - 无法让 Pyramid 识别 Mongo