Internacionalização (i18n)
Conceitos Básicos
Locale
// Criando Locales
Locale brLocale = new Locale("pt", "BR");
Locale usLocale = Locale.US;
Locale currentLocale = Locale.getDefault();
// Definindo Locale padrão
Locale.setDefault(brLocale);
ResourceBundle
// Arquivo: messages_pt_BR.properties
// mensagem=Olá, {0}!
// Arquivo: messages_en_US.properties
// message=Hello, {0}!
ResourceBundle bundle = ResourceBundle.getBundle("messages", brLocale);
String msg = bundle.getString("mensagem");
Textos e Mensagens
Properties Files
# messages_pt_BR.properties
welcome=Bem-vindo
error.notfound=Não encontrado
app.title=Minha Aplicação
# messages_en_US.properties
welcome=Welcome
error.notfound=Not found
app.title=My Application
Uso em Código
public class I18nDemo {
private ResourceBundle messages;
public void setLocale(Locale locale) {
messages = ResourceBundle.getBundle("messages", locale);
}
public String getMessage(String key) {
return messages.getString(key);
}
}
Boas Práticas
Organização
Separar textos em arquivos properties
Usar chaves hierárquicas
Manter consistência entre traduções
Documentar contexto das mensagens
Dicas de Implementação
// Uso de MessageFormat
String pattern = messages.getString("welcome.user");
MessageFormat formatter = new MessageFormat(pattern);
String result = formatter.format(new Object[]{"João"});
// Fallback para locale padrão
try {
String msg = messages.getString("key");
} catch (MissingResourceException e) {
msg = defaultMessages.getString("key");
}
Frameworks e Ferramentas
Spring Framework
@Configuration
public class I18nConfig {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("messages");
source.setDefaultEncoding("UTF-8");
return source;
}
}
Ferramentas de Gestão
POEditor
Crowdin
Lokalise
Trados
Testes
Testando Internacionalização
@Test
public void testMessageInDifferentLocales() {
ResourceBundle ptBR = ResourceBundle.getBundle("messages", new Locale("pt", "BR"));
ResourceBundle enUS = ResourceBundle.getBundle("messages", Locale.US);
assertEquals("Olá", ptBR.getString("greeting"));
assertEquals("Hello", enUS.getString("greeting"));
}
Próximos Passos
26 June 2025