2015-01-10 16 views
6

kullanarak kullanmak için NSLocalizedString öğesini zorla Hızlı bir şekilde, uygulamanızı belirli bir Localizable.strings öğesinden okumaya zorlayabilirim.Belirli bir dili Swift

Bunu ViewController'ı başlatmadan önce didFinishLaunchingWithOptions uygulamasına koydum, ancak yine de bana Uygulamayı İngilizce olarak gösteriyor.

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

Ve böyle "AppleLanguages" anahtar için bir Array sağlamayı denedi ama hala çalışmıyor:

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

Ve bir kez bu yapılır, ben App içinde bu çağırabilirsiniz ve Uygulamayı yeniden başlatmadan değişiklikleri dikkate alın.

cevap

24

AppleLanguages değerini değiştirerek uygulamanın dilini hemen değiştirmek mümkün değil. Değişiklik yürürlüğe girmeden önce uygulamayı yeniden başlatmayı gerektirir.

Sorununuz, uygulamanın dilini değiştirmek yerine farklı dillerin yerelleştirme dizelerine erişiyor gibi görünüyor, değil mi? Uygulamanızın birden fazla dili desteklemesini istiyorsanız, çevirileri sağlayıp gerçek değişiklik için settings.app belgesine güvenebilirsiniz.

Yerelleştirme dizelerini şu anda kullanılan yerelleştirmelerden başka bir yere erişmek istiyorsanız, uygun çeviriler paketine erişmeniz gerekir. Ve sonra çeviriler için bu paketi sorgula. Aşağıdaki kod parçası hile yapmalıdır.

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

Dil değişiklikleri dikkate alındı ​​ancak kodumu yürüttükten sonra uygulamayı yeniden başlatmayı özledim. – sazz

+0

İyi bilmek gerekirse, uygulamayı yeniden başlatmadan dili değiştirmek isterseniz, bunu yukarıda belirtilen kod örneği ile yapın. Sadece bir işlev/sınıfa sarın ve onu NSLocalizedString yerine kullanın. Dil değiştirmek için standart Apple yolunu kullanmanızı tavsiye etsem de. – Markus

+0

Benim için çalışmıyor. yol nil. Bunlara XCUITests'den erişemediğim olabilir mi? Bu berbat olurdu ... – Radu

1

@Radu Ben de @Markus' orijinal cevap sayesinde XCUITests için çalışan bu yaptı:

Sen sadece Simülatörü ile Mac üzerinde çalışacak, sizin MainBundle için açıkça yolunu belirtebilirsiniz, ancak Bu kabul edilebilir olabilir yüzden sık sık sürekli entegrasyon platformlarında kullanılır: Eğer paket belirtebilirsiniz

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 ile.

let language = "fr" 
let path = Bundle.main.path(forResource: language, ofType: "lproj")! 
let bundle = Bundle(path: path)! 
let localizedString = NSLocalizedString(key, bundle: bundle, comment: "") 

Veya bir paket ile

, ayrıca doğrudan çok localizedStringForKey:value:table: çağırabilir.