NSLocale.preferredLanguages()を使わずに日本語環境か判定する (try! Swift Conference Appから)

  • 12
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

try! Swift Conference Appのソースをのぞいてみた

try! Swift Conference AppがGithubで公開されていて、ソースを少し覗いていたのですが、
ソースコード見ていて「こういう判定の仕方があったんだ」、と気になったので投稿させていただきました。特に目新しいものではないですが。。

端末の使用言語が日本語かどうかの判定をしている記述があって、よく見てみると
NSLocale.preferredLanguages()を使わずに判定していました。

今まで見てきた日本語判定の実装

だいたい色々な記事をみても、NSLocale.preferredLanguages()を使って、

よくある判定、iOS9問題を考慮したもの
func isJapanese() -> Bool {
    if let language = NSLocale.preferredLanguages().first?.componentsSeparatedByString("-").first {
        return language == "ja"
    }
    return false
}

print(isJapanese())

こんな感じで判定しているものが多いです。
特に、iOS9になってから、このNSLocale.preferredLanguages()で取得できる文字列は必ずしもjaになるとは限らず、ja-JP、ja-USとなる可能性もあり、iOS9の登場の際は騒ぎになりましたね。
回避するためにも、一度"-"を区切り文字としてバラして、先頭の文字列を比較する、といった手法がベストなんじゃないかなって感じで落ち着いたかと思います。

try! Swift Conference Appでの日本語判定の実装

try! Swift Conference Appでは、

try!SwiftConferenceAppでのisJapanese
let isJapanese: Bool = {
    if let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String {
        return languageCode == "ja"
    }
    return false
}()

//e.g. (ソースより一部抜粋)
cell.textLabel?.text = isJapanese ? "try! Swiftについて" : "About"

と、currentLocale()から、 objectForKeyメソッドで NSLocaleLanguageCodeを指定して取得した文字列が"ja"かどうかを判定しているみたいです。
試しに使用言語を日本語→英語に切り替えて、try! Swift Conference Appを起動してみましたが、バッチリ英語表記に変更されていました。
これならiOS9で生じた問題(返ってくる文字列がja-JP、ja-US)を考えずに済みそうですね。
また、isJapaneseを関数ではなく、クロージャの即時実行を用いて変数として定義しているので、使用するときも、

  • × : isJapanese()
  • ◯ : isJapanese

といった形で、いちいち()を書かなくて済むようになっています。

今のところ単純に使用言語が日本語かどうかを判定するだけにおいては差はないと思っていますが、
こういう時に違う結果になってしまう、という事象がある場合をご存知の方がいらっしゃったら教えて下さい。自分は(おそらく)日本語かどうかの判定だけだったら差異はないと信じてます。

さいごに

try! Swift Conferenceに行く方も行かない方も、是非一度ストアに並ぶ前にプロジェクトに触れてみるのもいいかもしれませんね!
リポジトリをcloneして、プロジェクトのルートディレクトリでpod installすればすぐに試せますので是非。

参考