Androidアプリを多言語対応するには、言語ごとのリソースファイルを用意し、システムのロケールに応じて適切な文字列を表示する仕組みを使う。
文字列リソースの基本構成
デフォルトの文字列リソースは res/values/strings.xml に定義する。
<resources>
<string name="app_name">MyApp</string>
<string name="welcome_message">ようこそ</string>
<string name="button_submit">送信</string>
</resources>
英語のリソースは res/values-en/strings.xml に定義する。ディレクトリ名の -en が言語コードを表す。
<resources>
<string name="welcome_message">Welcome</string>
<string name="button_submit">Submit</string>
</resources>
Androidは端末のロケール設定に基づいて適切なリソースを自動的に選択する。対応するロケールのリソースが見つからない場合は、デフォルト(res/values/)のリソースを使う。
言語コードの指定方法
ディレクトリ名には言語コードと地域コードを組み合わせて指定できる。
| ディレクトリ名 | 対象ロケール |
|---|---|
values-en | 英語(全地域) |
values-en-rUS | 英語(アメリカ) |
values-en-rGB | 英語(イギリス) |
values-ja | 日本語 |
values-zh-rCN | 中国語(簡体字) |
values-zh-rTW | 中国語(繁体字) |
values-ko | 韓国語 |
values-ar | アラビア語 |
地域コードは -r プレフィックスをつけて指定する(例: rUS)。
Per-App Language へ対応する場合(Android 13以降)
Android 13(API 33)では、システム設定の「アプリの言語」でアプリごとに表示言語を変えられるPer-App Language機能が追加された。この機能に対応するには android:localeConfig の宣言が必要である。
基本的な多言語対応(システムのロケールに従って文字列リソースを切り替えるだけ)であれば、この設定は不要。
AndroidManifest.xml の <application> タグに android:localeConfig を追加する。
<manifest>
<application
android:localeConfig="@xml/locale_config">
...
</application>
</manifest>
res/xml/locale_config.xml にアプリが対応する言語を列挙する。
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="ja"/>
<locale android:name="en"/>
<locale android:name="zh-Hans"/>
<locale android:name="ko"/>
</locale-config>
この宣言によって、システム設定の「アプリの言語」画面にアプリが対応している言語の選択肢が表示される。
複数形(Plurals)の対応
個数によって表現が変わる文字列には <plurals> を使う。
<plurals name="item_count">
<item quantity="one">%d 件</item>
<item quantity="other">%d 件</item>
</plurals>
<plurals name="item_count">
<item quantity="one">%d item</item>
<item quantity="other">%d items</item>
</plurals>
コードから参照するには getQuantityString を使う。
val count = 3
val message = resources.getQuantityString(R.plurals.item_count, count, count)
第2引数が複数形の判定に使う数値、第3引数が %d に渡す値。
quantity に指定できる値は言語によって異なる。英語では one(1個)と other(それ以外)だが、言語によっては zero、two、few、many も使う。
文字列フォーマットのプレースホルダー
文字列に動的な値を埋め込む場合は %s(文字列)や %d(整数)を使う。
<string name="greeting">こんにちは、%sさん</string>
<string name="greeting">Hello, %s!</string>
複数のプレースホルダーを使う場合、言語によって順序が変わるためインデックスを明示する。
<string name="date_format">%1$d年%2$d月%3$d日</string>
<string name="date_format">%2$d/%3$d/%1$d</string>
val text = getString(R.string.date_format, 2026, 6, 17)
RTL(右から左)言語への対応
アラビア語やヘブライ語などのRTL言語に対応するには、AndroidManifest.xml の <application> に android:supportsRtl="true" を追加する。
<application
android:supportsRtl="true">
...
</application>
レイアウトでは left/right の代わりに start/end を使う。
<!-- RTL非対応 -->
<TextView
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp" />
<!-- RTL対応 -->
<TextView
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp" />
ConstraintLayout の制約も同様に start/end を使う。
Android Studio でのリソース管理
Android Studioの Translations Editor を使うと複数言語のリソースを一覧で管理できる。
res/values/strings.xml を開き、右上の Open editor をクリックするか、エディタ内を右クリックして Open Translations Editor を選択すると起動する。
翻訳エディタでは言語の追加や各言語の翻訳状況の確認、未翻訳の項目の把握ができる。
アプリ内での言語切り替え(Android 13以降)
アプリ内のUIにLanguage Picker(言語選択UI)を設けてアプリ言語を切り替えるには AppCompatDelegate.setApplicationLocales を使う。このAPIはAndroid 13未満でも androidx.appcompat:appcompat:1.6.0 以降であれば利用できる。
val appLocale = LocaleListCompat.forLanguageTags("en")
AppCompatDelegate.setApplicationLocales(appLocale)
日本語に戻す場合は以下のようにする。
val appLocale = LocaleListCompat.forLanguageTags("ja")
AppCompatDelegate.setApplicationLocales(appLocale)
システムのデフォルト設定に戻す場合は空のリストを渡す。
AppCompatDelegate.setApplicationLocales(LocaleListCompat.getEmptyLocaleList())
AppCompatDelegate.setApplicationLocales はアクティビティを再生成せず言語の切り替えを適用する。現在の言語を取得する場合は getApplicationLocales を使う。
val currentLocales = AppCompatDelegate.getApplicationLocales()
