言いたいことはそれだけか

KotlinとかAndroidとかが好きです。調べたことをメモします。٩( 'ω' )و

Android N からMulti Language and Multi Locale になるらしい

※本エントリは2016/4/8 に書いたもので、Android N Preview 1 時点で公開されている情報に基づいています。

昨日「まったりAndroid Framework Code Reading #3」に参加しました。
mandroidfcr.doorkeeper.jp

結局Frameworkのソースコードを読まずにAndroid N Previewを読んだというオチ。
NからMulti Language and Multi Locale になるらしい。
間違ったこと書いてたら指摘して欲しいです。


公式資料はこちら
http://developer.android.com/intl/ja/preview/features/multilingual-support.html

概要の翻訳版はこちら
http://qiita.com/tnagao3000/items/562e81e8ac9bb581afcc#multi-locale-support-more-languages

Nから設定で複数言語選べるようになる

M以前ではラジオボタンで単一でしか選択できなかった言語設定ですが、Nからは複数言語選択できるようになるらしい。
複数言語を選択する場合、選択する言語には優先度がつきます。
(例:1.日本語、2.Englishなど)

Nから端末がサポートするLocaleが大幅に増える

残念ながら各言語が具体的にどれくらい増えるかどうかは言及されていません。
ただ、例として出てくるar_EG (Arabic - EGYPT) は27もArabicなLocaleに対応するそうです。

NからLocaleに階層の概念が持ち込まれる

例えばM以前ではLocaleクラスのen_CA(CANADA), fr_CA(CANADA_FRENCH), en(ENGLISH), fr(FRENCH)の間に階層概念はありませんでしたが、NではLocaleに階層概念が持ち込まれました。これにより、より柔軟にユーザに適切な言語を提供できるようになります。

Nからシステムがどの言語を選択するかルールが変わる

M以前

ユーザが設定できる言語は一つで、アプリ側でその言語リソースが用意されている場合はそのリソースが使われます。
(例: 日本語設定している人がFacebookを使うと日本語をサポートしているFacebookで日本語表示になる)
アプリ側がユーザが設定している言語をサポートしていない場合、アプリがサポートするデフォルトの言語表示になります。
(例: 日本語設定している人がAWS Consoleを使うと日本語をサポートしていないAWS Consoleで英語表示になる)

N以降

ユーザが設定できる言語は複数。また、Localeに階層概念が持ち込まれているため、より柔軟に言語を選択することができる。

例えば、提供するアプリのサポートする言語が以下で:
- en_US (US English) <- default
- es_ES (Spanish)

端末の設定言語が以下の場合:
- es_MX(Spanish mexico)

M以前ではen_USが選択されていましたが、Nだと es が一致するes_ESの方が選択されます。


また、複数言語設定した場合の例。
提供するアプリのサポートする言語が以下で:
- en_US (US English) <- default
- de_DE (GERMANY)
- es_ES (Spanish)
- it_IT (ITALY)

端末の設定言語が以下の場合:
- fr_CH (French - SWITZERLAND)
- it_IT (Italian - SWITZERLAND)

まず、fr_CHを探しに行って見つからず、次にfrを探しに行って見つからず、
次にfrの子供を探しに行って見つからず、次にit_ITを探しに行って見つからず、
次にitを探しに行って見つからず、次にitの子供を探しに行ってついに晴れてマッチしたと判定されます。
もしここで見つからない場合はアプリデフォルトのen_USになります。

パフォーマンス注意点

今までのLocaleが階層関係のになる場合が多いので、そこを注意しないとパフォーマンスで問題が出ます。
上の例のように、子供でぴったり一致するものがいなければ親を見て、さらにその子供を探しに行くからです。
例えば、今までen-GB(UK) だったものはen-001(international English)にリネームするべきと記載されています。
en-GBの最も一般的な親はen-001になるからです。

NからAdditional Locale を設定できるようになるらしい

Nから追加されたLocaleList.GetDefault()を使うと端末に設定されているLocaleのリストを取得できるようになります。
これによりより洗練された言語表示ができるようになるらしい。
たとえば、翻訳かける時もより適切な言語にできるとか。
// 正直どう使うのか想像できなかった…

Formattersについて

M以前だと主要な言語(en, es, ar, fr, ru)でも1,2種類しかLocaleは用意されていませんでした。
そのせいで数字や日時がハードコードされてしまうことがあり、ユーザに混乱を与えることがあったけれど
Nからは数字や日時をハードコードする代わりにformatterを使うことが推奨されています。
主要な例はアラビア言語。Nでは`ar_EG`が**27**もアラビックロケールをサポートするそうです。

formatterの使い方の例は以下の通り。

format(locale, "Choose a %d-digit PIN", 4)

// RTL言語の読めない数字周りの表示確認つらそう…