Spring Internalization以正确的语言打印国家

时间:2013-12-20 11:04:55

标签: java spring

当我想访问地址为?language = en或language = fr的页面时,我使用以下控制器:

public class AddressController {
    private static Logger logger = Logger.getLogger(AddressController.class);

    @RequestMapping(value="/address",method=RequestMethod.GET)
    public ModelAndView init(HttpServletRequest r){
            ApplicationContext context = new FileSystemXmlApplicationContext("/WEB-INF/spring-servlet.xml");
            SessionLocaleResolver resolver = (SessionLocaleResolver) context.getBean("localeResolver");

            String[] locales = resolver.resolveLocale(r).getISOCountries();
            //String[] locales = Locale.getISOCountries();
            Map<String,String> countryList = new HashMap<String,String>();

            for(String countryCode : locales){
                 Locale loc = new Locale(resolver.resolveLocale(r).getLanguage(),countryCode);
                 countryList.put(loc.getDisplayCountry(), loc.getDisplayCountry());
                 logger.info(loc.getDisplayCountry());
             }

             Map<String,String> tree = new TreeMap<String,String>(countryList);
             ModelAndView modelAndView = new ModelAndView("address");
             modelAndView.addObject("address",new Address());
             modelAndView.addObject("countriesList", tree);

             return modelAndView;
     }
}

弹簧servlet.xml中:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.application.myGoogleAppEngine.controller" />
    <!-- <mvc:annotation-driven /> -->

    <!-- Register the messageBundle.properties -->
    <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
       <property value="classpath:MessageBundle,classpath:Messages" name="basenames" />
       <property value="UTF-8" name="defaultEncoding" />
    </bean>

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

    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
          <property name="paramName" value="language" />
    </bean>

    <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
         <property name="interceptors">
               <ref bean="localeChangeInterceptor" />
         </property>
    </bean>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property value="org.springframework.web.servlet.view.JstlView" name="viewClass" />
         <property name="prefix">
              <value>/WEB-INF/pages/</value>
         </property>
         <property name="suffix">
             <value>.jsp</value>
         </property>
    </bean>

</beans>

当我通过调用/ address?language = en或/ address?language = fr访问控制器时,我注意到循环中的Logger'for(String countryCode:locales)',每个国家/地区名称都用法语打印不是英文。

你有解决方案吗?

1 个答案:

答案 0 :(得分:0)

为什么不使用请求参数'language'来创建国家/地区列表?只要会话保持活动,SessionLocaleProvider将始终返回相同的语言。

以下代码示例使用该参数构建本地化国家/地区名称列表:

@Controller
public class CountriesController {

    @RequestMapping(value="/countries", method=RequestMethod.GET)
    public ModelAndView getCountries(@RequestParam("language") String language){

        List<String> countries = new ArrayList<>();

        Locale locale = new Locale(language);
        String[] isoCountries = Locale.getISOCountries();
        for (String isoCountry : isoCountries) {

            Locale countryLoc = new Locale(language, isoCountry);
            String name = countryLoc.getDisplayCountry(locale);

            if (!"".equals(name)) {
               countries.add(name);
            }

         }

         ModelAndView model = new ModelAndView("countries");
         model.addObject("model", countries);

        return model;
   }
}