Titanium Mobileでメッセージを多言語対応する

アプリの中のラベルやボタン、ダイアログに表示させる文字列を国際化、多言語対応します。

使用するプロジェクトは特に続き物というわけではないですが前回の記事と同じものを使用しています。

20121011-dlg1.png

例としてこんな感じでパスワード入力エラーを表示するためのアラートダイアログを作成します。

var dialog = Titanium.UI.createAlertDialog();
dialog.setTitle("エラー");
dialog.setMessage("パスワードを入力してください");
dialog.show();

これで上のアラートダイアログを表示させられますが、ソース内には日本語でメッセージの内容とタイトルが直接指定されています。ソース内に日本語で書いてあったら英語版など他の言語に対応させたい時にとても都合が悪いです。

言語ごとにstrings.xmlを用意する

多言語対応する場合はそれぞれの言語フォルダ内のstrings.xmlに文字列を定義します。

前回の記事でapp.xmlを作成した時と同様に、プロジェクト内に i18n/en と i18n/ja など、必要な数だけ言語コード名のフォルダを作成します。存在している場合は作成する必要はありません。

20121011-proj.png

次に、それぞれのフォルダにstrings.xmlを作成します。文字コードはUTF-8です。

i18n/ja/strings.xml (日本語)

<?xml version="1.0" encoding="UTF-8"?>
<resources>
	<string name="errdlg_title">入力エラー</string>
	<string name="errdlg_message">パスワードを入力してください</string>
</resources>

 

i18n/en/strings.xml (英語)

<?xml version="1.0" encoding="UTF-8"?>
<resources>
	<string name="errdlg_title">Error</string>
	<string name="errdlg_message">Enter your password</string>
</resources>

 

string要素を作成し、ダイアログの、タイトル(「入力エラー」)を"errdlg_title"、メッセージ(「パスワードを入力してください」)を"errdlg_message"という名前でそれぞれ定義します。文字列を識別するためのnameは自由に定義して良いですが、各strings.xmlには同じnameで定義しておく必要があります。

 

文字列を扱っている箇所をL()を使って書き換える

次に、ソースコードのダイアログを作成している箇所を書き換えましょう。

var dialog = Titanium.UI.createAlertDialog();
dialog.setTitle(L('errdlg_title'));
dialog.setMessage(L('errdlg_message'));
dialog.show();

setTitleを L("errdlg_title")、setMessageを L("errdlg_message") に書き換えます。

 

L()は、現在の言語環境に応じた文字列をstrings.xmlから取得してきて表示するための命令です。L()は Ti.Locale.getString()のショートマクロです。どちらを使っても同じ結果になります。僕はL()を使っています。

例として日本語環境で L("errdlg_title") と命令された場合、i18n/ja/strings.xml の中の "errdlg_title"で定義されている文字列、つまり「入力エラー」を表示する、という動きになります。英語環境の場合、「Error」という文字列が表示されます。

 

動作確認

動作確認してみましょう。

言語の切り替えは、Settings(設定) > General(一般) > International(言語環境)です。「日本語」と「英語」で確認してみます。

20121011-dlg1.png

 

英語に切り替えてみます。

20121011-dlgen.png

こんな感じで言語環境から表示する文字列を切り替えてくれていることが確認できればOKです。

 

こういったダイアログのメッセージだけでなく、ラベルやボタンで使う単語や、画像ファイル名など、言語が切り替わったら表示を変えたいようなものはすべてstrings.xmlに記載してしまう方がいいですね。

特に多言語対応を想定していない場合はソースコード内に直接日本語で書いてしまってもいいのですが、将来的に多言語対応することになった場合にもstrings.xmlだけコピーして翻訳すればいいですし、そうでない場合も文字列を1ファイルで一元管理できますのでデバッグする際などに「このメッセージどこで定義してるんだ?」とか探し回ることもないかと思います。

 

関連記事