Я хотел добавить функцию интернационализации и локализации, предоставляемую весной 3, в один из моих текущих проектов. Я просмотрел весеннюю документацию и затем поискал в интернете, чтобы найти некоторые ресурсы.
Но я не смог найти ресурс, который смог бы удовлетворить мои требования клиента. Большинство уроков напоминают приложение hello world, которое дает базовое понимание. Даже весенняя документация не дает подробного объяснения по интеграции этой функции в наш собственный проект. Опытные разработчики могут выбрать материал из весенней документации. Но для других нужно приложить дополнительные усилия, чтобы все заработало. В этом уроке я собираюсь объяснить очень практичный сценарий, которого ожидает большинство клиентов.
Требование
Я использую весеннюю безопасность с моим приложением. Пользователь должен иметь возможность выбирать язык на странице входа в систему, которая была указана как «страница входа» XML-файла Spring Security. Я указал ссылки «Английский», «Китайский», «Немецкий» и «Испанский» в правом верхнем углу страницы входа в систему, чтобы выбрать язык. Пользователь может выбрать язык и войти в систему, указав имя пользователя и пароль. Тогда вся заявка должна быть на выбранном языке. А также при выборе языка на странице входа в систему, содержимое страницы входа также должно быть изменено.
Пружинные конфигурации
В качестве первого шага мне нужно было настроить перехватчик LocaleChangeInterceptor с помощью dispatcher-servlet.xml файл. Это имя файла XML будет меняться в соответствии с именем, данным DispatcherServlet в файле web.xml . Я дал «Диспетчер» в качестве имени для DispatcherServlet. Поэтому я должен создать файл dispatcher-servlet.xml в папке / WEB-INF. Мое приложение работает на Tomcat 7.
Я не мог заставить это работать, следуя способу объявления этого перехватчика как в весенней документации. Запрос на изменение локали перед входом в систему (т. Е. Со страницы входа в систему) не был перехвачен перехватчиком смены локали. Поэтому мне пришлось объявить это паром.
1
2
3
4
5
6
7
8
|
<span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><mvc:interceptors></span> <MVC: перехватчики></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><mvc:interceptor></span> <MVC: перехватчик></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><mvc:mapping path= "/doChangeLocale*" /></span> <mvc: mapping path = "/ doChangeLocale *" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><bean class = "org.springframework.web.servlet.i18n.LocaleChangeInterceptor" ></span> <bean class = "org.springframework.web.servlet.i18n.LocaleChangeInterceptor" ></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><property name= "paramName" value= "locale" /></span> <property name = "paramName" value = "locale" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ></bean></span> </ Фасоль></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ></mvc:interceptor></span> </ MVC: перехватчик></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ></mvc:interceptors></span> </ MVC: перехватчики></span> |
LocaleChangeInterceptor будет перехватывать запрос с просьбой об изменении локали, и соответствующий код локали будет сохраняться в сеансе с помощью SessionLocaleResolver .
Далее мы рассмотрим, как объявить ‘SessionLocaleResolver’ в файле ‘dispatcher-servlet.xml’.
1
2
3
|
<span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><bean id= "localeResolver" class = "org.springframework.web.servlet.i18n.SessionLocaleResolver" ></span> <bean id = "localeResolver" class = "org.springframework.web.servlet.i18n.SessionLocaleResolver" ></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><property name= "defaultLocale" value= "en" /></span> <property name = "defaultLocale" value = "en" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ></bean></span> </ Фасоль></span> |
SessionLocaleResolver сохранит локаль в текущем сеансе и разрешит ее для каждого последующего запроса пользователя для текущего сеанса.
Далее мы должны объявить компонент ресурса сообщения.
01
02
03
04
05
06
07
08
09
10
|
<span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><bean id= "messageSource" class = "org.springframework.context.support.ReloadableResourceBundleMessageSource" ></span> <bean id = "messageSource" class = "org.springframework.context.support.ReloadableResourceBundleMessageSource" ></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><property name= "useCodeAsDefaultMessage" value= "true" /></span> <property name = "useCodeAsDefaultMessage" value = "true" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><property name= "basenames" ></span> <property name = "basenames" ></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><list></span> <Список></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><value>classpath:messages</value></span> <Значение> CLASSPATH: сообщения </ значение></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ></list></span> </ Список></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ></property></span> </ Недвижимость></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><property name= "cacheSeconds" value= "0" /></span> <property name = "cacheSeconds" value = "0" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><property name= "defaultEncoding" value= "UTF-8" ></property></span> <property name = "defaultEncoding" value = "UTF-8" > </ property></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ></bean></span> </ Фасоль></span> |
Мое приложение должно поддерживать 4 языка. Поэтому я добавил 4 файла свойств в папку «resources» (в конечном итоге все эти файлы свойств должны находиться в папке «classes») следующим образом.
messages_de.properties — немецкий
messages_en.properties — английский
messages_zh.properties — китайский
messages_es.properties — испанский
Обратите внимание, что все имена файлов должны начинаться с текста, который вы указали в качестве свойства ‘basenames’ компонента ресурсов сообщения.
Конфигурации безопасности Spring 3 были очень важны в этой реализации. Имейте в виду, что когда вы нажимаете любую ссылку для изменения локали со страницы входа в систему, вы еще не аутентифицированы. Но все же этот запрос должен быть перехвачен «LocaleChangeInterceptor». В противном случае язык не будет изменен должным образом. Поэтому любому анонимному пользователю должно быть разрешено делать запрос на изменение локали, и этот запрос должен проходить через «LocaleChangeInterceptor».
Внимательно изучите мою весеннюю конфигурацию безопасности.
1
2
3
4
5
6
|
<span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><http auto-config= "false" ></span> <http auto-config = "false" ></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><form-login login-page= "/login.jsp" authentication-failure-url= "/login.jsp?login_error=true" default -target-url= "/mainMenu.htm" /></span> <form-login login-page = "/ login.jsp" authentication-fail-url = "/ login.jsp? login_error = true" default -target-url = "/ mainMenu.htm" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><logout logout-success-url= "/login.jsp" /></span> <logout logout-success-url = "/ login.jsp" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><intercept-url pattern= "/doChangeLocale**" access= "ROLE_ANONYMOUS,ROLE_ADMIN,ROLE_USER" /></span> <intercept-url pattern = "/ doChangeLocale **" access = "ROLE_ANONYMOUS, ROLE_ADMIN, ROLE_USER" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><intercept-url pattern= "/**" access= "ROLE_ADMIN,ROLE_USER" /></span> <intercept-url pattern = "/ **" access = "ROLE_ADMIN, ROLE_USER" /></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ></http></span> </ HTTP></span> |
В файле login.jsp пользователь может войти в систему, указав имя пользователя и пароль, а также на этой странице есть соответствующие ссылки для изменения локали. Когда пользователь делает запрос к защищенному ресурсу без аутентификации, он будет перенаправлен на страницу login.jsp. Приведенная выше конфигурация говорит, что все запросы, поступающие в приложение, должны быть от аутентифицированного пользователя, а также пользователь должен быть авторизован, за исключением запроса «/ doChangeLocale **».
Перехват URL ‘/ doChangeLocale **’ очень важен. Без этого запросы на изменение локали не перехватываются перехватчиком изменения локали и, наконец, локаль не изменится.
Ниже приведены ссылки на изменения локали, которые находятся в файле login.jsp.
1
2
3
4
|
<span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><a href= "<%=request.getContextPath()%>/doChangeLocale?locale=en" >English</a></span> <a href= "<%=request.getContextPath()%> / doChangeLocale? locale = en " > английский </a></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><a href= "<%=request.getContextPath()%>/doChangeLocale?locale=de" >German</a></span> <a href= "<%=request.getContextPath()%> / doChangeLocale? locale = de " > немецкий </a></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><a href= "<%=request.getContextPath()%>/doChangeLocale?locale=es" >Spanish</a></span> <a href= "<%=request.getContextPath()%> / doChangeLocale? locale = es " > испанский </a></span> <span class = "notranslate" onmouseover= "_tipon(this)" onmouseout= "_tipoff()" ><span class = "google-src-text" style= "direction: ltr; text-align: left" ><a href= "<%=request.getContextPath()%>/doChangeLocale?locale=zh" >Chinese</a></span> <a href= "<%=request.getContextPath()%> / doChangeLocale? locale = zh " > китайский </a></span> |
Надеюсь, это будет полезно для вас.
Ссылка: Интернационализация и локализация Spring 3 — не «Hello World», но «практично» от нашего партнера по JCG Семика локу калуге в блоге Code Box .