JavaWeb国际化
软件的国际化:
软件在不同的地方,适应不同的风格:
中国: 显示中文,以及服务符合中国习惯的文本字符串!
美国: 显示英文,以及服务符合他国习惯的文本字符串!
这种软件,就叫国际化的软件!
如何做到国际化的软件,要求:
- 软件中存储特定的字符串
- 知道浏览器当前使用哪种语言(Locale )
相关API
一、Locale 实例对象代表一个特定的地理,政治、文化区域。
(一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)
二、ResourceBundle类提供了一个静态方法getBundle,该方法用于装载资源文件,并创建ResourceBundle实例:
加载资源文件后, 程序就可以调用ResourceBundle 实例对象的 getString 方法获取指定的资源信息名称所对应的值。
Locale 本地化
Java提供了一个本地化的对象!封装当前语言、国家、环境等特征!
首先来测试一下
- //本地化对象,封装语言、国家、信息的对象
- //由java.util包提供
- @Test
- public void test() {
- //Locale locale=Locale.CHINA;
- Locale locale=Locale.getDefault(); //当前系统默认的语言环境
- System.out.println(locale); //zh_CN 中文-中国
- System.out.println(locale.getCountry()); //CN 国家的简称
- System.out.println(locale.getDisplayCountry()); //中国 显示完整国家
- System.out.println(locale.getLanguage()); //zh 语言简称
- //模拟美国
- Locale locale2=Locale.US;
- System.out.println(locale2.getCountry());
- System.out.println(locale2.getDisplayCountry());
- }
然后改为美国(Locale.CHINA——》Locale.US)
- @Test
- public void test2() {
- //模拟美国
- Locale locale2=Locale.US;
- System.out.println(locale2.getCountry());
- System.out.println(locale2.getDisplayCountry());
- }
运行结果如图:
国际化
静态数据国际化
国际化的软件:
- 存储所有国家显示的文本的字符串
a) 文件: properties
b) 命名: 基础名_语言简称_国家简称.properties
例如:msg_zh_CN.properties 存储所有中文
Msg_en_US.properties 存储所有英文
- 程序中获取
ResourceBundle类,可以读取国际化的资源文件!
先创建两个properties文件,一个代表中文,另外一个代表英文
注意不能再source视图中去编辑,只能在properties视图中去add,add之后转换到source视图就会知道为什么了。
现在来添加java代码:
- //国际化
- @org.junit.Test
- public void test() {
- //中文语言环境
- Locale locale=Locale.CHINA;
- //创建工具类对象ResourceBundle
- ResourceBundle bundle=ResourceBundle.getBundle("com.gqx.international_i18.msg", locale);
- //根据key获取配置文件中的值
- System.out.println(bundle.getString("hello"));
- System.out.println(bundle.getString("username"));
- System.out.println(bundle.getString("pwd"));
- }
然后做对应的改变(Locale.CHINA——》Locale.US)会看到如下如的变化
但是,我们会想到,如果是金钱数目或者时间等,他们是变化的,不确定的,我们没办法将其通过数据保存下来,然后一一对应来解决。这个时候需要通过动态国际化来解决啦
动态文本国际化
数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)
国际化货币
NumberFormat.getCurrencyInstance();
国际化数字;
NumberFormat.getNumberInstance();
国际化百分比
NumberFormat.getPercentInstance();
国际化日期
DateFormat.getDateTimeInstance(dateStyle, timeStyle);
(1)、国际化货币
- //国际化-动态文本-国际化货币
- @org.junit.Test
- public void test4() {
- //模拟语言环境
- Locale locale=Locale.US;
- //数据
- double number=100;
- //工具类
- NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
- //国际化货币
- String m=nf.format(number);
- System.out.println(m);
- }
- //计算 $100.00*10(不能通过字符串的拆分方式实现)
- @org.junit.Test
- public void test5() throws ParseException {
- String string="$100";
- int num=10;
- //1、分析string是哪一个国家的货币
- Locale locale=Locale.US;
- //2、国际化工具类
- NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
- //3、解析货币
- Number n=nf.parse(string);
- System.out.println(n.intValue()*num);
- }
(2)、国际化数字
- //国际化-动态文本-国际化数字
- @org.junit.Test
- public void test6() {
- //模拟语言环境
- Locale locale=Locale.US;
- NumberFormat nf=NumberFormat.getNumberInstance(locale);
- String str=nf.format(10000000);
- System.out.println(str);
- }
(3)、国际化日期
- //国际化-动态文本-国际化日期
- /**
- * 日期:
- * FULL:2016年11月30日 星期三
- * LONG: 2016年11月30日
- * MEDIUM:2016-11-30
- * SHORT:16-11-30
- * 日期:
- * FULL:下午03时47分08秒 CST
- * LONG:下午03时49分43秒
- * MEDIUM:15:51:31
- * SHORT:下午3:53
- */
- @org.junit.Test
- public void test7() {
- //模拟语言环境
- Locale locale=Locale.CHINA;
- //日期格式
- int dateStyle=DateFormat.SHORT;
- //时间格式
- int timeStyle=DateFormat.SHORT;
- //工具类
- DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle);
- String date=df.format(new Date());
- System.out.println(date);
- }
将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象
- //将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象
- @org.junit.Test
- public void test8() throws ParseException {
- String str="16-11-30 下午16时25分30秒 CST";
- //日期格式
- int dateStyle=DateFormat.SHORT;
- //时间格式
- int timeStyle=DateFormat.FULL;
- //工具类
- DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle,Locale.getDefault());
- Date date=df.parse(str);
- System.out.println(date);
- }
Jsp页面国际化 – 使用jstl标签
<fmt:setLocale value=""/> 设置本地化对象
<fmt:setBundle basename=""/> 设置工具类
<fmt:message></fmt:message> 显示国际化文本
格式化数值
<fmt:formatNumber pattern="#.##" value="100.99"></fmt:formatNumber>
格式化日期:
<fmt:formatDate pattern="yyyy-MM-dd" value="${date}"/>
如下代码:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%--引入jstl国际化与格式化标签库 --%>
- <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <!-- 一、设置本地化对象 -->
- <fmt:setLocale value="${pageContext.request.locale}"/>
- <!-- 二、设置工具类 -->
- <fmt:setBundle basename="com.gqx.international_i18.msg" var="bundle"/>
- <title><fmt:message key="title" bundle="${bundle}"></fmt:message></title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- </head>
- <body>
- <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post">
- <table align="center" border="1">
- <tr>
- <td><fmt:message key="username" bundle="${bundle}"></fmt:message></td>
- <td>
- <input type="text" name="userName">
- </td>
- </tr>
- <tr>
- <td><fmt:message key="pwd" bundle="${bundle}"></fmt:message></td>
- <td>
- <input type="password" name="pwd">
- </td>
- </tr>
- <tr>
- <td>
- <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>">
- </td>
- </tr>
- </table>
- </form>
- </body>
- </html>
(将浏览器默认的语言改变后,会发现对应的文字也会改变)
JavaWeb国际化的更多相关文章
- javaWEB国际化(jsp中使用)
在jsp页面中使用国际化方法,首先将jstl开源架包:jstl.jar,standard.jar导进去 并在src目录下建立以test开头,.properties结尾的文件:test_en_US.pr ...
- javaWEB国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用
DateFormat:格式化日期的工具类,本身是一个抽象类: NumberFormat:格式化 数字 到 数字字符串,或货币字符串的字符类; MessageFormat: 可以格式化模式字符串,模式字 ...
- javaweb 国际化
国际化又称为 i18n:internationalization 软件实现国际化,需具备哪些特征:对于程序中固定使用的文本元素,例如菜单栏.导航条等中使用的文本元素.或错误提示信息,状态信息等,需要根 ...
- 11.javaweb国际化标签库
一.国际化标签库 1,格式化标签库提供的标签 2,标签详解 2.1<fmt:setLocale>标签 下面设置不同的区域,并在设置的区域下显示日期 2.2<fmt:requestEn ...
- 【转载】SpringMVC学习笔记
转载于:SpringMVC笔记 SpringMVC 1.SpringMVC概述 MVC: Model(模型): 数据模型,提供要展示的数据,:Value Object(数据Dao) 和 服务层(行为S ...
- javaweb学习总结(三十一)——国际化(i18n)
一.国际化开发概述 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化(internationaliz ...
- JavaWeb之多语言国际化
这周打算把国际化.JDBC和XML学习一下,从下周就开始学习三大框架,再坚持一个半月吧就能入门JavaWeb了,上周周末两天过的真是生不如死,两天坐在家里,醒来就写博客,原本在公司也自己操作了一遍,其 ...
- JavaWeb 后端 <十三> 之 监听器 JSTL国际化
1. 监听器 1.1 概述 监听器: 主要是用来监听特定对象的创建或销毁.属性的变化的! 是一个实现特定接口的普通java类! 对象: 自己创建自己用 (不用监听) 别人创建自己用 (需要监听) ...
- Javaweb学习笔记——(二十)——————Javaweb监听器、国际化
Javaweb监听器 三大组件 *Servlet *Listener *Filter Listener:监听器 1.初次相见:A ...
随机推荐
- jar包中的类如何读取包内和包外的配置文件
最近将代码打包成jar包,关于如何处理读取配置文件的问题特此记录一下. out.properties a.jar -com -a.class -in.properties 如上所示,out.prope ...
- linux0.11下的中断机制分析
http://orbt.blog.163.com/ 异常就是控制流中的突变,用来响应处理器状态中的某些变化.当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用, ...
- Joda-Time
任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛苦和繁琐.现在来看看 Joda Time,一 ...
- mysql联合索引
命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https://segmentfaul ...
- C++和java的区别
Java区别于C++ 表面看来两者最大的不同在于Java没有指针,或者说,Java满地都是指针.对于编程者而言Java的这种设计是安全且更易用的.说Java满地是指针的原因在于它把指针的功能隐藏了,其 ...
- 《深入理解linux内核》第二章 内存寻址
三种不同的内存地址 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址由16位的段选择符(segment selector)和 ...
- poj1141Brackets Sequence(dp+路径)
链接 dp好想 根据它定义的 记忆化下就行 路径再dfs一遍 刚开始以为要判空格 所以加了判空格的代码 后来知道不用 .. #include <iostream> #include< ...
- BZOJ_3527_[ZJOI2014]_力_(FFT+卷积)
描述 题面: http://wenku.baidu.com/link?url=D2ORnA9xjgSxa2GlYLB7gGiYgBcXsy-Aw0kVYTjTE-iYhH1s7h8xXGmnaMwl3 ...
- cmd find命令
find 作用:从文件中收索字符串 格式:find 参数 "字符串" 路径\文件名 参数: /V 显示所有未包含指定字符串的行. /C 仅显示包含字符串的行数. /N 显示行号. ...
- App性能优化
http://www.cocoachina.com/ios/20150429/11712.html http://blog.csdn.net/jasonblog/article/details/765 ...