【Android】Androidアプリのローカライズ方法

こんにちは、kazuです。
アプリを複数言語化したいと思ったことはありませんか?
日本語だけだとアプリを使う人は日本人がほとんどですが、英語を加えるだけで使用する人が全世界に増えます。
今回はローカライズ対応について記事にしていきます。

はじめに

まず今回の記事は以下を条件に実装しています。
本記事では、xmlを使用してレイアウトを作成する方法について解説します。
また今回の言語は日本語と英語の2カ国で実装しましたが、言語を増やすことも可能です。

ディレクトリ構成を知る

Androidには以下画像のように言語ごとにディレクトリを作成が必要になります。
ちなみにデフォルトではvaluesまでは作成されていますが、画像で言うvalues-en, values-jaは作成されていません。
作成方法はvalues-<言語コード>になります。
values-<言語コード>ディレクトリを用意してその中にstrings.xmlを用意します。
strings.xmlは言語コードに合わせた表示させたい文字列を定義するファイルのことです。(後ほどコードについては説明します。)

コードを見てみよう

では実際にコードを見てみましょう。
まずはstrings.xmlを定義します。
そして重要なルールとしてがname属性が同じである必要があると言うことです。
Androidではテキストを設定する際にandroid:text="@string/hello"のように定義したものを文言として設定できます。(以下のレイアウト例です。)

レイアウトの例
<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_width="wrap_content"
    android:text="@string/hello"    <--- ここ
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="parent"/>

そして以下の設定にすることにより日本語から英語、英語から日本語に読み込みファイルを変えてもうまく機能するようになっています。

values-en/strings.xml
<resources>
    <string name="hello">Hello Would!</string>
</resources>

values-ja/strings.xml
<resources>
    <string name="hello">ハローワールド!</string>
</resources>

次に実際に切り替える方法です。
以下の処理を実行するのみで言語設定を変更できます。
また変更後すぐに反映したい場合は最後のrecreate()を実行することにより言語反映を行うことができます。

// 言語コードの定義英語のにする場合は"en"にする
let languageCode = "ja"
// localeをセットする
val locale = Locale(languageCode)
Locale.setDefault(locale)
val config = Configuration()
config.setLocale(locale)
this.createConfigurationContext(config)
// Activityの再編成
recreate()

最後に

いかがでしたでしょうか?
ローカライズ対応は難しそうな感じはしますが、実装上ではあまり難しいことをせずにローカライズ対応を行うことができます。
いろいろな言語を導入することによりいろいろな国の人が扱ってくれる可能性があるメリットはありますが、文言が正しいかどうかや適切かどうかなどはしっかりと検証しなければいけません。
そうしないと使いにくいアプリとなってしまうからです。
ただ知名度が上がることは間違えないので、余裕があれば実装してみるといいかもしれませんね。
最後までご覧いただきありがとうございました。

参考

AndroidDeveloper | アプリをローカライズする

AndroidDeveloper | 文字列リソース(strings.xml)