[iPhone] 多言語対応、Localizationの設定

アプリを他言語で表示するためにはLocalizationの設定が必要です。Localizationはstoryboardを分けてレイアウトを個々に作成したり、レイアウトはそのままで言語のみを変更したりできます。アプリ名の変更も他言語化できます。

このLocalizationは変更が毎回微妙にあるのでいつも悩みのタネではあります。

English

日本語

Swift 4.0
Xcode 9.2

 

Localization

 
Localizationとはアプリを各国の言語に合わせることです。英語圏では英語でラベルを表示させ、日本語圏では日本語のラベルにするわけです。通常デフォルトとしては英語にしておいて、日本語圏のみ日本語にする、それ以外は英語というのが簡単です。
 
もちろん翻訳を入れ込んで各言語に対応することもできます。(もっとも国や地域によっては英語にしないと無理な場所もあります)
 

 

Localizationの追加

 
Xcodeの「PROJECT」(TARGETではありません)「Info」に
Use Base Internationalization」がありチェックされていると思います。
 

 
Development Language (Base)はdefaultでEnglishが設定されています。
「+」から追加したい言語を選びます。

 

 
例えば日本語を追加します。
ローカライズするファイルの選択ですが「Main.storyboard」を選択。
 

 
File Typeの設定をしますが、開発方法によって選びます。

  • Interface Builder Storyboard
    • storyboardのレイアウトが異なるものを作りたい場合、英語と日本語での文字幅が異なってレイアウトを変える必要があるなど
  • Localizable Strings:コードで全て記述したい場合はこちら
    • レイアウトは同じで表示言語だけ変えたい場合など


 
この設定は後からでも可能です。レイアウトはstoryboardを使わずコードで記述する場合は適当で大丈夫です。
 
これでEnglisの下に「Japanese」が追加されました。
 

 
プロジェクト内のファイルを見てみると「 ja.lproj 」フォルダーが新しくでき、その中にファイルが2つあるのがわかります。
 

 

 

Localizable.strings

 
Localizable.stringsファイルを作成します。これは翻訳したいKeyワードを登録しておくファイルになります。

例えば、Localizable.strings(Japanese)というファイルに
“hello” = “こんにちは”;
と記述するとダウンロードされた端末が日本語のときに「hello」が「こんにちは」に変換されます。
設定例:

Localizable.strings(Base) key Localizable.strings(Japanese)
“hello” = “Hello”; ←hello→ “hello” = “こんにちは”;

 
作成:
「New」「File…」「New」から「Strings File」というのを探します。
iOSのResourceにあります。検索した方が早いかもしれませんが…
 
 
Localizable.stringsというファイル名にして「Create」します。
ファイル名はLocalizable.stringsにするとdefaultになります。カスタムで名前を設定できますが、table名として呼び出しで指定しないといけません。
 

 
ファルが作成されました。
 

 
このファイルを選択した状態でInspectorを見るとLocalizationの下に「Localize…」というボタンらしきもの?がありますのでクリック(白いボタンですがクリックすると青くなる)
 

 
Japaneseを選択して「Localize」をクリックすると「Japanese」がLocalizationにできました。
 

 
ここで「Base」にチェックを入れるとLocalizable.stringsの下に
Localizable.string(Base)
Localizable.string(Japanese)
ができます。
 

 

Localizable Stringsの変換

 
テーブルの設定

 
Localizable.strings (Japanese) を選択して以下のように書き込みます

 
同様にLocalizable.strings (Base)を選択して以下のように書き込みます

 
これらを呼び出すためにはNSLocalizedStringを使います。

  • key:キーワードです。これを元に翻訳
  • tableName:Localizable.stringsはdefaultのテーブルになります。異なるABC.stringsのようなファイルを作った場合そのテーブル名(ABC)を指定します。
  • bundle:stringsを含めたbundle
  • value:keyに合うものが見つからない場合に表示するもの
  • comment:コメント

keyとcommentだけとして省略可能できます。
 
ViewController.swft

 
これで実行させて見ると、
結果Log
Japanese:

 
Base:

 
Xcodeのsimulatorでは言語設定はSchemeから変更できます。(アプリ名以外)
 
「Product」「Scheme」「Edit Scheme」
Run, Option からApplication Languageを変更することにより対応言語を変更できます。
Baseに設定しましたので、Japanese以外の言語では全てBaseの設定が適応され、Englishを選んでも問題なく英語で表示されます。
 

 

storyboardの変換

 
最初のLocalizeでMain.storyboardの選択で
Localizable Stringsを選択した場合は
Main.sttrings (Japanese)には何もありません
 

 
Main.storyboard (Base)にLabelを1つ置きます。
 

 
これでMain.storyboard(Japanese)のFile TypeをInterface Builder Storyboardに変更し「Convert」すると
 

 
ストーリボードが表示されました。BaseのLabelと同じLabelが見えます
 

 
Main.strings(Japanese)からLocalization設定が見えない場合は
上位のMain.storyboardから見えるかもしれません
 

 
これで、BaseのstoryboardとJapaneseを別々に変更できます。
 
Base:

 
Japanese:

 
Base側での変更はJapanese側には反映されませんので注意

Launch Screen:
ところで同じように Launch Screen もLocalizeしたいのですが
”Avoid including text on your launch screen. Because launch screens are static, any displayed text won’t be localized.”
Ref: Launch Screen – Icons and Images – iOS Human Interface Guidelines
とあるように今のところでオフィシャルにはきないということでしょうか。

https://stackoverflow.com/questions/30079257/how-to-localize-launch-screen/45436837#45436837のようなworkaroundもケースバイケースでできるようですが、どうでしょう?

 

アプリ名をローカライズ

 
アプリの名前は今までと多少異なります。アプリ名はInfo.plistで設定できますが、これを今まで通りにローカライズするとエラーになります。別のファイルInfoPlist.stringsを作ります。

  • Info.plist:CFBundleDisplayName = “App”を設定
  • InfoPlist.strings:CFBundleDisplayName = “アプリ”を記述

Info.plistを開いてCFBundleDisplayNameを新しく入力し名前「App」を入れます。
ファイルに書き込むと

 
Xcodeからみると


 
次にInfoPlist.stringsを「New」「File…」「New」「Strings File」から作成します。
 

 
Localizable.strings と同じようにして
Licalizationボタンをクリックして「Japanese」でローカライズします。
 

 
InfoPlist.stringsに
CFBundleDisplayName = “アプリ”;
記述します。(keyは””がいりません、セミコロンも忘れずに)
 

 
これで出来上がりですが、この場合のテストはsimulatorの場合はSchemeは使えません、通常のiPhoneでの言語設定と同じように、simulatorの「設定」から変えます。
 

 

 

CollectionViewのLocalize

 
こちらのCollectionViewをローカライズしてみます。

  • Base(English)
    • 名前を英語
    • 名前の背景色を半透明グリーン
  • 日本語
    • 名前を日本語
    • 名前の背景色を半透明ピンク

Localizable.strings (Base)

 
Localizable.strings (Japanese)

 
名前を変更しますが、CollectionViewなのでCellによって変わるところに NSLocalizedString を使います。
ViewController.swift

 
後は、それぞれのストーリーボード上でラベルの背景色の変更をします
 

Baseのstoryboard


 

Japaneseのstoryboard

 
最終的にこのようになりました。
 

 

 
 
References:
NSLocalizedString(_:tableName:bundle:value … – Apple Developer
Internationalization and Localization for iOS – Apple Developer
Localizing Your App
誤字脱字、意味不明などのご意見は 謙: e-mail まで
ブックマークしておくと便利です このエントリーをはてなブックマークに追加
Twitter:




ページのトップへ戻る

シェアする

  • このエントリーをはてなブックマークに追加

フォローする