Internacionalização (i18n) refere-se ao processo de desenvolvimento de aplicações que suporatm múltiplos idiomas e formatos de dados, sem necessidade de reescrever a lógica do código. Localização (l10n), por outro lado, é o processo de adaptar uma aplicação internacionalizada para um idioma ou região específica. Uma região (locale) representa um contexto geográfico, político ou cultural. Exemplos de operações sensíveis à região incluem a exibição de datas, onde o formato varia conforme a localização do usuário — por exemplo, 01/27/2018 nos EUA versus 27/01/2018 na Austrália.
Para implementar internacionalização, há duas abordagens principais:
- Criar versões separadas de recursos estáticos para cada região.
- Isolar elementos de texto em arquivos de propriedades, permitindo que a aplicação carregue automaticamente os textos apropriados com base no locale.
A classe java.util.Locale define uma região. Um objeto Locale contém três componentes principais: idioma, país e variante. O idioma é fundamental, mas não suficiente sozinho — por exemplo, o inglês pode ser falado de formas diferentes em EUA e Reino Unido. A variante serve para identificadores específicos de fornecedor ou plataforma, como WIN para Windows ou MAC para Macintosh.
Exemplos de criação de objetos Locale:
Locale locale1 = new Locale("en", "US");
Locale locale2 = Locale.CHINA;
Locale locale3 = Locale.getDefault();
Os códigos de idioma seguem padrões ISO 639 (ex: zh para chinês, en para inglês), enquanto os códigos de país seguem ISO 3166 (ex: CN para China, US para Estados Unidos).
Para internacionalizar uma aplicação Spring MVC, os passos são:
- Separar textos em arquivos de propriedades.
- Selecionar e carregar o arquivo apropriado com base no locale do usuário.
Exemplo de arquivos de propriedades:
# i18n.properties (padrão)
i18n.username=Username
i18n.password=Password
# i18n_zh_CN.properties
i18n.username=\u7528\u6237\u540D
i18n.password=\u5BC6\u7801
O nome dos arquivos segue o padrão: basename_languageCode_countryCode. Para carregar esses arquivos, usa-se java.util.ResourceBundle, embora no Spring MVC se utilize o bean messageSource.
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:i18n</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
<property name="cacheSeconds" value="120"/>
</bean>
Para definir o locale da aplicação, pode-se usar LocaleResolver. As opções incluem:
AcceptHeaderLocaleResolver: Usa o cabeçalho HTTPAccept-Language.SessionLocaleResolver: Armaznea o locale na sessão.CookieLocaleResolver: Armazana o locale em um cookie.
Exemplo de configuração com SessionLocaleResolver e LocaleChangeInterceptor:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
No JSP, utiliza-se a tag <spring:message> para exibir mensagens localizadas:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<spring:message code="i18n.username" text="Username"/>
<spring:message code="i18n.password" text="Password"/>
<a href='<c:url value="/i18n?locale=zh_CN"/>'>中文</a>
<a href='<c:url value="/i18n?locale=en_US"/>'>English</a>
A URL deve incluir o parâmetro locale para mudar o idioma, como ?locale=zh_CN ou ?locale=en_US. Caso o arquivo correspondente não exista, será usado o arquivo padrão `i18n.properties.