Mac Cocoaアプリのローカライズ(マルチリンガル)対応の方法をまとめてみました。
アプリのローカライズ
「Cocoaアプリをローカライズする」というのは、英語版のアプリ、日本語版のアプリ、というように言語別にアプリをつくるわけではありません。Cocoaアプリでは、ひとつのアプリの中に複数の言語のリソースを持つようにして、アプリ自体はひとつのみで、言語環境に合わせて、対応した文字列が表示される、という仕組みになっています。
例えば「テキストエディットアプリがありますが、このアプリのオブジェクトはひとつです。
日本語環境でテキストエディットを立ち上げると、
というように、メニューは日本語で表示されます。
次に、言語環境を変えてみます。まず、システム環境設定の「言語とテキスト」をクリックします。
言語リストで、「日本語」が「English」より下にくるようにします。
こんな感じになります。
テキストエディットアプリを立ち上げ直すと、
このようにメニューやウインドウタイトルは英語にになります。
Cocoaアプリの場合、ローカライズする、というより複数言語に対応することになりますので、今後「ローカライズ」ではなく「マルチリンガル化」と呼ぶようにします。
それではマルチリンガル化の手順を以下にまとめます。
開発環境
以下の環境で開発・ビルド・動作確認しました。
項目 | バージョン |
---|---|
Mac OS X | 10.8.3(Build 12D78) |
Xcode | 4.6.1(Build 4H512) |
サンプルアプリ
マルチリンガル化の手順をまとめるために、サンプルアプリをつくりました。テキストとボタンしかないアプリです。
アプリを立ち上げると、このようなウインドウを表示するだけです。まず、赤枠の文字列とボタンはxibファイルで設定しています。また緑枠の文字列はプログラムでセットしています。
ソースコードをアップしておきます。
https://github.com/tool-lab/mac-cocoa-app-localize-before
大半のアプリはこのようにxibファイル内に文字列を持ち、プログラムからも文字列を設定する、というタイプだと思います。(画像やサウンドファイルなどもローカライズ対象となるケースがあると思いますが、今回はそこまで調べていません…)
このサンプルアプリは英語しか対応していませんが、これから日本語を追加して、英語と日本語の2言語に対応してみます。
マルチリンガル化手順概略
アプリをマルチリンガル化する場合、プログラムで今の設定言語を取得して、言語の優先順位を確認して、その言語リストにあった言語を表示する、、、などのような実装は必要ありません。基本的には各言語のリソースを用意するだけになります。マルチリンガル化対象の文字列などのリソースがxibファイルだけにあれば、xibファイルを必要な言語分用意すればいいのですが、上のサンプルアプリのように、プログラムで文字列をセットしている場合などは、プログラム中の対応も必要です。プログラム中の対応といっても、機械的に置き換えるだけですが、数が多いとやはり面倒です。
アプリをマルチリンガル化する手順は以下のようになります。
- プロジェクトに言語を追加する
サンプルアプリでは、英語しかありませんので、プロジェクトに日本語も使うよ、って教えてあげます。 - xibファイルを対応した言語に翻訳する
1の手順で日本語も使うよ、って教えてあげると、自動的に日本語用のxibファイルを別に生成してくれます。中身は英語用のxibファイルをそのままコピーしてくれるだけなので、そのxibファイルを日本語化します。翻訳が必要なリソースがxibファイルにしかない場合、ここで終わりです。 - プログラム内で文字列設定している場合、まず、各言語文字列ファイルを用意してそのファイルに、文字列に対応する各言語を記述する
- プログラム内の文字列設定しているところを、該当の言語文字列ファイルから対応文字列を取得するように変更する
この変更はかなり機械的な作業になります。数が多いと大変だけど…
ちょっとわかりづらいですが、実際にやってみればすぐにわかると思います。
プロジェクトに言語を追加する
現在のサンプルアプリは英語のみですので、まずプロジェクトに日本語にも対応するよ、って教えてあげます。
サンプルアプリのソースコードをXcodeで開きます。一番左のプロジェクトファイル欄で、”MainMenu.xib”がひとつしかないことを確認してください。以下の作業で、このxibファイルが英語用と日本語用に増えます。
一番左からプロジェクトを選択して、二番目の列からプロジェクトを選択します。以下のような画面になりますので、”Localizations”エリアのプラスボタンをクリックします。
言語のリストが表示されますので、”Japanese (ja)”を選択します。
以下のようなダイアログになります。このダイアログでは、どのファイルをマルチリンガル対応するか、マルチリンガル対応する場合、既存のどの言語ファイルをベースにするか、を選択します。特にこの状態で問題ありませんので、Finishボタンをクリックします。
すると、以下のように”Localizations”の言語リストにはJapaneseが追加され、また、MainMenu.xibを含むいくつかのファイルが、各言語用に追加されています。ただし、中身は英語版をそのままコピーしただけです。
これで、プロジェクトに日本語が追加されました。
xibファイルを日本語化する
xibファイルを日本語化します。プロジェクトファイルリストから、MainMenu.xib (Japanese)を選択して、各リソースを日本語に修正します。修正すると例えば以下のようになります。
これで、xibファイルの日本語化ができましたので、一度動作させてみます。
日本語環境であれば、このように表示されると思います。”Application launched!”という文字列は、プログラムで設定していますので、まだ英語のままですが、他のテキストとボタンは日本語で表示されました。言語環境を英語にすれば、英語で表示されますので試してみてください。
このようにxibファイルを英語用と日本語用の2つを用意することにより、あとはOSが自動的に適切なxibファイルを使ってアプリを走らせてくれます。
なお、文字列などの翻訳するリソースがxibファイルにしか存在しない、というアプリは、これでマルチリンガル化完了です。
プログラムで設定する文字列をマルチリンガル化する
xibファイルは英語用、日本語用の2つを用意すれば、あとはOSが面倒をみてくれましたが、プログラム中の文字列処理はちょっとひと手間かかります。具体的な手順説明の前に、イメージを説明します。
サンプルアプリで、アプリウインドウに”Application launched!”と表示していますが、具体的には以下の部分でmessageString(NSTextField)に設定しています。
[messageString setStringValue:@"Application launched!"];
この@”Application launched!”のところを、現在の言語環境設定に合わせた文字列になるようにするわけです。
これを実現するために、まず最初に、ここで使う文字列に名前をつけます。例えば “STARTUP_TEXT” とします。次に、各言語の文字列ファイルを用意して、そのファイルに “STARTUP_TEXT”に対応するその言語の文字列を書いておきます。
英語の文字列ファイルには、
"STARTUP_TEXT" = "Application launched!";
と記述、日本語の文字列ファイルには、
"STARTUP_TEXT" = "アプリケーション起動完了!";
などです。各言語の文字列ファイルを用意したら、文字列を設定するところを
[messageString setStringValue: ("STARTUP_TEXT"って名前
つけておいたから、今の言語環境の文字列ファイルから
その文字列をもってきて) ];
という感じに書き直すことになります。”STARTUP_TEXT”の場合、具体的には以下のような記述になります。
[messageString setStringValue:NSLocalizedString(@"STARTUP_TEXT", @"アプリ起動完了メッセージ")];
NSLocalizedString、というマクロが用意されていますので、このマクロを使ってこのように書けばOKです。ところで、NSLocalizedStringは2つ引数があります。1番目の引数は文字列につけた名前、2番目の引数は文字列の内容です。”STARTUP_TEXT”っていう名前の文字列を持ってきて、と頼むわけなので、2番目の引数は必要ありませんよね。実際、NSLocalizedStringマクロでは、2番目の引数は捨てています。えっえーーっ、てビックリしませんか。この2番目の引数は捨てられますが、ここにメモとして文字列の具体的な内容を書いておくことにより、どんな文字列だったか後からわかるようになります。
後からわかるようにするんだったら、
[messageString setStringValue:NSLocalizedString(@"STARTUP_TEXT")]; //アプリ起動完了メッセージ
これでもよくね?って思うかもしれませんが、NSLocalizedStringで記述しておくと、genstringsというツールで、後からまとめて言語毎の文字列ファイルを生成できるみたいです。ということで、NSLocalizedStringはあとから読んでなんの文字列かわかるようなメモ欄、ということで納得しておいてよいと思います。
イメージつかめましたでしょうか。この後、言語毎の文字列ファイルをつくり、そのファイルに文字列を記述、プログラムを変更します。
まず、各言語毎に文字列ファイルを作成します。
プロジェクトファイルリストから、”Supporting Files”を選択します。文字列ファイルがこのフォルダの下にくるようにするためです。
次に、XcodeのFileメニューからNewを選択、File…を選択します。
OS Xの領域にResourceがありますので、それを選択し、ファイルタイプとしてStrings Fileを選択します。選択できたらNextをクリックします。続いて、ファイル名と保存場所を聞かれますので、ファイル名は “Localizable.strings”、保存場所はen.lprojにします。以下のような感じです。
すると、Localizable.stringsが作成されます。次に、Localizable.stringsを選択し、右側のLocalizationエリアにあるJapaneseのチェックボックスにチェックします。
チェックすると自動的にLocalizable.stringsファイルが英語用、日本語用の2つできます。
続いて、この文字列ファイルに英語と日本語の文字列を記述します。まず、Localizable.strings (English)を開いて、そこに
"STARTUP_TEXT" = "Application launched!";
と追記します。
次に、Localizable.strings (Japanese)を開いて、そこに
"STARTUP_TEXT" = "アプリケーション起動完了!";
と記述します。
これで、文字列ファイルの作成は完了です。最後にプログラムを変更します。LocalizeSampleAppDelegate.mにある、
[messageString setStringValue:@"Application launched!"];
を
[messageString setStringValue:NSLocalizedString(@"STARTUP_TEXT", @"アプリ起動完了メッセージ")];
のように変更します。
これでマルチリンガル化完了です。ここまで作業したソースコードをアップしておきます。
https://github.com/tool-lab/mac-cocoa-app-localize-after
動作確認
早速動作確認してみます。まず言語環境を日本語にしてアプリを立ち上げます。
次に言語環境をEnglishにしてアプリを立ち上げます。
これでOKです。対応言語を増やす場合、今までの手順を同様に繰り返せばOkですが、その前に、その言葉がわかる人をつれてくる必要がありますね。
変更履歴
日付 | 変更内容 |
---|---|
2013.4.13 | 新規投稿 |
2019.3.24 | ダウンロードファイルをGithubに引越し |