`

Java语言对国际化的支持

阅读更多
最近在做项目的时候,由于用到Java基础的东西比较少,都是一些框架的封装的应用,考虑到以后如果接触到其他框架了,会不会对这些底层的东西遗忘啊,所以下定决心,决定每天复习一点之前的知识,作为自己的一个备忘录吧。

随心翻到的一篇,Java对国际化的支持,做过web开发的同学都应该知道I18N这个东西,我就不去讲他的概念了,来张图片说说他的好处吧。



好处有那么多,我就不针对各个点进行详解了,我们直接来看Java语言的国际化的实现机制吧,当然下图是针对B/S框架而言的。





服务器根据客户端的传过来的语言进行解析,这些语言的值一般都保存在浏览器中,举例:

在IE浏览器中的语言选择如下图:
点击工具:




点击语言:




到时候浏览器向服务器发送请求的时候,就会把这个选项带着,然后交给web容器,web容器经过映射,拿到你想要的语言项。

所以:Web容器中的Locale对象来源于Request对象。


好了,现在我们来说说如何开发吧。

你想实现多语言,首先你得告诉服务器你支持哪几种语言啊,就是你有哪些语言的资源文件。

资源文件位置:在类路径下,以.properties为后缀。

资源文件命名:基本的命名_场所标志.properties。

场所标志:Locale对象中保存的一个属性值,例如:中国:zh_CN,美国en_US

那么上述资源文件的命名举例:myres_zh_CN.properties。


资源文件内容:Key=Value,例如:jsp.index.user=User Login,由于多个模块都可能用到Key值,因此为了区分,它支持"."来命名,接触过资源文件的同学应该都知道这些。

举例:

英文的资源文件:
jsp.index.userId=UserId:
jsp.index.userPwd=Password:


中文的资源文件:
jsp.index.userId=用户名:
jsp.index.userPwd=密码:


上述保存的中文就是这样的么?当然不是的,Java中保存汉字的时候是以Unicode编码保存的,因此需要把这些汉字进行转码。

JDK考虑到了这一点,它提供了一个转码的工具,供我们使用,当然了,现在IDE的集成开发工具都集成了很多插件,这样的转码工作,完全交给集成开发工具就可以搞定的,在这里我也就提下我们最原始的转码办法吧,当然我相信,这些转码插件底层应该也是调用了这个工具吧。


转码工具:native2ascii。JDK自带的。

用法:native2ascii 原始文件的全路径 目标文件的全路径(保证你的JAVA_HOME配置的是对的,否则这样执行会提示找不到)。




那么在我的本地D盘下会生成一个文件,打开如下:

jsp.index.title=\u7528\u6237\u767b\u5f55
jsp.index.userId=\u7528\u6237\u540d\uff1a
jsp.index.userPwd=\u5bc6\u7801\uff1a
jsp.index.submit=\u767b\u5f55
err.login.failure=\u767b\u5f55\u5931\u8d25\uff01


好了,预备知识差不多了,我们就开始项目吧。

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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">
<title>Insert title here</title>
</head>
<body>
	<f:setBundle basename="res.myres" />
	<c:if test="${errKey!=null}">
		<f:message key="${errKey }" />
	</c:if>
	<f:message key="jsp.index.title" />
	<form action="login.do" method="post">
		<p>
			<f:message key="jsp.index.userId" />
			<input type="text" name="userId" />
		</p>
		<p>
			<f:message key="jsp.index.userPwd" />
			<input type="text" name="userPwd" />
		</p>
		<p>
			<input type="submit" value="<f:message key="jsp.index.submit"/>" />
		</p>
	</form>
</body>
</html>


项目部署到Tomcat中,跑起来,按照之前浏览器的截图,把IE的浏览器语言设置为如下




访问http://localhost:8080/i18n/index.jsp,查看到的是英文的界面。


再找一个非IE内核的浏览器(我这里用的谷歌),直接访问,看到的应该是中文的界面了。

好了,页面弄好了,但是后台Java代码呢,如何访问资源文件呢?

package i18n;

import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("userId===" + request.getParameter("userId"));
		Locale loc = request.getLocale();
		ResourceBundle bundle = ResourceBundle.getBundle("res.myres", loc);
		String errInfo = bundle.getString("err.login.failure");
		request.setAttribute("errInfo", errInfo);

		//request.setAttribute("errKey", "err.login.failure");
		request.getRequestDispatcher("/index.jsp").forward(request, response);

	}

}



上述有两种写法,一种是在后台把消息值根据本地语言环境拿到,然后再放进去,还有一种,是直接把key给放进去,让JSP自己去获取。
那么代码如下:
package i18n;

import java.io.IOException;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.println("userId===" + request.getParameter("userId"));
//		Locale loc = request.getLocale();
//		ResourceBundle bundle = ResourceBundle.getBundle("res.myres", loc);
//		String errInfo = bundle.getString("err.login.failure");
//		request.setAttribute("errInfo", errInfo);

		request.setAttribute("errKey", "err.login.failure");
		request.getRequestDispatcher("/index.jsp").forward(request, response);

	}

}



好了,上述就是Java对国际化的支持,写的比较浅,大家觉得有什么不对的地方,可以指出来。

  • 大小: 67.8 KB
  • 大小: 88 KB
  • 大小: 64 KB
  • 大小: 42.2 KB
  • 大小: 12 KB
  • 大小: 43.4 KB
分享到:
评论

相关推荐

    java 实现国际化 中英文语言切换

    如果你的应用使用Struts框架,Struts提供了内置的国际化支持。在 Struts 配置文件(struts-config.xml)中,你可以定义全局的 `message-resources` 元素,指定资源包的位置。在ActionForm或Action类中,可以使用 `...

    java国际化&时间处理

    首先,Java中的国际化主要依赖于`java.util.Locale`类,它代表了特定的语言环境,包括语言、国家和地区。例如,`Locale.CHINA`表示简体中文环境,`Locale.US`则代表美国英语环境。开发者可以通过`ResourceBundle`类...

    用一段代码来描述JAVA语言对国际化的支持原理

    NULL 博文链接:https://hanz188.iteye.com/blog/768691

    国际化 必备工具 java编写

    Java作为一种广泛使用的编程语言,提供了强大的国际化支持。本篇将深入探讨Java中实现国际化的必备工具以及相关的编码转换问题。 一、Java中的国际化 1. **资源绑定文件(Properties文件)** 在Java中,我们通常...

    java国际化组件

    此外,还可以考虑使用Spring框架的国际化支持,它可以更方便地集成到大型项目中,提供基于注解的国际化解决方案。Spring的`MessageSource`接口和`@MessageSource`注解可以帮助我们在控制器或服务层直接注入本地化...

    java国际化官方指南

    Java作为广泛使用的编程语言之一,提供了强大的国际化支持。国际化,通常指软件能够支持多种语言和地区的不同习惯,例如货币、日期时间格式等。Java的国际化官方指南提供了详细的资源和API,帮助开发者为应用程序...

    编程语言+JAVAspring+国际化+多语言支持

    编程语言+JAVAspring+国际化+多语言支持**:这是一个关于JAVAspring编程语言的国际化的多语言支持的资源,适合有一定JAVAspring基础的开发者。它介绍了JAVAspring的国际化的概念、原理和作用,以及如何使用JAVA...

    java国际化i18n

    Java国际化(i18n)是Java平台为支持全球不同地区的用户和语言而设计的一种机制。i18n这个名字来源于“internationalization”这个单词,其中'i'是第9个字母,'n'是第14个字母,所以18代表了两者之间的字母数。Java的...

    java实现国际化

    为了更好地支持国际化,Java还提供了`java.text`包,其中包含了`NumberFormat`、`DateFormat`和`ChoiceFormat`等类,用于格式化数字、日期和选择性文本。例如,我们可以使用`SimpleDateFormat`来格式化日期以符合...

    JAVA国际化文件生成工具

    总的来说,这个工具包可能提供了一套完整的解决方案,包括Java和本地代码层面的国际化支持,以及使用`gettext`工具进行资源文件管理和翻译的工作流程。对于开发跨语言应用的Java开发者来说,这是一份非常实用的资源...

    Java程序国际化教程源码下载

    Java程序的国际化(Internationalization,通常简写为i18n)是使软件能够适应不同语言和文化背景的重要过程。这个教程源码旨在帮助开发者理解并掌握如何在Java应用程序中实现这一功能。以下是对Java程序国际化关键...

    java国际化实现框架底层源码

    在大型项目中,国际化框架如Spring Framework提供了更高级的国际化支持,如MessageSource接口,它可以方便地集成到MVC应用中,处理视图层的国际化问题。 7. **测试与调试** 国际化功能的测试通常需要模拟不同的...

    JAVA_国际化程序实现

    Java 国际化(i18n)是开发支持多种语言和文化环境的应用程序的关键技术。这个过程涉及创建可适应不同地区和语言的资源,如文本、日期、时间和数字格式,以便用户能根据他们的本地设置体验到定制化的界面。下面我们...

    java实现国际化源码

    接下来,我们要在Struts配置中启用国际化支持。在`struts-config.xml`文件中,添加一个`message-resources`节点,指定我们的资源bundle: ```xml ``` 这里的`parameter`属性值应匹配资源bundle的完全限定类名,...

    Java国际化的工具 propedit

    在Java应用程序中,为了支持不同地区的用户,我们需要提供多语言支持,这就涉及到了国际化和本地化。propedit正是帮助开发者管理和编辑这些资源的一个工具,它使得创建和维护.properties文件变得更为便捷。 ....

    javaI18N[国际化]

    Java I18N(国际化)是Java平台提供的一项重要功能,它使得开发的软件能够适应全球不同地区的语言和文化环境。I18N这个术语来源于“Internationalization”,其中“I”和“N”之间有18个字母,因此简称为I18N。Java...

    java 国际化转换

    ### Java国际化转换详解 #### 一、Java国际化概念与意义 在软件开发过程中,随着产品的全球化,越来越多的应用程序需要支持多种语言环境。这就引出了一个重要的概念——国际化(Internationalization)。通常简称...

    Java 程序国际化教程+源码

    Java程序的国际化(i18n)是为了使软件能够适应不同地区的语言和文化习惯,它涉及到日期、时间、数字格式、货币符号、排序规则、文本方向等多方面的处理。本教程将详细介绍Java如何实现这一功能,并提供源码供学习者...

    java国际化.ppt

    Java 国际化(i18n)是开发支持多语言的应用程序的关键步骤,使得软件能够适应不同国家和地区用户的需求。以下将详细讲解Java中实现国际化涉及的主要知识点: 1. **软件国际化的意义**: - 提高软件的全球适用性,...

Global site tag (gtag.js) - Google Analytics