KINTO Tech Blog
Development

Android開発をする時に知っておかないとバグを引き起こしそうな「地域別の設定」について

Cover Image for 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以上の場合、なぜ不明なのかを解説します!

AndroidでのLocaleとは

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~23
  • temperatureUnit = celsius : 温度 = 摂氏

「地域別の設定」とは

Android 14から導入される「地域別の設定」は、Locale(言語、国)で設定された「温度」や「週の最初の曜日」をカスタマイズできる機能です。

  • 温度
    • デフォルトを使用
    • 摂氏(℃)
    • 華氏(°F)
  • 週最初の曜日
    • デフォルトを使用
    • 月曜日 ~ 日曜日
温度設定画面 週最初の曜日画面
ondo youbi
設定画面に入る方法

「設定アプリ」内の「システム」→「言語」セクションから「地域別の設定」画面にアクセスできます。

setting

「地域別の設定」がなぜ必要か?

「アメリカ🇺🇸」と「オランダ🇳🇱」では、共に英語を使用できますが、使用される「温度」の単位や「週の最初の曜日」が異なります。

アメリカ🇺🇸 オランダ🇳🇱
温度 華氏 摂氏
週最初の曜日 日曜日 月曜日

「アメリカ🇺🇸」に住んでいる「オランダ人🇳🇱」が摂氏に慣れており、温度のみを摂氏に変更したい場合は、「地域別の設定」を使用して、温度のみを変更することが可能です。

「地域別の設定」を設定すると、どのような変化があるのか

Locale.getDefault().toString()

設定値を確認するために、上記のコードを使用しながら各設定を変更してみましょう。

言語 温度 週最初の曜日 結果
日本語(日本) デフォルト デフォルト ja_JP
日本語(日本) 華氏 デフォルト ja_JP_#u-mu-fahrenhe
日本語(日本) デフォルト 月曜日 ja_JP_#u-fw-sun
日本語(日本) 華氏 月曜日 ja_JP_#u-fw-sun-mu-fahrenhe

「温度」や「週の最初の曜日」を設定した結果、#umu-fahrenhefw-sunなど理解しにくいテキストが出力されましたが、これらはLocaleのメンバー変数であり、localeExtensionsの値です。このようにlocaleExtensionsに値が設定された場合、LocalehashCodeequals()の結果も変わり、Locale.JAPANと比較してもtrueにはなりません。

では、どのようにして言語を確認するか?

Locale.getDefault() == Locale.JAPAN // X
Locale.getDefault().language == Locale.JAPANESE.language // O

言語を確認したい場合、Localeに含まれるlanguageプロパティで比較してください。
この方法を用いれば、「地域別の設定」を変更しても影響を受けず、求めている結果を得られると思います。

最後に

Android 14からこっそり追加された「地域別の設定」機能によって、突然以前動いていたコードが動かなくなっても、この変更を検知することはかなり難しいですね。
ほとんどの方は問題ないと思いますが、もしLocaleインスタンスで言語を比較している場合は、確認してみてください。
一人でも多くの方がこのようなバグを早く発見し、解決できれば、この記事は大成功と言えるでしょう!

また、myrouteのメンバーが執筆した他の記事もぜひご覧ください!

ここまで読んでいただき、ありがとうございました。

※Android ロボットは、Google が作成および提供している作品から複製または変更したものであり、クリエイティブ・コモンズ表示 3.0 ライセンスに記載された条件に従って使用しています。

Facebook

関連記事 | Related Posts

Hand-Tomi
Hand-Tomi
Cover Image for Potential Bug Triggers in Android Development Due to Regional Preferences

Potential Bug Triggers in Android Development Due to Regional Preferences

長谷川
長谷川
Cover Image for KotlinでOGPを取得する時に文字コードで苦労した話

KotlinでOGPを取得する時に文字コードで苦労した話

長谷川
長谷川
Cover Image for Structured Concurrency with Kotlin coroutines

Structured Concurrency with Kotlin coroutines

Maya.S
Maya.S
Cover Image for KINTOテクノロジーズにおける言語ローカライゼーション(前編)

KINTOテクノロジーズにおける言語ローカライゼーション(前編)

ソミ
ソミ
Cover Image for myroute Android AppでのJetpack Compose

myroute Android AppでのJetpack Compose

長谷川
長谷川
Cover Image for Roomのマイグレーション

Roomのマイグレーション

We are hiring!

【iOS/Androidエンジニア】モバイルアプリ開発G/東京・大阪

モバイルアプリ開発GについてKINTOテクノロジーズにおける、モバイルアプリ開発のスペシャリストが集まっているグループです。KINTOやmy routeなどのサービスを開発・運用しているグループと協調しながら品質の高いモバイルアプリを開発し、サービスの発展に貢献する事を目標としています。

【バックエンドエンジニア】my route開発G/東京

my route開発グループについてmy route開発グループは、my routeに関わる開発・運用に取り組んでいます。my routeの概要 my routeは、移動需要を創出するために「魅力ある地域情報の発信」、「最適な移動手段の提案」、「交通機関や施設利用のスムーズな予約・決済」をワンストップで提供する、スマートフォン向けマルチモーダルモビリティサービスです。