Internacionalização (i18n) em jogos Flash? Existe uma maneira fácil?

8

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?

miguelSantirso
fonte
"é realmente fácil com outras tecnologias" - quais outras você já usou?
Kylotan
Por exemplo: PHP, .NET, Java ... Mas, ok, se eu tiver que pensar apenas no desenvolvimento de jogos, não é tão fácil.
precisa saber é o seguinte

Respostas:

5

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 mainconfiguração e, em seguida, um arquivo contendo as traduções (chamadas lang). A mainconfiguraçã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 %dtransforma 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.

bummzack
fonte
Esta é uma boa resposta, mas não posso votar novamente porque sou um novo usuário :( Aceitarei sua resposta se não houver nada melhor em breve. #
MiguelSantirso
1

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];

Ian Schreiber
fonte
Vi algo semelhante nos jogos enviados, exceto que os dados geralmente são lidos em uma planilha do Excel, um idioma por coluna.
Kylotan
0

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).

kosmoknot
fonte