Android
国際化とローカリゼーション(I18NとL10N)
サーチ…
前書き
国際化(i18n)とローカリゼーション(L10n)は、言語、地域の違い、ターゲットオーディエンスの違いに応じてソフトウェアを適合させるために使用されます。
国際化:将来のローカリゼーションを計画するプロセス。つまり、将来のローカリゼーションの取り組みに適応して適応できる程度に柔軟にソフトウェアを設計すること。
ローカリゼーション:ソフトウェアを特定の地域/国/市場(ロケール)に適合させるプロセス。
備考
デバイスのローカライズをテストするには、次のようにadb
を使用してデバイスまたはエミュレータを特定のロケールで再起動できます。
- 次のコマンドを使用してadbを実行します。adb
adb shell
-
setprop persist.sys.locale [BCP-47 language tag];stop;sleep 5;start
ここで[BCP-47言語タグ]は、ここで説明する言語固有のコードです。BCP47コード
たとえば、アプリで日本語のローカリゼーションを確認するには、次のコマンドを使用しますsetprop persist.sys.locale ja-JP;stop;sleep 5;start
ローカリゼーションの計画:マニフェストでのRTLサポートの有効化
RTL(右から左)サポートは、i18nおよびL10nの計画において不可欠な部分です。左から右に書かれた英語とは異なり、アラビア語、日本語、ヘブライ語などの多くの言語は右から左に書かれています。よりグローバルなオーディエンスにアピールするには、プロジェクトの最初からこれらの言語をサポートするレイアウトを計画することをお勧めします。ローカライゼーションの追加は後で簡単に行えます。
RTLサポートは、 AndroidManifest
supportsRtl
タグを追加することで、Androidアプリで有効にすることができます。
<application
...
android:supportsRtl="true"
...>
...
</application>
ローカリゼーションの計画:レイアウトでのRTLサポートの追加
SDK 17(Android 4.2)を起動すると、AndroidレイアウトでRTLサポートが追加され、ローカリゼーションに不可欠な部分です。今後は、レイアウトのleft/right
表記をstart/end
表記に置き換える必要があります。ただし、プロジェクトのminSdk
値が17
より小さい場合は、レイアウトでleft/right
およびstart/end
両方の表記を使用する必要があります。
相対レイアウトの場合、 alignParentStart
とalignParentEnd
を使用する必要があります。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"/>
</RelativeLayout>
重力とレイアウトの重力を指定するには、次のように同様の表記法を使用する必要があります。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left|start"
android:gravity="left|start"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|end"
android:gravity="right|end"/>
パディングとマージンも同様に指定する必要があります。
<include layout="@layout/notification"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:paddingLeft="128dp"
android:paddingStart="128dp"
android:layout_toLeftOf="@id/cancel_action"
android:layout_toStartOf="@id/cancel_action"/>
<include layout="@layout/notification2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="12dp"
android:layout_marginEnd="12dp"
android:paddingRight="128dp"
android:paddingEnd="128dp"
android:layout_toRightOf="@id/cancel_action"
android:layout_toEndOf="@id/cancel_action"/>
ローカリゼーションの計画:RTLのレイアウトをテストする
作成されたレイアウトがRTLと互換性があるかどうかをテストするには、次の手順を実行します。
[設定] - > [開発者オプション] - > [描画] - > [強制RTLレイアウト方向]に移動します。
このオプションを有効にすると、デバイスはRTLロケールを使用するようになり、RTLサポートのためにアプリのすべての部分を簡単に検証できます。この時点まで、実際に新しいロケール/言語サポートを追加する必要はありません。
ローカライズのためのコーディング:デフォルトの文字列とリソースの作成
ローカライゼーションをコーディングするための最初のステップは、デフォルトのリソースを作成することです。このステップは暗黙のうちに多くの開発者がそれについて考えることさえしません。ただし、サポートされていないロケールでデバイスを実行すると、すべてのリソースがデフォルトのフォルダからロードされるため、デフォルトのリソースを作成することは重要です。リソースのいずれかがデフォルトのフォルダにない場合、アプリケーションは単にクラッシュします。
デフォルトの文字列のセットは、指定された場所の次のフォルダに置く必要があります。
res/values/strings.xml
このファイルには、アプリの多数のユーザーが話すことになっている言語の文字列が含まれている必要があります。
また、アプリケーションのデフォルトリソースは、次のフォルダと場所に配置する必要があります。
res/drawable/
res/layout/
アプリにanim
やxml
などのフォルダが必要な場合は、デフォルトのリソースを次のフォルダと場所に追加する必要があります。
res/anim/
res/xml/
res/raw/
ローカライズのためのコーディング:代替文字列の提供
他の言語(ロケール)で翻訳を提供するには、次のような規約で別のフォルダにstrings.xml
を作成する必要があります。
res/values-<locale>/strings.xml
同じものの例を以下に示します。
この例では、ファイルres/values/strings.xml
にデフォルトの英語の文字列があり、フランス語の翻訳はres/values-fr/strings.xml
というフォルダにあり、日本語の翻訳はres/values-ja/strings.xml
他のロケールの翻訳も同様にアプリに追加できます。
ロケールコードの完全なリストは、ここで見つけることができます: ISO 639コード
翻訳できない文字列:
プロジェクトには、翻訳されない特定の文字列が含まれている場合があります。 SharedPreferencesのキーとして使用される文字列または記号として使用される文字列は、このカテゴリに分類されます。これらの文字列は、デフォルトのstrings.xml
のみ格納する必要があり、 translatable="false"
属性でマークする必要があります。例えば
<string name="pref_widget_display_label_hot">Hot News</string>
<string name="pref_widget_display_key" translatable="false">widget_display</string>
<string name="pref_widget_display_hot" translatable="false">0</string>
翻訳はバイリンガルな専門家によって実施されることが多いので、この属性は重要です。これにより、翻訳に関与するこれらの関係者は翻訳されない文字列を識別し、時間と費用を節約することができます。
ローカライズのためのコーディング:代替レイアウトの提供
前の例で説明したように、正しいstart/end
表記法を指定した場合は、言語固有のレイアウトを作成する必要はありません。ただし、デフォルトのレイアウトが特定の言語で正しく機能しない場合があります。 RTL言語の場合、左から右のレイアウトは翻訳されないことがあります。そのような場合には、正しいレイアウトを提供する必要があります。
RTLレイアウトを完全に最適化するために、 ldrtl
リソース修飾子( ldrtl
はレイアウト方向を表します)を使用して、完全に別々のレイアウトファイルを使用できます。たとえば、デフォルトのレイアウトファイルをres/layout/
保存し、RTL最適化されたレイアウトをres/layout-ldrtl/
保存することができます。
ldrtl
修飾子は描画可能なリソースに適しているため、読み取り方向に対応する方向に配置されたグラフィックスを提供できます。
ldrtl
レイアウトの優先順位を説明する素晴らしい投稿があります: 言語固有のレイアウト