iOS获取特定语言字符串的本地化版本



我正在为iOS构建一个应用程序,该应用程序将同时提供英语和法语版本。我读了一些关于国际化的教程,我对它的工作原理和我需要做的事情有了了解

我遇到的问题是,在一个特定的情况下,我想为一个英语用户加载法语字符串。

我知道可以为整个应用程序设置语言,但这需要重新启动应用程序才能生效。我想避免这种情况,而是可以根据需要选择加载法语或英语字符串。

是否可以通过编程方式从.strings文件加载特定语言的字符串?

是的,这是可能的,但实现起来并不容易。

我只是有一个例子,我应该为GAI(iOS版谷歌分析)发送一个相同名称的ViewController(适用于所有语言)。

前提条件:

1) 我从这里使用NSBundle扩展https://stackoverflow.com/a/20257557/3883492-也许先抬头看看是个好主意。(说实话,这真是天才)

2) 我正在使用swift 2

这里有一个非常简单的代码示例来说明我的想法:

func getFrenchString(forKey key: String) -> String {
    if let currentLanguage = (NSUserDefaults.standardUserDefaults().arrayForKey(AppleLanguages)?.first as? String) {
        if currentLanguage == "fr" {
            return NSLocalizedString(key, comment: "")
        }
        else {
            //the application is not currently on `fr`
            //change application to `fr`
            NSBundle.setLanguage("fr")
            //get the localized string on `fr`
            let frString = NSLocalizedString(key, comment: "")
            //return the application to the old language
            NSBundle.setLanguage(currentLanguage)
            return frString
        }
    }
    return ""
}

此外,您的项目中应该有带有本地化字符串的"fr.lproj"文件夹。

我通过用这个方法扩展String解决了这个问题。通过这种方式,您可以获得应用程序中任何区域设置的本地化字符串。

extension String {
    func localized(forLanguageCode lanCode: String) -> String {
        guard
            let bundlePath = Bundle.main.path(forResource: lanCode, ofType: "lproj"),
            let bundle = Bundle(path: bundlePath)
        else { return "" }
        
        return NSLocalizedString(
            self,
            bundle: bundle,
            value: " ",
            comment: ""
        )
    }
}

示例(当系统语言为英语时,获取乌克兰语言的本地化字符串):

"settings_choose_language".localized(forLanguageCode: "uk")

最新更新