Delphi or C++Builder で作った Android アプリのパッケージ名のローカライズ

これは [Delphi Advent Calendar 2017](https://qiita.com/advent-calendar/2017/delphi) の 13 日目の記事です。

また、これは以前 [EDN](http://edn.embarcadero.com/article/44669) に投稿した記事のリライトです。
実行環境は 10.2 Tokyo Release 1, Nexus 5, Android 5.1.1 で確認してます。

Delphi/C++Builder にはアプリ内の文字列を翻訳するための [TLang](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Types.TLang) コンポーネントが用意されています。
ただし、これはあくまでアプリ内の文字列の翻訳だけで、デバイス上に表示されるパッケージ名 (アプリ名) の翻訳までは行ないません。
Android 上でのローカライズに関しては [Android Developers のリファレンス](https://developer.android.com/training/basics/supporting-devices/languages.html?hl=ja)のルールに従って

- ロケールフォルダを作成する
- 文字列ファイルを作成する

事と、Delphi/C++Builder 側での

- プロジェクトオプションの書き換え
- 配置情報に文字列ファイルを含める

が必要です。

##はじめにやること

- Delphi/C++Builder でクロスプラットフォームアプリケーションを作る
- フォルダを作って、そのフォルダ以下にプロジェクト等を保存しておくと作業がやりやすい
- 作ったアプリケーションは Android プラットホームを選択して、少なくとも１回はビルドしておく ( 後の工程で自動生成されたファイルを使うため )

##ロケールフォルダを作成する
プロジェクト等を保存しているフォルダに values, values-fr (ロケール:フランス) フォルダを作成します。
( ロケール:日本なら values-ja というフォルダを作成 )
ちなみに values は、翻訳文字列が用意されていない場合に表示されるものを指定するところです。

実際にフォルダを作るとこんな感じです
![L10_004.png](https://qiita-image-store.s3.amazonaws.com/0/164551/fdd2c99c-e8d9-857b-5d78-0eb479e4d79f.png)

##文字列ファイルを作成する
翻訳文字列を定義する strings.xml を作成します。
この際注意しなければならないのは「改行コード」です。
XML の改行コードは LF しか使用できません。Windows の改行コード(CR LF) で作成してしまうと、デバイスに配置する際にエラーが発生してしまいます。
チェックのために、まずはエディタの表示オプションを設定します。
IDE のメニューから [ツール|オプション] を選び、エディタ設定のソースオプションで XML に関する設定で「改行の表示」のチェックボックスにチェックをつけておきます。
![l10_02.png](https://qiita-image-store.s3.amazonaws.com/0/164551/2982d76d-d53d-9b4a-496a-3214b22043d8.png)

Delphi/C++Builder のエディタで xml ファイルを開いたときの改行が
![l10_03.png](https://qiita-image-store.s3.amazonaws.com/0/164551/f7a1bba3-5633-734b-77ab-8cca33661e6e.png)
なら LF なので OK

![l10_04.png](https://qiita-image-store.s3.amazonaws.com/0/164551/1aff989f-cc76-d155-8794-3fac0a7240c2.png)
なら CR LF なので NG です。

ビルドしたときに自動的に作成された \Android\Debug(またはRelease) フォルダ以下にある splash_image_def.xml ファイルを strings.xml という名前で、各ロケールフォルダ以下にコピーして修正すると改行コードが正しい状態で作成できます。

values フォルダ以下の strings.xml ファイルを次のように記載します。

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">L10Base</string>
</resources>
```

values-fr フォルダ以下の strings.xml ファイルは

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">L10FR</string>
</resources>
```

values-ja フォルダ以下の strings.xml ファイルは

```xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">L10JR</string>
</resources>
```

とそれぞれ記述します (日本語用のは JA とすべきところが JR にしてしまった....)

なお、string name で設定する文字列リソース名を、ここでは分かりやすいように「app_name」としています。後のステップで出てくるリソース名と同じで、かつ、予約語に被らなければ OK です。

##プロジェクトオプションの書き換え
文字列ファイルに設定した文字列がアプリ名に反映されるように、プロジェクトオプションを修正します。
IDE のメニューから [プロジェクト|オプション] を選び、アプリケーションの「バージョン情報」を選択します。
Android プラットフォームで、label キーの値を $(ModduleName) から @string/app_name に変更します。
![L10_005.png](https://qiita-image-store.s3.amazonaws.com/0/164551/891cfa83-3c05-18db-b0c9-a87bc3c3fae8.png)

##配置情報に文字列ファイルを含める
アプリをデバイスに配置する際の構成に文字列ファイルを含めます。
IDE のメニューから [プロジェクト|配置] を選び、配置マネージャを表示します。
Android プラットフォームで、values, value-xx のリモートパスを .\assets\internal から res\values\, res\values-xx\ に書き換えます。
以下のスクリーンショットを参考にすると分かりやすいと思います。
![L10_006.png](https://qiita-image-store.s3.amazonaws.com/0/164551/50e47efe-40e1-c0be-7887-a7bd87b05fcf.png)

これで準備完了！お疲れ様でした！

##実際どうなるかというと
###言語 : 日本語
 (values-ja フォルダ以下の strings.xml ファイル内で指定した L10JR が表示される)
![Screenshot_2017-11-09-10-08-00.png](https://qiita-image-store.s3.amazonaws.com/0/164551/23f56960-e301-407a-4802-11643839bf78.png)

###言語 : フランス語
 (values-fr フォルダ以下の strings.xml ファイル内で指定した L10FR が表示される)
![Screenshot_2017-11-09-10-08-30.png](https://qiita-image-store.s3.amazonaws.com/0/164551/f1fd1f25-11d9-9405-a4a1-18dc9160611b.png)

###言語 : 英語
 (ロケールフォルダが無いので、values フォルダ以下の strings.xml ファイル内で指定した L10Base が表示される)
![Screenshot_2017-11-09-10-08-55.png](https://qiita-image-store.s3.amazonaws.com/0/164551/733ee82e-3bb3-e020-0c5e-37745ec8734c.png)