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(それ以外)だが、言語によっては zerotwofewmany も使う。

文字列フォーマットのプレースホルダー

文字列に動的な値を埋め込む場合は %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()

参考