首页 > 解决方案 > 使用错误的 Localizable.string

问题描述

我有一个默认语言(英语)的 iOS 应用程序。它还具有法语本地化功能,并且可以按预期在两种语言中运行。

这是我遇到的问题:将设备设置为英语以外的语言(默认)或提供本地化的语言(例如将设备设置为日语)时;该应用程序未按预期使用默认语言。但它保留了应用程序使用的最后一种语言。这是为什么?我该如何解决?

我发现了一些类似问题的帖子,但提出的解决方案对我不起作用。例如这个,问题与我的相似。

我使用的是 Xcode 11.1 版和 iOS 12.4.2 版。

标签: iosswiftxcodelocalization

解决方案


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

我希望它能解决你的问题!


推荐阅读