Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Quando necessário utilizar o filtro programaticamente, é recomendado que este seja linkado ao $rootScope do AngularJS para que seja acessível de qualquer ponto do aplicativo. Utilizando como base a implementação da aplicação de referencia, basta no index.js ao fazer o bootstrap da aplicação, após já ter realizado o registro do filtro de internacionalização, adicionar a referencia ao $rootScopt conforme exemplo:

...

Bloco de código
languagejs
titleExemplo
firstline1
linenumberstrue
sampleService.$inject = ['$rootScope'];
function sampleService($rootScope) {

	this.label = $rootScope.i18n('label-to-translate');

}
  • Link para o demo ???

Definição

Cada produto é livre para definir a forma como irá gerenciar suas traduções. No entanto, o TOTVS | HTML Framework confia que o AngularJS Filter seja registrado com o alias de i18n e que receba como parâmetro a palavra ou código a ser traduzido.

Utilizando como base a implementação da aplicação de referencia temos um filtro de internacionalização definido no arquivo filter-i18n.js. Este filtro considera o arquivo de tradução por contexto de aplicação; no caso temos um arquivo de tradução para a aplicação centralizadora (html-app) e um para a aplicação convencional (html-sample). Ambas as aplicações seguem a mesma infraestrutura para que as traduções possam ser carregadas de acordo com a aplicação que está sendo acessada.

Neste model cada arquivo de tradução está disponível através da seguinte estrutura:

  • <contexto da aplicação>/<contexto da view>/i18n/translations.js

Usando o cadastro de clientes como exemplo teríamos o arquivo de tradução na seguinte estrutura:

  • /datasul/crm/i18n/translations.js

Para o carregamento dinâmico das traduções foi desenvolvida uma função para carregar o arquivo de tradução de acordo com o contexto da aplicação e view. O carregamento do arquivo é realizado através do RequireJS e armazenado na sessão para evitar de recarregar o arquivo para cada solicitação de tradução.

No caso da aplicação de referencia o filtro foi concebido para inicialmente buscar a tradução no contexto que está sendo acessado. Caso não encontre recorre ao arquivo de tradução da aplicação centralizadora. Desta forma, podemos evitar de replicar traduções comuns como 'sim', 'atenção', 'não' entre outros.

Cada arquivo de tradução se resume a um arquivo JSON com o nome de translations.js, este por sua vez deve seguir a estrutura padrão de um arquivo do JSON no qual temos a seguinte formatação:

Bloco de código
languagejs
titleExemplo
firstline1
linenumberstrue
[{
    "sample" : {
        "pt":"Sample",
        "en":"Sample",
        "es":"Sample"
    },
    "label-to-translate" : {
        "pt":"Palavra ou sentença a ser internacionalizada !",
        "en":"Word or sentence to be internationalized !",
        "es":"Palabra o frase que se internacionalizaron!"
    }
}]

Por termos o produto normalmente traduzido para 3 idiomas (Português, Inglês e Espanhol) foi adotada a estrutura de que cada palavra ou sentença irá conter as 3 traduções para que seja possível alterar o idioma do sistema em runtime.

Na aplicação de referencia ao carregar as informações do usuário logado para a sessão é carregado também a preferência de idioma do usuário. Sendo assim, no filtro é realizado o tratamento para retornar preferencialmente a tradução correspondente ao idioma do usuário logado. Entretanto, caso o usuário não possua um idioma associado ao seu login, o filtro se responsabiliza por buscar o idioma utilizado no navegador do usuário. Caso seja diferente dos idiomas padrões do produto este então considera o idioma inglês para realização das traduções.

No caso de não encontrar uma tradução para a palavra ou sentença a retorna entre colchetes para que fique visível que está pendente de tradução.