さまざまなバリエーションを持つアプリを作成しています。
これらのバリアントは、複数の Localizable.strings ファイル内のいくつかの文字列によって制御されます。
ただし、文字列の 90% は同じままです。
固有の Localizable.strings ファイルのそれぞれが「マスター」ファイルをインポートするようにしたいので、共通の文字列を変更したいときに各アプリ バリアント ファイルを調べる必要はありません。
これは可能ですか?
さまざまなバリエーションを持つアプリを作成しています。
これらのバリアントは、複数の Localizable.strings ファイル内のいくつかの文字列によって制御されます。
ただし、文字列の 90% は同じままです。
固有の Localizable.strings ファイルのそれぞれが「マスター」ファイルをインポートするようにしたいので、共通の文字列を変更したいときに各アプリ バリアント ファイルを調べる必要はありません。
これは可能ですか?
2 つの選択肢:
階層ルックアップを行うカスタム ラッパー関数を使用してから、デフォルト ケースNSLocalizedString
のメカニズムにフォールバックします。NSLocalizedString
これを行う方法についての回答を以前に書きました: Can .strings resource files be added at runtime?
言語ごとに複数の .strings ファイルを使用します。デフォルトでは、「Localizable.strings」で検索されますが、この関数NSLocalizedStringFromTable()
を使用すると、カスタムの「テーブル」名を指定できます。したがって、テーブル名として「Configuration」を渡した場合、「Configuration.strings」ファイルで検索されます。
私はこれを行うアプリに取り組みました。2 つの異なる .strings ファイルがありました。1 つはブランディング設定 (使用する名前、使用する画像、使用するサーバーなど) を制御し、もう 1 つは実際に翻訳されたすべての文字列を含んでいました。アプリ バンドルにはブランド情報のコピーが 1 つしかないため、いくつかのカスタム スクリプトでコンパイル時に使用する正しいバリアントを選択しました。それは本当にうまくいきました。
残念ながら、Apple はそのLocalizable.strings
ファイルに対してそれをサポートしていません。
カスタムの Ruby または Python スクリプト、またはsed
;を使用した Bash スクリプトを使用して、その機能を模倣できます。スクリプトはルート.strings
ファイルを取得し、その内容を各亜種のファイルにコピーでき.strings
ます。Xcode のカスタム ビルド ステップである場合もあります。
あなたが何を望んでいるかはわかりませんが、いくつかの文字列を翻訳したいだけなら可能です。
これらの文字列の一部を翻訳することができます。翻訳がない場合、ios はアプリケーション言語で文字列を選択して表示します。したがって、アプリケーション言語の Localizable.strings はマスターのように考えることができます。
わかった。これを解決するために私がしたことは次のとおりです。
さまざまな Localizable.strings ファイルを Git リポジトリから削除しましたが、それらはそれぞれの場所 (各アプリ バリアント ディレクトリに 1 つずつ) に残しました。
各亜種で異なる数行だけを取り出し、「MyLocalizable.strings」という名前の別のテキスト ファイルに分割しました。これらをそれぞれ Git に追加し、ターゲットに関連付けずにプロジェクトに追加しました。各ターゲットに関連付けられた Localizable.strings ファイルを残しました。
つまり、各ターゲットには、ターゲットに関連付けられた Localizable.strings ファイルがあり、バンドルにコピーされます。各ターゲット ディレクトリには、"MyLocalizable.strings" というファイルがあり、ターゲットごとに異なるいくつかの文字列のみが含まれています。
次に、大部分の文字列 (変更されない文字列) を「MyLocalizable.strings」という別のファイルに入れ、これを中央 (共通) ディレクトリに配置しました。繰り返しますが、これをターゲットに関連付けずに、Git とプロジェクトに追加しました。
次に、共通ファイルから特定のターゲットに Localizable.strings ファイルを作成し、ターゲット固有のファイルを追加する、非常に小さく哀れな Perl スクリプトを作成しました。これにより、既存の Localizable.strings ファイルが上書きされます。これは、スクリプトを実行するたびに Localizable.strings ファイルが新しくなることを意味します。このスクリプトは共通領域に配置され、ターゲットと関連付けることなくプロジェクトに追加されました。スクリプトには、ターゲット (およびそのディレクトリ) の名前である 1 つの引数があります。このスクリプトの構文は次のとおりです。
#!/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}
ビルドが行われると、ファイルが結合され、結合されたファイルがバンドルに入れられます。