Desenvolvi recentemente um jogo em flash que traduzi para alemão e inglês. Você pode dar uma olhada aqui: http://www.bioaschi.ch/?lang=en#/game . Você pode alterar o idioma rapidamente no menu de configurações .
Para traduzir o jogo, usei a seguinte abordagem: Eu tenho uma classe Config escrita personalizada que é basicamente apenas um registro dos pares chave => valor . A classe de configuração pode ler de um arquivo XML e também despacha eventos quando um valor é alterado.
Para o jogo, criei 2 arquivos de configuração diferentes. Um é a main
configuração e, em seguida, um arquivo contendo as traduções (chamadas lang
). A main
configuração deles contém uma chave que especifica o idioma, por exemplo. lang = en . No jogo, escuto eventos de alteração nessa tecla. Sempre que isso acontece, leio / aplico os valores do idioma apropriado.
Aqui está um pequeno trecho de código que mostra como o idioma é alternado no jogo:
Em algum lugar no código do painel "Configurações":
Config.getConfig('main').setValue('lang', 'de'); // or 'en'
Em qualquer outro lugar onde o texto precise ser localizado:
// 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 + ".");
}
}
Você pode dar uma olhada no arquivo que está sendo carregado pelo jogo aqui: http://www.bioaschi.ch/game/language.xml
Para substituir partes do texto por variáveis (por exemplo, your score is %d
transforma em your score is 10000
), sugiro que você use a excelente Biblioteca de estruturas de dados poligonais . Ele contém uma implementação AS3 do Sprintf .
Em vez de ter todas as traduções em um arquivo, você também pode facilmente ter um único arquivo por idioma.
Por uma questão de integridade, aqui estão algumas listagens de código:
Uau, isso meio que acabou sendo um post longo, me desculpe. A abordagem adotada é bastante simplista e não cobre os tópicos mais complicados da internacionalização, como formatos de data , formatação de números ou moedas, etc. Para traduções simples, ela funciona bem.