[iOS] ゼロから始める!簡単!多言語対応!

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

みなさん、多言語対応はしていますか?
大変そうに見えて、ちょっと躊躇してしまいますよね...

実際に僕もやってみたのですが、日本語の情報が少なくて導入部分で苦労したので、記事を書いてみることにしました。

簡単な導入のみなので、詳しいテクニックは後で紹介する参考サイト等を見てもらうといいと思います。

タイトルは若干つりです(๑>؂<๑)Շ^✩

多言語対応とは

端末本体の設定言語によって、アプリ内の文字列をその言語に合わせて表示することです。
日本人以外の人にも使ってもらえるようになるので、ぜひ対応したいですね!

完成形は以下のようになります。

Localizable.strings(Base)
"welcome" = "Hello, World!";
"name" = "Your name is %@.";
"numbers" = "one: %d, two: %d";
"words" = "one: %1$@, two: %2$@";
Localizable.strings(Japanese)
"welcome" = "ハローワールド!";
"name" = "あなたの名前は %@ です。";
"numbers" = "壱: %d, 弐: %d";
"words" = "弐: %2$@, 壱: %1$@";
viewController.swift

override func viewDidLoad() {
    super.viewDidLoad()

    let myName = "sim"

    print(NSLocalizedString("welcome", comment: ""))
    print(String(format: NSLocalizedString("name", comment: ""), myName))
    print(String(format: NSLocalizedString("numbers", comment: ""), 10, 20))
    print(String(format: NSLocalizedString("words", comment: ""), "Apple", "Mac"))
}

結果(日本語以外の環境)

console
Hello, World!
Your name is sim.
one: 10, two: 20
one: Apple, two: Mac

結果(日本語環境)

console
ハローワールド!
あなたの名前は sim です。
壱: 10, 弐: 20
弐: Mac, 壱: Apple

多言語対応を始める前に

多言語対応を始める前に知っておきたいことがあります。
それは、外国語には””複数形””の存在があることです。
こいつがなかなか厄介(情報が少ない)なのですが、ちゃんと対応しましょう。

また、日付のフォーマットや通貨のフォーマットなどは今回紹介する方法ではなく、Formatterを使った方がいいです。ここら辺はNSDateFormatterNSNumberFormatterについて調べてみてください。

ちなみに、Storyboardのローカライズは言語ごとにStoryboardが複製されてそれぞれいじる必要が出てくるなど大変なので、僕はすべてコードでいじります。
なのでStoryboardのローカライズについては書けません...

多言語対応を調べるときに参考になったサイト

(@mono0926 さんは多くの良記事を書いているすごいお方なので是非フォローしましょう)
iOSアプリの国際化対応の勘所とTips集(Swift版) - @mono0926
Xcode 6で導入されたstringsdictファイルを使って、イケてる複数形多言語対応 - @mono0926
iOS Developer Library - Localizing Your App
iOS Developer Library - Stringsdict File Format
iOS Developer Library - String Format Specifiers

多言語対応を使う時に便利なやつ

questbeat/Lin

多言語対応の方法

今回紹介する多言語対応の方法はstringsファイルを用いたものを紹介します。

stringsファイルの仕組み

完成形で見てもらっているように、Localizable.stringsにキーとなる文字と表示させたいものを書きます。
Localizable.stringsはファイルが各言語ごとに分けることができます。
これを対応したい各言語ごとに用意して、NSLocalizedStringでキーを指定することによって端末の設定言語に自動で判定して文字を入れてくれます。

手順1 stringsファイルを追加する

新規ファイル作成よりLocalizable.stringsファイルを追加します。
手順1.png
手順2.png

手順2 stringsファイルをLocalizeする

右側のLocalize...ボタンを押す。
選択はBaseでOK
手順3.png
手順4.png

手順3 アプリの対応言語を増やす

プロジェクトの設定のLocalizationsの+ボタンから追加したい言語(今回はJapanese)を選択する。
手順5.png

チェックボックスはLocalizable.stringsのみ選択する。(Storyboardのlocalizeはこの記事では説明しない)
手順6.png

こうなっていればOK
手順7.png

手順4 stringsファイルに記述する

今回は本体の設定言語がJapaneseの時はLocalizable.stringsが利用され、それ以外はBaseの方のLocalizable.stringsが使われる。
(BaseはデフォルトでEnglishになっているが、このままいじらない方が良い)

つまり、設定が日本語の時表示したい文字をLocalizable.strings(Japanese)ファイルに記述し、またそれ以外のLocalizable.strings(Base)ファイルに記述する。
(記事上部の完成形参考)

フォーマット

stringsファイルのフォーマットは以下のようになっています。

Localizable.strings
"キーとなる文字" = "表示したい文字(とフォーマット)";

swiftを触っていると普段セミコロンを使わないので、書き忘れがちなので注意!!

代表的なフォーマット文字列

以下のようなフォーマット文字列を使って、String(format: _, arguments: _)と組み合わせることによって表示したい文字の中に変数の値を入れることができます。

フォーマット
String %@
Int %d
Double %f

もっと詳しく知りたい時ならこれを参照
iOS Developer Library - String Format Specifiers

他にも、%の直後に1$2$をつけることで、引数の順番を選択できたり、数字の小数点以下の数の指定等もできます。

手順5 使う

使いたい場所でNSLocalizedStringを使いましょう。

~.swift
// 変数を入れない場合
NSLocalizedString("キーとなる文字", comment: "")

// 変数を入れたい場合
String(format: NSLocalizedString("キーとなる文字", comment: ""), 変数1, 変数2, ...)

複数形対応の方法

複数形への対応にはstringdictファイルを用います。

stringdictファイルの仕組み

Localizable.stringsファイルと違う点として、フォーマット文字列で受け取る数字が'0'なのか'1'なのか'2'なのか、少なめなのか、多めなのか、それ以外なのかを判定して文字列を分けることができるようになります。

手順1 stringsdictファイルを追加する

新しくファイルを追加する。
追加するのはPropertyListファイルだが、名前はLocalizable.stringsdictとする。

スクリーンショット 2016-05-02 17.02.35.png

できたファイルはLocalizable.stringsdict.plistとなっているので、plistの部分を削除する!!

手順2 stringsdictファイルをLocalizeする

stringsファイルと同様Localize...ボタンよりBaseでローカライズする。
スクリーンショット 2016-05-02 17.04.16.png

スクリーンショット 2016-05-02 17.04.25.png

手順3 stringsdictファイルの言語を増やす

先ほどLocalized...ボタンがあった辺りにLocalization欄が追加されていると思うので、そこからJapaneseにチェックを入れる。

スクリーンショット 2016-05-02 17.04.39.png

こうなっていたらOK
スクリーンショット 2016-05-02 18.27.32.png

手順4 stringsdictファイルに記述する

list形式よりコード形式の方がいじりやすいので、Localizable.stringsdictファイルを右クリックからのOpen asからSource Codeを選んで開いてください。
stringsdictファイルは以下のような形式で記述します。

Localizable.stringsdict(Base)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>key1</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@apples@</string>
        <key>apples</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>an apple</string>
            <key>other</key>
            <string>%d apples</string>
        </dict>
    </dict>
    <key>key2</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@goods@</string>
        <key>goods</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>one</key>
            <string>%d GOOD</string>
            <key>other</key>
            <string>%d GOODS</string>
        </dict>
    </dict>
</dict>
</plist>
Localizable.stringsdict(Japanese)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>key1</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@apples@</string>
        <key>apples</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>other</key>
            <string>%d 個のリンゴ</string>
        </dict>
    </dict>
    <key>key2</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@goods@</string>
        <key>goods</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>other</key>
            <string>%d いいね</string>
        </dict>
    </dict>
</dict>
</plist>

コードの説明

  • <key>key1</key>
    これはstringsファイルの"キーとなる文字"と同じです。

  • <key>NSStringLocalizedFormatKey</key> <string>%#@apples@</string>
    これは、%#@apples@の部分が変数のようなものと考えてください。この後で各変数の設定をしていく感じです。

  • <key>apples</key> <dict> ... </dict>
    ここのdictの中に設定を書いていきます。

  • <key>NSStringFormatSpecTypeKey</key> <string> ... </string>
    これはそのまま写しましょう。

  • <key>NSStringFormatValueTypeKey</key> <string> ... </string>
    これは引数の型のフォーマットを書きます。ほぼInt型だと思うのでdと書いておきましょう。

  • <key>one</key> <string> ... </string>
    ここに引数の数が1だった時の表示したい文字(フォーマット)を書きます。

  • <key>other</key> <string> ... </string>
    ここに上記以外の時の表示したい文字(フォーマット)を書きます。

<key>one</key>の他にもzero, two, few, manyなどがあります。
使えるキーは言語ごとに異なっています。
Language Plural Rulesに各言語対応表がありますので確認しましょう。
ちなみに日本語はzerootherのみ使えるそうです。

手順5 使う

Localizable.stringsの使い方と変わりません!!

~.swift
String(format: NSLocalizedString("key1", comment: ""), 1)
String(format: NSLocalizedString("key2", comment: ""), 6)

わかりにくいところ、間違っているところがあればコメントください!
また、ちゃんと使うためにも参考サイトは一度目を通しておいたほうがいいと思います。

サンプルプロジェクトをGithubにあげました!!
simorgh3196/LocalizationSample