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

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

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

English

日本語

Swift 5.1
Xcode 11.4

 

Localization

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

 

Localizationの追加

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

 
Development Language は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(Englsih) key Localizable.strings(Japanese)
“hello” = “Hello”; ←hello→ “hello” = “こんにちは”;

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

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

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

白いボタンですがクリックすると青くなりダイアログが現れる
 

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

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

 

Localizable Stringsの変換

 
テーブルの設定
 
Localizable.strings (Japanese) を選択して以下のように書き込みます

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

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

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

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

 
これで実行させて見ます。
結果Log
Japanese:

 
English:

 
Xcodeのsimulatorでは言語設定はSchemeから変更できます。(アプリ名以外)
 
「Product」「Scheme」「Edit Scheme」
Run, Options からApplication Languageを変更することにより対応言語を変更できます。

 

 

storyboardの変換

 
最初のLocalizeでMain.storyboardの選択で
Localizable Stringsを選択した場合は
Main.strings (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を別々にstoryboard上で変更できます。
 
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を「File」「New」「File…」「Strings File」から作成します。
 

 
Localizable.strings と同じようにして
Licalizationボタンをクリックして「Japanese」でローカライズします。
 
 
InfoPlist.stringsに
CFBundleDisplayName = “アプリ”;
記述します。(keyは””がいりません、セミコロンも忘れずに)
 

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

 

 

CollectionViewのLocalize

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

アルバムのような写真アプリによく使われますが、画像をマス目に配置するには UICollectionView を使います。基本的な設定をテスト...

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

Localizable.strings (English)

 
Localizable.strings (Japanese)

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

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

Englishのstoryboard


 

Japaneseのstoryboard

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

 
Japanese:

 
 
References:
NSLocalizedString(_:tableName:bundle:value … – Apple Developer
Internationalization and Localization for iOS – Apple Developer
Localizing Your App

一人でアプリ開発の限界を感じたら

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンライン・スクールがいいと思います。


TECH ACADEMY
自宅にいながら1時間でプログラミング基礎を習得

こういうものではアプリ作れないと言う意見もありますが、それは結局本人のやる気があるかないかです。やる気があっても独学では突破しにくいところは教えてもらうのが一番早い。


侍エンジニア塾
侍エンジニア塾 無料体験レッスン



とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


CodeCamp
~約20,000名の受講生と300社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp




直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。


Play Ground
本業と並行してやるには月額制なのがありがたいです。


無料で転職まで
これはiOSアプリ限定ではありませんが無料です
その代わり就職することを前提にしたスクールで「エンジニアになって職を得たい」のであれば手っ取り早いかもしれません


誤字脱字、意味不明などのご意見は 謙: e-mail まで
ブックマークしておくと便利です このエントリーをはてなブックマークに追加
Twitter:


シェアする

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

フォローする