私が取り組んでいるフラッシュ(フレックスではない)ゲームの一部のテキストを国際化したいのですが、簡単にそれを実現する方法が見つかりません...ライブラリや他のソリューションをいくつか見つけましたが、かなり簡単なものを期待していました(他のテクノロジーを使うと本当に簡単です)。
これでの経験はありますか?どうやってやるの?
私が取り組んでいるフラッシュ(フレックスではない)ゲームの一部のテキストを国際化したいのですが、簡単にそれを実現する方法が見つかりません...ライブラリや他のソリューションをいくつか見つけましたが、かなり簡単なものを期待していました(他のテクノロジーを使うと本当に簡単です)。
これでの経験はありますか?どうやってやるの?
回答:
最近、ドイツ語と英語に翻訳した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つのファイルを簡単に作成することもできます。
完全を期すために、ここにいくつかのコードリストを示します。
うわー、これは長いポストであることがわかりました、申し訳ありません。私が取ったアプローチはかなり単純化されており、日付の形式、数値、通貨の形式など、国際化のより複雑なトピックはカバーしていません。単純な翻訳の場合は問題なく動作します。
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];