21

私のアプリは英語でのみ実行されるとしましょう。しかし、新しい言語を追加するたびに新しいバージョンをリリースしたくはありません。私の提案は、このlocalizable.stringsファイルをアプリにリモートでロードすることです。

私のアプリには、ftp サイトからファイルをロードする機能があります。

この方法で言語をロードすることは可能だと思いますか? または、アプリはコンパイル時に言語ファイルをコンパイルする必要がありますか?

4

1 に答える 1

35

すべてのローカライズされた文字列リソース (および他の多くの種類のリソース) がバンドルから抽出されます。通常、アプリは、アプリと共に XCode によって作成される「メイン バンドル」を使用します。ただし、正しい構造で作成すれば、他のバンドルを個別に作成できます。その後、アプリにダウンロードし、最終的に NSLocalizedStringFromTableInBundle() 関数を使用してローカライズされた文字列を抽出できます。

したがって、言語翻訳のキー「KEY」を抽出すると、通常の構文は次のようになります。

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

ただし、バンドルを指定できるこのオプションの変形があります。

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

標準的なケースでは次のように置き換えますmyBundle[NSBundle mainBundle]、別のバンドルを使用する場合は、次のように指定できます。

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

バンドルの完全な構造は、Apple ドキュメントの「バンドル プログラミング ガイド」で確認できますが、この場合は次の方法で簡単に作成できます。

  • Mac でディレクトリを作成し、「MyBundle」という名前を付けます。
  • このディレクトリ内で、ローカライズされた文字列を移動します (バンドルに複数の言語がある場合、localizable.strings ファイルは lproj ディレクトリ内にあります: en.lproj、it.lproj、fr.lproj など)。
  • 次に、ディレクトリの名前を「MyBundle.bundle」に変更します

最後の操作で、このオブジェクトがスタンドアロン オブジェクトとして表示されるようになったことに気付くでしょうが、実際にはディレクトリです。

ここで、複数バンドルのアプローチを採用するか、単一バンドルの手法に従うかを決定できます。後者の場合、すべての言語をパッケージ化してから、自動システム ローカリゼーション ルールを使用して言語翻訳に一意の更新されたバンドルを使用できます。それ以外の場合は、言語ごとにバンドルを作成し、現在選択されている言語に基づいて適切なバンドルをロードし、翻訳用に選択することができます。

于 2012-09-10T20:02:39.473 に答える