使用swift,我如何强制我的应用程序从特定的Localizable.strings中读取数据。
我在实例化ViewController之前将它放在didFinishLaunchingWithOptions中,但它仍然以英语显示应用程序。
NSUserDefaults.standardUserDefaults().removeObjectForKey("AppleLanguages")
NSUserDefaults.standardUserDefaults().setObject("fr", forKey: "AppleLanguages"
NSUserDefaults.standardUserDefaults().synchronize()
我试图传递一个数组用于" AppleLanguages"像这样的关键,但它仍然无法运作:
NSUserDefaults.standardUserDefaults().setObject(["fr"], forKey: "AppleLanguages"
一旦完成,我可以在应用程序中调用此内容并在不重新启动应用程序的情况下考虑更改吗?
答案 0 :(得分:27)
通过更改AppleLanguages
的值,无法立即更改应用的语言。它需要在更改生效之前重新启动应用程序。
您的问题似乎是访问不同语言的本地化字符串而不是更改应用程序的语言,对吧?如果您希望您的应用支持多种语言,您只需提供翻译并依赖settings.app进行实际更改。
如果要从当前使用的本地化以外的位置访问本地化字符串,则需要访问正确的翻译包。然后只需查询该包的翻译。以下代码应该可以解决问题。
let language = "en"
let path = NSBundle.mainBundle().pathForResource(language, ofType: "lproj")
let bundle = NSBundle(path: path!)
let string = bundle?.localizedStringForKey("key", value: nil, table: nil)
答案 1 :(得分:1)
@Radu由于@Markus的原始回答,我也为XCUITests工作了这个:
您可以明确指定MainBundle的路径,它只能在您的Mac上使用模拟器,但它通常用于持续集成平台,因此这是可以接受的:
let app = XCUIApplication()
let language:String? = "en"
let path = "/Users/{username}/{path_to_your_project}/\(language).lproj"
let bundle = NSBundle(path: path)
let string = bundle?.localizedStringForKey("key", value: nil, table: nil)
答案 2 :(得分:1)
使用NSLocalizedString
,您可以指定捆绑包。
let language = "fr"
let path = Bundle.main.path(forResource: language, ofType: "lproj")!
let bundle = Bundle(path: path)!
let localizedString = NSLocalizedString(key, bundle: bundle, comment: "")
或者使用捆绑包,您也可以直接致电localizedStringForKey:value:table:
。
答案 3 :(得分:0)
在Swift 4中,我无需重新启动或使用库即可解决该问题。 在尝试了许多选项之后,我发现了此函数,您在其中传递了要翻译的(Localizable.String,字符串文件的)stringToLocalize,要翻译的语言以及返回的值您在字符串文件中拥有的字符串:
index + 2
考虑到此功能,我在Swift文件中将其创建为全局文件:
func localizeString (stringToLocalize: String, language: String) -> String
{
let path = Bundle.main.path (forResource: language, ofType: "lproj")
let languageBundle = Bundle (path: path!)
return languageBundle! .localizedString (forKey: stringToLocalize, value: "", table: nil)
}
要从整个应用程序以及其余ViewControllers的每个字符串中进行访问,而不是放置:
struct CustomLanguage {
func createBundlePath () -> Bundle {
let selectedLanguage = //recover the language chosen by the user (in my case, from UserDefaults)
let path = Bundle.main.path(forResource: selectedLanguage, ofType: "lproj")
return Bundle(path: path!)!
}
}
我已将其替换为
NSLocalizedString ("StringToLocalize", comment: “")
我不知道这是否是最好的方法,但是我发现它非常简单,并且对我有用,希望对您有帮助!