Flashゲームの国際化(i18n)?簡単な方法はありますか?


8

私が取り組んでいるフラッシュ(フレックスではない)ゲームの一部のテキストを国際化したいのですが、簡単にそれを実現する方法が見つかりません...ライブラリや他のソリューションをいくつか見つけましたが、かなり簡単なものを期待していました(他のテクノロジーを使うと本当に簡単です)。

これでの経験はありますか?どうやってやるの?


「それは他の技術で本当に簡単です」-あなたは他にどの技術を使いましたか?
Kylotan、

たとえば、PHP、.NET、Java ...ですが、ゲーム開発だけを考えなければならない場合は、それほど簡単ではありません。
miguelSantirso

回答:


5

最近、ドイツ語と英語に翻訳したFlashゲームを開発しました。あなたはここでそれを見ることができます:http : //www.bioaschi.ch/?lang=en#/game。言語は設定メニューでその場で変更できます。

ゲームを翻訳するために、私は次のアプローチを使用しました。基本的に、キー => 値のペアのレジストリにすぎない、カスタムで作成されたConfigクラスがあります。configクラスはXMLファイルから読み取ることができ、値が変更されたときにイベントを送出します。

ゲームでは、2つの異なる構成ファイルを作成しました。1つはmain設定で、次に翻訳を含む1つのファイル(と呼ばれますlang)。それらのmain設定には、言語を指定するキーが含まれています。lang = en。ゲームでは、そのキーの変更イベントをリッスンします。それが起こるたびに、私は適切な言語から値を読み取り/適用します。

ゲーム内で言語がどのように切り替わるかを示す小さなコードスニペットを次に示します。

「設定」パネルコードのどこかに:

Config.getConfig('main').setValue('lang', 'de'); // or 'en'

次に、テキストをローカライズする必要がある他の場所:

        // this is in the construtor or some init method
        ...
        var cfg:Config = Config.getConfig('main');
        cfg.addEventListener(ConfigEvent.CONFIG_CHANGE, onConfigChange);

        updateText(cfg.getValue('lang', 'en') + '.');
    }

    private function updateText(langns:String) : void {
        var langCfg:Config = Config.getConfig('lang');
        this.title.htmlText = langCfg.getValue(langns + "credits.TITLE", "<title>");
        this.text.htmlText = langCfg.getValue(langns + "credits.TEXT", "<text>");
        _btnClose.label = langCfg.getValue(langns + 'highscore.CLOSE', 'X');
    }

    private function onConfigChange(evt:ConfigEvent) : void {
        if(evt.key == 'lang'){
            updateText(evt.value + ".");
        }
    }

ここでゲームによってロードされているファイルを見ることができます:http : //www.bioaschi.ch/game/language.xml

テキストの一部を変数(たとえばyour score is %dへの変換your score is 10000)で置き換えるには、優れたPolygonal Datastructures Libraryを使用することをお勧めします。Sprintfの AS3実装が含まれています。

すべての翻訳を1つのファイルに含める代わりに、言語ごとに1つのファイルを簡単に作成することもできます。

完全を期すために、ここにいくつかのコードリストを示します。

うわー、これは長いポストであることがわかりました、申し訳ありません。私が取ったアプローチはかなり単純化されており、日付の形式数値、通貨の形式など、国際化のより複雑なトピックはカバーしていません。単純な翻訳の場合は問題なく動作します。


これは良い答えですが、私は新しいユーザーだから:(何が良く、すぐに存在しない場合、私はあなたの答えを受け入れる私はupvoteすることはできません。
miguelSantirso

1

C ++の世界から来て、オンザフライで言語を変更するための一般的な考え方は、すべての言語のテキストをテーブルのどこかにメモリ内に置き、各文字列(またはテキストを含むスプライト)に数値IDを割り当てることです。すべてのIDは異なる言語で同じであり、さらに言語オフセットがあります。例えば:

const LANG_EN:int = 0; const LANG_DE:int = 1000;

const STRING_HELLO_WORLD:int = 0;

var StringTable:array / * of string * /; StringTable [STRING_HELLO_WORLD + LANG_EN] = "こんにちは、世界!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "ハロー、ヴェルト!"

これはかなりのセットアップ時間を必要としますが、一度だけ実行する必要があります。

次に、コードで、文字列と現在の言語オフセットを使用してテーブルを参照するだけです。myObject.text = StringTable [STRING_HELLO_WORLD + currentLanguage];


データは通常、列ごとに1つの言語であるExcelスプレッドシートから読み込まれることを除いて、出荷されたゲームでも同様のものが見られます。
Kylotan

0

コンポーネントをflash.utils.Dictionaryオブジェクトにバインドします。辞書は基本的に連想配列です。あるものを別のものと交換し、バインディングが設定されている場合、ビューは自動的に変更されます。日付書式などの情報をそこに2つ配置できます。また、人気のない、使いにくい「番号付きID」システムも導入しました。これは、国際化/多言語アプリを実際に探索すると、文脈によって英語の翻訳が異なる単語があることがわかるためです(フランス語またはスペイン語では、非常に一般的です)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.