Cocoaアプリのローカライズ(マルチリンガル)対応の方法をまとめてみました。アプリのローカライズ「Cocoaアプリをローカライズする」というのは、英語版のアプリ、日本語版のアプリ、というように言語別にアプリをつくるわけではありません。Cocoaアプリでは、ひとつのアプリの中に複数の言語のリソースを持つようにして、アプリ自体はひとつのみで、言語環境に合わせて、対応した文字列が表示される、という仕組みになっています。「テキストエディットアプリがありますが、このアプリのオブジェクトはひとつです。日本語環境でテキストエディットを立ち上げると、というように、メニューは日本語で表示されます。次に、言語環境を変えてみます。システム環境設定の「言語とテキスト」をクリックします。言語リストで、「日本語」が「English」より下にくるようにします。こんな感じになります。テキストエディットアプリを立ち上げ直すと、このようにメニューやウインドウタイトルは英語にになります。Cocoaアプリの場合、ローカライズする、というより複数言語に対応することになりますので、今後「ローカライズ」ではなく「マルチリンガル化」と呼ぶようにします。それではマルチリンガル化の手順を以下にまとめます。以下の環境で開発・ビルド・動作確認しました。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”エリアのプラスボタンをクリックします。(ja)”を選択します。以下のようなダイアログになります。このダイアログでは、どのファイルをマルチリンガル対応するか、マルチリンガル対応する場合、既存のどの言語ファイルをベースにするか、を選択します。この状態で問題ありませんので、Finishボタンをクリックします。すると、以下のように”Localizations”の言語リストにはJapaneseが追加され、また、MainMenu.xibを含むいくつかのファイルが、各言語用に追加されています。中身は英語版をそのままコピーしただけです。これで、プロジェクトに日本語が追加されました。xibファイルを日本語化するxibファイルを日本語化します。(Japanese)を選択して、各リソースを日本語に修正します。修正すると例えば以下のようになります。これで、xibファイルの日本語化ができましたので、一度動作させてみます。日本語環境であれば、このように表示されると思います。launched!”という文字列は、プログラムで設定していますので、まだ英語のままですが、他のテキストとボタンは日本語で表示されました。言語環境を英語にすれば、英語で表示されますので試してみてください。このようにxibファイルを英語用と日本語用の2つを用意することにより、あとはOSが自動的に適切なxibファイルを使ってアプリを走らせてくれます。文字列などの翻訳するリソースがxibファイルにしか存在しない、というアプリは、これでマルチリンガル化完了です。プログラムで設定する文字列をマルチリンガル化するxibファイルは英語用、日本語用の2つを用意すれば、あとはOSが面倒をみてくれましたが、プログラム中の文字列処理はちょっとひと手間かかります。具体的な手順説明の前に、イメージを説明します。launched!”と表示していますが、具体的には以下の部分でmessageString(NSTextField)に設定しています。launched!”のところを、現在の言語環境設定に合わせた文字列になるようにするわけです。これを実現するために、まず最初に、ここで使う文字列に名前をつけます。“STARTUP_TEXT”に対応するその言語の文字列を書いておきます。"アプリケーション起動完了!";などです。];という感じに書き直すことになります。”STARTUP_TEXT”の場合、具体的には以下のような記述になります。@"アプリ起動完了メッセージ")];NSLocalizedString、というマクロが用意されていますので、このマクロを使ってこのように書けばOKです。ところで、NSLocalizedStringは2つ引数があります。1番目の引数は文字列につけた名前、2番目の引数は文字列の内容です。”STARTUP_TEXT”っていう名前の文字列を持ってきて、と頼むわけなので、2番目の引数は必要ありませんよね。実際、NSLocalizedStringマクロでは、2番目の引数は捨てています。えっえーーっ、てビックリしませんか。この2番目の引数は捨てられますが、ここにメモとして文字列の具体的な内容を書いておくことにより、どんな文字列だったか後からわかるようになります。//アプリ起動完了メッセージこれでもよくね?って思うかもしれませんが、NSLocalizedStringで記述しておくと、genstringsというツールで、後からまとめて言語毎の文字列ファイルを生成できるみたいです。いうことで、NSLocalizedStringはあとから読んでなんの文字列かわかるようなメモ欄、ということで納得しておいてよいと思います。イメージつかめましたでしょうか。この後、言語毎の文字列ファイルをつくり、そのファイルに文字列を記述、プログラムを変更します。各言語毎に文字列ファイルを作成します。Files”を選択します。文字列ファイルがこのフォルダの下にくるようにするためです。次に、XcodeのFileメニューからNewを選択、File...を選択します。Fileを選択します。選択できたらNextをクリックします。“Localizable.strings”、保存場所はen.lprojにします。以下のような感じです。すると、Localizable.stringsが作成されます。次に、Localizable.stringsを選択し、右側のLocalizationエリアにあるJapaneseのチェックボックスにチェックします。チェックすると自動的にLocalizable.stringsファイルが英語用、日本語用の2つできます。続いて、この文字列ファイルに英語と日本語の文字列を記述します。launched!";と追記します。"アプリケーション起動完了!";と記述します。これで、文字列ファイルの作成は完了です。最後にプログラムを変更します。@"アプリ起動完了メッセージ")];のように変更します。これでマルチリンガル化完了です。ここまで作業したソースコードをアップしておきます。言語環境を日本語にしてアプリを立ち上げます。次に言語環境をEnglishにしてアプリを立ち上げます。