UnityのLocalizationパッケージのPseudo-Localization機能を使って、ローカライズに関する色んなテストを行う方法についてまとめました。
Unity 2020.3.15f2
Localization 1.2.1
はじめに
Pseudo-Localizationはローカライズに関する様々なテストを行うための機能です。
いろんなテストをできる機能になるので初めは理解しづらいですが、例えば以下のような項目をテストすることができます。
本記事ではこの機能の使い方についてまとめます。
なおLocalizationパッケージの基礎知識は前提知識としますが、以下の記事にまとめていますので必要に応じて参照してください。
基本的な使い方
Pseudo-Localizationを使うには、まずAssets > Create > Localization > Pseudo-Locale
からアセットを作成します。
すると以下のようなアセットが生成されます。
生成時にはデフォルトの設定が行われた状態になります。
細かい設定方法は次節にまとめるとして、ひとまずこのPseudo-Localizationを適用してみます。
Pseudo-Localizationアセットが作られると、Locale切り替え時の選択肢としてPseudoが現れるので、これに切り替えることで適用します。
以下はLocalization Scene ControlsでActive Localeを切り替えている例です。
下図は実際に文字列に適用している例です。
Pseudo-Localizationを正常に適用できていることが確認できます。
まるで文字化けしているかのように見えますが、これは正常に適用できている結果です(詳細は次節)。
Pseudo-Localization Methodの説明
次にPseudo-Localeアセットに、テストしたい項目を設定していきます。
テスト項目はInspectorからPseudo-Localization Methodsに登録します。
+ボタンを押下すると色んな項目が表示されることを確認できます。
以下ではこれらを簡単に説明していきます。
Expander
一般的に、英語のテキストは日本語のテキストよりも広いテキスト領域を必要とします。
そのため日本語でアプリを作っていると、英語に翻訳した際にテキストが収まり切らず途切れてしまったり改行されてしまったりということが起こります。
Expanderを使うと、基準となる言語から指定した分だけ文字を追加して、広いテキスト領域が必要な言語に翻訳した際に必要な長さのテキストを擬似的に生成できます。
設定するにはSource Localeに基準となる言語を設定した上で、下図のようにString LengthとExpansionを組み合わせて指定します。
元のテキストの長さがString Lengthだったときに、元のテキストの文字数にExpansionの値を掛けた文字数の擬似テキストを生成して付与します。
デフォルトでは上記の値が設定されていますが、テストしたい内容に応じてこの値を設定する必要があります。
このときの目安の値は以下の表から得られます。
Unityのマニュアルからもリンクされている、Andiamoというサイトから引用しています。
Language | From English | Into English |
---|---|---|
Arabic | +20% to +25% | -20% to -25% |
Croatian | +15% | -5% to -15% |
Czech | +10% | -5% to -10% |
Danish | -10% to -15% | +10% to +15% |
Finnish | -25% to -30% | +30% to +40% |
French | +15% to +20% | -10% to -15% |
German | +10% to +35% | -20% to -30% |
Greek | +10% | -5% to -15% |
Hebrew | -20% to -30% | +20% to +30% |
Hindi | +15% to +35% | -15% |
Italian | +10% to +25% | -15% |
Japanese | -10% to -55% | +20% to +60% |
Korean | -10% to -15% | +15% to +20% |
Norwegian | -5% to -10% | +5% to +10% |
Polish | +20% to +30% | -5% to -15% |
Portuguese | +15% to +30% | -5% to -15% |
Russian | +15% | -5% to -15% |
Spanish | +15% to +30% | -5% to -15% |
Swedish | -10% | +10% |
この表を見ると、日本語から英語に翻訳する際には+20%から+60%程度のスペースが必要なようです。
Accenter
Accenterは主に、アルファベットの文字をアクセント記号付きのものに置き換える機能です。
フォントがアクセント記号付きのアルファベットを表示できるかどうか、またアクセントが付いた際に文字表示領域の高さにそれが収まるかといったことをチェックできます。
日本語と英語しか知らないとアクセント記号自体に馴染みが薄いですが、イタリア語などへの翻訳を考えている場合にはつけておくと良さそうです。
デフォルトでは以下のようにある程度の設定がされています。
Source Localeを英語にした上でこれをつけておくことでアクセント記号などのテストができます。
Encapsulator
各ローカライズ文字列を[]で囲む機能です。
たとえば今英語をベースとしてアプリを作っており、「I have 1 apple」という文をローカライズすることを考えます。
この時、「I have」と「apple」をそれぞれローカライズ文字列として登録しているとします。
この場合一見ローカライズ対応ができているように見えますが、例えば実際に日本語に翻訳しようとすると、「私は持っています1リンゴ」のようになり、まともな文章にならないことがわかります。
Encapsulatorで各ローカライズ文字列を囲むことで、このように不適切なローカライズ設定がされていることを検知できます。
ちなみに上例のようなケースではSmartStringsを使うべきです。
本記事では説明しませんが、以下の記事で説明していますので必要に応じて参照してください。
なお囲むための文字は自由に設定可能です。
Preserve Tags
これを使うと<color=red>などのタグが他のPseudo-Localization Methodの影響を受けなくなります。
タグはどの言語でも共通のものなので、本質的に他のPseudo-Localization Methodを受けるべきものではありません。
例えばタグがExpanderの影響を受けてしまうと、無駄に表示領域を確保しなければならなくなります。
このような事態を防ぐためのものがPreserve Tagsです。
Character Substitutor
その名の通り文字を置き換えるための機能です。
大文字にしたり小文字にしたり、マップで置き換える文字の組み合わせを指定したりできます。
しかし実はこの機能には他にも、ローカライズ対象になっていない文字列を洗い出すという有用な使い方があります。
これを行うには、Substitution MethodをListにしてReplacementListにアンダースコアを入力します。
これを適用するとローカライズ対象となっている文字列はすべてアンダースコアに変換されます。
逆にいうとアンダースコアになっていない文字列は、ローカライズ対応されていない文字列であると判断できます
Mirror
これはシンプルな機能で、文字列の並び順を反転させます。
独自のPseudo-Localization Method
IPseudoLocalizationMethodインターフェースを実装したクラスを作成すると独自のPseudo-Localization Methodを定義することもできます。
namespace UnityEngine.Localization.Pseudo { /// <summary> /// Provides a Pseudo-Localization transformation method as used by <see cref="PseudoLocale"/>. /// </summary> public interface IPseudoLocalizationMethod { /// <summary> /// Apply a Pseudo-Localization transformation to the <see cref="Message"/>. /// </summary> /// <param name="message"></param> void Transform(Message message); } }