techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Android 7.0 Nougatのマルチロケールについて

Android 7.0 Nougatから、マルチロケールが採用され、それに合わせてシステムのロケール選択のロジックが変更になったようです。

developer.android.com

今回は、以下の公式ドキュメントを参考に、マルチロケールを選択できるようになることで何が変わるのか確認してみます。

developer.android.com

マルチロケールの複数選択によって何が変わるのか?

例えば以下のようにアプリのリソースファイルを用意したとします。

f:id:uentseit:20160910002747p:plain:w200
図1
ちなみに、en_GBロケールのリソースファイルはこんな内容にしてます。
[/values-en-rGB/strings.xml]

<resources>
    <string name="app_name">Multi Locale Application british mode</string>
    <string name="locale_text">This is British English.</string>
</resources>

この状態で言語設定を「en_US」にした場合、Android 7.0未満だと該当するロケールのリソースファイルが見つかりません。

Android 7.0で行うと以下のようになります。
まず、Android 7.0の端末の言語設定を下図のように設定してみます。
f:id:uentseit:20160910003505p:plain:w200
図2 Android 7.0未満の言語設定では、ロケールを一つしか選べませんでしたが、Android 7.0ではこのように複数の言語をロケールとして設定することができます。
一番上に設定した言語(ここではEnglish (United States))が端末のデフォルト言語になります。

さて、この状態で図1のリソース構成を持つアプリを起動すると、、、
f:id:uentseit:20160910005341p:plain:w200

en_GBのリソースファイルが読み込まれます。

今回のケースの場合、Android 7.0未満では以下の順番でリソースを探しに行きます。
1. 端末の設定ロケールen_USで検索 → アプリは持っていないので見つからない
2. enで検索 → アプリは持っていないので見つからない
3. デフォルトのロケールを読み込み

一方、Android 7.0以上では以下の順番でロケールを探しに行きます。
1. 端末の設定ロケールen_USで検索 → アプリは持っていないので見つからない
2. enで検索 → アプリは持っていないので見つからない
3. enに属するのロケールを検索 → en_GB発見
4. en_GBリソースを読み込み

見ての通り、違いは3番目で、Android 7.0以上ではenに属する子ロケールまで探しに行き、できるだけ近いロケールのリソースまで検索します。
これでよりユーザのロケール設定に対して柔軟にリソースが選択されるようになりました。

ただ、なぜか公式ドキュメントのTable 3. の例がうまく動作しませんでした。。
"User Settings"列のit_CHを一番上に持ってくると、確かにit_ITのリソースが利用されるのですが、2番目に置いている状態だとデフォルトのロケールが選択されてしまいます。何か間違っているのか、、、わかったら追記します。