获取 MacOS 使用的 "real" 语言环境

Getting "real" locale used by MacOS

我制作了一个 MacOS 应用程序,用户可以在应用程序中 select 使用他想要的语言。

要在按钮中设置本地化标题,我这样做:

NSLocalizedString("CONTEXT_MENU_OPT_QUIT", bundle: myClass.localeBundle, comment: "Context menu option");

我 运行 这段代码在 start-up 设置 localeBundle:

    func getLocale() -> String {
        let availableLanguages: [String] = Bundle.main.localizations;
        var locale: String = userDefaults!.string(forKey: "locale") ?? "";

        if (locale.isEmpty) {
            let preferredLocale: String = Locale.preferredLanguages.first!;

            if (availableLanguages.contains(preferredLocale) == false) {
                locale = "en";
            }
        }
        return locale;
    }

    func loadLocale() {
        let currentLocale: String = self.getLocale();
        var bundlePath: String;

        bundlePath = Bundle.main.path(forResource: currentLocale, ofType: "lproj")!;
        myClass.localeBundle = Bundle.init(path: bundlePath)!;
    }

这适用于大多数人,但如果您设置的系统语言与预期区域不同,这将失败。例如:

语言为葡萄牙语,区域设置为俄罗斯:Locale.preferredLanguages.first! 将 return pt-RU

考虑到我只有 pt-PTpt-BR 的翻译,我的代码将默认为 "en",因为 "pt-RU" 不存在。

如何独立于用户区域获得 pt-PTpt-BR

谢谢

用户对首选语言的设置(在系统偏好设置中设置)存储在键 "AppleLanguages" 下的用户默认值中。它是一组语言标识符字符串(如 "pt-BR")。

用户的设置在全局域中,但与所有用户默认设置一样,您可以在更多本地域中覆盖它。特别是,您可以在应用程序域中设置它以仅影响您的应用程序。

因此,我认为您应该只在 "AppleLanguages" 键下存储一个数组,其中包含用户为您的应用程序选择的语言的标识符,然后让系统执行它的操作。您不应该尝试自己重现资源搜索算法。

如果您想继续使用您的技术,您可以使用 Bundlelocalization properties and methods 根据首选的列表选择捆绑包中可用的实际本地化之一。也就是说,不要查询 localizations 然后检查它是否包含您的区域设置标识符;使用 preferredLocalizations(from:forPreferences:) 为您进行搜索。它可能使用更复杂的算法。此外,请记住区域设置和语言之间的区别,尤其是区域设置 ID 与语言 ID 之间的区别。它们代表不同的事物并具有不同的形式,但您似乎可以互换使用它们。