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 が各デバイスの正しいバージョンを選択できるようにすることに既に慣れ親しんでいます。 同じメカニズムを使用して、リソース ディレクトリに言語とカルチャ識別子のサフィックスを付けることで、複数の言語翻訳を提供します。

Screenshot of Resources/drawable and Resources/values folders for multiple cultural identifiers

Note

最上位言語を 2 文字だけのようにes指定する場合は必須です。ただし、完全なロケールを指定する場合、ディレクトリ名の形式では、pt-rBRzh-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>

Screenshot of multiple values folders, each containing a Strings.xml file

文字列ファイルを設定すると、変換された値をレイアウトとコードの両方で参照できます。

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-esdrawable-ja などの修飾された描画可能フォルダーに配置する必要があります (dpi 指定子も追加できます)。

このスクリーンショットでは、4 つの画像が描画可能なディレクトリに保存されますが、他のディレクトリにローカライズされたコピーがあるのは 1 つの flag.png のみです。

Screenshot of multiple drawable folders, each containing one or more localized .png files

その他のリソースの種類

レイアウト、アニメーション、生ファイルなど、他の種類の代替言語固有のリソースを提供することもできます。 つまり、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) と一緒startendに指定できます。また、その代わりにleft配置right値を指定することもできます。 また、RTL リーダーに適応する画面の構築に役立つ 、TextDirectionTextAlignmentなどのLayoutDirection新しい API もあります。

次のスクリーンショットは、アラビア語でローカライズされた Tasky サンプル示しています。

Screenshot of Tasky app in Arabic

次のスクリーンショットは、ヘブライ語で ローカライズされた Tasky サンプル を示しています。

Screenshot of Tasky app in Hebrew

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 の詳細については、このクロスプラットフォーム ガイド参照してください。