Avance.Lab

技術紹介

【新機能探訪】Android 13から導入された『アプリごとの言語設定』

公開日:2022.12.09 更新日:2022.12.09

tag: スマートデバイス

こんにちは、KNSKです。
よろしくお願いします。

今回は Android13の新機能である『アプリごとの言語設定』について
開発者目線で紹介したいと思います。

アプリごとの言語設定とは

Android13がリリースされる前は、アプリが使用する言語は端末の設定に依存しており
アプリごとに異なる言語を設定することはできませんでした。
※ OSの機能として提供されていなかっただけで
  独自の言語設定機能が実装されているアプリも多く存在します。

Android13でOSの機能として『アプリごとの言語設定』が提供されるようになったため、
この機能に対応したアプリであれば、共通の設定画面(下図)で言語設定が可能になりました。

設定画面の表示方法

設定画面は下記のいずれかの手順で表示できます。

A. 『アプリごとの言語設定』に対応するアプリの一覧を表示し、対象アプリを選択する。
 [設定] > [システム] > [言語と入力] > [アプリの言語] 

B. 対象アプリのアプリ情報画面で[言語]の項目を選択する。
 [設定] > [アプリ] >(アプリを選択)

対応方法

次に、『アプリごとの言語設定』にアプリを対応させる方法について説明します。
(既に多言語対応されているアプリを前提に説明します。)

1. 言語設定画面が表示されるようにする

① 対応言語ファイルの作成

アプリが対応している言語を記述したファイル app/src/main/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="en" />
    <locale android:name="fr" />
    <locale android:name="it" />
</locale-config>

② 対応言語ファイルの登録

マニフェストファイル app/src/main/AndroidManifest.xml に言語ファイルを指定する行を追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...

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

        ...
    </application>
</manifest>

以上の対応で、言語設定画面が表示されるようになります。(簡単!)

なお、上図において「言語の候補」にイタリア語が表示されていませんが
これは使用端末の言語設定画面でイタリア語が追加されていないためです。

2. アプリから言語設定を取得・変更できるようにする

Android13で言語設定を取得・変更するためのAPIが追加されました。
Androidフレームワーク と AndroidXサポートライブラリ の 2種類のAPIがありますが、
AndroidX サポートライブラリは Android12以下の環境でも使用することができるため
こちらを使用する方法を説明します。

① サポートライブラリの導入

app/build.gradle に依存関係を追加します。

...

dependencies {
    ...
    implementation 'androidx.appcompat:appcompat:1.6.0-rc01'
}

② 取得

AppCompatActivity を継承したActivityで使用する必要があります。
また、onCreate() 以降に使用する必要があります。

val appLocales: LocaleListCompat = AppCompatDelegate.getApplicationLocales()
if (appLocales.isEmpty) {
    Log.d("AppLanguage", "システムのデフォルト")
} else {
    appLocales[0]?.let {
        Log.d("AppLanguage", it.language)
    }
}

③ 変更

使用条件は取得と同様です。
言語設定を変更すると自動的にActivityが再生成されます。

// システムのデフォルト
AppCompatDelegate.setApplicationLocales(LocaleListCompat.getEmptyLocaleList())

// 日本語
val appLocale: LocaleListCompat = LocaleListCompat.forLanguageTags("ja")
AppCompatDelegate.setApplicationLocales(newAppLocale)

④ Android12以下をサポートする

app/src/main/AndroidManifest.xml に下記の記述を追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    ...

    <application
        ...

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

        ...
    </application>
</manifest>

最後に

言語設定機能を独自に実装した経験があるのですが、
それと比べると今回の『アプリごとの言語設定』はとても簡単に実装できました。
開発者にとって嬉しい新機能でした。

なお、IOSでは同様の機能がiOS13で追加されているようです。

今後もOSの新機能について掲載していきたいと思います。

参考

アプリごとの言語設定 | Android デベロッパー

KNSK

現在は主にスマホアプリ開発を担当しています。

ハイスペックでコンパクトなスマホが欲しいです。

関連記事