我正在为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")