【Android】アプリを多言語化/ローカライズしたい(RTL対応あり)


概要

作成していたAndroidアプリを国外で配信する可能性があったため、アプリを日本語以外にも対応させたかった。
そこで、アプリを多言語化(ローカライズ)する方法や、アラビア語などの右読み言語(RTL; Right To Left)の場合はどうするかを調べてまとめた。

多言語対応方法

リソースを用意する

<アプリプロジェクト>/app/src/main/resの中には、例えば以下のようなリソースのディレクトリが格納されている。

  • drawable(画像)
  • values(色や文字列などの値)
  • layout(レイアウト)

対応したい言語のリソースディレクトリを用意すると、Android端末の設定を拾って、その言語に対応した表示になる。
ディレクトリの名前は次のようにする。

  • <リソースのタイプ>-<言語コード>[-r<地域コード>]
    res/values-jares/values-en-rGBなど
  • <リソースのタイプ>-b+<言語コード>[+<地域コード>]
    res/values-b+en+001など

そしてディレクトリの中に該当するリソースを用意する。

res/values/strings.xml
<resources>
  <string name="title">Title</string>
<resources>
res/values-ja/strings.xml
<resources>
  <string name="title">タイトル</string>
<resources>

※端末の設定に当てはまるものがない場合、読み込むリソースがなくなりアプリの強制終了などが起こり得るため、言語を指定しないデフォルトのリソースディレクトリを用意しておく。

多言語対応の要素を表示する

上で用意したリソースを要素に指定する。
指定の仕方は@<リソースのタイプ>/<リソースのname>

main.xml
<TextView
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/title" />

これで、言語設定が日本語の場合は"タイトル"、それ以外の場合"Title"という文字列が表示される。

多言語対応の要素をコードで利用する

R.<リソースのタイプ>.<リソースのname>で利用することができる。

Main.kt
textView.text = R.string.title // TextViewにテキストをセットする

RTL、双方向テキストへの対応

アラビア語は右から左に読む(RTL)。
             مرحبا هناك

しかし、テキスト中に数字・左から右に読む言語(LTR; 英語など)を含む場合は、その部分はLTRになる。
             مرحبا هناك12345678←

基本的にはシステムのデフォルト処理によってその通りに表示されるが、ローカライズしたテキストに逆方向のテキストを挿入した場合などは適当な表示にならないことがある。

  • メッセージの先頭に挿入されている
  • 数字や区切り記号で始まる

その場合はBidiFormatterクラスのunicodeWrap()メソッドを用いる。

また、Android 4.2(APIレベル17)以上ではレイアウトミラーリングもサポートされている。
AndroidManifest.xmlに以下を記述する。

AndroidManifest.xml
<application
    ...(略)...
    android:supportsRtl="true">
</application>

参考記事

Localize your app
複数の言語と文化をサポートする
言語とロケール
代替リソースを提供する