【Unity】【Localization】Pseudo-Localizationでローカライズに関する色んなテストを行う

UnityのLocalizationパッケージのPseudo-Localization機能を使って、ローカライズに関する色んなテストを行う方法についてまとめました。

Unity 2020.3.15f2
Localization 1.2.1

はじめに

Pseudo-Localizationはローカライズに関する様々なテストを行うための機能です。
いろんなテストをできる機能になるので初めは理解しづらいですが、例えば以下のような項目をテストすることができます。

  • 特定の言語で翻訳したときにテキストが入るための十分なスペースがあるか
  • ハードコードされてしまっていてローカライズできない文字列が存在しないか
  • 特殊文字がサポートされているか

本記事ではこの機能の使い方についてまとめます。

なおLocalizationパッケージの基礎知識は前提知識としますが、以下の記事にまとめていますので必要に応じて参照してください。

light11.hatenadiary.com

基本的な使い方

Pseudo-Localizationを使うには、まずAssets > Create > Localization > Pseudo-Localeからアセットを作成します。
すると以下のようなアセットが生成されます。

f:id:halya_11:20220404190617p:plain:w700
Pseudo-Localization

生成時にはデフォルトの設定が行われた状態になります。
細かい設定方法は次節にまとめるとして、ひとまずこのPseudo-Localizationを適用してみます。

Pseudo-Localizationアセットが作られると、Locale切り替え時の選択肢としてPseudoが現れるので、これに切り替えることで適用します。
以下はLocalization Scene ControlsでActive Localeを切り替えている例です。

f:id:halya_11:20220404190659p:plain:w400
Active Locale切り替え

下図は実際に文字列に適用している例です。

f:id:halya_11:20220404190733g:plain:w700
適用

Pseudo-Localizationを正常に適用できていることが確認できます。
まるで文字化けしているかのように見えますが、これは正常に適用できている結果です(詳細は次節)。

Pseudo-Localization Methodの説明

次にPseudo-Localeアセットに、テストしたい項目を設定していきます。
テスト項目はInspectorからPseudo-Localization Methodsに登録します。

f:id:halya_11:20220404190838p:plain:w500
Pseudo-Localization Methods

+ボタンを押下すると色んな項目が表示されることを確認できます。
以下ではこれらを簡単に説明していきます。

f:id:halya_11:20220404190905p:plain:w500
+ボタンを押下

Expander

一般的に、英語のテキストは日本語のテキストよりも広いテキスト領域を必要とします。
そのため日本語でアプリを作っていると、英語に翻訳した際にテキストが収まり切らず途切れてしまったり改行されてしまったりということが起こります。

Expanderを使うと、基準となる言語から指定した分だけ文字を追加して、広いテキスト領域が必要な言語に翻訳した際に必要な長さのテキストを擬似的に生成できます。

設定するにはSource Localeに基準となる言語を設定した上で、下図のようにString LengthとExpansionを組み合わせて指定します。
元のテキストの長さがString Lengthだったときに、元のテキストの文字数にExpansionの値を掛けた文字数の擬似テキストを生成して付与します。

f:id:halya_11:20220404190952p:plain:w500
Expander

デフォルトでは上記の値が設定されていますが、テストしたい内容に応じてこの値を設定する必要があります。
このときの目安の値は以下の表から得られます。
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を英語にした上でこれをつけておくことでアクセント記号などのテストができます。

f:id:halya_11:20220404191136p:plain:w400
デフォルトの設定

Encapsulator

ローカライズ文字列を[]で囲む機能です。

たとえば今英語をベースとしてアプリを作っており、「I have 1 apple」という文をローカライズすることを考えます。
この時、「I have」と「apple」をそれぞれローカライズ文字列として登録しているとします。
この場合一見ローカライズ対応ができているように見えますが、例えば実際に日本語に翻訳しようとすると、「私は持っています1リンゴ」のようになり、まともな文章にならないことがわかります。

Encapsulatorで各ローカライズ文字列を囲むことで、このように不適切なローカライズ設定がされていることを検知できます。

ちなみに上例のようなケースではSmartStringsを使うべきです。
本記事では説明しませんが、以下の記事で説明していますので必要に応じて参照してください。

light11.hatenadiary.com

なお囲むための文字は自由に設定可能です。

f:id:halya_11:20220404191315p:plain
囲むための文字を設定

Preserve Tags

これを使うと<color=red>などのタグが他のPseudo-Localization Methodの影響を受けなくなります。

タグはどの言語でも共通のものなので、本質的に他のPseudo-Localization Methodを受けるべきものではありません。
例えばタグがExpanderの影響を受けてしまうと、無駄に表示領域を確保しなければならなくなります。

このような事態を防ぐためのものがPreserve Tagsです。

Character Substitutor

その名の通り文字を置き換えるための機能です。
大文字にしたり小文字にしたり、マップで置き換える文字の組み合わせを指定したりできます。

f:id:halya_11:20220404191405p:plain
Character Substitutor

しかし実はこの機能には他にも、ローカライズ対象になっていない文字列を洗い出すという有用な使い方があります。
これを行うには、Substitution MethodをListにしてReplacementListにアンダースコアを入力します。

f:id:halya_11:20220404191430p:plain
アンダースコア

これを適用するとローカライズ対象となっている文字列はすべてアンダースコアに変換されます。
逆にいうとアンダースコアになっていない文字列は、ローカライズ対応されていない文字列であると判断できます

f:id:halya_11:20220404191456g:plain
適用

Mirror

これはシンプルな機能で、文字列の並び順を反転させます。

f:id:halya_11:20220404191536p:plain
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);
    }
}

関連

light11.hatenadiary.com

参考

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com