2012-09-10 94 views
19

可以說我的應用程序只能用英文運行。但我不想每次添加新語言時都要發佈新版本。我的建議是將這個localizable.strings文件遠程加載到我的應用程序中。我可以將一個localizable.strings文件加載到iOS應用程序中嗎

我的應用程序具有從ftp站點加載文件的功能。

你們認爲可以用這種方式加載語言嗎?或者,應用程序是否必須在編譯時編譯語言文件?

+0

同樣的問題作爲http://stackoverflow.com/questions/12358379/is-it-possible-to-access-the-app-bundles-en-lproj? –

+0

這個問題似乎已被解決[這裏](http://stackoverflow.com/a/6075533/1651167) – Shelm

+1

是類似的,但人們根據問他們是如何回答不同的問題。下面這個顯然有更好的答案。 – mskw

回答

32

所有本地化的字符串資源(加上許多其他類型的資源)都從該包中提取。通常,應用程序使用「主包」,這是由XCode與您的應用程序一起創建的「主包」。 但是,如果您使用正確的結構創建它,您可以單獨創建任何其他包,然後可以將它下載到您的應用中,最後使用NSLocalizedStringFromTableInBundle()函數提取本地化的字符串。

所以我們說你提取的關鍵「鑰匙」的語言翻譯,那麼正常的語法爲:

NSString *translated = NSLocalizedStringFromTable(@"key",nil,nil); 

,但有這個選項,允許您指定包的變體:

NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil); 

在標準情況下你[NSBundle mainBundle]更換myBundle但如果你想使用另一種捆綁,你可以用這種方式指定它:

NSString *myBundlePath = "the path to the downloaded bundle"; 
NSBundle *myBundle = [NSBundle bundleWithPath:myBundlePath]; 
NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil); 

捆綁的完整結構可以看出,在蘋果文檔的「捆綁編程指南」中,但在你的情況下,你可以簡單地創建了這種方式:在您的Mac創建一個目錄

  • ,並將其稱爲「MyBundle」
  • 移動您的本地化字符串(如果您的包中有多種語言,則localizable.strings文件將位於lproj目錄中:en.lproj,it.lproj,fr .lproj,...)
  • 然後將該目錄重命名爲「MyBundle.bundle」

您會注意到上一個操作,現在這個對象被看作是一個獨立的對象,但實際上它是一個目錄。

現在您可以決定採用多捆綁方式還是採用單捆綁技術:在後一種情況下,您可以打包所有語言,然後使用唯一更新的捆綁包進行語言翻譯,方法是使用自動系統本地化規則;在另一種情況下,您可以爲每種語言製作一個包,然後 - 根據當前選擇的語言 - 加載適當的包,併爲您的翻譯選擇它。

+3

非常有用!不幸的是,如果你想添加App Store元數據的本地化(如果你添加一個新的本地化,你可能需要),你必須提交應用更新...... –

+0

App Store元數據將用於什麼? – mskw

+1

是的,元數據本地化意味着應用程序重新提交。在這種情況下,您會在捆綁中合併您的新語言。但是下載捆綁方式的簡單性使得您可以在任何應用更新之前提供本地化(和翻譯錯誤修復)。當然,在下一次應用更新(錯誤修復,新功能)中,您將在主包中合併新語言,並且您也將更新元數據。 – viggio24

相關問題