方法:ローカライズ ゲームの作成

XNA Game Studio 4.0

ローカライズ ゲームは、ゲーマーの言語とカルチャーに適した代替テキスト セットによる UI が表示されるゲームです。

このチュートリアルでは、CultureInfo に格納されている、プラットフォームの現在のカルチャー設定に応じて異なる UI テキストをゲームに表示できるようにする方法を示します。また、Content Pipeline を拡張して、ローカライズされたテキストのために追加で必要となる最小限のフォント文字をゲームの実行可能ファイルに含める方法も示します。

ローカリゼーションに関する問題の詳細については、「How to: Build a Localized Application for Windows Phone」を参照してください。

完全なサンプル コード

このトピックのコードは、ローカライズ可能なゲームを作成する手法を実際に示したものです。このトピックの完全なサンプル コードをダウンロードできます。ダウンロード内容には、完全なソース コードと、このサンプルに必要な追加のサポート ファイルが含まれます。

リソース ファイルの作成

ローカライズ ゲームでは、ゲームのコード プロジェクト内のリソース (.resx) ファイルにリソースを保持する必要があります。サポートする言語/カルチャーごとに、少なくとも 1 つのリソース ファイルが必要です。それぞれのリソース ファイルでは、ゲーム内のローカライズ可能な各 UI 文字列の識別子と、その文字列を目的の言語/カルチャーにローカライズした文字列を定義します。この方法であれば、ローカリゼーションをコーディングと切り離して管理できます。

リソース ファイルを作成するには

  1. ソリューション エクスプローラーで、コード プロジェクト ノードを右クリックし、[追加][新しいアイテム] の順にクリックします。

  2. [新しい項目の追加] ダイアログ ボックスで、リソース ファイルを選択し、必要に応じてファイル名を変更します (たとえば、Strings.resx など)。

    このファイルには、アプリケーションで使用する既定の言語のリソースを格納します。

  3. アプリケーション内の文字列を特定し、それらの文字列をリソース ファイルに追加します。

    文字列ごとに、名前、値、およびコメント (省略可能) を設定します。名前は、一意である必要があり、できるだけわかりやすいものにします。値は、アプリケーション内でユーザーに表示される文字列です。コメントを追加すると、大きいリソース ファイルでその文字列の用途を示すメモとして、また、翻訳者が正しいコンテキストを理解するための情報として役立ちます。

    Figure 1.  Strings.resx リソース ファイルの英語文字列の例

    Ff966426.CP_HowTo_Localize_Strings(ja-jp,XNAGameStudio.40).png
  4. アプリケーションでサポートする言語/カルチャーごとに、新しいリソース ファイルをプロジェクトに追加します。

    Ff966426.note(ja-jp,XNAGameStudio.40).gifNote

    各リソース ファイルは、次の命名規則に従っている必要があります。

    既定の言語のリソース ファイル名.カルチャー名

    たとえば、MyStrings.fr.resx のようなファイル名にします。カルチャー名 (この例では fr) は CultureInfo クラスに由来するものです。

    次の図に示すように、リソース ファイルで定義される文字列は、既定のリソース ファイルで定義されている文字列と同じ識別名を持っている必要があります。

    Figure 2.   Strings.fr.resx リソース ファイルのフランス語文字列の例

    Ff966426.CP_HowTo_Localize_Strings_fr(ja-jp,XNAGameStudio.40).png

    Figure 3.  Strings.ja.resx リソース ファイルの日本語文字列の例

    Ff966426.CP_HowTo_Localize_Strings_ja(ja-jp,XNAGameStudio.40).png
Ff966426.note(ja-jp,XNAGameStudio.40).gifWindows Phone 固有の情報

リソース ファイルを配置する場合、Windows Phone 開発者は、Windows Phone ゲームの Visual Studio プロジェクト ファイル (.csproj) に <SupportedCultures> 要素を追加する必要があります。<SupportedCultures> の使用法の詳細については、「How to: Build a Localized Application for Windows Phone」を参照してください。

  1. Windows Phone ゲーム プロジェクトの Visual Studio プロジェクト ファイル (.csproj) を閉じ、そのプロジェクト ファイルをテキスト エディターで開きます。
  2. ビルド構成と Windows Phone プラットフォームを示す <PropertyGroup> 要素を探します。

  3. 目的のビルド構成の <PropertyGroup> 要素に、<SupportedCultures> という新しい要素を追加します。<SupportedCultures> の値として、ゲームでサポートするすべてのカルチャーをセミコロンで区切ったリストを指定します。

    <SupportedCultures>ja-jp</SupportedCultures>
    

Content Pipeline の拡張

ローカライズ ゲームを提供する場合は、リソース ファイルとフォントを処理するために新しい Content Pipeline Library Extension プロジェクトを作成する必要があります。

新しい Content Pipeline Library Extension プロジェクトでは、後で .spritefont ファイルに格納されるリソース ファイルのリストに対応するように FontDescription クラスを拡張する必要があります。

また、新しいコンテンツ プロセッサも作成する必要があります。このコンテンツ プロセッサでは、リソース ファイル リストを処理してビルド後のゲーム実行可能ファイルに必要な文字が含まれるように FontDescriptionProcessor を拡張します。

コンテンツ パイプライン拡張ライブラリー プロジェクトを作成するには

  1. [ファイル] メニューの [新しいプロジェクト] をクリックします。

  2. プロジェクトの種類として [コンテンツ パイプライン拡張ライブラリー (4.0)] を選択します。

  3. [名前] テキスト ボックスに、新しいライブラリー プロジェクトの名前を入力します。

    たとえば、LocalizationPipeline などのプロジェクト名にします。

  4. [OK] をクリックすると、新しいプロジェクトが作成されて読み込まれます。

FontDescriptor クラスを拡張するには

新しいファイルを追加して新しいクラスを格納します。

  1. ソリューション エクスプローラーで、新しく作成した Content Pipeline Library Extension プロジェクトを右クリックし、[追加][新しいアイテム] の順にクリックし、[クラス] を選択します。

    新しいファイルに名前を付けます (たとえば LocalizedFontDescription.cs など)。

  2. 新しいクラス ファイルで、FontDescription から派生する新しいクラス (たとえば LocalizedFontDescription など) を宣言します。

    class LocalizedFontDescription : FontDescription
    
  3. そのクラス内に、新しい ResourceFiles プロパティを定義します。

    この操作により、リソース ファイルのリストを格納する .spritefont XML ファイル内の ResourceFiles 要素が認識されます。

    [ContentSerializer(Optional = true, CollectionItemName = "Resx")]
    public List<string> ResourceFiles
    {
        get { return resourceFiles; }
    }
    
    List<string> resourceFiles = new List<string>();
    

FontDescriptionProcessor クラスを拡張するには

新しい FontDescriptionProcessor クラスを格納するための新しいファイルを追加します。

  1. ソリューション エクスプローラーで、Content Pipeline Library Extension プロジェクトを右クリックし、[追加][新しいアイテム] の順にクリックし、[クラス] を選択します。

    新しいファイルに名前を付けます (たとえば LocalizedFontProcessor.cs など)。

  2. 新しいクラス ファイルで、ContentProcessor から派生する新しいクラス (たとえば LocalizedFontProcessor など) を宣言し、新しい LocalizedFontDescription クラスを入力として指定します。

    [ContentProcessor]
    class LocalizedFontProcessor : ContentProcessor<LocalizedFontDescription,
                                                    SpriteFontContent>
    

    そのクラス内で、新しい LocalizedFontDescription クラスを入力として Process をオーバーライドします。

    public override SpriteFontContent Process(LocalizedFontDescription input,
                                              ContentProcessorContext context)
    
  3. 新しい Process メソッドで、LocalizedFontDescription オブジェクトの ResourceFiles プロパティをステップ スルーして、宣言された各リソース ファイルを読み込みます。

    foreach (string resourceFile in input.ResourceFiles)
    {
        string absolutePath = Path.GetFullPath(resourceFile);
    
        // Make sure the .resx file really does exist.
        if (!File.Exists(absolutePath))
        {
            throw new InvalidContentException("Can't find " + absolutePath);
        }
    
        // Load the .resx data.
        XmlDocument xmlDocument = new XmlDocument();
    
        xmlDocument.Load(absolutePath);
    
  4. リソース ファイルごとに、各文字列をスキャンし、見つかった文字を LocalizedFontDescription オブジェクトに追加します。

    // Scan each string from the .resx file.
    foreach (XmlNode xmlNode in xmlDocument.SelectNodes("root/data/value"))
    {
        string resourceString = xmlNode.InnerText;
    
        // Scan each character of the string.
        foreach (char usedCharacter in resourceString)
        {
            input.Characters.Add(usedCharacter);
        }
    }
    
  5. AddDependency を使用して、リソース ファイルが変更された場合にフォントをビルドし直す必要があることをマークします。

    context.AddDependency(absolutePath);
    
  6. FontDescription クラスを使用してフォントをビルドし直します。
  7.     return context.Convert<FontDescription,
                               SpriteFontContent>(input, "FontDescriptionProcessor");
    }
    

ローカリゼーション データとプロセッサをフォントと関連付ける

プロジェクト データをリソース ファイルに分割し、そのデータを使用するカスタム コンテンツ プロセッサができました。次に、各パーツをバインドして連動できるようにする必要があります。これを行うには、.spritefont ファイルで拡張された情報を提供し、このファイルをカスタム コンテンツ プロセッサにバインドします。

.spritefont ファイルを拡張するには

新しい .spritefont ファイルを作成します。

  1. ソリューション エクスプローラーで、コンテンツ プロジェクト ノードを右クリックし、[追加][新しいアイテム] の順にクリックします。

  2. [新しい項目の追加] ダイアログ ボックスで、[スプライト フォント] を選択し、[名前] ボックスに新しいファイルの名前 (たとえば Font.spritefont など) を入力します。

  3. [追加] をクリックして新しいファイルを作成します。

  4. 編集するために、新しく作成したファイルをダブルクリックして開きます。

  5. アセット タイプの宣言を、前に作成した拡張 FontDescriptor クラスを参照するように変更します。

    <Asset Type="LocalizationPipeline.LocalizedFontDescription">
  6. <ResourceFiles> タグ内に、<Resx> 要素を使用して各リソース ファイルを列記したブロックを追加します。

    次の例では、既定の言語に加えて、デンマーク語 (da)、フランス語 (fr)、日本語 (ja)、および韓国語 (ko) のリソース ファイルを指定しています。

    <ResourceFiles>
       <Resx>..\Strings.resx</Resx>
       <Resx>..\Strings.da.resx</Resx>
       <Resx>..\Strings.fr.resx</Resx>
       <Resx>..\Strings.ja.resx</Resx>
       <Resx>..\Strings.ko.resx</Resx>
    </ResourceFiles>
  7. ファイルを保存します。

カスタム コンテンツ プロセッサを .spritefont ファイルに割り当てるには

  1. ソリューションをコンパイルしてコンテンツ パイプライン拡張ライブラリー プロジェクトをビルドします。

  2. ソリューション エクスプローラーで、プロジェクトを右クリックし、[参照の追加] をクリックします。

  3. [参照の追加] ダイアログ ボックスで、[プロジェクト] タブをクリックし、前に作成したコンテンツ パイプライン拡張ライブラリー プロジェクト (たとえば LocalizationPipeline など) を選択します。

  4. [OK] をクリックします。

  5. コンテンツ プロジェクトで、.spritefont ファイルを右クリックし、[プロパティ] を選択します。

  6. [プロパティ] ペインが表示されたら、ContentProcessor フィールドに関連付けられたドロップダウン リストからカスタム プロセッサ (たとえば LocalizedFontProcessor など) を選択します。

ローカライズされた文字列をゲーム内で使用する

ローカライズされた文字列は、既定の言語のリソース ファイルのベース ファイル名 (たとえば Strings など) と同じ名前を持つクラスとしてゲーム内で使用できます。

CultureInfo.CurrentCulture プロパティからこのクラスの Culture プロパティを設定すると、プラットフォームの現在のカルチャー設定に従って、正しい言語にローカライズされた文字列が読み込まれます。

Strings.Culture = CultureInfo.CurrentCulture;

コミュニティの追加

追加
表示: