QA@IT

Titanium Mobileって日本語はちゃんと扱えますか?

4603 PV

外国の製品って日本語の扱いに問題があったりするのが珍しくありませんが、Titanium Mobileはどうですか?公式サイトも英語の情報ばかりなのでよくわかりません。

回答

はい、といいえの両方が答えです。

多言語対応についてはいくつかのレベルに分類できるので、整理して説明します。

(1)アプリの多言語対応

アプリの中の文言をOSの言語設定に合わせて出し分けるような多言語対応については、Titanium Mobileは専用の仕組みを持っています。プロジェクトのディレクトリ直下にi18nディレクトリを作成して、その下にjaやen、ko、zh_hans、zh_hantなどのディレクトリを設置、それぞれの中にstrings.xmlというファイルを置きます。

PROJECT
└──i18n
    ├── en
    │   └── strings.xml
    ├── ja
    │   └── strings.xml
    ├── ko
    │   └── strings.xml
    ├── zh_hans
    │   └── strings.xml
    └── zh_hant
        └── strings.xml

strings.xmlの書式は

<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <string name="open_window">ウィンドウを開く</string>
</resources>

のようになります。これで、JavaScriptの中でL()関数を使ってname属性として指定した値を記述すれば、自動的にOSの言語設定によって文言を差し替えてくれます。

alert(L('open_window'));

用意した言語以外の設定になっていた場合は、アプリのデフォルト言語(通常はEnglish)を優先します。

ホーム画面に表示されるアプリの名称を多言語対応する場合はiOSとAndroidで方法が違うので注意してください。

iOSの場合はstrings.xmlと同じ階層にapp.xmlファイルを設置します。その中でappnameとして各言語のアプリ名を記述していきます。

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <string name="appname">日本語の名前</string>
</resources>

一方、Androidの場合はプロジェクトのディレクトリ直下にplatform/android/res/values-ja/strings.xmlに下のようにappnameを指定して、AndroidManifest.xmlを編集します。

<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="appname">日本語の名前</string>
</resources>

一度Android用のapp.apkをビルドすると、プロジェクトのディレクトリ直下のbuild/android/にAndroidManifest.xmlが生成されます。これを上で作成したplatform/android直下にコピーしてください。コピーしたAndroidManifest.xmlの冒頭部分、android:labelを編集します(「XXXXX」は作成するアプリ毎に異なります)。

<!-- TI_MANIFEST -->

<application android:icon="@drawable/appicon"
    android:label="@string/app_name" android:name="XXXXXApplication"
    android:debuggable="false">

    <!-- TI_APPLICATION -->
    <activity android:name=".XXXXXActivity"
        android:label="@string/app_name" android:theme="@style/Theme.Titanium"
        android:configChanges="keyboardHidden|orientation">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

それから、iOSの裏技ですが、空のstrings.xmlを設置するだけでスイッチの表記が「On/Off」に(そうしないと「○/-」みたいになる)変更されます。

(2)Titanium Studioの多言語対応 *オススメしません…

Aptanaから作られたTitanium MobileのIDE、Titanium Studioですが、機能も豊富でEclipseに慣れた方には使いやすいと思います。しかしTitanium Studio自体は日本語化されていません。Eclipseベースなのでよく知られたやり方で表示を変更することができます。

ただし、安定して動作するとは限らないので、どうしても必要な場合のみ自己責任でお試しください。やり方は「Titanium Studio 日本語化」で検索すればすぐにヒットします。

(3)Titanium Mobile SDKの多言語対応

Titanium MobileはIDEであるTitanium StudioとJavaやObjective-CのAPI群となる各ソースコード、Pythonで記述されたビルド用スクリプトなどから成る一連のプログラムの総称です。その内、なかなか対応が厄介なのがビルド用のスクリプトです。特に多言語対応の問題に関してはここが最も手強いので、注意が必要です。

原則として、熟練のTitanium Mobile利用者は以下のルールを守って開発しています。

・プロジェクト名は半角英数字で指定、スペースや記号は混ぜない
・プロジェクトの保存先のフルパスに日本語などマルチバイトの文字を混ぜない
・JavaScriptや画像などのファイル名にスペースや日本語などマルチバイトの文字を混ぜない

これらのルールを破るとプログラム上の間違いはなくてもビルドが出来ない、といった事態に陥ることがあります。余計な時間を費やすのがあまり好きでない方は、このルールを守るよう心がけましょう。

ビルドスクリプトがマルチバイト文字に関するエラーになる場合は必ず

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 110

のようなエラーメッセージがコンソールに表示されます。こうなった場合、上のルールを守っていないとどこで問題が発生しているのか探すのはとても大変です。

ビルドの他にも、例えばTitanium MobileにはXcodeでビルドできるようにするためのツール、transport.pyが付属しています。これもマルチバイト文字を含むパスがあると正常に動作しません。(もしかしたらこちらのスクリプトでうまくいくかもしれませんが https://gist.github.com/814181)

もし問題が起きてしまった場合は、上のルールに則っていないケースがないかどうかチェックしてください。

編集 履歴 (8)
ウォッチ

この質問への回答やコメントをメールでお知らせします。