国際化対応したiOSアプリの作成ー第1回(全体の流れと準備)
日本市場はいずれは縮小していくだろうし、日本に来る外国人も増えている。アプリを作るなら国際化対応させたいというのが作成者の願いだろう。
今回から数回に分けてiOS(Swift 4.x + Xcode 10.x)の国際化対応アプリ作成についてまとめたい。
第1回の今回は国際化対応アプリ作成の全体の流れと、最初にすべき準備について記す。まずは日本語のアプリを作ってそれを各国語に対応させるという前提である。(日本語ネイティブの人なら殆どそうするだろう・・・。)
必要なもの
当然、Xcode 10.xが走るMacが必要である。インストールして使えるようにしておく。
もう一つはVisual Studio Codeである。別にこれでなくてもいいのだが、Xcodeのプロジェクトファイル内にあるテキストファイルを操作するのにやりやすいのである。
全体の流れ
大まかな手順は以下のようになる。
- プロジェクトファイルの開発言語を日本語にする。
- 動的に変更するStringをNSLocalizedStringで実装し、UIを完成させる。
- 動作確認用のXcodeのSchemeを作成する。
- 上記NSLocalizedStringのKey(ラベル)とValue(日本語)をLocalizable.stringsに書き出す。
以上で日本語版プロジェクト作成は完了。
「国際化対応」つまり各国語へのローカライズは日本語版がほぼ完成してからの方がいいだろう。
この後は各国語に対応させる、ローカライズ作業をする。その流れは以下のようなものである。
- 対応言語をプロジェクトに追加する。
- ローカライズ用xliffファイルをExport。
- xliffファイルの中身を翻訳する。(してもらう。)
- 翻訳後のxliffファイルをImportする。
- XcodeのSchemeをローカライズ用に編集、動作確認をする。
この言語対応プロセスを言語毎に実行すればよい。
最初の一手
まず普通にXcodeを起動し、必要なテンプレートでプロジェクトを作成する。
老婆心ながらgitはチェックしてバージョン管理をしないと、国際化対応では失敗したときに後戻り作業がパニックになるので必ずチェックしておくことをお勧めする。そしてこまめにコミットする。
Xcodeではプロジェクトファイルを右クリックして中央のペインの左端でPROJECTを選択すると下の方にLocalizations、さらにその階層下にLanguageという項目があり、それがEnglish — Development Languageになっていることを確認する。
そしてすぐにXcodeを止め、今作成したXcodeのプロジェクトファイルを右クリックしてコンテキストメニュー出し「このアプリケーションで開く」からVisual Studio Codeを選択する。
Visual Studio CodeではWindowが開くので左ペインの一番下に現れているファイルproject.pbxprojを選択する。
右ペインにカーソルを移動してコマンドfで検索ボックスを出し、そこにregionと打つと次のようなテキストが現れる。
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
この二つのenをjaに変え、セーブしてVisual Studio Codeを止める。
Xcodeでプロジェクトを開き直し、プロジェクトファイルをクリックすると先ほどのLanguage項目の中身がJapanese — Development Languageになっているのが確認できるはずである。
この項目を英語のままにしておくと、本当に英語対応させたくなったときに「すでにBaseで使われているのでダメ」というエラーでスタックする。もちろんen-USなどと地域まで指定すればできるが、それは本意ではないだろう。
とにかく使用言語とリソース類を正しく対応させることが「国際化対応」の基礎である。
今回の場合、まず日本語版を作ってから各国語へのローカライズをするというシナリオを前提としているのでこうなったが、最初に英語版を作成しておいて、それから日本語版を各国版の一つとして作成する場合にはこのステップは言うまでもなく不要である。
まとめと次回予告
今回はiOSアプリの国際化対応の準備まで行った。実はここまではSwiftでもObjective-Cでも同じである。
次回はソースコードの「国際化対応」について書く予定。マクロのNSLocalizedStringを使うのでこれも実際にはObjective-Cでもパラレルに実施できると思う。ただサンプルコードにはSwift 4.2を使う。
またAndroidとの共通化についても触れたい。