Por que sua aplicação Java precisa falar como um humano?
\n\nVocê já se perguntou por que os aplicativos que usamos todos os dias — do Spotify ao Notion — imediatamente "entendem" em qual idioma falar com você? Eles não leem mentes, não adivinham pelo endereço IP. Eles usam internacionalização (i18n).
\n\nPara um desenvolvedor Java, saber tornar aplicativos multilíngues não é apenas um "diferencial", mas uma habilidade obrigatória se você almeja o mercado global. Imagine: você criou um ótimo serviço de gerenciamento de tarefas. Na Rússia, ele decolou. Mas assim que você tentar vendê-lo na Alemanha ou no Japão — os usuários verão o botão "Criar tarefa" em russo. E fecharão a aba. Triste, não é?
\n\nNeste artigo, não vamos apenas falar sobre teoria. Vamos pegar uma aplicação Java (bem comum, console ou web) e, passo a passo, adicionar suporte aos idiomas russo, inglês e alemão. Você verá que a internacionalização Java não é assustadora, mas sim muito elegante. Vamos nessa!
\n\nO que é internacionalização e localização? Não confunda!
\n\nFrequentemente, esses conceitos são misturados. Vamos esclarecer de uma vez.
\n\n- \n
- Internacionalização (i18n) — é o processo de projetar a aplicação para que ela possa ser adaptada a diferentes idiomas e regiões sem alterar o código. Você cria "ganchos" para a tradução. \n
- Localização (l10n) — é o preenchimento desses "ganchos" com traduções específicas, formatos de data, moedas e regras de classificação para um país específico. \n
Em Java, as classes responsáveis pela internacionalização estão no pacote java.util: Locale e ResourceBundle. Lembre-se delas — são seus melhores amigos.
Passo 1. Conhecendo o Locale — o coração da internacionalização
\n\nA classe Locale representa uma região específica (idioma + país). Por exemplo:
- \n
Locale.US— inglês (EUA) \n Locale.GERMANY— alemão (Alemanha) \n new Locale("ru", "RU")— russo (Rússia) \n
O Locale é usado para selecionar a tradução correta das strings, formatação de números, datas, moedas. Sem ele, a internacionalização é impossível.
\n\nComo obter a localidade atual?
\n\nimport java.util.Locale;\n\npublic class Main {\n public static void main(String[] args) {\n // Localidade padrão (geralmente coincide com a do sistema)\n Locale defaultLocale = Locale.getDefault();\n System.out.println("Localidade atual: " + defaultLocale);\n\n // Localidades disponíveis na JVM\n Locale[] available = Locale.getAvailableLocales();\n System.out.println("Total disponível: " + available.length);\n }\n}\n\nA saída pode ser, por exemplo: Localidade atual: ru_RU. Mas não vamos depender da localidade do sistema — em uma aplicação web, ela geralmente é enviada pelo navegador do usuário.
Passo 2. ResourceBundle — seu tradutor
\n\nAgora a parte mais interessante: como armazenar as traduções? Em Java, usamos arquivos de propriedades (.properties). Cada arquivo é um conjunto de pares chave=valor.
Criando os arquivos de tradução
\n\nCrie no diretório src/main/resources (ou apenas na pasta com os arquivos fonte) três arquivos:
1. Messages.properties (idioma padrão — inglês)
\ngreeting=Hello, {0}!\nfarewell=Goodbye!\napp.title=Task Manager\n\n2. Messages_ru_RU.properties (russo)
\ngreeting=Привет, {0}!\nfarewell=До свидания!\napp.title=Менеджер задач\n\n3. Messages_de_DE.properties (alemão)
\ngreeting=Hallo, {0}!\nfarewell=Auf Wiedersehen!\napp.title=Aufgabenverwaltung\n\nObserve os sufixos: _ru_RU, _de_DE. O Java procura o arquivo pelo padrão: Base