2009-08-07 61 views
14

我正在開發本地化應用程序,並且所有工作都正常。問題是我想讓用戶在應用程序設置文件夾中專門選擇特定應用程序的語言。如果用戶將其手機設置爲一種語言(例如法語),以便將應用設置爲以英語工作。創建本地化的iPhone應用程序,但允許用戶更改應用程序的語言

我目前使用NSLocalizedString來獲取本地化的字符串,但通過宏的所有變化看我找不到一個,讓我指定的語言。

關於如何做到這一點的任何想法?

+0

您是否嘗試過使用'initWithLocaleIdentifier代碼:'設置自己的語言環境? 例如,要設置區域設置到荷蘭則可以使用初始化區域設置:NSLocale *語言環境= [[NSLocale的alloc] initWithLocaleIdentifier:@ 「nl_BE」]; – Dimitris 2009-10-23 10:06:09

+0

我懷疑這會工作,因爲它只是創建一個NSLocale對象指定的區域設置,並不會影響到「當前」 /「激活」區域 – 2009-10-24 10:23:59

回答

12

有更好的方法來做到這一點。您可以強制的語言,像這樣:

[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"]; 

而且通過撤消此設置:

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

NB。您通常必須重新啓動應用才能生效。

考慮,如果你需要調用[[NSUserDefaults standardUserDefaults] synchronize];

我同意有一點需要允許用戶指定的語言。但是有一個例外是可以覆蓋語言並將其設置爲開發人員的母語。如果用戶可以說出開發人員的語言(例如,英語),那麼他們可能希望使用該語言的應用程序,如果翻譯不正確。

我參考這個答案:How to force NSLocalizedString to use a specific language(答案實際上並不適用於我,但遵循評論中的想法做到了。

+1

最後。謝謝 – 2010-03-12 20:14:39

1

正確的「用戶體驗」是供用戶通過系統偏好面板選擇他們的語言;不是你的應用程序(或你的應用程序的設置面板等)。沒有辦法覆蓋每個應用程序,我們不希望任何應用程序更改系統範圍設置。

+0

這是一個有點奇怪想在不同的語言運行一個應用程序所有其他應用程序。我不知道理由是什麼? – 2009-11-19 14:42:40

+3

我同意,一般來講你是正確的,但是在一個多語言的國家或用戶來說一種以上的語言,有時有情況我會喜歡用一種語言特定應用的,而我的手機的其餘部分被設置在英語。一個很好的例子可能是像這種堆棧溢出這樣的網站,對我來說,因爲這裏的內容我總是希望看到英文,而不是Facebook,我會堅持使用我的母語。 – 2009-11-20 12:28:43

+0

此外,允許應用程序內語言切換在自助服務終端模式場景中非常有用(這對iPad應用程序非常重要,但不是iPhone應用程序,但仍然...)。 – 2010-09-06 14:01:37

15

有三個問題在這裏:

  • 字符串
  • 其他資源(包括髮鈔銀行)
  • 系統消息

最後是幾乎可以肯定不是可以解決的,所以我們會離開它是。它們將以設備語言顯示。

另外兩個是可以解決的,但你需要手動做更多的事情。對於字符串,不是創建一個Localizable.strings然後本地化它,而是創建完全獨立的表(English.strings,French.strings等)。然後,使用NSLocalizedStringFromTable(),將語言作爲表傳遞。

對於NIB,有兩種方法。您可以將每個本地化NIB集合放入其自己的Bundle,然後通過該Bundle而不是nil-initWithNibName:bundle:。或者,您可以用[NSBundle -pathForResource:ofType:inDirectory:forLocalization:]找到它們後手動加載NIB。

+0

謝謝,這只是迴應,實際上是我所問的答案。 你的建議似乎很合理,並利用內置的本地化框架。 感謝 – 2009-11-21 13:01:56

+0

這是一個奇妙的答案。 – Brandon 2010-07-01 14:46:17

+1

我注意到這個問題並沒有說在運行時做這件事。獲得批准的答案特別指出,它需要重新啓動應用程序。 此答案允許您在運行時更改區域設置。 這正是我一直在尋找的。謝謝。 – Brandon 2010-07-01 16:36:33