Android開発をする時に知っておかないとバグを引き起こしそうな「地域別の設定」について
はじめに
KINTOテクノロジーズでmy routeのAndroid側を開発しているHand-Tomiと申します。
Android 14が2023年4月12日にリリースされてそろそろ1年になります。
しかし、新しく追加された「地域別の設定」についてまだ十分理解されていない方も多いと感じ、この記事を書くことにしました。
多言語対応のアプリケーション開発において「地域別の設定」を理解せずに進めると予期せぬバグが発生するリスクがあります。この記事を読んで、そうしたバグを予防できれば幸いです。
この記事で解説するもの
Locale.getDefault() == Locale.JAPAN
コード解説
Locale
: 言語、国、地域に基づく特定の文化的、地理的設定を表すクラスLocale.getDefault()
: 現在のアプリケーションのデフォルトのLocale
を返すLocale.JAPAN
: 日本の言語(ja
)と国(JP
)の設定を表すLocaleのインスタンス
上記のコードでは端末に「日本語(日本)」が設定されている場合、true
が出力されますか?それともfalse
が出力されますか?
正解は、Android 13以下ではtrue
であり、Android 14以上の場合、これだけの情報では不明です。
この記事では、Android 14以上の場合、なぜ不明なのかを解説します!
Locale
とは
AndroidでのLocale
は、言語、国、地域に基づいた文化的、地理的設定を表すクラスです。この情報を利用して、Androidアプリケーションは多様なユーザーに適応したアプリケーションを構成することができます。
Locale
は主に言語や国を扱いますが、LocalePreferences
を使用することで、より多くのデータを抽出することが可能です。
val locale = Locale.getDefault()
println("calendarType = ${LocalePreferences.getCalendarType(locale)}")
println("firstDayOfWeek = ${LocalePreferences.getFirstDayOfWeek(locale)}")
println("hourCycle = ${LocalePreferences.getHourCycle(locale)}")
println("temperatureUnit = ${LocalePreferences.getTemperatureUnit(locale)}")
「日本語(日本)」の設定を持つ端末で上記のコードを実行すると、以下のようになります。
calendarType = gregorian
: 暦法 = グレゴリオ暦firstDayOfWeek = sun
: 週最初の曜日 = 日曜日hourCycle = h23
: 時間周期 = 0~23temperatureUnit = celsius
: 温度 = 摂氏
「地域別の設定」とは
Android 14から導入される「地域別の設定」は、Locale(言語、国)で設定された「温度」や「週の最初の曜日」をカスタマイズできる機能です。
- 温度
- デフォルトを使用
- 摂氏(℃)
- 華氏(°F)
- 週最初の曜日
- デフォルトを使用
- 月曜日 ~ 日曜日
温度設定画面 | 週最初の曜日画面 |
---|---|
設定画面に入る方法
「設定アプリ」内の「システム」→「言語」セクションから「地域別の設定」画面にアクセスできます。
「地域別の設定」がなぜ必要か?
「アメリカ🇺🇸」と「オランダ🇳🇱」では、共に英語を使用できますが、使用される「温度」の単位や「週の最初の曜日」が異なります。
アメリカ🇺🇸 | オランダ🇳🇱 | |
---|---|---|
温度 | 華氏 | 摂氏 |
週最初の曜日 | 日曜日 | 月曜日 |
「アメリカ🇺🇸」に住んでいる「オランダ人🇳🇱」が摂氏に慣れており、温度のみを摂氏に変更したい場合は、「地域別の設定」を使用して、温度のみを変更することが可能です。
「地域別の設定」を設定すると、どのような変化があるのか
Locale.getDefault().toString()
設定値を確認するために、上記のコードを使用しながら各設定を変更してみましょう。
言語 | 温度 | 週最初の曜日 | 結果 |
---|---|---|---|
日本語(日本) | デフォルト | デフォルト | ja_JP |
日本語(日本) | 華氏 | デフォルト | ja_JP_#u-mu-fahrenhe |
日本語(日本) | デフォルト | 月曜日 | ja_JP_#u-fw-sun |
日本語(日本) | 華氏 | 月曜日 | ja_JP_#u-fw-sun-mu-fahrenhe |
「温度」や「週の最初の曜日」を設定した結果、#u
やmu-fahrenhe
、fw-sun
など理解しにくいテキストが出力されましたが、これらはLocale
のメンバー変数であり、localeExtensions
の値です。このようにlocaleExtensions
に値が設定された場合、Locale
のhashCode
やequals()
の結果も変わり、Locale.JAPAN
と比較してもtrue
にはなりません。
では、どのようにして言語を確認するか?
Locale.getDefault() == Locale.JAPAN // X
Locale.getDefault().language == Locale.JAPANESE.language // O
言語を確認したい場合、Locale
に含まれるlanguage
プロパティで比較してください。
この方法を用いれば、「地域別の設定」を変更しても影響を受けず、求めている結果を得られると思います。
最後に
Android 14からこっそり追加された「地域別の設定」機能によって、突然以前動いていたコードが動かなくなっても、この変更を検知することはかなり難しいですね。
ほとんどの方は問題ないと思いますが、もしLocaleインスタンスで言語を比較している場合は、確認してみてください。
一人でも多くの方がこのようなバグを早く発見し、解決できれば、この記事は大成功と言えるでしょう!
また、myrouteのメンバーが執筆した他の記事もぜひご覧ください!
- Structured Concurrency with Kotlin coroutines
- myroute Android AppでのJetpack Compose
- Compose超初心者のPreview感動体験
ここまで読んでいただき、ありがとうございました。
※Android ロボットは、Google が作成および提供している作品から複製または変更したものであり、クリエイティブ・コモンズ表示 3.0 ライセンスに記載された条件に従って使用しています。
関連記事 | Related Posts
We are hiring!
【iOS/Androidエンジニア】モバイルアプリ開発G/東京
モバイルアプリ開発GについてKINTOテクノロジーズにおける、モバイルアプリ開発のスペシャリストが集まっているグループです。KINTOやmy routeなどのサービスを開発・運用しているグループと協調しながら品質の高いモバイルアプリを開発し、サービスの発展に貢献する事を目標としています。
【iOSエンジニア】モバイルアプリ開発G/大阪
モバイルアプリ開発GについてKINTOテクノロジーズにおける、モバイルアプリ開発のスペシャリストが集まっているグループです。KINTOやmy routeなどのサービスを開発・運用しているグループと協調しながら品質の高いモバイルアプリを開発し、サービスの発展に貢献する事を目標としています。