海外言語の対応について
よく越境とかインバウンドとか聞きますが、ようするに海外言語に対応して表示する文字列を英語とかフランス語とかに対応させようって話で
Androidではどうやるのっていうのを記載します。
ユーザによる言語変更のイメージ
私のOPPO端末でのイメージ画像ですが、このように言語設定変えることを指しています。
開発側でどこを変更するのか
※公式を参考に説明しています。知っている風に書いててごめんなs
https://developer.android.com/guide/topics/resources/localization?hl=ja
Android のデフォルトリソース
res
ディレクトリの配下にある各ファイルのことを指しています。
Androidアプリが必要とするテキスト文字列、レイアウト、音声、グラフィック、およびその他のすべての静的データのことです、
テキストに関しては特に指定がなければAndroidは自動でres/values/strings.xml
からテキストを取得して表示しています。
一例
<!-- The action for submitting a form. This text is on a button that can fit 30 chars -->
<string name="login_submit_button">Sign in</string>
この例で言えば"login_submit_button"という名前をつけて、文字列は「Sign in」になるようにしています。
テキストの代替リソースの作成方法に関する概念
各ロケール用に代替リソースを作成するには、言語または言語と地域の組み合わせを指定する修飾子を使用します(リソース ディレクトリの名前は、代替リソースを提供する方法に記載されている命名規則に準拠する必要があります。準拠していないと、アプリはコンパイルできません)。
言語は2文字のISO639-1言語コードで定義できます。
つまりは英語ならen、フランス語ならfrになります。
plならPL学園ではなくポーランド語です。
実際の代替リソース変更例
上記の概念をもとにどのように変更するのか例の紹介です。
代替リソースを変更してテキストを海外言語に合わせるとアプリ内のすべてのテキストをフランス語にローカライズするとします。
各ロケール専用のリソースディレクトリにそれぞれ格納
フランス語ならvalues-fr
のようになります。
英語ならvalues-en
です。
strings.xmlファイル作成
res/values-fr/strings.xml
titleなどすべての文字列に対してフランス語のテキストを含めます。
どのように読み込むか
これによってtitleを読み込む際に
デバイスがフランス語に設定されている場合、Androidはres/values-fr/strings.xml
ファイルからtitleを読み込みます。
もし日本語に設定されている場合はAndroidはres/values-ja/strings.xmlファイル内でtitleを探しますが、そんなものはないのでAndroidはデフォルトリソースのres/values/strings.xmlファイルから英語のtitleを読み込みます。
こんな流れです。
以上で終わりですが、下記は付随するTipsです。
ローカライズする文字列を管理する
アプリを作成する際に、どの文字列もハードコードしないようにしてください。ハードコーディングはダメ絶対
すべての文字列をリソースとして、デフォルトの strings.xml ファイルに宣言します。
これによってローカライズがしやすくなりますし、アプリ内で文字列にアクセスする方法に一貫性ができて効率的な開発が望めます。
コメントアウトを効果的に付ける
- この文字列は何のためか。いつ、どこでユーザーに表示されるか。
- レイアウトのどこに配置されるか。
これらがコメントで表現されていると翻訳する際や開発者同士の認識の齟齬が起きにくいです。
メッセージ内の翻訳対象外の部分に印を付ける
他の言語に翻訳してはならないテキストが文字列に含まれることはよくあります。
例は、コードの一部、何かの値のプレースホルダ、特殊記号、名称などです。文字列を翻訳する準備の際に、翻訳せずにそのまま残す必要があるテキストを探して印を付け、翻訳者が変更しないようにします。
翻訳対象外のテキストに印を付けるには、xliff:g プレースホルダ タグを使用します。次の例では、テキスト「%1$s」が翻訳中に変更されないよう指定するタグを示します(タグを指定しないと、メッセージが壊れるおそれがあります)。
<string name="prod_name">
Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g>
</string>
until holidayの部分は固定なのですが日数は可変のため翻訳されないようにしています。
プレースホルダ タグを宣言する際は、何のためのプレースホルダかを説明する id属性を必ず追加します。
MainActivityなどで値を可変にする例
private String method(String inputName) {
String gameGroup = inputName;
String inputThing = getString(R.string.prod_name, inputName);
}
methodを呼び出して引数に文字列を与えて呼び出しています。
string.xmlのprod_nameにアクセスしてprod_gamegroupの部分は引数で渡した文字列で埋めた文字列にしてくれます。
参考