2012-07-11 78 views
0

我很感謝您的幫助。我搜索了高和低的答案,沒有運氣。如何本地化plist文件

我有一個應用程序,使用非常專業化的體育術語,我存儲在一個plist文件中。這些術語然後顯示在UITableView中。當用戶點擊該技能時,播放視頻演示。該應用程序運行良好,但我非常想將其本地化爲其他語言。

我已經翻譯了這些條款,並且我希望我可以通過製作一份副本並僅更改文件的每個連續副本中的運動特定術語,然後將其置於其各自的位置語言文件夾。這是可能的,如果是這樣,有人可以請我指出一個很好的例子或教程?

到目前爲止,我已經嘗試在Xcode中本地化俄羅斯的plist文件,並將它放在它自己的ru.lproj文件夾中,然而,當我在模擬器中運行它時,UITableView中沒有任何數據出現!沒有俄羅斯文件,它工作正常。所以我的想法是,不知何故Xcode混淆了plist文件,因爲名稱是相同的,即使它位於不同的目錄(en.lproj和ru.lproj)。該文件在兩個目錄中都稱爲Basic.plist。這個過程對我來說是完全混淆的,從我收集的內容來看,這應該不難想象出來!

再次感謝您的提前。本地化概念對我來說是全新的,我渴望學習它。我很確定我理解.strings文件如何處理嵌入代碼中的字符串,但我想知道是否可以翻譯整個pList文件。

+0

如何在Xcode中設置文件(Xcode是否將其視爲具有本地化的文件)?您是否使用bundle API在運行時定位文件,或嘗試自己找到它? – 2012-07-11 04:16:38

回答

1

很多事情都可能是錯誤的。一種可能性是plist文件不會被複制到bundle中(在目標的Build Phases頁面中驗證 - 它應該在Basic.plist的旁邊寫上「... in(localization).lproj」)

如果您手動創建了ru.lproj,可能是您在錯誤的位置複製了它,或者將原始文件放在了錯誤的位置(它應該在en.lproj中),而不是手動創建文件,這是最簡單的在XCode中選擇文件Basic.plist,並使用File Inspector中的本地化控制來添加本地化。正如Kevin Grant所提到的,如果這不會顯示文件爲英文和俄文文件,那麼出現了一些問題,您可以重新開始使用+控制

最後,我不是100%確定這一點,但足夠接近:我相信喲你的代碼可能需要更新來確定從哪裏加載plist文件。它是一個.xib或.strings文件,你不必這樣做,因爲這是自動的,iOS知道首先查看相關的.lproj文件夾(當你加載一個.xib文件時,你只需要指定它的名字,不是確切的位置)。但是我假設你正在通過一個特定的路徑加載plist文件,因此路徑現在必須包含.proj文件夾。

如果可能的話,我認爲更好的方法是讓每種語言有不同的plist文件,只需要一個plist,而不是從plist中顯示字符串,您可以將它用作.strings文件的一個鍵。您可以使用NSLocalizedString宏(定義爲[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil])檢索本地化,這會在運行時爲您提供本地化的.strings文件中的對應值。當然這意味着當你更新你的plist時,你還必須更新你的.strings文件來匹配。好處是你不需要爲活動語言確定plist的路徑 - 使用NSLocalizedString,你根本不提供路徑。

+0

感謝您的回覆。plist被複制使用: NSString * Path = [[NSBundle mainBundle] bundlePath]; \t NSString * DataPath = [Path stringByAppendingPathComponent:@「Basic.plist」]; \t NSDictionary * tempDict = [[NSDictionary alloc] initWithContentsOfFile:DataPath]; self.data = tempDict; 我有做不同的做法,因爲我現在有兩個不同的.lproj文件夾? – user1516264 2012-07-12 18:36:06

+0

是的,因爲過去Basic.plist文件位於包的根文件夾中,而現在它位於en.lproj或ru.lproj子文件夾中。所以首先你需要弄清楚是要在en.lproj裏面還是在ru.lproj裏面(我不知道如何實現這一點)並將它附加到你的路徑中。 – Clafou 2012-07-12 21:49:23

+0

我想通了。我使用的初始代碼不正確。我使用了以下,現在它工作得很好:NSString * path = [[NSBundle mainBundle] pathForResource:@「Plyos」ofType:@「plist」]; \t \t NSDictionary * tempDict = [NSDictionary dictionaryWithContentsOfFile:path]; – user1516264 2012-07-14 19:53:13