Как я могу динамически переключать язык в весенний MVC?

1

Я хочу переключить язык между английским и китайским, поэтому я создаю два языковых файла:

messages_en.properties messages_zh.properties

и в jsp файле, мой код, как показано ниже:

<c:choose>
<c:when test="${language=='en'}">
    <a href='<c:url value="/language?language=zh" />'>
    <i class='glyphicon glyphicon-asterisk'></i>&nbsp;
        <s:message code="label.language" />
    </a>
</c:when>
<c:otherwise>
    <a href='<c:url value="/language?language=en" />'>
    <i class='glyphicon glyphicon-asterisk'></i>&nbsp;
        <s:message code="label.language" />
    </a>
</c:otherwise>

и в файле контроллера, мой код, как показано ниже:

@RequestMapping(value = { "/language" }, method = RequestMethod.GET)
public String switchLanguage(@RequestParam("language") String language,
        ModelMap model) {
    Locale currentLocale = null;

    if ("zh".equals(language)) {
        currentLocale = new Locale("zh", "CN");
    } else if ("en".equals(language)) {
        currentLocale = new Locale("en", "US");
    }
    model.put("language", currentLocale.getLanguage());

    return "/book/index";
}

и в.xml файле, я config MessageSource, как показано ниже:

 <bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:language/messages"/>
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

Как я могу изменить код действия контроллера для динамического переключения языка?

Благодарю.

Теги:
spring
spring-mvc
internationalization

2 ответа

1

Посмотрите на компонент org.springframework.web.servlet.i18n.LocaleChangeInterceptor.

Похоже, это то, чего вам не хватает, или пытаетесь написать себя. Он выбирает параметр ?language=en URL и изменяет этот языковой стандарт пользователя для вас.

Хороший учебник здесь

  • 0
    В учебнике используется ControllerClassNameHandlerMapping, который устарел в Spring 4.3.4.
0

Вы можете использовать

Locale locale = Locale.forLanguageTag(language);

чтобы получить нужную локаль. language может быть чем-то вроде "en" или "en_US". Проблема в том, что вы получаете только язык с вашего запросаParameter и знаете по определению, какую страну использовать.

Я бы создал карту для этого, содержащую языки как Ключи и страны как ценности. Таким образом, вы можете сделать

String languageCountry = language + "_" + myCountryMap.get(language); // returns "US"
Locale locale = Locale.forLanguageTag(languageCountry );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню