2013-11-25 30 views
16

我有一個本地化爲16種語言的iOS項目。只有一些詞語沒有本地化(主要是那些進入更新和本地化辦公室沒有及時交付)。 對於我的密鑰我做而不是使用英文措辭,因爲如果翻譯者希望這也可以改變。 所以現在如果我只是沒有一種語言的翻譯,如果退回到我使用的密鑰。但是,由於這個關鍵不是'人類可讀的',或者至少不是'人類愉快的閱讀',這是一個問題。備用語言iOS(帶有不完整的Localizable.strings文件)

我做了一些研究,但找不到我的確切問題的解決方案。 我有FE:

Localizable.strings in en.lproj 
@"Key1" = @"Value 1" 
@"Key2" = @"Value 2" 

Localizable.strings in de.lproj 
@"Key1" = @"Wert 1" 
// Note that @"Key2" is missing here in my de.lproj 

I would expect that if I make NSLocalizedString(@"Key2", ...) 
and am running on a german phone, it falls back to the english 
translation for this key as it exists... 

所以現在我只是複製了英文翻譯成丟失的Localizable.strings文件。但這是一個很大的破解! 但也使用英語單詞作爲鍵似乎是對我的破解!

有什麼辦法告訴我的應用程序,它應該使用f.e.英語作爲後備,如果沒有給定的鍵的價值?我試着加入鹼的定位,但這並不能幫助......

非常感謝

+0

「但是使用英文單詞作爲鍵似乎對我來說是一種破解!」 - 一點也不。這是一個非常優雅的解決方案,完全解決了您所描述的問題。僅僅因爲翻譯者可能會改變英文翻譯中使用的實際詞彙,並不意味着密鑰必須改變。也就是說,Maxthon提到的新Base本地化在大多數情況下是更好的方法。 –

回答

14

據我所知,目前沒有「官方」的方式做到這一點,但我已經實現的功能,如本前:

NSString * L(NSString * translation_key) { 
    NSString * s = NSLocalizedString(translation_key, nil); 
    if (![[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"] && [s isEqualToString:translation_key]) { 
     NSString * path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; 
     NSBundle * languageBundle = [NSBundle bundleWithPath:path]; 
     s = [languageBundle localizedStringForKey:translation_key value:@"" table:nil]; 
    } 
    return s; 
} 

從借來的:https://stackoverflow.com/a/8784451/1403046

基本上代替NSLocalizedString(),這將返回輸入字符串,這個版本在必要時將回退到英語。

+0

這太糟糕了:)問題是如果我使用L(...)genstrings(由Linguan使用)不會找到它......但是,謝謝你的回答......如果我不會得到其他答案這更好,我會很快接受你的。乾杯! – Georg

+0

您可以將'-s'傳遞給genstrings,以告訴它使用的是什麼函數而不是NSLocalizedString。 –

+1

我不能相信這是這麼多年後才建成的...... – Thomas

-3

您可以使用Base本地化,所有未定位的字符串將從此取而代之。

+8

我確實爲Localizable.strings添加了一個Base本地化,但它沒有從它們的缺失本地化...我希望它會這樣做,但它不是...有沒有我必須在Xcode中激活的設置? – Georg

+0

這是不正確的。或者我想念一些東西 – jlmg5564

+0

不,這沒有幫助。 [基礎國際化](https://developer.apple。com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingYourUserInterface/InternationalizingYourUserInterface.html)讓我們簡單地將可定位的字符串從xib或storyboard中分離出來,然後將其轉換爲字符串文件。 – JonEasy

0

通過thisthis,我斯威夫特代碼版本的啓發:

public func LS(_ key: String) -> String { 
    let value = NSLocalizedString(key, comment: "") 
    if value != key || NSLocale.preferredLanguages.first == "en" { 
     return value 
    } 

    // Fall back to en 
    guard 
     let path = Bundle.main.path(forResource: "en", ofType: "lproj"), 
     let bundle = Bundle(path: path) 
     else { return value } 
    return NSLocalizedString(key, bundle: bundle, comment: "") 
} 

許多開發商期待一個不完整的翻譯後備的開發語言。但事實並非這樣Apple choose to behave。我有一個pseudocode幫助更好地瞭解蘋果如何選擇後備。

相關問題