アプリごとの言語設定

多言語ユーザーは、多くの場合、特定のアプリに対してシステムに設定した言語(英語など)とは別の言語(オランダ語、中国語、ヒンディー語など)を選択します。Android 13 では、このようなユーザーのエクスペリエンスを改善するために、複数の言語をサポートするアプリ向けに以下の機能を導入しています。

  • アプリごとの使用言語をユーザーが一か所で選択できるシステム設定

    アプリはマニフェストで android:localeConfig 属性を宣言して、複数の言語に対応するようにシステムに指示する必要があります。詳しくは、リソース ファイルを作成してアプリのマニフェスト ファイルで宣言する手順をご覧ください。

  • ユーザー インターフェースで使用する別の言語をアプリが実行時に設定できるようにする API

    カスタムのアプリ内言語選択ツールを使用するアプリでは、これらの新しい API を使用して、ユーザーがどこで言語設定を選択するかにかかわらず、一貫したユーザー エクスペリエンスを提供する必要があります。新しい API を使用すると、ボイラープレート コードの量を減らし、分割 APK をサポートして、アプリの自動バックアップによってアプリレベルのユーザー言語設定を保存できるようになります。

    以前の Android バージョンとの下位互換性を維持するため、この API は AndroidX でも使用できます。Appcompat 1.6.0-alpha04 以上を使用することをおすすめします。

複数の言語に対応していないアプリは、これらの変更の影響を受けません。

この機能の実装の概要

次の表に、さまざまなユースケースに基づくおすすめの実装方法を示します。

ユースケース おすすめの実装方法
アプリにアプリ内言語選択ツールがない
  1. アプリのマニフェストの android:localeConfig 属性を使用して、アプリの言語をスマートフォン設定に追加します。
  2. アプリ内言語選択ツールを使用する場合: AndroidX ライブラリを使用して API 実装をオプトインし、autoStoreLocales によって下位互換性を確保します。
アプリにすでにアプリ内言語選択ツールがある
  1. アプリのマニフェストの android:localeConfig 属性を使用して、アプリの言語をスマートフォン設定に追加します。
  2. アプリのカスタム ロジックを移行し、新しい API を使用して、ユーザーに一貫したエクスペリエンスを提供します。
  3. 以下のような特殊なケースに対応します。
    1. Android 13 搭載デバイスで初めてアプリを実行するときに AppCompatDelegate.setApplicationLocales() を呼び出します。
    2. 以下の場合に、AppCompatDelegate.setApplicationLocales() を呼び出して既存のユーザー リクエスト ロケールをシステムに渡します。

ユーザーのためのシステム設定

Android 13 では、スマートフォンのアプリ別言語設定を一か所で行えるようになりました。Android 13 搭載デバイスのシステム設定でアプリの言語を構成できるようにするには、locales_config XML ファイルを作成し、android:localeConfig 属性を使用してアプリのマニフェストを追加します。android:localeConfig マニフェスト エントリを省略すると、ユーザーはスマートフォンの設定で、システムの言語とは別にアプリの言語を設定できなくなります。

android:localeConfig を使用して、対応言語をスマートフォンの設定に追加する

アプリの対応言語をユーザーのスマートフォンの設定に追加するには:

  1. res/xml/locales_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="fr"/>
       <locale android:name="en"/>
    </locale-config>
    
  2. マニフェストにこの新しいファイルを指す行を追加します。

    <manifest
        ...
        <application
            ...
            android:localeConfig="@xml/locales_config">
        </application>
    </manifest>
    

ユーザーがシステム設定でアプリの言語を選択する方法

ユーザーは、新しいシステム設定を使用してアプリごとの使用言語を選択できます。この設定にアクセスするには、次の 2 つの方法があります。

  • システム設定からアクセスする

    [設定] > [システム] > [言語と入力] > [アプリの言語] >(アプリを選択)

  • アプリ設定からアクセスする

    [設定] > [アプリ] >(アプリを選択)> [言語]

既知の問題

アプリをテストする際に注意すべき既知の問題がいくつかあります。

  • AGP 7.3.0-alpha07 に、android:localeConfig でリソースのリンクが失敗する可能性がある既知の問題があります。この問題を回避するには、以前のバージョンの AGP を使用します。この問題は今後のリリースで解決される予定です。

アプリ内言語選択ツールを処理する

アプリ内言語選択ツールをすでに備えているか使用する予定があるアプリの場合、アプリにおけるユーザーの使用言語の設定と取得を処理するには、アプリのカスタム ロジックの代わりに新しい API を使用してください。

以前の Android バージョンとの下位互換性を維持するため、アプリ内言語選択ツールを実装する際に AndroidX サポート ライブラリを使用することを強くおすすめします。ただし必要に応じて、フレームワーク API を直接実装することもできます。

AndroidX サポート ライブラリを使用して実装する

Appcompat 1.6.0- alpha04 以上では setApplicationLocales() メソッドを使用します。

たとえば、ユーザーの使用言語を設定するには、言語選択ツールでロケールを選択するようユーザーにリクエストし、その値をシステムに設定します。

Kotlin

val appLocale: LocaleListCompat = LocaleListCompat.forLanguageTags("xx-YY")
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale)

Java

LocaleListCompat appLocale = LocaleListCompat.forLanguageTags("xx-YY");
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale);

Android 12 以下をサポートする

Android 12(API レベル 32)以下を搭載するデバイスをサポートするには、autoStoreLocales の値を true に設定し、android:enabledfalse に設定してロケールの保存を処理するよう AndroidX に指示します。これは次のコード スニペットに示すように、アプリの AppLocalesMetadataHolderService サービスのマニフェスト エントリ内で行います。

<application
  ...
  <service
    android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
    android:enabled="false"
    android:exported="false">
    <meta-data
      android:name="autoStoreLocales"
      android:value="true" />
  </service>
  ...
</application>

autoStoreLocales の値を true に設定すると、メインスレッドでのブロック読み取りの原因になります。スレッド違反をログに記録している場合は、StrictMode diskRead および diskWrite 違反になる可能性があります。詳しくは、AppCompatDelegate.setApplicationLocales() をご覧ください。

カスタム ストレージの取り扱い

マニフェスト エントリを省略するか、autoStoreLocalesfalse に設定すると、独自のストレージを扱っていると示すことになります。その場合、Android 12(API レベル 32)以下では、アクティビティのライフサイクルで onCreate の前に保存済みのロケールを指定し、AppCompatDelegate.setApplicationLocales() への呼び出しを制御します。

アプリにカスタムのロケールの保存場所がある場合は、カスタム ロケール ストレージ ソリューションと autoStoreLocales 間で 1 回限りのハンドオフを使用し、ユーザーが任意の言語で引き続きアプリを使用できるようにすることをおすすめします。これは特に、デバイスが Android 13 にアップグレードされた後に初めてアプリを実行する場合に当てはまります。その場合は、カスタム ストレージからロケールを取得して AppCompatDelegate.setApplicationLocales() に渡すことで、ユーザーがリクエストした既存のロケールを指定できます。

Android フレームワーク API を使用して実装する

AndroidX サポート ライブラリを使用してアプリ内言語選択ツールを実装することを強くおすすめしますが、Android 13 を搭載したデバイスでは、Android フレームワーク内で setApplicationLocales() メソッドと getApplicationLocales() メソッドを使用することもできます。

たとえば、ユーザーの使用言語を設定するには、言語選択ツールでロケールを選択するようユーザーにリクエストし、その値をシステムに設定します。

// 1. Inside an activity, in-app language picker gets an input locale "xx-YY"
// 2. App calls the API to set its locale
mContext.getSystemService(LocaleManager.class
    ).setApplicationLocales(newLocaleList(Locale.forLanguageTag("xx-YY")));
// 3. The system updates the locale and restarts the app, including any configuration updates
// 4. The app is now displayed in "xx-YY" language

ユーザー指定の言語を取得して言語選択ツールで表示する場合、システムからその値を取得します。

// 1. App calls the API to get the preferred locale
LocaleList currentAppLocales =
    mContext.getSystemService(LocaleManager.class).getApplicationLocales();
// 2. App uses the returned LocaleList to display languages to the user

その他のおすすめの方法

次のおすすめの方法を考慮してください。

別のアプリからインテントを呼び出す場合は言語を指定する

言語中心のインテントでは、呼び出すアプリの言語を指定できる場合があります。その一例が、Speech Recognizer API の EXTRA_LANGUAGE 機能です。

Chrome カスタムタブで Accept-Language ヘッダーを使用する

Chrome カスタムタブを呼び出すときに、Browser.EXTRA_HEADERS によって Accept-Language ヘッダーを追加して、アプリで設定した言語でウェブページを開くことを検討してください。