2012年7月1日日曜日

iOS ローカライズ

こんにちは, iOS の学習を着々と進めてまいりましたが, Android, Windows Phone と比べるとずいぶん手こずっています。

今回は, ローカライズです。普段, Webアプリも, スマフォアプリもEnglish を基準に開発していますが,
最終的には, 日本語版を作ります。 できれば他の言語でも出して, いろいろな方に使っていただけたら~。  ダウンロード数を増やしたい というのが本音です。

※先日, ColorDos というアプリを公開いたしました。無料ですので, よかったらダウンロードしてみてください。


ローカライズというのは

・ UI のローカライズ
・ 文字列(コード内)のローカライズ

もうひとつ アプリ名のローカライズというのがありますが, またの機会に。

UIのローカライズ

UIのローカライズですが, これは, Interface Buider で作成したUI , ボタンとか, ラベルとか 特に
動的にコードなどで変更しない, 部分のことを指します。

.xib   でも,  storyboard の場合でも方法はほぼ同じです。

とりあえず, UI を作っていきましょう。

UIを作成したのち, "View" -> "Utilities" -> "Show File Inspector" の順に選択します

すると, XCode の右側に "Localization" という項目が出てくるので, ここから言語を追加します。

そこから言語を追加します。


言語を追加すると, .xib, .storyboard のところに

・ .xib の場合

ViewController.xib(English)
ViewController.xib(Japanese)

・.storyboard の場合
MainStoryboard....board(English)
MainStoryboard....board(Japanese)


というように追加されます


それぞれが, その言語に対応したものになります。
ここで, それぞのUI の文字を変更すると, 実際に起動したときに言語に応じて, 表示が変わります



上が英語, 下が日本語( storyboard )

後でUI を修正する場合は, 先頭にある (言語名) なしのファイルを変更しましょう。これで, 他の言語ファイルにも UIの修正がいきわたります。


文字列(コード内)のローカライズ

こちらは, コードで取り出したり, 加工したものとかです。最終的には, UIに反映するでしょうが, 上と違い途中でコードから変更する場合です。

"New File" -> "iOS" -> "Resources" -> "Strings File" を選択しましょう

このファイルを Localizable.strings とでも名付けておいて, Supporting File の下にでも入れておきます。

先ほどの .xib や, storyboard と同様に,  "Localization" という項目が出てくるので そこで, 言語を追加します。

Localizable.strings(English)
Localizable.strings(Japanese)

のように言語ファイルが追加されました。

このファイルに "key" = "value"; という形式で, 使いたいkey と value のセットを作ります。


例)
"Hello" = "こんにちは";


※ "" と ; を忘れないように

これをコードから取り出すには, NSLocalizedString を使います

NSString *message = NSLocalizedString("Hello", nil);

第一引数が key で, 第二引数は, コメントです(いらなければ nil で)

上のファイルに, key, value のセットを追加すれば複数の値が利用できます。


※どうやら, 言語ごとにstoryboard が増えるという, 厄介なことを解決してくれる術があるようです。
(コードで全部入れないといけない気もしますが... )









2 件のコメント:

  1. Check Use single storyboard file for Base Internationalization in iOS 6 at http://forums.macrumors.com/showthread.php?t=1467446

    返信削除
    返信
    1. Looks nice. Every time we added new language resource, new story board is added automatically, and have to handle events(Drag & Drop UI to code) on all storyboard. Certainly, in your blog, it seems that we need to add all resources by codes. But it is easier than to handle all storyboard. Thanks.

      削除