【Swift】Locale構造体の使い方!デバイスの「言語と地域」を取得する方法!
この記事からわかること
- Locale構造体の使い方
- Swiftでデバイスの「言語と地域」の値を取得するには?
- preferredLanguagesプロパティとは?
- ja-JPやen-JPとは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
Locale構造体
Locale
は地域や言語情報に依存した日付や通貨、数値などを表現するための構造体です。地域や言語はxx_XX
形式の文字列(言語識別子)で表現され、xx
で言語をXX
で地域を指定しています。jp_JP
は日本語(jp)の日本(JP)となります。
例えば日付の表示をロケールによって切り替えたい場合は以下のように指定します。
let dateFormatter = DateFormatter()
let currentDate = Date()
dateFormatter.locale = Locale(identifier: "en_US")
dateFormatter.dateStyle = .medium
let englishDate = dateFormatter.string(from: currentDate)
print("English: \(englishDate)") // Nov 12, 2023
dateFormatter.locale = Locale(identifier: "ja_JP")
dateFormatter.dateStyle = .medium
let japanDate = dateFormatter.string(from: currentDate)
print("日本語: \(japanDate)") // 2023/11/12
言語識別子:BCP 47とは?
ロケールで指定する文字列はIETF(Internet Engineering Task Force)の BCP 47という仕様に基づいた言語識別子を使用します。
使用できる言語識別子の一覧は以下のページに記載されているようです。
公式リファレンス: Language Subtag Registry
Swiftでも使用可能な識別子を取得できました。
let identifiers = Locale.availableIdentifiers
print(identifiers)
// ["bas_CM", "sq_MK", "kaj_NG", "ca_AD", "ar_LB", "dsb_DE" ・・・]
Localeインスタンスの生成
特定のロケールのLocale
インスタンスを生成するにはinit(identifier:)
に任意のロケール言語識別子を渡します。
Locale(identifier: "en_US")
// en_US (fixed)
デバイスで設定されている「言語と地域」を取得する方法
iPhone端末で「設定アプリ(Settings)」>「一般(General)」>「言語と地域(Language & Region)」で設定されているロケールを取得するにはLocale
構造体のcurrent
プロパティを使用します
Locale.current
// ja_JP (fixed)
またLocale
構造体のpreferredLanguages
プロパティを使用することで設定されている全てのロケールを配列形式で取得することができます。
Locale.preferredLanguages
// ["ja-JP", "en-JP"]
Locale同士の比較
取得したデバイスのロケール値に基づいて処理を分岐させようと以下のようにコードを記述しましたが期待通りに動作しませんでした。
print(Locale.current)
print(Locale(identifier: "ja_JP"))
if Locale.current == Locale(identifier: "ja_JP") {
print("日本です。")
} else {
print("日本以外です。")
}
// ja_JP (fixed)
// ja_JP (fixed)
// 日本以外です。
デバイスのロケールは日本になっており、print
した値も違いはないように見えますが比較するとfalse
になるようです。これを防ぐにはidentifier
プロパティで比較することで期待通りの実装にすることができました。
if Locale.current.identifier == Locale(identifier: "ja_JP").identifier {
print("日本です。")
} else {
print("日本以外です。")
}
// 日本です。
またもしデバイスの設定で暦法などを西暦から和暦などに変更すると取得する識別子はja_JP@calendar=japanese
のようになるので注意してください。
Locale(identifier: "ja_JP").identifier // ja_JP@calendar=japanese
アプリを多言語化する方法
リリースしたiOSアプリを日本だけでなく海外ユーザーにも使用してもらいたい場合はLocalization(多言語対応)をしておく必要があります。詳細な流れは以下の記事を参考にしてください。
その際には申請する際もやるべきことがあるので注意してください。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。