【Swift】Locale構造体の使い方!デバイスの「言語と地域」を取得する方法!

この記事からわかること

  • Locale構造体使い方
  • Swiftデバイスの「言語と地域」の取得するには?
  • preferredLanguagesプロパティとは?
  • ja-JPen-JPとは?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Locale構造体

公式リファレンス: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(多言語対応)をしておく必要があります。詳細な流れは以下の記事を参考にしてください。

その際には申請する際もやるべきことがあるので注意してください。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index