Ótima pergunta! Eu tenho exatamente a mesma questão; minhas constantes são essencialmente: quais idiomas são suportados nos meus aplicativos e informações adicionais sobre esses idiomas no que se refere à funcionalidade do aplicativo.
Infelizmente, a melhor coisa que eu encontrei (como você encontrou) é simplesmente redefinir constantes para cada idioma, como você está fazendo atualmente (eu sei, você definitivamente queria ouvir isso ).
Obviamente parece errado, porque é o oposto de DRY ( WET ?? ). No entanto, as constantes devem mudar com tanta frequência que os 5 a 10 minutos de redefini-las para cada idioma realmente não me incomodam. No final do dia, pequenos problemas com alguma solução 'elegante', como configuração compartilhada ou geração de código, podem levar horas ou dias para serem resolvidos, então o que realmente é ganho? A complexidade adicionada com o risco de algo dar errado que poderia exigir um esforço adicional para corrigir não é algo com o qual eu quero lidar.
Além disso, se o seu aplicativo tiver tantas constantes que redefini-las por idioma quando você as adiciona ou altera, leva um tempo significativo, é possível que você tenha um cheiro de código mais significativo para lidar e, nesse ponto, convém ativar para algo mais complexo.
Resumindo, redefini-los para cada idioma tem sido minha melhor solução, e ainda tenho que pensar em algo mais SECO que não tenha mais fatores de risco do que gostaria de lidar.
Uma coisa a fazer definitivamente , porém, é garantir que suas constantes sejam bem documentadas de maneira generalizada (e independente de idioma) (temos um repositório de documentos da empresa com especificações, documentos diversos, documentos da 'prancheta' etc. etc., onde mantemos esse documento). Além disso, verifique se você possui mecanismos para manter suas definições sincronizadas. Esse é um problema tão grande com a abordagem de duplicação quanto você terá, exceto por uma pequena quantidade de sofrimento psicológico causado pela duplicação intencional de código. Mas, no final, suas mudanças constantes devem ser muito deliberadas e pouco frequentes , portanto os problemas de sincronicidade devem ser essencialmente nulos.
Também devo mencionar que, ao longo dos anos, vi portos multilíngues de várias bibliotecas (cansados demais para lembrar o que são no momento) escritos pelo mesmo grupo que invariavelmente tem constantes definidas nos próprios idiomas. Nenhuma configuração compartilhada, nenhuma geração de código (exceto as bibliotecas cliente da API do Google ... mas vamos lá, o Google tem os recursos para permitir essa complexidade). Então acho que atingimos uma parede de tijolos nessa. Talvez alguém venha a criar uma biblioteca para lidar com esse problema;)