Quero internacionalizar alguns textos em um jogo flash (não flexível) em que estou trabalhando e não consigo encontrar uma maneira fácil de conseguir isso ... Encontrei algumas bibliotecas e outras soluções, mas esperava algo muito mais fácil ( é realmente fácil com outras tecnologias).
Você tem experiência nisso? Como você faz isso?
flash
actionscript-3
miguelSantirso
fonte
fonte
Respostas:
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 (chamadaslang
). Amain
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":
Em qualquer outro lugar onde o texto precise ser localizado:
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 emyour 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.
fonte
Vindo do mundo C ++, a idéia geral para alterar idiomas rapidamente é ter todo o texto do idioma na memória em uma tabela em algum lugar, com cada sequência de caracteres (ou sprite que contém texto) atribuída um ID numérico. Todos os IDs são iguais em idiomas diferentes, além de um deslocamento de idioma. Por exemplo:
const LANG_EN: int = 0; const LANG_DE: int = 1000;
const STRING_HELLO_WORLD: int = 0;
var StringTable: array / * de string * /; StringTable [STRING_HELLO_WORLD + LANG_EN] = "Olá, mundo!" StringTable [STRING_HELLO_WORLD + LANG_DE] = "Olá, Veldt!"
Isso leva um tempo considerável de configuração, concedido, mas só precisa ser feito uma vez.
Em seguida, no seu código, você apenas faz referência à tabela usando a seqüência de caracteres e o deslocamento do idioma atual: myObject.text = StringTable [STRING_HELLO_WORLD + currentLanguage];
fonte
Ligue seus componentes a um objeto flash.utils.Dictionary. Um dicionário é basicamente uma matriz associativa. Se você trocar um pelo outro e suas ligações estiverem no lugar, as visualizações serão alteradas automaticamente. Use pode colocar informações de formatação de data, etc. Também introduzi um sistema "id numerado" impopular e hostil. Isso ocorre porque, quando você realmente explorar aplicativos de internacionalização / multilíngue, verá que algumas palavras em inglês são traduzidas de maneira diferente, dependendo do contexto (em francês ou espanhol, isso é muito comum).
fonte