2011-10-10 66 views
3

我正在創建一個應用程序,該應用程序將具有多個變體。IOS/iPhone:嵌套Localizable.strings文件?

這些變體將由多個Localizable.strings文件中的幾個字符串控制。

但是,90%的字符串將保持不變。

我想要它,以便每個獨特的Localizable.strings文件導入「主」一個,這樣我就不必通過每個應用程序變體文件,當我想要更改一個常用字符串。

這可能嗎?

回答

5

兩種選擇:

  1. 各地NSLocalizedString着你們分層查找適合你,然後回落到NSLocalizedString機制默認情況下使用自定義包裝函數。

    我之前寫了一篇關於如何做到這一點的答案:Can .strings resource files be added at runtime?

  2. 使用每種語言的多個.strings文件。通過默認東西在「Localizable.strings」中查找,但NSLocalizedStringFromTable()函數允許您指定一個自定義的「表」名稱。因此,如果您在「Configuration」中傳入表名稱,它會在「Configuration.strings」文件中查找。

    我在一個這樣做的應用程序工作。我們有兩個不同的.strings文件。一個控制品牌設置(使用什麼名稱,使用哪些圖像,使用哪些服務器等),另一個包含所有實際翻譯的字符串。應用程序包中只有一個品牌信息副本,我們選擇了正確的變體,以便在編譯時使用一些自定義腳本。它的工作非常好。

+0

謝謝。我很感激。我可能不得不做一些正確的研究,但選項2很有意義。 Perl腳本爲我做了訣竅,而且我已經有了幾天的時間(以及一些變體),所以我必須堅持這個項目。 –

1

我不確定你想要什麼,但如果你只是想翻譯一些字符串,你可以。

只要翻譯這些字符串的一部分,如果沒有翻譯,ios將選擇應用程序語言中的字符串並顯示它。因此,應用程序語言中的Localizable.strings可以被認爲是高級的。

+0

謝謝。但是,這並不是我所需要的。顯示的每個字符串都來自Localized.strings文件。但是,應用變體之間只有很少的變化。絕大多數都是一樣的。這意味着我必須爲每個變體制作完整的文件副本。然後,當我添加或更改字符串時,我需要進入每個變體,並更改該字符串。犯錯很容易。我更喜歡將一個文件中的所有共享字符串包含在變體的特定文件中。但是,.strings文件似乎是一種自定義格式。 –

2

不幸的是,Apple不支持其Localizable.strings文件。

您可以通過自定義的Ruby或Python腳本或僅使用sed的Bash腳本來模擬該功能;該腳本可以採用根文件.strings並將內容複製到每個變體的.strings文件中。它甚至可以是Xcode中的自定義構建步驟。

+0

謝謝。這幾乎是我的想法。 –

1

好的。這是我做的解決它。

我從Git存儲庫中刪除了各種Localizable.strings文件,但將它們留在它們的位置(每個應用程序變體目錄中都有一個)。

我在每個變體之間花了幾行不同的東西,並將它們分解爲一個單獨的文本文件,名爲「MyLocalizable.strings」。我將這些添加到Git中,並將它們添加到項目中,但沒有將它們與目標關聯起來。我離開了與每個目標相關的Localizable.strings文件。

那麼,我們有什麼,每個目標都有一個Localizable.strings文件與目標相關聯,並將被複制到該包中。每個目標目錄都有一個名爲「MyLocalizable.strings」的文件,其中只包含幾個從目標到目標不同的字符串。

然後,我把絕大多數字符串 - 不改變的字符串 - 放到另一個名爲「MyLocalizable.strings」的文件中,並將其放在中央(公共)目錄中。再次,我將此添加到Git和項目中,而不是將它與目標聯繫起來。

然後,我編寫了一個非常小的可憐的Perl腳本,用於在給定目標中從公共文件中構建一個Localizable.strings文件,並附加特定於目標的文件。這將覆蓋現有的Localizable.strings文件。這意味着Localizable.strings文件對於腳本的每次運行都是新的。這個腳本被放置在公共區域,並添加到項目中,但沒有將它與目標聯繫起來。該腳本有一個參數,它是目標(及其目錄)的名稱。這個腳本的語法是:

#!/usr/bin/perl 

use strict;   # I'm anal. What can I say? 
use Cwd;   # We'll be operating on the working directory. 
use File::Path; 

my $input1File = cwd()."/BMLT/Supporting\ Files/en.lproj/MyLocalizable.strings"; 
my $input2File = cwd()."/".$ARGV[0]."/en.lproj/MyLocalizable.strings"; 
my $outputFile = cwd()."/".$ARGV[0]."/en.lproj/Localizable.strings"; 

open (MAIN_FILE, $input1File) || die ("Could not open main file!"); 

my @file_data = <MAIN_FILE>; 

close (MAIN_FILE); 

open (PRODUCT_FILE, $input2File) || die ("Could not open product file!"); 

push (@file_data, <PRODUCT_FILE>); 

close (PRODUCT_FILE); 

open (FINAL_FILE, ">$outputFile") || die ("Could not open destination file!"); 

foreach (@file_data) print FINAL_FILE $_; 

close (FINAL_FILE); 

然後在複製包資源步驟之前添加一個運行腳本構建步驟。這個腳本調用Perl腳本語法如下:

${PROJECT_DIR}/BMLT/Supporting\ Files/buildLocalizationFile.pl ${PRODUCT_NAME} 

當構建而成,該文件被合併,合併後的文件放入包。

+0

我認爲這是解決這個問題的完美方案。謝謝,我今天會試試這個。 –