2011-05-20 77 views
11

我知道在Mac應用程序中,可以將.strings文件添加到項目文件夾以添加本地化。可以在運行時添加.strings資源文件嗎?

有沒有什麼辦法可以在編譯時將附加本地化添加到應用程序(iOS或Mac OS),而無需從資源包中加載它們。說,下載一個額外的本地化並將其存儲在iOS上的/ Documents上?

+0

5年後,有一個產品爲此。 https://lokalise.co/「無需重新提交您的應用程序進行審查了。使用Lokalise iOS和Android SDK通過幾行代碼更新字符串和翻譯「 – JoePasq 2017-10-27 14:21:16

回答

19

是的,但這不是你的想法。

您可以取一個字符串文件並將其加載到NSString中,然後使用-[NSString propertyListFromStringsFileFormat]將其轉換爲字典。

這將爲您提供一種將自定義翻譯的字符串存儲在內存中的方法。

至於實際使用,你必須定義自定義翻譯功能。 IE,你不能再使用NSLocalizedString()和朋友。幸運的是,genstrings(用於生成字符串的文件的實用程序)允許您指定custom function names

genstrings -s "JPLocalizedString" ... 

這意味着,在代碼中,你可以定義:

NSString* JPLocalizedString(NSString *key, NSString *comment) { 
    return [myLoadedStrings objectForKey:key]; 
} 

除了JPLocalizedStringFromTable()JPLocalizedStringFromTableInBundle()JPLocalizedStringWithDefaultValue()genstrings將拿起所有這些。 (換句話說,只是因爲NSLocalizedString是一個宏觀的,並不意味着你的版本必須是)

如果你這樣做,並使用這些JPLocalizedString變種,然後genstrings仍然會產生你的字符串的文件爲您(您提供使用-s標誌)。

一旦這些函數被調用,你可以使用你想要的任何查找機制,如果找不到任何東西,則默認返回NSLocalizedString版本。

+1

謝謝,這更多是一個理論問題,我沒有計劃實現這一點。 – JoePasq 2011-05-21 15:28:23

0

您應該可以通過覆蓋NSBundle的各種pathForResource: ...方法來實現此目的。 (我假設他們都經歷過-pathForResource:ofType:inDirectory:forLocalization:,但這沒有記錄,所以你不能依賴它,即使它原來是,現在的情況,所以你應該覆蓋所有的人。)

我也建議filing an enhancement request用於覆蓋查找機制的乾淨方式。

+1

ooph,糟糕的主意。唯一的辦法就是通過將' - [NSBundle localizedStringForKey:value:table: ]''方法,這真的是一個非常糟糕的想法 – 2011-05-20 17:33:54

+0

嗯,我回過頭來,你可以使用'NSBundle'的子類,重寫方法中的邏輯,並在必要時調用'super', *您必須*總是*使用'NSLocalizedStringFromTableInBundle()'或'NSLocalizedStringWithDefaultValue()'宏指定您的自定義捆綁軟件 – 2011-05-20 17:45:31

0

如果你想在應用程序中實現一個替代版本的NSLocalizedString(),那麼有很多好的策略。這將允許您修改應用程序本身內部使用的值。但是在推送通知時,這些功能將不起作用。

但是,警告:對於使用本地化字符串的iOS推送通知,沒有合法的運行時方法修改用於將從服務器發送的本地化參數轉換爲設備本地語言的內置字符串資源。

所以,如果你想使用本地化的字符串作爲推送通知的一部分,你必須在提交到商店時將它們發送到應用程序中。以後不能通過從服務器加載某些內容來修改它們。

相關問題