软件的国际化:

软件在不同的地方,适应不同的风格:

中国: 显示中文,以及服务符合中国习惯的文本字符串!

美国: 显示英文,以及服务符合他国习惯的文本字符串!

这种软件,就叫国际化的软件!

如何做到国际化的软件,要求:

  1. 软件中存储特定的字符串
  2. 知道浏览器当前使用哪种语言(Locale  )

相关API

一、Locale 实例对象代表一个特定的地理,政治、文化区域。
(一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)

二、ResourceBundle类提供了一个静态方法getBundle,该方法用于装载资源文件,并创建ResourceBundle实例:

加载资源文件后, 程序就可以调用ResourceBundle 实例对象的 getString 方法获取指定的资源信息名称所对应的值。


Locale  本地化

Java提供了一个本地化的对象!封装当前语言、国家、环境等特征!

首先来测试一下

  1. //本地化对象,封装语言、国家、信息的对象
  2. //由java.util包提供
  3. @Test
  4. public void test() {
  5. //Locale locale=Locale.CHINA;
  6. Locale locale=Locale.getDefault(); //当前系统默认的语言环境
  7. System.out.println(locale); //zh_CN 中文-中国
  8. System.out.println(locale.getCountry()); //CN 国家的简称
  9. System.out.println(locale.getDisplayCountry()); //中国 显示完整国家
  10. System.out.println(locale.getLanguage()); //zh 语言简称
  11. //模拟美国
  12. Locale locale2=Locale.US;
  13. System.out.println(locale2.getCountry());
  14. System.out.println(locale2.getDisplayCountry());
  15. }

然后改为美国(Locale.CHINA——》Locale.US)

  1.   @Test
  2. public void test2() {
  3. //模拟美国
  4. Locale locale2=Locale.US;
  5. System.out.println(locale2.getCountry());
  6. System.out.println(locale2.getDisplayCountry());
  7. }

运行结果如图:


国际化

  静态数据国际化

  

    国际化的软件:

    1. 存储所有国家显示的文本的字符串

        a)         文件: properties

        b)        命名:  基础名_语言简称_国家简称.properties

          例如:msg_zh_CN.properties     存储所有中文

          Msg_en_US.properties    存储所有英文

    1. 程序中获取

        ResourceBundle类,可以读取国际化的资源文件!

先创建两个properties文件,一个代表中文,另外一个代表英文

注意不能再source视图中去编辑,只能在properties视图中去add,add之后转换到source视图就会知道为什么了。

现在来添加java代码:

  1. //国际化
  2. @org.junit.Test
  3. public void test() {
  4. //中文语言环境
  5. Locale locale=Locale.CHINA;
  6. //创建工具类对象ResourceBundle
  7. ResourceBundle bundle=ResourceBundle.getBundle("com.gqx.international_i18.msg", locale);
  8. //根据key获取配置文件中的值
  9. System.out.println(bundle.getString("hello"));
  10. System.out.println(bundle.getString("username"));
  11. System.out.println(bundle.getString("pwd"));
  12. }

然后做对应的改变(Locale.CHINA——》Locale.US)会看到如下如的变化

但是,我们会想到,如果是金钱数目或者时间等,他们是变化的,不确定的,我们没办法将其通过数据保存下来,然后一一对应来解决。这个时候需要通过动态国际化来解决啦

动态文本国际化

数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)

国际化货币
NumberFormat.getCurrencyInstance();
国际化数字;
NumberFormat.getNumberInstance();
国际化百分比
NumberFormat.getPercentInstance();
国际化日期
DateFormat.getDateTimeInstance(dateStyle, timeStyle);

(1)、国际化货币

  1.   //国际化-动态文本-国际化货币
  2. @org.junit.Test
  3. public void test4() {
  4. //模拟语言环境
  5. Locale locale=Locale.US;
  6. //数据
  7. double number=100;
  8. //工具类
  9. NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
  10. //国际化货币
  11. String m=nf.format(number);
  12. System.out.println(m);
  13. }

  1. //计算 $100.00*10(不能通过字符串的拆分方式实现)
  2. @org.junit.Test
  3. public void test5() throws ParseException {
  4. String string="$100";
  5. int num=10;
  6. //1、分析string是哪一个国家的货币
  7. Locale locale=Locale.US;
  8. //2、国际化工具类
  9. NumberFormat nf=NumberFormat.getCurrencyInstance(locale);
  10. //3、解析货币
  11. Number n=nf.parse(string);
  12. System.out.println(n.intValue()*num);
  13. }

  

(2)、国际化数字

  1. //国际化-动态文本-国际化数字
  2. @org.junit.Test
  3. public void test6() {
  4. //模拟语言环境
  5. Locale locale=Locale.US;
  6. NumberFormat nf=NumberFormat.getNumberInstance(locale);
  7. String str=nf.format(10000000);
  8. System.out.println(str);
  9. }

(3)、国际化日期

  1.                   //国际化-动态文本-国际化日期
  2. /**
  3. * 日期:
  4. * FULL:2016年11月30日 星期三
  5. * LONG: 2016年11月30日
  6. * MEDIUM:2016-11-30
  7. * SHORT:16-11-30
  8. * 日期:
  9. * FULL:下午03时47分08秒 CST
  10. * LONG:下午03时49分43秒
  11. * MEDIUM:15:51:31
  12. * SHORT:下午3:53
  13. */
  14. @org.junit.Test
  15. public void test7() {
  16. //模拟语言环境
  17. Locale locale=Locale.CHINA;
  18. //日期格式
  19. int dateStyle=DateFormat.SHORT;
  20. //时间格式
  21. int timeStyle=DateFormat.SHORT;
  22. //工具类
  23. DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle);
  24. String date=df.format(new Date());
  25. System.out.println(date);
  26. }

  

将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象

  1. //将时间值:16-11-30下午16时25分30秒 CST,反向解析成一个打他对象
  2. @org.junit.Test
  3. public void test8() throws ParseException {
  4. String str="16-11-30 下午16时25分30秒 CST";
  5. //日期格式
  6. int dateStyle=DateFormat.SHORT;
  7. //时间格式
  8. int timeStyle=DateFormat.FULL;
  9. //工具类
  10. DateFormat df=DateFormat.getDateTimeInstance(dateStyle, timeStyle,Locale.getDefault());
  11. Date date=df.parse(str);
  12. System.out.println(date);
  13. }

 


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}"/>

如下代码:

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%--引入jstl国际化与格式化标签库 --%>
  3. <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
  4.  
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  6. <html>
  7. <head>
  8. <!-- 一、设置本地化对象 -->
  9. <fmt:setLocale value="${pageContext.request.locale}"/>
  10. <!-- 二、设置工具类 -->
  11. <fmt:setBundle basename="com.gqx.international_i18.msg" var="bundle"/>
  12.  
  13. <title><fmt:message key="title" bundle="${bundle}"></fmt:message></title>
  14. <meta http-equiv="pragma" content="no-cache">
  15. <meta http-equiv="cache-control" content="no-cache">
  16. <meta http-equiv="expires" content="0">
  17. </head>
  18.  
  19. <body>
  20. <form name="frmLogin" action="${pageContext.request.contextPath }/admin?method=login" method="post">
  21. <table align="center" border="1">
  22. <tr>
  23. <td><fmt:message key="username" bundle="${bundle}"></fmt:message></td>
  24. <td>
  25. <input type="text" name="userName">
  26. </td>
  27. </tr>
  28. <tr>
  29. <td><fmt:message key="pwd" bundle="${bundle}"></fmt:message></td>
  30. <td>
  31. <input type="password" name="pwd">
  32. </td>
  33. </tr>
  34. <tr>
  35. <td>
  36. <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>">
  37. </td>
  38. </tr>
  39. </table>
  40. </form>
  41. </body>
  42. </html>

(将浏览器默认的语言改变后,会发现对应的文字也会改变) 

JavaWeb国际化的更多相关文章

  1. javaWEB国际化(jsp中使用)

    在jsp页面中使用国际化方法,首先将jstl开源架包:jstl.jar,standard.jar导进去 并在src目录下建立以test开头,.properties结尾的文件:test_en_US.pr ...

  2. javaWEB国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    DateFormat:格式化日期的工具类,本身是一个抽象类: NumberFormat:格式化 数字 到 数字字符串,或货币字符串的字符类; MessageFormat: 可以格式化模式字符串,模式字 ...

  3. javaweb 国际化

    国际化又称为 i18n:internationalization 软件实现国际化,需具备哪些特征:对于程序中固定使用的文本元素,例如菜单栏.导航条等中使用的文本元素.或错误提示信息,状态信息等,需要根 ...

  4. 11.javaweb国际化标签库

    一.国际化标签库 1,格式化标签库提供的标签 2,标签详解 2.1<fmt:setLocale>标签 下面设置不同的区域,并在设置的区域下显示日期 2.2<fmt:requestEn ...

  5. 【转载】SpringMVC学习笔记

    转载于:SpringMVC笔记 SpringMVC 1.SpringMVC概述 MVC: Model(模型): 数据模型,提供要展示的数据,:Value Object(数据Dao) 和 服务层(行为S ...

  6. javaweb学习总结(三十一)——国际化(i18n)

    一.国际化开发概述 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化(internationaliz ...

  7. JavaWeb之多语言国际化

    这周打算把国际化.JDBC和XML学习一下,从下周就开始学习三大框架,再坚持一个半月吧就能入门JavaWeb了,上周周末两天过的真是生不如死,两天坐在家里,醒来就写博客,原本在公司也自己操作了一遍,其 ...

  8. JavaWeb 后端 <十三> 之 监听器 JSTL国际化

    1. 监听器 1.1   概述 监听器: 主要是用来监听特定对象的创建或销毁.属性的变化的! 是一个实现特定接口的普通java类! 对象: 自己创建自己用 (不用监听) 别人创建自己用 (需要监听) ...

  9. Javaweb学习笔记——(二十)——————Javaweb监听器、国际化

    Javaweb监听器     三大组件         *Servlet         *Listener         *Filter Listener:监听器         1.初次相见:A ...

随机推荐

  1. jar包中的类如何读取包内和包外的配置文件

    最近将代码打包成jar包,关于如何处理读取配置文件的问题特此记录一下. out.properties a.jar -com -a.class -in.properties 如上所示,out.prope ...

  2. linux0.11下的中断机制分析

    http://orbt.blog.163.com/     异常就是控制流中的突变,用来响应处理器状态中的某些变化.当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用, ...

  3. Joda-Time

    任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛苦和繁琐.现在来看看 Joda Time,一 ...

  4. mysql联合索引

    命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https://segmentfaul ...

  5. C++和java的区别

    Java区别于C++ 表面看来两者最大的不同在于Java没有指针,或者说,Java满地都是指针.对于编程者而言Java的这种设计是安全且更易用的.说Java满地是指针的原因在于它把指针的功能隐藏了,其 ...

  6. 《深入理解linux内核》第二章 内存寻址

    三种不同的内存地址 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址由16位的段选择符(segment selector)和 ...

  7. poj1141Brackets Sequence(dp+路径)

    链接 dp好想  根据它定义的 记忆化下就行 路径再dfs一遍 刚开始以为要判空格 所以加了判空格的代码 后来知道不用 .. #include <iostream> #include< ...

  8. BZOJ_3527_[ZJOI2014]_力_(FFT+卷积)

    描述 题面: http://wenku.baidu.com/link?url=D2ORnA9xjgSxa2GlYLB7gGiYgBcXsy-Aw0kVYTjTE-iYhH1s7h8xXGmnaMwl3 ...

  9. cmd find命令

    find 作用:从文件中收索字符串 格式:find 参数 "字符串" 路径\文件名 参数: /V 显示所有未包含指定字符串的行. /C 仅显示包含字符串的行数. /N 显示行号. ...

  10. App性能优化

    http://www.cocoachina.com/ios/20150429/11712.html http://blog.csdn.net/jasonblog/article/details/765 ...