我最近想將Spring 3提供的國際化和本地化功能添加到我當前的項目之一中。 我瀏覽了Spring文檔,然后在Internet上搜索以找到一些資源。
但是我找不到能夠滿足客戶要求的資源。 大多數教程都像hello world應用程序,它提供了基本的理解。 即使是spring文檔,也沒有提供有關將此功能集成到我們自己的項目中的詳細說明。 專業的開發人員可以從spring文檔中挑選東西。 但是對于其他人,則必須付出額外的努力來使事情正常運行。 通過本教程,我將解釋大多數客戶期望的非常實際的情況。
要求
我在我的應用程序中使用Spring Security。 用戶應該能夠從登錄頁面中選擇語言,該頁面被指定為spring security XML文件的“登錄頁面”。 我在登錄頁面的右上角提供了“英語”,“中文”,“德語”和“西班牙語”鏈接,以選擇語言。 用戶可以選擇語言并通過提供用戶名和密碼來登錄系統。 然后,整個應用程序應來自所選語言。 同樣,從登錄頁面選擇語言時,登錄頁面的內容也應更改。
彈簧配置
第一步,我必須在dispatcher-servlet.xml中配置LocaleChangeInterceptor攔截器 文件。 此XML文件名將根據web.xml文件中分配給DispatcherServlet的名稱進行更改。 我已將“ dispatcher”作為DispatcherServlet的名稱。 所以我應該在/ WEB-INF文件夾下創建' dispatcher-servlet.xml '文件。 我的應用程序正在Tomcat 7上運行。
我不能像在Spring文檔中那樣通過聲明此攔截器的方法來使其工作。 登錄之前更改語言環境的請求(即,從登錄頁面開始)未被語言環境更改攔截器攔截。 因此,我不得不宣布它為休假。
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/doChangeLocale*"/><bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" ><property name="paramName" value="locale" /></bean></mvc:interceptor>
</mvc:interceptors>
“ LocaleChangeInterceptor ”將攔截請求更改語言環境的請求,并借助“ SessionLocaleResolver ”將相應的語言環境代碼存儲在會話中。
接下來,我們將研究如何在“ dispatcher-servlet.xml”文件中聲明“ SessionLocaleResolver”。
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"><property name="defaultLocale" value="en" />
</bean>
SessionLocaleResolver將在當前會話中存儲區域設置,并針對當前會話的每個后續用戶請求解析該區域設置。
接下來,我們必須聲明消息資源bean。
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><property name="useCodeAsDefaultMessage" value="true" /><property name="basenames"><list><value>classpath:messages</value></list></property><property name="cacheSeconds" value="0" /><property name="defaultEncoding" value="UTF-8"></property>
</bean>
我的應用程序應支持4種語言。 因此,我將4個屬性文件添加到“ resources”文件夾中(最終,所有這些屬性文件應位于“ classs”文件夾中),如下所示。
messages_de.properties –德語
messages_en.properties –英文
messages_zh.properties –中文
messages_es.properties –西班牙語
注意,所有文件名都應以您指定為消息資源bean的'basenames'屬性的文本開頭。
Spring 3安全配置在此實現中非常重要。 請記住,當您單擊登錄頁面上的任何區域更改鏈接時,您尚未通過身份驗證。 但是,該請求仍應由“ LocaleChangeInterceptor”攔截。 否則,語言將不會按預期更改。 因此,應該允許任何匿名用戶發出區域更改請求,并且該請求應通過“ LocaleChangeInterceptor”。
仔細研究我的spring安全配置。
<http auto-config="false"><form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=true" default-target-url="/mainMenu.htm"/><logout logout-success-url="/login.jsp"/><intercept-url pattern="/doChangeLocale**" access="ROLE_ANONYMOUS,ROLE_ADMIN,ROLE_USER"/><intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />
</http>
用戶可以通過login.jsp文件提供用戶名和密碼來登錄系統,并且該頁面具有用于更改語言環境的相應鏈接。 當用戶未經身份驗證而對受保護資源提出任何請求時,該用戶將被重定向到login.jsp頁面。 上面的配置說,所有傳入應用程序的請求都應來自經過身份驗證的用戶,并且除了“ / doChangeLocale **”請求外,還應授權該用戶。
攔截URL'/ doChangeLocale **'非常重要。 否則,語言環境更改攔截器將不會攔截更改語言環境的請求,并且最終語言環境也將不會更改。
以下是放置在login.jsp文件中的語言環境更改鏈接。
<a href="<%=request.getContextPath()%>/doChangeLocale?locale=en">English</a>
<a href="<%=request.getContextPath()%>/doChangeLocale?locale=de">German</a>
<a href="<%=request.getContextPath()%>/doChangeLocale?locale=es">Spanish</a>
<a href="<%=request.getContextPath()%>/doChangeLocale?locale=zh">Chinese</a>
希望這對您有幫助。
參考: Spring3國際化和本地化–并非來自“ Hello World”,而是來自JCG合作伙伴 Semika loku kaluge(來自Code Box博客)的“實用” 。
翻譯自: https://www.javacodegeeks.com/2012/07/spring-3-internationalization-and.html