Internacionalização (i18n)
Internacionalização e localização, em informática, são processos de desenvolvimento e/ou adaptação de um produto, em geral softwares de computadores, para uma língua e cultura de um país. A internacionalização de um produto não recria o produto novamente, somente adapta as mensagens do sistema à língua e à cultura locais. Isto é importante porque permite que o programador respeite as particularidades de cada língua e cultura de cada país.
Preparar uma aplicação para a sua internacionalização é vital para que seja possível a escalar a um nível global. Nesse sentido foi criada uma ferramenta para facilitar a globalização do front-end em soluções athena.
Configuração do módulo
A configuração da internacionalização num módulo está separada em três passos: 1. Pastas e ficheiros de resources; 2. Distribuição de resources; 3. Configuração.
No final de efetuar estes três passos, as resources serão distribuidas de forma correcta para o projecto principal, o ORINOCO irá proceder às traduções para as linguas necessárias e o serviço I18nService terá acesso a estas resources para serem usadas no módulo.
Pastas e ficheiros de resources
Na pasta do módulo deve ser criada a seguinte estrutura de pastas:
|--src
|-- i18n
|-- en-us
Na pasta en-us devem ser colocados todos os ficheiros de resources em inglês com o nome [module].[internacionalization_resource_group].lang.json.
Como exemplo, para as resources dos componentes do módulo NgCore, o nome do ficheiro é ngcore.components.lang.json.
Os ficheiros devem conter um objecto json válido com o formato:
{
"RES_[resource_key_1]" : "[resource_value_1]",
"RES_[resource_key_2]" : "[resource_value_2]",
"RES_[resource_key_3]" : "[resource_value_3]"
}
Distribuição de resources
O package que é distribuido com o módulo deve conter todos os ficheiros de resources disponívels.
Depois de compilado o módulo, os ficheiros de resources devem estar na pasta dist/assets/i18n/[locale].
Usando o exemplo do módulo NgCore, a estrutura de pastas fica a seguinte:
|--dist
|--assets
|--i18n
|--en-us
|-- ngcore.components.lang.json
|--es-es
|-- ngcore.components.lang.json
|--pt-pt
|-- ngcore.components.lang.json
Para distribuir os ficheiros de forma automática sempre que se faça build do módulo, deve-se adicionar o seguinte snipet ao ficheiro Gulp que trata da compilação do módulo.
gulp.task('copy:languageresources', function () {
let dirnameParts = __dirname.split('\\');
let moduleName = dirnameParts[dirnameParts.length - 1];
return gulp.src(`${srcFolder}/i18n/**/*.lang.json`)
.pipe(gulp.dest(`${distFolder}/assets/i18n`));
});
Esta task deve ser executada depois da task de build, para garantir que a pasta /dist já se encontra criada.
Configuração
Para o serviço i18n estar disponível num módulo é necessário adicionar o módulo i18n à lista de imports do módulo
@NgModule({
imports: [
...
PrimaveraI18nModule.forRoot(i18nConfig),
...
]})
passando a configuração com o locale e a lista de resources deste módulo
let i18nConfig : I18nConfig = {
locale: '[locale]', // 'pt-PT' p.e.
sources: ['[module].[internacionalization_resource_group].lang', '...'] // ['ngcore.components.lang'] p.e.
}
Como utilizar resources
As resources localizadas podem ser usadas de três formas - Serviço I18nService - Directiva PriI18N - Filtro PriI18n
Serviço I18nService
Para usar o serviço I18nService é necessário adicionar o serviço ao construtor da class, e invocar o método get do serviço, passando a chave da resource.
let title = this.i18nService.get('ngcore.components.RES_PriImagePicker_RemovePhotoPopupTitle')
Caso a resource não exista, é retornada a chave da resource.
Directiva PriI18n
Para usar a directiva PriI18n basta adicionar a directiva ao elemento do DOM que pretende traduzir, passando a respectiva chave da resource.
<span priI18n="ngcore.components.RES_PriImagePicker_Placeholder_LabelTwo"></span>
Caso a resource não exista, é retornada a chave da resource.
Filtro PriI18n
Para usar o filtro PriI18n basta adicionar a chave da resource a uma expressão angular e adicionar o filtro PriI18n.
{{"ngcore.components.RES_PriImagePicker_Placeholder_LabelTwo" | PriI18n}}
Caso a resource não exista, é retornada a chave da resource.