基於 Session 的 Spring MVC 國際化實現:攔截器 + ResourceBundle 切換語系
架構設計
LocaleChangeInterceptor 攔截 langType 參數解析語系
- Controller 將
Locale 存入 Session
- JSP 透過
ResourceBundle 讀取對應屬性檔
配置與實現
1. Spring 配置攔截器
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="langType"/> <!-- 預設 locale -->
</bean>
</mvc:interceptors>
2. 訊息屬性檔
# myproperties.properties (預設)
welcome=Welcome
simplified=Simplified Chinese
# myproperties_zh.properties
welcome=歡迎
simplified=簡體中文
# myproperties_en.properties
welcome=Welcome
simplified=English
3. Controller 切換語系並存 Session
@Controller
@RequestMapping("/index")
public class IndexAction {
@GetMapping("/findex")
public String findex(HttpServletRequest request,
@RequestParam String langType,
@RequestParam String page) {
Locale locale;
switch (langType) {
case "zh": locale = Locale.SIMPLIFIED_CHINESE; break;
case "en": locale = Locale.US; break;
default: locale = Locale.getDefault();
}
request.getSession().setAttribute("i18nlanguage", locale);
return "/front/" + page + ".jsp";
}
}
4. JSP 讀取國際化文字
<%@ page import="java.util.*" %>
<%
Locale locale = (Locale) session.getAttribute("i18nlanguage");
ResourceBundle bundle = ResourceBundle.getBundle("myproperties", locale);
%>
<a href="${pageContext.request.contextPath}/index/findex.do?langType=en&page=Home">ENG</a> |
<a href="${pageContext.request.contextPath}/index/findex.do?langType=zh&page=Home"><%=bundle.getString("simplified")%></a>
進階優化建議
- 使用
SessionLocaleResolver 替代手動存 Session,配合 LocaleChangeInterceptor 完全聲明式
- JSP 採用
<fmt:message key="welcome"/> (JSTL fmt 標籤庫) 替代 Scriptlet
- 屬性檔命名遵循
messages_zh_CN.properties 標準格式
- 支援參數化訊息:
welcome=Welcome, {0}! → bundle.getString("welcome", new Object[]{userName})
Session vs Cookie vs Accept-Language