ray*_*owe 11 xcode localization internationalization nslocalizedstring ios
我正在为iOS构建一个以英语和法语提供的应用程序.我已经阅读了一些关于国际化的教程,并且我了解它是如何工作的以及我需要做什么.
我遇到的问题是有一个特定的情况,我想为英语用户加载法语字符串.
我知道可以为整个应用程序设置语言,但是它需要在应用程序生效之前重新启动它.我想避免这种情况,而是能够根据需要选择加载法语或英语字符串.
是否可以通过编程方式从特定语言的.strings文件中加载字符串?
Dmy*_*nko 10
我通过使用此方法扩展 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: ""
)
}
}
Run Code Online (Sandbox Code Playgroud)
示例(当系统语言为英语时,获取乌克兰语的本地化字符串):
"settings_choose_language".localized(forLanguageCode: "uk")
Run Code Online (Sandbox Code Playgroud)
是的,这是可能的,但并不容易实现.
我就是这样,我应该为GAI(Google Analytics for iOS)发送一个ViewController的同名(适用于所有语言).
前提条件:
1)我从这里使用NSBundle扩展/sf/answers/1418029021/ - 也许最好先查看那里.(说实话,这是天才)
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 ""
}
Run Code Online (Sandbox Code Playgroud)
您还应该在项目中使用带有本地化字符串的"fr.lproj"文件夹.