使用JSP的fmt标签配置i18n国际化资源文件可以实现根据不同的地区和语言切换不同的显示.
具体做法如下:
1.在JSP页面中添加fmt标签的引用:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
2.设置需要用到的bundle :
<fmt:setBundle basename="i18n/i18n_${system_language}"/>
其中,system_language是从request中传入的
3.在需要显示变量的地方使用fmt标签来显示:
<div style="font-size: large;color: darkcyan"> <fmt:message key="common.bookname"/> </div>
这里为了演示,假设我们需要显示的东西是是引用的资源文件里的common.bookname这个属性
4.在src/main/resources 路径下新建i18n文件夹(或者在其他的路径下也可以,编译之后,文件夹要在classes目录下),新建资源文件 i18n_en_US.properties 和 i18n_zh_CN.properties,内容如下:
i18n_en_US.properties:
common.copyright=Copyright \u00A9 2013 common.language=language common.bookname=HTTP by picture
i18n_zn_CN.properties:
common.copyright=\u7248\u6743\u6240\u6709 \u00A9 2013 common.language=\u7cfb\u7edf\u8bed\u8a00 common.bookname=\u56fe\u89e3HTTP
5.在服务器端添加一个filter,在请求中判断需要显示哪种语言,通过设置system_language的值,使页面的显示发生变化:
package com.jiaoyiping.websample; /* * Created with Intellij IDEA * USER: 焦一平 * Mail: jiaoyiping@gmail.com * Date: 2016/10/19 * Time: 14:27 * To change this template use File | Settings | Editor | File and Code Templates */ import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Locale; @WebFilter(urlPatterns = "/*") public class I18NFilter implements Filter { private static final String COOKIE_LANGUAGE = "cookie_language"; private static final String SYSTEM_LANGUAGE = "system_language"; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; String systemLanguage = getSystemLanguage(httpServletRequest); request.setAttribute(SYSTEM_LANGUAGE, systemLanguage); chain.doFilter(request, response); } @Override public void destroy() { System.out.println("init...."); } private String getSystemLanguage(HttpServletRequest request) { String systemLanguage = null; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (COOKIE_LANGUAGE.equals(cookie.getName())) { systemLanguage = cookie.getValue(); break; } } } if (systemLanguage == null || "".equals(systemLanguage)) { systemLanguage = request.getLocale().toString(); } if (systemLanguage == null || "".equals(systemLanguage)) { systemLanguage = Locale.getDefault().toString(); } return systemLanguage; } }
我们通过request.setAttribute("system_language",${system_language}); 来改变JSP中的bundle的名字,实现切换显示语言的功能,
getSystemLanguage()方法,先是从cookie中找显示语言,若没有找到,则使用浏览器的语言,如果是空,则取操作系统的默认语言
5.为了能够动态显示出来效果,我们提供两个按钮,点击之后可以切换语言:
<div id="footer"> <div id="copyright"> <span><fmt:message key="common.copyright"/></span> </div> <div id="language"> <span><fmt:message key="common.language"/>:</span> <a href="#" data-value="zh_CN">中文</a> <span>|</span> <a href="#" data-value="en_US">English</a> </div> </div>
引入jquery文件,在dom被加载完毕之后执行一些操作
<script type="text/javascript"> $(function () { $('#language').find('a').click(function () { var language = $(this).data('value'); document.cookie = "cookie_language=" + language + ";expires=365"; location.reload(); }); }); </script>
最终的结果实现了点击切换语言的功能(截取的git图,没有鼠标放到链接上的小手,所以显示的有点不太清楚):
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现