Gostaria de saber como posso implementar a internacionalização em um projeto Angular v11 separando os arquivos de tradução por módulo ou por página.
Estou aprendendo sobre internacionalização i18n, e os exemplos que encontrei usam um único arquivo para cada idioma, com todas as traduções para aquele idioma armazenadas naquele arquivo. No entanto, eu gostaria de pelo menos separá-lo por módulos porque meu projeto contém muito texto, e um único arquivo acabaria se tornando grande e confuso. Alguém tem alguma dica ou sugestão?
Vi que é possível fazer isso, mas não tive muita sorte em encontrar exemplos.
Eu estava trabalhando em um projeto de exemplo, mas ficou muito claro que você está trocando o tamanho do arquivo de tradução pela sobrecarga de ter que combinar os vários arquivos de tradução e/ou sincronizar várias instâncias do
TranslateService
.tl;dr essa é uma má ideia. A documentação recomenda uma abordagem centralizada (apenas chamando especificamente o uso de uma pasta para agrupar arquivos de tradução, mas implicando que todos os arquivos de tradução devem estar lá):
Em relação à sua preocupação de que "um único arquivo acabaria se tornando grande e confuso", a seção de gerenciamento de traduções da documentação aborda uma maneira de agilizar a edição. Não estou incluindo isso na minha resposta porque promove um produto específico (pago).
Além disso, a seção why [...] contextuais ids [...] da documentação recomenda o uso de definições de tradução aninhadas que permitem o agrupamento por aspectos centrados no desenvolvedor da base de código, como páginas, módulos, componentes ou recursos, o que torna a organização (e, portanto, a localização) das traduções mais fácil:
Mas se você quisesse fazer isso...
No caso de uso padrão, cada instância de
TranslateService
abre um único<lang>.json
arquivo. Se você quiser um<lang>.json
arquivo por módulo/componente, então você precisa adicionar manualmente as traduções do arquivo de tradução daquele módulo/componente às chaves de tradução conhecidas do existenteTranslateService
ou você precisa de uma nova instância deTranslateService
para o arquivo de tradução do módulo/componente.A primeira abordagem deve ser possível
setTranslation
, mas você terá que carregar o<lang>.json
arquivo na memória e analisá-loInterpolatableTranslationObject
você mesmo.Não estou confiante de que essa abordagem funcione como esperado e você pode encontrar alguns problemas (talvez ter que acionar manualmente a detecção de alterações, talvez ter que alternar manualmente o idioma de e para o idioma atual para acionar novas traduções, talvez ter que adiar o carregamento de componentes até que o módulo/componente atual tenha terminado de corrigir suas traduções, etc.), não sei.
Mas aqui está o que um esboço poderia parecer:
Você também pode tentar seguir esta resposta de daniel-sc para atualizar/mesclar arquivos de tradução i18n no Angular .
A segunda abordagem que requer um meta serviço (ou token de injeção, mais provavelmente) para sincronizar várias instâncias do
TranslateService
é um sinal vermelho imediato para mim de que essa não é uma boa abordagem. Eu não tentaria a menos que fosse a última opção possível.