Android のローカライズ
このドキュメントでは、Android SDK のローカライズ機能と、Xamarin を使用してそれらにアクセスする方法について説明します。
Android プラットフォーム機能
このセクションでは、Android のメインローカライズ機能について説明します。 特定の コードと例については、次のセクション に進んでください。
ロケール
ユーザーは、設定>言語と入力で自分の言語を選択します。 この選択は、表示される言語と使用される地域設定の両方を制御します (日付と数値の書式設定など)。
現在のロケールは、現在のコンテキスト Resources
でクエリを実行できます。
var lang = Resources.Configuration.Locale; // eg. "es_ES"
この値は、言語コードとロケール コードの両方をアンダースコアで区切って含むロケール識別子になります。 参考までに、StackOverflow を使用した Java ロケールと Android でサポートされるロケールの一覧を次に示します。
たとえば、次のような場合です。
en_US
英語 (米国)es_ES
スペイン語 (スペイン) の場合ja_JP
日本語 (日本)zh_CN
中国語 (中国) の場合zh_TW
中国語 (台湾) の場合pt_PT
ポルトガル語 (ポルトガル)pt_BR
ポルトガル語 (ブラジル)
LOCALE_CHANGED
Android は、 android.intent.action.LOCALE_CHANGED
ユーザーが言語の選択を変更したときに生成されます。
アクティビティは、次のようにアクティビティに属性を android:configChanges
設定することで、これを処理することを選択できます。
[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
ConfigurationChanges = ConfigChanges.Locale | ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
Android での国際化の基本
Android のローカライズ戦略には、次の重要な部分があります。
ローカライズされた文字列、画像、およびその他のリソースを含むリソース フォルダー。
GetText
メソッド。コード内のローカライズされた文字列を取得するために使用されます@string/id
を使用して、ローカライズされた文字列をレイアウトに自動的に配置します。
リソース フォルダー
Android アプリケーションは、次のようなリソース フォルダー内のほとんどのコンテンツを管理します。
- layout - AXML レイアウト ファイルが含まれています。
- drawable - 画像とその他の描画可能なリソースが含まれています。
- values - 文字列を含みます。
- raw - データ ファイルが含まれています。
ほとんどの開発者は、描画可能なディレクトリで dpi サフィックスを使用して複数のバージョンのイメージを提供し、Android が各デバイスの正しいバージョンを選択できるようにすることに既に慣れ親しんでいます。 同じメカニズムを使用して、リソース ディレクトリに言語とカルチャ識別子のサフィックスを付けることで、複数の言語翻訳を提供します。
Note
最上位言語を 2 文字だけのようにes
指定する場合は必須です。ただし、完全なロケールを指定する場合、ディレクトリ名の形式では、pt-rBR や zh-rCN などの 2 つの部分を区切るためにダッシュと小文字の r が必要です。 これは、アンダースコア (例: ) を持つコードで返される値と比較します。 pt_BR
これらはどちらも、.NET CultureInfo
クラスが使用する値とは異なり、ダッシュのみが含まれます (例: pt-BR
)。 Xamarin プラットフォーム間で作業する場合は、これらの違いに留意してください。
Strings.xml ファイル形式
ローカライズされた値のディレクトリ (例: values-es または values-pt-rBR) には Strings.xml という名前のファイルが含まれている必要があります。このファイルには、そのロケールの翻訳されたテキストが含まれます。
変換可能な各文字列は、属性として name
指定されたリソース ID を持つ XML 要素であり、変換された文字列を値として使用します。
<string name="app_name">TaskyL10n</string>
通常の XML 規則に従ってエスケープする必要があり name
、有効な Android リソース ID (スペースやダッシュなし) である必要があります。 この例の既定の (英語) 文字列ファイルの例を次に示します。
values/Strings.xml
<resources>
<string name="app_name">TaskyL10n</string>
<string name="taskadd">Add Task</string>
<string name="taskname">Name</string>
<string name="tasknotes">Notes</string>
<string name="taskdone">Done</string>
<string name="taskcancel">Cancel</string>
</resources>
スペイン語のディレクトリ 値 es には、翻訳を含む同じ名前のファイル (Strings.xml) が含まれています。
values-es/Strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">TaskyLeon</string>
<string name="taskadd">agregar tarea</string>
<string name="taskname">Nombre</string>
<string name="tasknotes">Notas</string>
<string name="taskdone">Completo</string>
<string name="taskcancel">Cancelar</string>
</resources>
文字列ファイルを設定すると、変換された値をレイアウトとコードの両方で参照できます。
AXML レイアウト ファイル
レイアウト ファイル内のローカライズされた文字列を参照するには、構文を使用します @string/id
。 このサンプルの XML スニペットは、ローカライズされたリソース ID で設定されているプロパティを示しています text
(他のいくつかの属性は省略されています)。
<TextView
android:id="@+id/NameLabel"
android:text="@string/taskname"
... />
<CheckBox
android:id="@+id/chkDone"
android:text="@string/taskdone"
... />
GetText メソッド
コード内の翻訳された文字列を取得するには、メソッドを GetText
使用し、リソース ID を渡します。
var cancelText = Resources.GetText (Resource.String.taskcancel);
Quantity 文字列
Android 文字列リソースを使用すると、数量文字列を作成して、翻訳者がさまざまな数量に対してさまざまな翻訳を提供することもできます。次に例を示します。
- "1 つのタスクが残っています。"
- "まだ 2 つのタスクがあります。"
(一般的な "n 個のタスクが残っています" ではなく)。
Strings.xml 内
<plurals name="numberOfTasks">
<!--
As a developer, you should always supply "one" and "other"
strings. Your translators will know which strings are actually
needed for their language.
-->
<item quantity="one">There is %d task left.</item>
<item quantity="other">There are %d tasks still to do.</item>
</plurals>
完全な文字列をレンダリングするには、メソッドを GetQuantityString
使用して、リソース ID と表示される値 (2 回渡されます) を渡します。 2 番目のパラメーターは、使用するquantity
文字列を決定するために Android によって使用されます。3 番目のパラメーターは、実際に文字列に置き換える値です (両方とも必須)。
var translated = Resources.GetQuantityString (
Resource.Plurals.numberOfTasks, taskcount, taskcount);`
有効な quantity
スイッチは次のとおりです。
- ゼロ
- 1
- 2 つ
- few
- many
- other
Android ドキュメントで詳しく 説明されています。特定の言語で '特別な' 処理が必要ない場合、これらの quantity
文字列は無視されます (たとえば、英語でのみ使用 one
され other
、文字列を指定しても zero
効果はありません。使用されません)。
Images
ローカライズされたイメージは、文字列ファイルと同じ規則に従います。フォールバックが行われるように、アプリケーションで参照されるすべてのイメージを描画可能なディレクトリに配置する必要があります。
ロケール固有のイメージは、drawable-es や drawable-ja などの修飾された描画可能フォルダーに配置する必要があります (dpi 指定子も追加できます)。
このスクリーンショットでは、4 つの画像が描画可能なディレクトリに保存されますが、他のディレクトリにローカライズされたコピーがあるのは 1 つの flag.png のみです。
その他のリソースの種類
レイアウト、アニメーション、生ファイルなど、他の種類の代替言語固有のリソースを提供することもできます。 つまり、1 つ以上のターゲット言語に特定の画面レイアウトを提供できます。たとえば、非常に長いテキスト ラベルを使用できるドイツ語専用のレイアウトを作成できます。
Android 4.2 では、アプリケーション設定android:supportsRtl="true"
を設定した場合、右から左 (RTL) 言語のサポートが導入されました。 リソース修飾子 "ldrtl"
をディレクトリ名に含めて、RTL 表示用に設計されたカスタム レイアウトを含めることができます。
リソース ディレクトリの名前付けとフォールバックの詳細については、代替リソースの提供に関する Android ドキュメントを参照してください。
アプリ名
アプリケーション名は、アクティビティに in を使用 @string/id
して簡単に MainLauncher
ローカライズできます。
[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Locale)]
右から左へ (RTL) 言語
Android 4.2 以降では、ネイティブ RTL サポート ブログで詳しく説明されている RTL レイアウトが完全にサポートされています。
Android 4.2 (API レベル 17) 以降を使用する場合、配置値は、(たとえばandroid:paddingStart
) と一緒start
end
に指定できます。また、その代わりにleft
配置right
値を指定することもできます。 また、RTL リーダーに適応する画面の構築に役立つ 、TextDirection
TextAlignment
などのLayoutDirection
新しい API もあります。
次のスクリーンショットは、アラビア語でローカライズされた Tasky サンプルを示しています。
次のスクリーンショットは、ヘブライ語で ローカライズされた Tasky サンプル を示しています。
RTL テキストは、LTR テキストと同じ方法で Strings.xml ファイルを使用してローカライズされます。
テスト
既定のロケールを十分にテストしてください。 何らかの理由で既定のリソースを読み込むことができない (つまり、リソースが不足している) 場合、アプリケーションはクラッシュします。
エミュレーター のテスト
ADB シェルを使用してエミュレーターを特定の ロケールに設定する方法については、「Android Emulator での Google のテスト」セクションを参照してください。
adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start
デバイス テスト
デバイスでテストするには、設定 アプリで言語を変更します。
ヒント
言語を元の設定に戻すことができるように、メニュー項目のアイコンと場所をメモしておきます。
まとめ
この記事では、組み込みのリソース処理を使用した Android アプリケーションのローカライズの基本について説明します。 iOS、Android、クロスプラットフォーム (Xamarin.Forms を含む) アプリの i18n および L10n の詳細については、このクロスプラットフォーム ガイドを参照してください。