Swift 4 の iOS アプリでローカライズ版(多言語対応)にトライしてみる

iOS アプリでの多言語対応のために、XCode上での操作で必要なことについて調べてみる。

以下サイトがわかりやすく書いてあるので、以下サイトに書いてなかった部分(主に初歩的な所)でとまどった部分についてのメモ。
iOS Localization チュートリアル


ローカライズ対象は二種類あって、Storyboard で生成したコンポーネントに対するローカライズと、コード上で生成することのある文字列(たとえば通知用のメッセージなど)に対するローカライズ。

最初にプロジェクトの設定をするところがあるけれど、ニワカな自分はここで躓いた。

プロジェクトツリーのプロジェクト(左のペインのツリーの一番上)を選択した状態で Identity → Display Name などのプロパティを設定する画面の場合は以下の項目を選択して、Targets ではなく Project 配下にあるプロジェクトを選択する。

もしくは以下の順番で選択した後に表示される一覧から PROJECT 配下の項目を選択する。

基礎的なツールの使い方とか理解せずに(あるいは読み飛ばして)開発を始めると躓く事例ということで・・・。

その後 Localizations にある ” + ” を選択して、対応させたい言語を一覧から選択する。

この後、対象とする Storyboard の選択画面が出て、Main.Storyboard を選択すると選んだ Storyboard に関する必要なファイルが自動で生成される。

ここで生成されるファイルには、指定した Storyboard が既に持っているコンポーネントに関するローカライズ対応用文字列が自動で抜き出されるけれど、一度生成された言語用ファイルにはその後追加したコンポーネントについては自動で追記はされないようです。

なので、たとえば英語版として一通りの部分が作成完了したのちに、日本語版対応としてこの操作を行えば、多言語対応に必要な準備は一度で済む。そうでない場合は、コンポーネントを追加するたびに文言を別途手作業で言語の定義ファイルに追加していく必要がある模様。

将来的な XCode のバージョンで対応されそうな気がしないでもないですが。

ここまでが Storyboard のコンポーネントに対する多言語対応の流れ。

コード上で指定したりする文字列文言に関しては、プロジェクトにファイルを追加して対応する。File → New → File…

プロジェクトに新規ファイルを追加する際に、一覧の下の方にある Strings File を選択。その後に指定するファイル名を「Localizable」にする。そういう決まりの模様。そうするとプロジェクトには Localizable.strings というファイルが追加される。


中身を見ると以下のようなファイルなので、あとは順次コード上で多言語対応したい文字列について追加をしていくと。


書き方としては

"label name" = "メールアドレス";
"button name" = "登録";

という感じで、各行の最後に ” ; ” セミコロンを書かないとビルド時に以下のエラーになる。

Localizable.strings:0: error: read failed: The data couldn’t be read because it isn’t in the correct format.


呼び出す場合は NSLocalizedString(key: String, comment: String) で呼び出す。
たとえば Localizable.strings に

"sample" = "サンプル";

の行があったとすると

print(NSLocalizedString("sample", comment: ""))

で指定して、表示は

サンプル

になる。

comment はいつ使うんだろう・・・。

Web で NSLocalizedString を検索して辿れるヘルプだと
NSLocalizedString (公式)

The comment to place above the key-value pair in the strings file.

と書いてあって、コメントは Localizable.strings 内に書かれるコメントを指すようだけど、鶏と卵な気がしてきた。
Localizable.strings は手動追加ではなく自動で生成(あるいは追加)できる方法があるならば、コードを読んで自動でコメントとして使ってくれるというのはわかるけど・・・。昔はできたとかかな?

NSLocalizedString 自体がマクロのようなので将来的には Swift のバージョンアップで置き換わるきがしないでもない。

フォローする