mzgkworks

iOSを中心にプログラミング関係について書く

【Swift】Xcode6でiOSアプリの多言語・ローカライズ対応のまとめ

アプリ名・Storyboardで定義したUI・コードで定義した文言等を多言語化する方法のまとめ。
ベースを英語で作成し、日本語環境の場合にアプリ名・UI・メッセージ等を日本語で表示させる。

0. 共通処理

  1. Project -> Info -> LocalizationsでJapanese(ja)を追加 ※追加したい言語を選択
  2. 追加時に表示されるダイアログのStoryBoardとLaunchScreenのチェックはそのまま
  3. Main.storyboardにMain.strings(Japanese)が追加される
  4. LaunchScreen.xibにLaunchScreen.strings(Japanese)が追加される

1. アプリ名の多言語化

  1. Supporting FilesにInfoPlist.stringsファイルを追加

    • File -> New -> File...で、Strings Fileを選択する
    • ファイル名:InfoPlist.stringsとして、Supporting FilesのGroupに追加
    • InfoPlist.stringsを選択して、ユーテリティエリアのShow the File inspectorで、Localize...をクリック
    • 表示されたダイアログでJapaneseを選択し、Localizeをクリック
  2. InfoPlist.stringsファイルにアプリ名を追加

    • InfoPlist.stringsに以下を追記する
    • CFBundleDisplayName = "日本語の場合に表示したいアプリの名前";
    • 保存する

2. StoryBoardで定義した UIの多言語化

  1. Main.storyboard(Japanese)の変更
    • 中に書かれている各UIのタイトル等を表示したい文言に変更する
    • 保存する

※2015.7.23 追記
多言語化をした後(Main.strings(Japanese)を作成した後)でStoryBoardにUIを追加しても、自動でMain.strings(Japanese)へは反映されない。
標準機能で反映させる際は、ターミナルにて実行する必要がある。

# プロジェクトのBase.lprojまで移動する
$ cd AppTest/AnyLanguage/AnyLanguage/Base.lproj/

# ibtoolを使って、UI追加を反映したstringsファイルを作成する
$ ibtool Main.storyboard --generate-strings-file 任意の名前.strings

作成された.stringsファイルをXcodeなどで開き、追加したUIのコメントとキー値ペアを元のMain.strings(Japanese)にコピーして使用する。
ちょっと面倒なので、もしかしたらStoryBoar上では文字列は設定せずに、コードですべて設定して次の 3. の方法でやったほうがスッキリするかもしれない...

3. コードで定義した文言の多言語化

  1. Supporting FilesにLocalizable.stringsファイルを追加

    • File -> New -> File...で、Strings Fileを選択する
    • ファイル名:Localizable.stringsとして、Supporting FilesのGroupに追加
    • Localizable.stringsを選択して、ユーティリティエリアのShow the File inspectorで、Localize...をクリック
    • 表示されたダイアログでBaseを選択し、Localizeをクリック
    • Localizable.stringsを選択して、ユーティリティエリアのLocalizationでJapaneseにチェックをつける
    • Localizable.stringsにLocalizable.strings(Base)とLocalizable.strings(Japanese)の2つが追加される
  2. Localizable.strings(Base)とLocalizable.strings(Japanese)にKey項目を定義

    • 他言語したい項目(タイトルやメッセージなど)のキー項目を値を定義する
    // Localizable.strings(Base)
    "alertTitle" = "ALERT!!";
    "alertMessage" = "MESSAGE!!";
    // Localizable.strings(Japanese)
    "alertTitle" = "アラート!!";
    "alertMessage" = "メッセージ!!";
  1. 多言語化したい部分のコードを変更
    // 元のコード
    // アラートを表示
    let alert: UIAlertController = UIAlertController(title: "Hello", message: "Are You OK?", preferredStyle: UIAlertControllerStyle.Alert)
    // 対応後のコード
    // アラートを表示
    // NSLocalizedStringは、引数のkey:と#comment:以外はdefault引数なので必要時以外の設定は不要
    let alertTitle:String = NSLocalizedString("alertTitle", comment: "アラートのタイトル")
    let alertMessage:String = NSLocalizedString("alertMessage", comment: "アラートのメッセージ")
    let alert: UIAlertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: UIAlertControllerStyle.Alert)