Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Локализация в Spring


Автор: Terentich 7.10.2011, 20:25
Добрый день!

Нникак не могу заставить работать локализацию при использовании http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/i18n/LocaleChangeInterceptor.html (т. е. смена языка на основе ссылки в приложении).
Судя по http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-localeresolver-interceptor, а также http://viralpatel.net/blogs/2010/07/spring-3-mvc-internationalization-i18n-localization-tutorial-example.html достаточно подобного кода в конфигурационном файле Spring:

Код

<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8"/>
</bean>
 
<bean id="localeChangeInterceptor"
    class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
</bean>
 
<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="en"/>
</bean>
 
<bean id="handlerMapping"
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <ref bean="localeChangeInterceptor" />
    </property>
</bean>


В тестовом проекте использую Java-конгурирование для Spring.
Листинги основных конфигурационных файлов приведены ниже.

Что наблюдаю:
При нажатии на кнопку смены языка (как на английский, так и на русский) ничего не происходит.
Что требуется:
Переключения языка приложения с помощью кнопки в приложении.

Просьба помочь в решении проблемы. Заранее признателен за вашу помощь!

AppConfig.java:
Код

@Configuration
public class AppConfig {

    @Value("#{database['jdbc.url']}")
    private String url;
    @Value("#{database['jdbc.dialect']}")
    private String dialect;
    @Value("#{database['jdbc.username']}")
    private String username;
    @Value("#{database['jdbc.password']}")
    private String password;

    @Bean
    DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource(url,
                username, password);
        return dataSource;
    }

    @Bean
    SessionFactory sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new AnnotationSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());

        Properties hibernateProperties = new Properties();
        hibernateProperties.put("hibernate.dialect", dialect);
        hibernateProperties.put("hibernate.show_sql", "true");
        hibernateProperties.put("hibernate.connnection.charSet", "UTF-8");

        sessionFactory.setHibernateProperties(hibernateProperties);

        return sessionFactory.getObject();
    }

    @Bean
    MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");

        return messageSource;
    }

    @Bean
    ViewResolver viewResolver() {
        TilesViewResolver viewResolver = new TilesViewResolver();

        return viewResolver;
    }

    @Bean
    LocaleChangeInterceptor localChangeInterceptor() {
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();

        return localeChangeInterceptor;
    }

    @Bean
    DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping(
            LocaleChangeInterceptor localeChangeInterceptor) {
        DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping = new DefaultAnnotationHandlerMapping();
        defaultAnnotationHandlerMapping
                .setInterceptors(new Object[] { localeChangeInterceptor });

        return defaultAnnotationHandlerMapping;
    }

    @Bean
    LocaleResolver localeResolver() {
        CookieLocaleResolver localeResolver = new CookieLocaleResolver();
        localeResolver.setDefaultLocale(Locale.ENGLISH);

        return localeResolver;
    }

    @Bean
    TilesConfigurer tilesConfigurer() {
        TilesConfigurer tilesConfigurer = new TilesConfigurer();
        tilesConfigurer.setDefinitions(new String[] { "/WEB-INF/tiles.xml" });

        return tilesConfigurer;
    }

    @Bean
    CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setMaxUploadSize(100000);

        return resolver;
    }
}


index.jsp:
Код

<%@ page language="java" contentType="text/html; charset=utf8"
    pageEncoding="utf8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<body>
    <h1>Заголовок страницы</h1>
    <span style="float: right">
    <a href="?locale=en">en</a>
    |
    <a href="?locale=ru">ru</a>
</span>
</body>
</html>


spring.xml:
Код

<?xml version="1.0" encoding="UTF-8"?>
<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"
   xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
   xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
   http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd 
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
   http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
   <context:component-scan base-package="org.terentich.site" />
   <mvc:annotation-driven />
   <util:properties id="database" location="/WEB-INF/database.properties" />
</beans>


web.xml:
Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">
   <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/spring.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>
   <filter>
      <filter-name>charsetFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter
      </filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
      <init-param>
         <param-name>forceEncoding</param-name>
         <param-value>true</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>charsetFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Автор: MisterCleric 7.10.2011, 20:46
Привет.
Меня смущает вот это:
Код

 @Bean
    DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping(
            LocaleChangeInterceptor localeChangeInterceptor) {
        DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping = new DefaultAnnotationHandlerMapping();
        defaultAnnotationHandlerMapping
                .setInterceptors(new Object[] { localeChangeInterceptor });
        return defaultAnnotationHandlerMapping;
    }

Попробуй так:
Код

 @Bean
    DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping() {
        DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping = new DefaultAnnotationHandlerMapping();
        defaultAnnotationHandlerMapping
                .setInterceptors(new Object[] { localChangeInterceptor() });
        return defaultAnnotationHandlerMapping;
    }

Автор: Terentich 7.10.2011, 23:01
MisterCleric, привет!

Изменил метод defaultAnnotationHandlerMapping так, как ты написал.
Увы, не взлетело. :(

Самое обидное то, что ошибок никаких нет. А может как-то можно подебажить приложение?

Автор: Terentich 8.10.2011, 00:13
Тьфу, ты черт. 
Столько времени убил! Как жаль...

Смотрим внимательно и не повторяем таких глупых ошибок:

Код

<?xml version="1.0" encoding="UTF-8"?>
<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"
   xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
   xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
   http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
   http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd 
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
   http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
   <context:component-scan base-package="org.terentich.site" />
   <mvc:annotation-driven />
   <util:properties id="database" location="/WEB-INF/database.properties" />
</beans>


Это -  <mvc:annotation-driven /> - явно здесь лишнее, потому как уже есть другая строка: <context:component-scan base-package="org.terentich.site" />.
Судя по всему, Spring два раза сканировал компоненты, в результате чего локализации сносило крышу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)