2015-01-10 79 views
6

使用swift,我該如何強制我的應用程序讀取特定Localizable.strings中的數據。強制NSLocalizedString使用Swift使用特定語言

在實例化ViewController之前,我把它放在了didFinishLaunchingWithOptions中,但它仍然向我展示了英文App。

NSUserDefaults.standardUserDefaults().removeObjectForKey("AppleLanguages") 
NSUserDefaults.standardUserDefaults().setObject("fr", forKey: "AppleLanguages" 
NSUserDefaults.standardUserDefaults().synchronize() 

我試圖通過一個Array,像這樣的「AppleLanguages」鍵,但它仍然不能正常工作:

NSUserDefaults.standardUserDefaults().setObject(["fr"], forKey: "AppleLanguages" 

而一旦做到這一點,我可以把這個裏面的應用程序並考慮更改而不重新啓動應用程序?

回答

24

通過更改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) 
+0

語言更改已考慮在內,但我錯過了在執行代碼後重新啓動應用程序。 – sazz

+0

很高興知道,如果您想在不重新啓動應用程序的情況下更改語言,那麼您也可以使用上述代碼示例。只需將它包裝在一個函數/類中,並使用它來代替NSLocalizedString。雖然我建議使用標準的蘋果方式來改變語言。 – Markus

+0

不適用於我。路徑是零。可能是我無法從XCUITests訪問這些內容?這將吸... – Radu

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) 
0

隨着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:

相關問題