2010-07-22 46 views
17

我有一個應用程序,我翻譯成一堆不同的語言。問題在於,澳大利亞的應用程序在新西蘭都會有一些不同的價值,這兩個國家都是英語國家。iPhone應用程序本地化 - 英語問題?

我已經創建了一個en_AU和一個en_NZ語言文件,但他們都使用標準的英文文件。我刪除了英文文件,但它繼續發生...

關於如何讓這個工作的任何想法?

謝謝

--D

+0

刪除英文文件引起了一堆問題...我有一堆其他語言的工作,但是當我想使用相同的語言,但對於不同的地區,它不起作用:S – dewberry 2010-07-22 13:44:17

回答

37

iPhone的本地化(或者是本地化?)不採取地區的任何通知用戶組(即,英國,澳大利亞,新西蘭)。默認情況下只有一種「英文」語言翻譯可用。不過,你可以用事情來強制它使用不同的翻譯設置 - 我剛剛在「英語」(美國)和「英國英語」(英國英語)之間進行了選擇。

在你main.m文件,修改它,所以它看起來像下面的(把你自己的NZ或AU測試)

int main(int argc, char *argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

// Set up the locale jiggery pokery 
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; 
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]; 
if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"]; 
} 

int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 

}

這會彈出用戶的語言(例如「 en「)轉換爲語言NSString,並將用戶區域設置(例如NZ,GB,AU)轉換爲區域設置NSString。如果他們(在我的情況下)匹配en和GB,那麼我將用戶的默認語言首選項設置爲「en_GB」,然後是「en」。

然後,在你的應用程序委託的application:didFinishLaunchingWithOptions方法要刪除您剛纔設置的代碼

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"]; 

它是安全的,在這一點上,因爲所有的包初始化已經完成刪除NSUserDefaults的設置。您的應用程序現在應該在en_GB.lproj目錄中使用Localization.strings文件。

這是一個可怕的哈克解決方案,但它適用於我。

+0

它適合你,它適用於我...它只是工作!太棒了,謝謝你! – dewberry 2010-07-22 19:09:19

+0

感謝您的回答。真的幫助我在這裏解決我的問題。 – AppAspect 2011-08-08 15:03:56

+0

感謝NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; – CReaTuS 2012-09-11 07:37:24

4

Apple documents this missing iOS feature here.

重要:在iOS中,捆綁 接口不採取方言或 腳本的信息考慮在內時 尋找本地化資源;只有 語言指示符代碼是 考慮。因此,如果您的項目 包含特定於語言的項目 包含語言和 區域指示符的目錄,則會忽略那些目錄 。 Mac OS X的 目錄中的軟件包接口支持特定於語言的項目 中的區域標識符 。

14

我想出了我認爲是rickerbh接受的答案稍有改進的版本。首先要認識到的是,用戶默認值被組織到域中,並且@"AppleLanguages"鍵不是來自應用的域,而是來自域的層次更高的某個域。這意味着它是完全安全地從用戶的默認設置中刪除:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

調用此代碼後,你會發現,調用[defaults objectForKey:@"AppleLanguages"]仍返回一個值。因此,而不是在稍後的某個時間點刪除@"AppleLanguages",根據您的應用程序的複雜程度,這可能會有問題,您希望做相反的處理:立即刪除@"AppleLanguages"。基本上,這會將其重置爲默認值,並捕獲系統所做的任何更改,例如,如果用戶已更改其首選語言。

這是我做的:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy]; 
NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; 
NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"]; 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    [appleLanguages removeObject:languageAndRegion]; 
} 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    NSInteger index = [appleLanguages indexOfObject:language]; 
    [appleLanguages insertObject:languageAndRegion atIndex:index]; 
} 
[defaults setObject:appleLanguages forKey:@"AppleLanguages"]; 

(注意:filteredArrayUsingPredicateFormat:是一個擴展方法,我寫這不是火箭科學弄清楚它做什麼或它是如何工作的。)

這將創建本地化列表中的每種語言與用戶區域結合在一起。例如,如果原始列表是es en en-GB而用戶的地區是AU,我們將得到es-AU es en-AU en en-GB。請注意,es-AU不存在,但它沒有區別。由於該應用找不到關聯的本地化或資源,因此它會忽略它。

+1

使用ios 8.1,這是解決方案。 – Mike 2014-10-24 22:49:39

+0

這看起來很穩固。有一件事要補充,@ selector(filteredArrayUsingPredicateFormat :)是NSArray上的一個類別方法,你可以在這裏找到:https://github.com/huguesbr/library-ios/blob/master/Categories/NSArray%2BFilteredSortedShortcuts.m – 2015-03-11 15:05:58

+0

,你在哪裏把它放在你的代碼中:在應用程序委託或你的「主」功能? – 2015-03-11 15:06:36

0

我與德國人有同樣的問題,並認爲我找到了「正確」的解決方案。錯誤在於,原來我的基本語言只是「德語(德語)」,在添加「德語/奧地利(de_AT)」本地化時,文件被忽略。將基礎語言更改爲「德國/德國(de_DE)」時,奧地利語翻譯不會被忽略。

0

這裏值得注意的是,XCode非常具有誤導性 - 您可以轉到Project(不是Target),Info,Localizations,按下語言列表下方的+按鈕,然後向下滾動到語言列表的底部出現在彈出窗口中,直到你看到「其他」(右邊的箭頭),這將打開一個很好的大名單,其中包括語言的區域變體。但是,這些區域變體在iPhone上不起作用 - 您沒有得到任何東西(如Apple所記錄並在此處顯示的另一個答案中引用)。顯然,上面列出的基於代碼的解決方案之一是必要的。