5名のエンジニアが登壇しました。この記事では松岡(@matsuokah_)の「多言語対応と戦う2019年版」のセッションについて高橋(@tomosan_dev)がご紹介します。多言語対応って本当に必要?多言語対応は1つの国で利用されるアプリならば極論多言語対応は必要ではないですが、世界各地で利用されるアプリを開発するには必要です。アプリのソースコードに対象言語を直打ちするのではなくコードからラベルなどに注入したい場合に有効と言えるでしょう。基本的なローカライズ方法.stringsファイルを作るローカライズの基本として言語対応するためにそれぞれの言語で.stringsファイルを作成します。以下の例は日本語と英語に対応するために作成するファイルたちです。このときのポイントとして「app.world」のようにネームスペースを利用することで単語の整理に役立ちます。共通の単語についてもまとめておくことで複数定義しなくて済むと思います。ローカライズをタイプセーフに行おう上記のようにしてローカライズを行うことができます。このコードはNSLocalizedStringのkey名をわざわざ.stringsファイルから確認しなければならない上にタイプセーフではありません。そこでSwiftGenやR.swiftなどのライブラリを使うことで解決できます。松岡のセッションではSwiftGenを用いた方法が紹介されています。SwiftGenのコードテンプレートはデフォルトだと以下のようなコード生成になります。簡単にアクセスでき、タイプセーフただしデバッグ用の文言や、文言整理の観点からファイルを分けたい場合、L10nのenumが競合してしまいます。そこでSwiftGenのstencilをカスタムすることでL10nをextensionとして定義し、競合を防ぐことができます。“AppleLanguages”)を利用して言語変更機能を実装しておく必要があります。このプロパティは配列で返却されるので一番先頭の要素の言語がアプリに適用されます。複数形の単語のローカライズXcodeのファイル生成からStringsdictファイルを生成します。StringsファイルとStringsdictファイルは同じkey名が存在するとStringsdictの方から読まれるのでStringsdictの方には複数形に対する分岐を記述します。SwiftGenではとりあえず、keyとなるapp.apple.sentenceをつくっておきます。その後Stringdictファイルを構成したのが上記です。(発表資料でも言及されています)NSStringLocalizedFormatKeyに指定されたものが最初に読み込まれます。この場合はsentenceです。otherのときに複数形を分岐することができます。装飾する際の範囲をNSRangeの直指定に気をつけるローカライズを進めていくと必ず文章の長さは変わっていきます。文字の装飾にはNSAttributedStringを利用しますがrangeに直接数値をいれてしまうと装飾範囲にずれが出てくるので気をつけなければなりません。そこで、range(of:)を利用してローカライズされた文字を引数に渡して範囲すると良いでしょう。翻訳SaaSを利用して多言語対応をスムーズにCrowdinという翻訳SaaSを利用することで多言語対応がスムーズに行えます。Github連携しておくことで翻訳者さんにPRを出してもらい、本体コードにマージすることができて便利です。翻訳がすべてとは限らず国によってその国の意訳などもあるので注意は必要です。AssetもローカライズするWWDC2019でも発表されましたがXcode11で画像のローカライズができるようになりました(13:00あたり)。Localize.stringsファイルを分けたり、ネームスペースをしっかり区切ることで解決しています。対象プロパティのdidSetでコードから注入しています。サーバーから取得した文言についてはどういう対応をしていますか?→サーバー側でローカライズされているが将来的にはhttpHeaderのaccepted-languageを参照してクライアントから注入していきたいと考えています。多言語対応でUIが崩れてしまうのではないですか?→実際に困っていますが、現地の方に様々な表現方法を聞いてUI対応しています。ネームスペースの判断基準はなにかありますか?→予期せぬ変更で他のコンポーネントの文言が変わってしまう可能性があるので文言はまとめすぎないことは意識しています。まとめ今回のセッションを聞いて自分自身が知らなかったStringdictや多言語対応するためにいまからしておくべきことなどが明確になったと感じました。みなさんも多言語対応を意識してまずは第一言語からでも実践してみませんか?ぜひ参考にしてみてください。iOSiOSDCSwiftカンファレンスtomokitakahashi2019年新卒入社。CAmotionにてiOSアプリ開発に携わっています。