最近、5つのスタンドアロンプロジェクトを1つのプロジェクトにマージして、共通のコードベースを作成しました。これで、代わりに5つのターゲットを持つ1つのプロジェクトができました。
各ターゲットのファイルセットは同じですが、ターゲットごとに異なるファイル(Default.pngやアイコンファイルなど)が異なります。私のアプリケーションは、デフォルトで英語を使用して7つの言語に翻訳されています。他の言語は、スウェーデン語、オランダ語、ドイツ語、フランス語、ポーランド語、スペイン語です。
次に、使用する言語に応じてアプリケーションの名前を翻訳したいと思います。たとえば、私のスウェーデンの航空アプリの場合、アプリはスウェーデン語で「Flyget ARN」と呼ばれる必要がありますが、英語の場合は「AviationARN」と呼ばれる必要があります。これはInfoPlist.string
で行われるため、これはすべて問題ではありませんが、これをアプリのローカリゼーションと組み合わせるのは問題です。
私は最近この質問を書きました: いくつかのローカリゼーションはまだ英語のみを表示しています そして私はいくつかの.stringsファイルを組み合わせることができないことを発見しました。 (私が書いた答えを参照してください)。
だから私の質問は次のとおりです:
複数のターゲットを含むプロジェクトからローカライズされたアプリを取得し、DRY違反(重複コード)を発生させずにアプリケーション名をローカライズするにはどうすればよいですか。
更新
これはまだ問題です、与えられた答えは私の問題を解決しません。
私はXCodeプロジェクトでこの問題を解決しました。これは、あなたと同じ問題に取り組んでいると思います。これがお役に立てば幸いです。このソリューションには、同じコードベース(異なるアプリ名)から構築され、アプリ名を含めて完全にローカライズされた2つのターゲットが含まれています。 (Growth(フランス語:Croissance、スペイン語)というフリーミアムアプリをビルドします:Crecer)と呼ばれる有料バージョンGrowth +(フランス語:Croissance +、スペイン語:Crecer +)。
また、InfoPlist.string
ファイル(アプリの名前のみが含まれている)を見つけました。ソリューションでサブフォルダーを使用し、ターゲットを変更して、関連するサブフォルダーからのInfoPlist.stringsのローカライズされたセットを含めることで問題を回避しました。具体的には、私はこの構造を持っています:
ルート +-en.lproj ¦ + -Localizable.strings ¦ + -SomeXib.xib + -es.lproj ¦ + -Localizable.strings ¦ + -SomeXib.xib +-fr.lproj ¦ +- --Localizable.strings ¦ + -SomeXib.xib +-OnlyInAppA ¦ + -en.lproj ¦ ¦ + -InfoPlist.strings ¦ + -es.lproj ¦ ¦ + -InfoPlist.strings ¦ + -fr.lproj ¦ + -InfoPlist.strings +-OnlyInAppB ¦ + -en.lproj ¦ ¦ + -InfoPlist.strings ¦ + -es.lproj ¦ ¦ + -InfoPlist.strings ¦ + -fr.lproj ¦ + -InfoPlist.strings +-AppA.plist +- --AppB.plist
そして、私のターゲット間の唯一の違い(異なるプリプロセッサシンボルと異なる.plistファイルを除く)は、AppAのビルド設定にはOnlyInAppAの下のInfoPlist.stringsファイルが含まれているのに対し、AppBのビルド設定にはOnlyInAppBの下のInfoPlist.stringsファイルが含まれていることです。
私が使用した命名規則(OnlyInAppA/OnlyInAppBフォルダー、AppB/AppB plistファイル)は、私の個人的な意見では、これを満足のいくアプローチにするのに十分明白です。
編集:
これらの2つのXCode4スクリーンショットを参照して、ターゲットで変更された設定を正確に見つける場所を確認してください。
ターゲットビルド設定では、別のplistファイルが指定されています(注:新しいターゲットを追加すると、XCodeが自動的にこれを行います)
ターゲットビルドフェーズの[バンドルリソースのコピー]セクションで、関連するOnlyInAppXサブフォルダーからInfoPlist.stringsのバージョンを選択します(このスクリーンショットのInfoPlist.stringsの横にある灰色のテキストに注意してください。これにより、他のターゲットの場所が異なります) 。 +/-ボタンを使用してこれを実現し、ファイルを目的のファイルに置き換えることができます。
この問題が引き続き発生する場合:プロジェクトのターゲットごとにローカライズされた複数のInfoPlist.stringを追加する方法に関する解決策を見つけました。次の手順に従ってください。
各ターゲットに固有のフォルダーを作成します。
各フォルダーにInfoPlist.stringsファイルを作成します。
ターゲットにフォルダーを追加する指定プロジェクト内の各フォルダーの適切な(そして唯一の!)ターゲット:
新しいターゲットごとに、元のInfoPlist.stringsファイルのターゲット依存関係を削除します。
新しいInfoPlist.stringsファイルをローカライズします。
ターゲットを作成し、言語設定を変更して確認します。
同じソフトウェアが複数のドメインをサポートし、各ドメインがさまざまなモジュール(ブログ、フォーラムなど)のまったく同じパスにアクセスする同様の設定があります。特にデータベースサービスが利用できなくなったときにドメインごとの個性を維持するために、重要な情報、基本的にはメタ情報をファイルに保持します。ローカリゼーションのために、各サイト/プロジェクトのデフォルト言語を保持する変数を保持します。情報を含むファイルに独自のドメインを持たせるか、すべてのプロジェクトを同じファイルに保存するかを決定できます。これを最終的なフォールバックに使用するか、権限の低い人や全員に公開オプションがない場合に使用します。あなたがそのようなオプションを実装するまであなたよりも(ユーザーは言語オプションを上書きすることができます)。
すべてのInfoPlist.stringsファイルを別々のパスに保存するだけです。それぞれが1つのターゲットのメンバーになります。
それとも私はその質問を理解していませんでしたか?
私は自分のアプリに対してまさにこれを行ってきました。
電話のデフォルト言語を変更すると、各infoPlist.stringsファイルの名前が正しく取得されます。
しかし、私はこれを最初から行いました。必要な動作を取得するためにバックアップする必要があるかどうかはわかりません。おそらく、ローカリゼーションフォルダからさまざまなinfoPlist.stringsファイルを保存してから、次の手順を実行してから、現在のinfoPList.stringsファイルのコンテンツを次の手順で新しく作成したファイルに再挿入します。
xcode4.3を使用しています。手順:
1)info-plist.stringsで、デフォルト言語に使用する文字列を設定します。最終的には1つのファイルになります。
2)ここで、ファイルインスペクターを開きます
3)右端のインスペクターで、ナビゲーターの下部にある+記号をクリックできます。
4)関心のある言語を選択すると、左側のプロジェクトナビゲーターに次のように表示されます。
localizable.stringsおよびその他のファイル(次の例の写真のindex.htmlなど)に対してもこれを行うことができます。