春天:如何获得" ACTUAL" /" CURRENT" locale就像它适用于消息?

时间:2015-04-27 18:02:21

标签: java spring spring-mvc locale gettext

我有点困惑,因为我有一个工作系统,但我无法获得实际/当前的语言环境。

工作系统就是这样:

例如来自:http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/

一些messages.properties文件,

带有以下内容的servlet-context.xml文件:

  <!-- Additional i18n -->
  <bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="en" />
  </bean>

  <bean id="translationService" class="inbiz.webapp.service.TranslationService">
  </bean>
  <alias name="translationService" alias="t" />

  <mvc:interceptors>
    <bean id="localeChangeInterceptor" 
      class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
      <property name="paramName" value="lang" />
    </bean>
  </mvc:interceptors>
  <!-- END: Additional i18n -->

对于TranslationService(即使与问题检查没有直接关系也是:java spring mvc @service method: nullpointerexception | newbie and translation

这显然已经使所有事情都在第一个链接的内部工作。所以我可以这样做:

<a href="" th:text="#{help}">Help</a>

这是thymeleaf(http://www.thymeleaf.org/),但与JSP或JSF基本相同。消息加载了正确的语言环境。

但对于我的TranslationService,我需要像消息包一样获取语言环境。

关注:https://templth.wordpress.com/2010/07/21/configuring-locale-switching-with-spring-mvc-3/,我设置了此过滤器:

package inbiz.webapp.filters;

import java.io.IOException;

import java.util.Map;
import java.util.Locale;

import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.LocaleResolver;

import org.springframework.context.i18n.LocaleContextHolder;

import org.springframework.web.servlet.support.RequestContextUtils;

import org.springframework.web.filter.OncePerRequestFilter;

public class LocaleConfigurerFilter extends OncePerRequestFilter {

    private LocaleResolver localeResolver;


    protected void initFilterBean() throws ServletException {

    Locale locale;

        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
        Map resolvers = wac.getBeansOfType(LocaleResolver.class);
        if (resolvers.size()==1) {
            localeResolver = (LocaleResolver) resolvers.values().iterator().next();
        }

    locale = LocaleContextHolder.getLocale();
    System.out.println("DEBUG FILTER LOCALE LCH - INIT: "+locale);

    }


    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain)
    throws IOException, ServletException {

    Locale locale;

    WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());

        Map resolvers = wac.getBeansOfType(LocaleResolver.class);
        if (resolvers.size()==1) {
            localeResolver = (LocaleResolver) resolvers.values().iterator().next();
        }
        if (localeResolver!=null) {
            locale = localeResolver.resolveLocale(req);
        System.out.println("DEBUG FILTER LOCALE LRS: "+locale);
            LocaleContextHolder.setLocale(locale);
        }

    locale = LocaleContextHolder.getLocale();
    System.out.println("DEBUG FILTER LOCALE LCH: "+locale);
    locale = RequestContextUtils.getLocale((HttpServletRequest) req);
    System.out.println("DEBUG FILTER LOCALE RCU: "+locale);
    LocaleContextHolder.setLocale(locale);

    chain.doFilter(req, res);

    }

}

调用过滤器,但输出只是:

DEBUG FILTER LOCALE LCH - INIT: en_US
DEBUG FILTER LOCALE LCH: en_US
DEBUG FILTER LOCALE RCU: en_US
DEBUG FILTER LOCALE LCH: en_US
DEBUG FILTER LOCALE RCU: en_US
DEBUG FILTER LOCALE LCH: en_US
DEBUG FILTER LOCALE RCU: en_US

即使使用以下内容调用任何页面:?lang = it_IT

(确实适用于messages.properties)

我很抱歉这可能是太多的信息.​​..但正如我所说,我在理解谁保持实际的语言环境方面有点迷失。此外,下一步是从用户配置文件设置区域设置,但如果用户未登录,则需要受控制的默认值。

所以最后一个问题:我如何获得语言环境?

我认为,我错过了一些基本要点......解决方案只是一条线。但是目前我已经完成了我的&#34; web&#34;资源..;)也许是一个错误的搜索..

另一方面,我提供了一些信息,以便它可能有所帮助 其他人试图实现&#34; gnu gettext&#34;版本

3 个答案:

答案 0 :(得分:7)

  1. 首先,让我们考虑如何在Spring上下文中注册LocaleResolver(注意,默认语言环境已设置):

    @Configuration
    @EnableWebMvc
    @ComponentScan(value = "com.locales.package")
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Bean(name = "localeResolver")
        public LocaleResolver getLocaleResolver(){
            CookieLocaleResolver localeResolver = new CookieLocaleResolver();
            localeResolver.setDefaultLocale(Locale.ENGLISH);
            return localeResolver;
        }
    
    ...
    // Other beans        
    ...
    
    }
    
  2. 最后在我们的控制器(或其他地方),我们可以获得当前的语言环境:

    @Autowired
    private LocaleResolver localeResolver;
    
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView resolveLocale(ModelMap model, HttpServletRequest request) {
        Locale locale = localeResolver.resolveLocale(request);
    
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        modelAndView.addObject("currentLocale", locale.getDisplayLanguage());
    
        return modelAndView;
    }
    
  3. 然后我们可以在JSP(index.jsp)显示结果:

    <h1>Current locale = ${currentLocale}</h1>
    

答案 1 :(得分:2)

尝试使用我在JSP中使用的以下代码来显示语言环境:

${pageContext.response.locale}

答案 2 :(得分:0)

一旦你的Spring Boot i18n配置为消息工作,你可以通过这种方式使用Thymeleaf获得当前的语言环境:

<input th:value="${#locale.language}"/>

价值得像:“en”。

当然你可以使用另一个有效标签或者:组合;)

希望它有所帮助!