繁体   English   中英

如何在I18n中使用Spring?

[英]How to use Spring with I18n?

我的项目在github上: https : //github.com/QuentinVaut/JavaquariumEE

我遵循了许多教程,他们说了不同的话,我尝试实现教程中找到的解决方案,但没有错,我理解为什么。

您能告诉我我的项目出了什么问题并向我解释吗?

许多教程和Github示例之一:

http://memorynotfound.com/spring-mvc-internationalization-i18n-example/

我粗略浏览了该教程。 这是我的方法:

首先配置它:

在返回MessageSource实现的配置类中创建一个Bean。

@Bean
public MessageSource messageSource() //The bean must be named messageSource.
{
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setCacheSeconds(-1); //cache time in seconds was set to -1. This disables reloading and makes the message source cache messages forever (until the JVM restarts).
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
messageSource.setBasenames(
"/WEB-INF/i18n/messages", "/WEB-INF/i18n/errors"); //the message source is configured with the basenames /WEB-INF/i18n/messages and /WEB-INF/i18n/errors. This means that the message source will look for filenames like /WEB-INF/i18n/messages_en_US.properties, /WEB-INF/i18n/errors_fr_FR.properties
return messageSource;
}

现在创建一个返回LocaleResolver的bean:

@Bean
public LocaleResolver localeResolver() //The bean must be named localeResolver.
{
return new SessionLocaleResolver();
}

这使LocaleResolver可用于DispatcherServlet执行的任何代码。 这意味着其他非视图JSP不能访问LocaleResolver。 要解决此问题,您可以创建一个过滤器并按如下所示进行设置:

private ServletContext servletContext;
private LocaleResolver = new SessionLocaleResolver();    
@Inject MessageSource messageSource;
...

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
request.setAttribute(
DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver
);
JstlUtils.exposeLocalizationContext(
(HttpServletRequest)request, this.messageSource
); 

现在,您需要配置处理程序拦截器:

您可以在配置类中重写WebMvcConfigurerAdapter的addInterceptors方法,以设置LocaleChangeInterceptor(或与此相关的任何其他拦截器):

@Override
public void addInterceptors(InterceptorRegistry registry)
{
super.addInterceptors(registry);
registry.addInterceptor(new LocaleChangeInterceptor());
}

现在,您只需在控制器上使用@Injected LocaleResolver。 您只需在解析器上调用setLocale即可更新当前语言环境。

编辑:更具体的示例:

假设您有一个具有以下内容的简单控制器:

@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(Map<String, Object> model)
{
model.put("date", new Date());
model.put("alerts", 12);
model.put("numCritical", 0);
model.put("numImportant", 11);
model.put("numTrivial", 1);
return "home/index";
}

然后说您在/ WEB-INF / i18n /下有messages_en_US.properties文件。 此属性文件包含本地化为美国英语的消息。

title.alerts =服务器警报页面

Alerts.current.date =当前日期和时间:

number.alerts =那里{0,choice,0#是没有警报| 1#是一个警报| 1

alert.details = {0,choice,0#没有警报是| 1#一个警报是| 1 <{0,number,integer}> \\警报是关键。 {1,choice,0#没有警报是| 1#一个警报是| 1 <{1,number,\\ integer}警报}很重要。 {2,choice,0#没有警报是| 1#一个警报\\是| 1 <{2,number,integer}警报是微不足道的。

然后,假设您在/ WEB-INF / i18n /下有messages_es_MX.properties文件,并且此文件包含针对墨西哥西班牙语本地化的消息。

title.alerts =服务器AlertasPágina

Alerts.current.date =实际获取值:number.alerts = {0,choice,0#无干草警报| 1#干草无警报| 1

alert.details = {0,choice,0#No Hay Alertas soncríticos| 1#Una alerta es \\crítica| 1 <{0,number,integer} alertas soncríticos}。 \\ {1,choice,0#无重要提示| 1#Una重要提示\\ | 1 <{1,number,integer}重要提示}。 \\ {2,choice,0#No hay alertas son triviales | 1#Una alerta es trivial \\ | 1 <{2,number,integer} alertas son triviales}。

现在,您需要在JSP中使用<spring:message>标记在英语和西班牙语之间进行翻译。 这就是您的jsp页面的外观:

 <spring:htmlEscape defaultHtmlEscape="true" /> <%--@elvariable id="date" type="java.util.Date"--%> <%--@elvariable id="alerts" type="int"--%> <%--@elvariable id="numCritical" type="int"--%> <%--@elvariable id="numImportant" type="int"--%> <%--@elvariable id="numTrivial" type="int"--%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE html> <html> <head> <title><spring:message code="title.alerts" /></title> </head> <body> <h2><spring:message code="title.alerts" /></h2> <i><fmt:message key="alerts.current.date"> <fmt:param value="${date}" /> </fmt:message></i><br /><br /> <fmt:message key="number.alerts"> <fmt:param value="${alerts}" /> </fmt:message><c:if test="${alerts > 0}"> &nbsp;<spring:message code="alert.details"> <spring:argument value="${numCritical}" /> <spring:argument value="${numImportant}" /> <spring:argument value="${numTrivial}" /> </spring:message> </c:if> </body> </html> 

在我的application.properties中,添加了这一行:

spring.messages.basename=i18n/messages
spring.messages.cache-seconds=-1
spring.messages.encoding=UTF-8

您可以使用此方法删除MessageSource bean。

在我使用之前

 <spring:message code="javaquarium.welcome" text="default text" />

但是我胸腺需要这条线:

<h1 th:text="#{javaquarium.welcome}"></h1>

现在,来自messages.properties的消息可以正确显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM