
Continuando a discussão sobre as vantagens do Fluent sobre o gettext usual, publico a posição oficial dos criadores do Fluent na tradução.
Gettext é um sistema de localização profundamente enraizado no projeto GNU e em suas soluções arquitetônicas associadas.
O Projeto Fluente vê o gettext como um bom exemplo de um ecossistema completo de bibliotecas e ferramentas independentes de plataforma de baixo nível para gerenciar o ciclo completo de lançamento do produto com arquivos de localização em um formato legível. Ao mesmo tempo, o paradigma Fluent nos leva a outras soluções arquiteturais em aspectos importantes de localização, que, por sua vez, levam a APIs e ciclos de vida completamente diferentes.
Em outras palavras, o gettext é um ótimo projeto, mas não compartilhamos suas opiniões sobre a abordagem da localização.
Aqui estão as principais diferenças entre gettext e Fluent:
Disposição
A diferença mais importante entre gettext e Fluent é o identificador da mensagem. A Gettext decidiu usar a string de origem (geralmente em inglês) como um identificador. Essa escolha parece simples, mas mais tarde impõe muitas restrições.
Antes de tudo, com essa abordagem, qualquer alteração na linha original invalida todas as traduções associadas a ela. Isso aumenta seriamente a carga dos desenvolvedores, forçando-os a nunca alterar as mensagens originais, pois isso exigirá a atualização de todas as traduções.
Em segundo lugar, complica a introdução de várias mensagens com o mesmo texto no idioma de origem, que devem ser traduzidas de maneiras diferentes. Por exemplo, o texto do botão "Abrir" e da marca "Abrir" pode ser traduzido de diferentes maneiras, pois o primeiro texto é um comando e o segundo é uma descrição. O Gettext possui uma linha de contexto opcional
msgctxt para distinguir as linhas com o mesmo segmento de origem. Essa abordagem coloca a responsabilidade de reconhecer essas situações nos desenvolvedores, o que contradiz o princípio da separação de interesses.
Fluent não recomenda a reutilização de textos exatamente por esse motivo. A separação do texto de origem de outras traduções também é importante para nossa capacidade de inserir mensagens compostas (que contêm várias linhas para uma unidade de tradução conectada a um único widget da interface do usuário) e para links baseados em identificadores para mensagens.
Fluent estabelece um "acordo" entre desenvolvedores e localizadores. O desenvolvedor insere um identificador exclusivo e um conjunto de variáveis (número de mensagens não lidas, nome de usuário etc.) e o localizador, usando a sintaxe Fluente, decide como construir o texto da mensagem para esse identificador.
O desenvolvedor não deve se preocupar com a implementação detalhada das traduções dessas mensagens. Tudo o que um desenvolvedor precisa é obter uma única linha de texto adequada para um local específico na interface do usuário para solicitar uma sequência de caracteres por um identificador específico.
Opções de mensagem
Gettext suporta um pequeno conjunto de funções para internacionalização, em particular para plurais. Mas essa sintaxe plural é um caso especial, além da sintaxe gettext padrão, e é difícil dimensionar para outros casos que requerem variabilidade.
O Fluent suporta o conceito básico de variação de cordas, que pode ser usado com seletores. Normalmente, a regra do plural será um seletor, mas, dependendo dos recursos gramaticais do idioma, pode haver outros, como sexo, declinação ou até o ambiente - por exemplo, a hora do dia ou o sistema operacional. A sintaxe do Fluent permite que os localizadores considerem todos esses recursos e criem texto que corresponda exatamente à situação.
Argumentos externos
Gettext não suporta argumentos externos. Em outras palavras, você não pode especificar a formatação dos parâmetros - números, datas. Para formatar parâmetros no gettext, é recomendável retornar uma string, que será passada para
printf ou execute
String.prototype.replace na string resultante.
No Fluent, o suporte a argumentos externos está no cerne da sintaxe. Argumentos externos não são apenas interpolados, mas também usados como parâmetros para o seletor e também podem ser transferidos para funções internas. Isso permite que os localizadores criem textos muito mais precisos para casos específicos. Além disso, o Fluent coloca marcadores
FSI / PDI em torno de objetos para proteger o isolamento de diretividade em texto bidirecional e proíbe qualquer manipulação de strings de folhas, reduzindo a carga sobre os desenvolvedores.
Isolamento de Responsabilidade
Além disso, a maneira como o gettext lida com regras plurais exige que o projetista do sistema escolha se a mensagem será uma mensagem multivariada ou uma única linha. Do ponto de vista do Fluent, o desenvolvedor não deve lidar com esses problemas. Em muitos casos, quando uma opção é suficiente em inglês, em outros idiomas, você precisa adicionar variantes com plurais.
Fluent assume que o desenvolvedor não deve ter conhecimento lingüístico semelhante ao desenvolver software com muitos locais e cada idioma deve ter uma certa liberdade de ação durante a localização.
Como resultado, o Fluent armazena cada tradução separadamente, sem "vazar" os requisitos de um idioma para outros, e mantém todas as traduções "opacas" para um desenvolvedor que não precisa se preocupar com as funções que os localizadores podem precisar para uma determinada linha.
Cancelamento de uma transferência
No ciclo de desenvolvimento, há três situações em que a tradução é "cancelada" (torna-se inválida) em relação à original:
- Pequenas alterações: não afeta a tradução (pontuação correta, erros de digitação).
- Alteração média: afeta o design da mensagem, mas não cancela a correção da tradução associada (por exemplo, Mostrar todos os favoritos -> Mostrar gerenciador de favoritos ).
- Alteração significativa: o novo significado da frase ( Clique para salvar -> Clique para abrir ).
Por motivos de arquitetura, o gettext combina todos os três níveis em um único estado chamado
difuso . Qualquer alteração na linha de origem (pelo menos completa, pelo menos insignificante) leva ao cancelamento das traduções.
No Fluent, o uso de identificadores exclusivos permite manter dois desses níveis separados do terceiro: quando você faz
pequenas alterações no texto de origem de uma linha e quando salva o identificador, as traduções permanecem válidas. Por outro lado, se o desenvolvedor alterar o identificador, todas as traduções serão canceladas e exigirão atualização.
Acreditamos que essa solução arquitetônica é mais benéfica para a maioria dos ciclos de lançamento, embora reconheçamos que, para alterações de nível
intermediário , o desenvolvedor precisará escolher entre salvar ou alterar o identificador (ou seja, entre uma alteração
menor e uma
significativa ).
Também estamos considerando a idéia do
controle de
versão da mensagem para que o desenvolvedor possa marcar a mensagem como
atualizada sem invalidar completamente seu conteúdo. Esse estado permitirá que você mantenha a tradução válida com base no ponto em que a versão antiga da tradução ainda é melhor que a string não traduzida e, ao mesmo tempo, permitirá que as ferramentas notifiquem o localizador sobre a necessidade de atualizar a tradução.
Formato de dados
O Gettext usa três formatos de arquivo - * .po, * .pot e * .mo. Isso afeta a implementação do gettext no ciclo de produção, adicionando etapas como extrair e compilar mensagens.
O Fluent usa um único formato de arquivo * .ftl, que simplifica a implementação e não requer etapas adicionais que podem levar a discrepâncias de dados.
Suporte Unicode
O Gettext pode ser codificado em UTF-8. Em geral, é aqui que o suporte ao Unicode termina. Ele usa seu próprio conjunto de dados para plurais, não sabe como formatar datas e números, não ajuda no trabalho com textos bidirecionais.
Fluent faz uso extensivo de bibliotecas padronizadas e dos algoritmos CLDR, ICU e ECMA402, combinando perfeitamente localização e internacionalização.
Conclusão
Acreditamos que a API e a sintaxe do Fluent representam uma melhoria significativa em relação ao gettext, e recomendamos que você as use para software internacional.
Mais sobre Fluente