12/16 の記事を @jarinosuke が書かせて頂きます。
Localization
多言語対応のアプリを作る時に大変になるのが、全ての言語リソースが用意できた後で、それらを適用したアプリのテストやデバッグです。
大抵の言語は英語より長くなってしまうので、文言が予期せぬかたちで truncate されたりビューのレイアウトが壊れていたりと、単純に言語リソースを用意すれば御終いというわけではありません。
そこで今回は多言語対応を行う際の助けになるであろう手法の一つとして、Launch Arguments を用いた賢いデバッグ方法を紹介します。
Launch Arguments とは?
Launch Arguments を設定することでアプリの実行中のみ、指定した argument で現在の設定状態を上書きしてくれます。
デバッグやテスト時などに設定をすることで効果を発揮します。
設定は Xcode の Scheme 毎に行うことが出来ます。
具体的な方法はプロジェクトを開いて、左上の Scheme 選択ドロップダウンメニューから Edit Sceheme… を選択します。
指定は先頭に-を置き、そのキー名をスペースを入れずに指定、その後スペースを一つ開けた後に渡したい値を設定します。
Core Data の SQL 出力などがLaunch Argumentsでは有名ですが、実は NSLocalizedString でも便利なものが隠されています。
Arguments
3つほど Localization に関する argument を紹介します。
AppleLanguages
他言語リソースでの表示を確認する時に、実機や iOS Simulator の設定から言語を切り替えていませんか?
-AppleLanguages (ja)
上記の用に()内に確認したい言語を指定することで、iOS の設定とは独立して言語リソースを設定することが出来ます。
NSDoubleLocalizedString
プロジェクト開始当初は仕様書には英語や日本語で記されているだけで 、多言語リソースは揃っていないのが普通だと思います。
しかし英語や日本語だけを考えてビューのレイアウトを考えてしまうと、いざ多言語リソースが来た時に大変な事になりかねません。
そんな懸念に対して、 NSDoubleLocalizedString が面白い仕組みを提供してくれています。
-NSDoubleLocalizedString YES
上記のように設定すると、NSLocalizedString で設定している文言全てが2倍の長さに変更されます。
これにより、プロジェクト開始時から多言語リソースを想定した2倍の長さの文言にまでは対応できます。
NSShowNonLocalizedString
多言語対応するうえで、一番怖いのが言語リソースの抜け落ちです。
言語リソースの準備は担当する開発者以外が行う事が多く、受け取ったExcelなどのファイルを Localizable.string に反映したりすることが多いと思われます。
そのような行程が多いせいか、特定言語のみ文言に Localizable.string のキー名がそのまま露出してしまう事故が起きたりする事もあります。
厄介なのがアルファベットだけで構成され意味が分からない言語同士だと、目で確認してもなかなか抜け漏れに気付きにくい点です。
-NSShowNonLocalizedString YES
上記のように設定すると、抜け落ちている文言を全て大文字にして表示してくれます。なので既に設定されている文言よりは目立つようになり気付きやすいというわけです。
しかし、そもそもの Localizable.string の key を全て大文字で定義してしまっていると、全く効果は得られません笑。
まとめ
上記のように Localization のための便利な機能も提供されているので、積極的にグローバルなアプリケーションを作って行きましょう。
ちなみに Localization のための Mac アプリもいくつかあり、僕は Linguan を使っていますが非常に便利なのでオススメです。
参考
iOS Debugging Magic(Apple Documentation)
Launch Arguments & Environment Variables(NSHipster)