iOS アプリを多言語化する機会があったのでアプリ内での対応をまとめてみました。
- ストアの対応についてはこちら
アプリ内の文言を言語によって切り替える
辞書ファイルの準備
- PROJECT の設定 Info タブ内の Localizetions の
+
ボタンから必要な言語を追加する - Localizable.strings ファイルを追加する
- Localizable.strings を選択し、ウインドウ右の File inspector の
Localize…
ボタンをクリックして表示を切り替えたい言語にチェックを入れる - 先ほど追加した Localizable.strings の下に言語毎のファイルがツリー表示される
Localizable.strings(Base)
は端末の言語設定に対応する言語が追加されていない場合に参照されるファイルです。その場合に日本語で表示させたい場合はこの中身も日本語で記述します。
- 追加された言語毎の Localizable.strings に、参照キーと表示させたいテキストを
"キー名" = "テキスト";
の形で追加する
Localizable.strings(Base)
"exampleTextKey" = "テキスト";
Localizable.strings(Japanese)
"exampleTextKey" = "テキスト";
Localizable.strings(English)
"exampleTextKey" = "text";
コード
swift
exampleLabel.text = NSLocalizedString("exampleTextKey", comment: "")
のように書けば端末の言語設定によって切り替えることができますが、この場合は端末の言語設定による切り替えしかできず、端末の言語設定≠アプリの言語設定の場合に対応できません。
また全てに NSLocalizedString(~
を書くのは面倒なので、 後述のように String
クラスを拡張して "キー名".localized
で参照できるようにするのが見た目もスッキリするのでおすすめです。
swift
exampleLabel.text = "exampleTextKey".localized
String クラスの拡張
端末の言語設定によって切り替える場合
StringExtension.swift
import Foundation
extension String {
var localized: String {
return NSLocalizedString(self, comment: "")
}
}
アプリ内の設定によって切り替える場合
ローカライズのリソースが英語の場合は en.lproj
フォルダに格納されることから、下記サンプルコードの lang
に相当する文字列は、日本語なら ja
、英語なら en
など、ISO 639-1 に準拠している必要があります。不安であればローカライズを追加した時にできるフォルダ名で判断するといいでしょう。
StringExtension.swift
import Foundation
extension String {
var localized: String {
let lang = {アプリ内で設定している言語の文字列を取得するコード}
// lang からリソースのパスを取得して bundle を取得
guard let path = Bundle.main.path(forResource: lang, ofType: "lproj"),
let bundle = Bundle(path: path) else {
// bundle が取得できなかった場合は端末の言語設定を元に切り替える
return NSLocalizedString(self, comment: "")
}
// 取得した bundle でキーを参照して切り替える
return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
}
}
言語によってプライバシーデータアクセス許可の文言を変更する
- これは端末の言語設定による変更のみです
- InfoPlist.strings ファイルを追加する(すでに存在していれば手順4のみ)
- InfoPlist.strings を選択し、ウインドウ右の File inspector の
Localize…
ボタンをクリック - アプリ名を切り替えたい言語にチェックを入れる
- 追加された InfoPlist.strings(言語名) にアクセス許可の種類に対応するキーと文言を追加する
InfoPlist.strings(言語名)
// フォトライブラリへ書き込みのアクセス許可の場合
NSPhotoLibraryAddUsageDescription = "言語名したい言語での文言";
言語によってアイコンのアプリ名表示を切り替える
- これも端末の言語設定による変更のみです
- InfoPlist.strings ファイルを追加する(すでに存在していれば手順4のみ)
- InfoPlist.strings を選択し、ウインドウ右の File inspector の
Localize…
ボタンをクリック - アプリ名を切り替えたい言語にチェックを入れる
- 追加された InfoPlist.strings(言語名) に以下を追加する
InfoPlist.strings(言語名)
CFBundleDisplayName = "表示したいアプリ名";