javaweb国际化

根据数据的类型不同,国际化分为2类:静态数据国际化和动态数据的国际化。

 

静态数据,包括 “标题”、“用户名”、“密码”这样的文字数据。

动态数据,包括日期、货币等可以动态生成的数据。

 

国际化涉及到java.util.Locale和java.util.ResourceBundle类。

 

java.util.Locale

A Locale object represents a specific geographical, political, or cultural region.

Locale对象代表了一定的地理、政治、文化区域。

 

java.util.ResourceBundle

Resource bundles contain locale-specific objects. When your program needs a locale-specific resource, a String for example, your program can load it from the resource bundle that is appropriate for the current user's locale. In this way, you can write program code that is largely independent of the user's locale isolating most, if not all, of the locale-specific information in resource bundles. 

ResouceBundle,由两个单词组成Resouce和Bundle,合在一起就是“资源包”的意思。ResouceBundle是包含不同区域(Locale)资源的集合,只要向ResouceBundle提供一个特定的Locale对象,ResouceBundle就会把相应的资源返回给你。

wKiom1d5hMbSGxdUAAAyLcgcnhk020.png

1、静态数据国际化

 

静态数据国际化的步骤:

(1).建立资源文件,存储所有国家显示的文本的字符串

    a)文件: .properties

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

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

            msg_en_US.properties    存储所有英文

(2).程序中获取

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

    Locale类,代表某一区域,用于决定使用哪一个国际化的资源。

 

1.1、Locale的API

static Locale getDefault()    得到JVM中默认的Locale对象

String getCountry()         得到国家名称的简写

String getDisplayCountry()    得到国家名称的全称

String getLanguage()        得到当前语言的简写

String getDisplayLanguage()    得到语言的全称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.rk.i18n.demo;
import java.util.Locale;
public class Demo01
{
    public static void main(String[] args)
    {
        //本地化对象:Locale
        // 封装语言、国家信息的对象,由java.util提供
//      Locale locale = Locale.CHINA;
//      Locale locale = Locale.US;
        Locale locale = Locale.getDefault();
        String country = locale.getCountry();
        String displayCountry = locale.getDisplayCountry();
        String language = locale.getLanguage();
        String displayLanguage = locale.getDisplayLanguage();
         
        System.out.println(country);          //      CN       
        System.out.println(displayCountry);   //     中国       
        System.out.println(language);         //       zh       
        System.out.println(displayLanguage);  //      中文       
    }
}

 

1.2、ResourceBundle的API

static ResourceBundle getBundle(String baseName,Locale locale) 获取ResourceBundle实例

String getString(String key)    根据key获取资源中的值

 

 

1.3、示例

 

(1)建立properties文件:msg_zh_CN.properties和msg_en_US.properties

msg_zh_CN.properties

1
2
uname=\u59D3\u540D
pwd=\u5BC6\u7801

wKioL1d5jefT6vNlAAALbK1OAno343.png

 

msg_en_US.properties

1
2
uname=User Name
pwd=Password

(2)代码获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.rk.i18n.demo;
import java.util.Locale;
import java.util.ResourceBundle;
// 国际化 - 静态数据
public class Demo02
{
    public static void main(String[] args)
    {
        // 中文语言环境
        Locale locale = Locale.US;
         
        // 创建工具类对象ResourceBundle
        ResourceBundle bundle = ResourceBundle.getBundle("com.rk.i18n.demo.msg", locale);
         
        // 根据key获取配置文件中的值
        String uname = bundle.getString("uname");
        String pwd = bundle.getString("pwd");
         
        //输出
        System.out.println(uname);
        System.out.println(pwd);
    }
}

 

1.4、关于ResourceBundle的资源文件properties

文件命名:基础名、语言简称

Resource bundles belong to families whose members share a common base name, but whose names also have additional components that identify their locales. For example, the base name of a family of resource bundles might be "MyResources".  The family can then provide as many locale-specific members as needed, for example a German one named "MyResources_de". 

 

文件命名:国家简称

If there are different resources for different countries, you can make specializations: for example, "MyResources_de_CH" contains objects for the German language (de) in Switzerland (CH). If you want to only modify some of the resources in the specialization, you can do so. 

 

文件命名:默认的Resource Bundle

The family should have a default resource bundle which simply has the same name as its family - "MyResources" - and will be used as the bundle of last resort if a specific locale is not supported.

 

文件内容:属于同一个family的resource bundle要包含相同的items内容。

Each resource bundle in a family contains the same items, but the items have been translated for the locale represented by that resource bundle. For example, both "MyResources" and "MyResources_de" may have a String that's used on a button for canceling operations. In "MyResources" the String may contain "Cancel" and in "MyResources_de" it may contain "Abbrechen". 

 

Java代码:获取Resource Bundle

When your program needs a locale-specific object, it loads the ResourceBundle class using the getBundle method: 

 

 ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale);

 

 

2、动态数据国际化

动态国际化则主要涉及到数字、货币、百分比和日期

例如:

    中文:1987-09-19   ¥1000

    英文: Sep/09 1987  $100

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.rk.i18n.demo;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
import org.junit.Test;
public class Demo03
{
    // 国际化 - 动态文本 - 0. 概述
    public void testI18N()
    {
        // 国际化货币
        NumberFormat.getCurrencyInstance();
        // 国际化数字
        NumberFormat.getNumberInstance();
        // 国际化百分比
        NumberFormat.getPercentInstance();
        // 国际化日期
        // DateFormat.getDateTimeInstance(dateStyle, timeStyle, aLocale)
    }
    // 国际化 - 动态文本 - 1. 国际化货币
    @Test
    public void testI18NCurrency()
    {
        // 模拟语言环境
        Locale locale = Locale.CHINA;
        // 数据准备
        double number = 100;
        // 工具类
        NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
        // 国际化货币
        String str = nf.format(number);
        // 输出
        System.out.println(str);
    }
     
    //面试题:  代码计算:  $100 * 10  
    @Test
    public void testCurrency() throws ParseException
    {
        String str = "$100";
        int num = 10;
         
        // 1. 分析str值是哪一国家的货币
        Locale locale = Locale.US;
         
        // 2. 国际化工具类
        NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
         
        // 3. 解析str
        Number number = nf.parse(str);
         
        //4.进行计算
        int value = number.intValue() * num;
        //5.格式化输出
        str = nf.format(value);
        System.out.println(str);
    }
     
    // 国际化 - 动态文本 - 2. 国际化数值
    @Test
    public void testI18NNumber()
    {
        Locale locale = Locale.CHINA;
        NumberFormat nf = NumberFormat.getNumberInstance(locale);
        String str = nf.format(1000000000);
        System.out.println(str);
    }
     
    // 国际化 - 动态文本 - 3. 国际化百分比
    @Test
    public void testI18NPercent()
    {
        Locale locale = Locale.CHINA;
        NumberFormat nf = NumberFormat.getPercentInstance(locale);
        String str = nf.format(0.325);
        System.out.println(str);
    }
     
    // 国际化 - 动态文本 - 4. 国际化日期
    /*
     * 日期
     *      FULL   2015年3月4日 星期三
     *      LONG   2015年3月4日
     *      FULL   2015年3月4日 星期三
     *    MEDIUM 2015-3-4
     *    SHORT  15-3-4
     *    
     * 时间
     *      FULL   下午04时31分59秒 CST
     *      LONG   下午04时32分37秒
     *    MEDIUM 16:33:00
     *    SHORT  下午4:33
     *    
     
     */
    @Test
    public void testI18NDate()
    {
        int dateStyle = DateFormat.FULL;
        int timeStyle = DateFormat.FULL;
        Locale locale = Locale.CHINA;
        DateFormat df = DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale);
        String date = df.format(new Date());
        System.out.println(date);
    }
     
    // 面试2: 请将时间值:09-11-28 上午10时25分39秒 CST,反向解析成一个date对象。
    @Test
    public void testDate() throws ParseException
    {
        String str = "09-11-28 上午10时25分39秒 CST";
         
        int dateStyle = DateFormat.SHORT;
        int timeStyle = DateFormat.FULL;
        Locale locale = Locale.CHINA;
        // 创建DateFormat工具类,国际化日期
        DateFormat df = DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale);
        Date date = df.parse(str);
        System.out.println(date);
    }
}

 

 

 

3、JSP页面国际化

 

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

 

3.1、准备工作:建立properties资源

建立2个properties文件:message_en_US.properties和message_zh_CN.properties。

 

message_zh_CN.properties

1
2
3
4
title=\u4F60\u597D\uFF0C\u8BF7\u767B\u5F55
uname=\u7528\u6237\u540D
pwd=\u5BC6\u7801
submit=\u63D0\u4EA4

wKiom1d5j8aArKdIAAAOCpAj0R8612.png

message_en_US.properties

1
2
3
4
title=Plean Log In
uname=User Name
pwd=Password
submit=Submit\!

 

3.2、使用JSP脚本进行国际化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <%
        ResourceBundle bundle = ResourceBundle.getBundle("com.rk.i18n.resource.message", request.getLocale());
    %>
    <title><%=bundle.getString("title") %></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>
   
  <body>
    <table border="1">
        <tr>
            <td><%=bundle.getString("uname") %></td>
            <td><input type="text" name="uname"/></td>
        </tr>
        <tr>
            <td><%=bundle.getString("pwd") %></td>
            <td><input type="password" name="pwd"/></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="<%=bundle.getString("submit") %>"/></td>
        </tr>    
    </table>
  </body>
</html>

 

3.3、使用JSTL进行国际化

 

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

 

需要注意的一点是:HttpServletRequest有一个方法是getLocale(),可以获取当前request中的Locale信息,在EL表达式中可以使用${pageContext.request.locale}获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<%@ 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.rk.i18n.resource.message" var="msg"/>
    <title><fmt:message bundle="${msg }" key="title"></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>
    <table border="1">
        <tr>
            <td><fmt:message bundle="${msg }" key="uname"></fmt:message></td>
            <td><input type="text" name="uname"/></td>
        </tr>
        <tr>
            <td><fmt:message bundle="${msg }" key="pwd"></fmt:message></td>
            <td><input type="password" name="pwd"/></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="<fmt:message bundle="${msg }" key="submit"></fmt:message>"/></td>
        </tr>    
    </table>
  </body>
</html>

 

格式化数值和日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>格式化</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  <body>
      <!-- 
          格式化金额 
              格式: 0.00   保留2为小数,会自动补0
                   #.##  保留2为小数,不自动补0
      -->
    <fmt:formatNumber pattern="0.00" value="100" ></fmt:formatNumber> <br>
    <fmt:formatNumber pattern="#.##" value="100" ></fmt:formatNumber>  <br>
    <fmt:formatDate pattern="yyyyMMdd" value="<%=new Date() %>"/> <br>
    <%
        request.setAttribute("date", new Date());
    %>
    <fmt:formatDate pattern="yyyy-MM-dd"  value="${date }"/> <br>
  </body>
</html>

转载于:https://www.cnblogs.com/plan123/p/5639803.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20145335郝昊《网络攻防》Bof逆向基础——ShellCode注入与执行

20145335郝昊《网络攻防》Bof逆向基础——ShellCode注入与执行 实验原理 关于ShellCode&#xff1a;ShellCode是一段代码&#xff0c;作为数据发送给受攻击服务器&#xff0c;是溢出程序和蠕虫病毒的核心&#xff0c;一般可以获取权限。我们将代码存储到对方的堆栈中&#xff0…

玩转Android之加速度传感器的使用,模仿微信摇一摇

Android系统带的传感器有很多种&#xff0c;最常见的莫过于微信的摇一摇了&#xff0c;那么今天我们就来看看Anroid中传感器的使用&#xff0c;做一个类似于微信摇一摇的效果。 OK ,废话不多说&#xff0c;我们就先来看看效果图吧&#xff1a; 当我摇动手机的时候这里的动画效果…

Java两种设计模式_23种设计模式(11)java策略模式

23种设计模式第四篇&#xff1a;java策略模式定义&#xff1a;定义一组算法&#xff0c;将每个算法都封装起来&#xff0c;并且使他们之间可以互换。类型&#xff1a;行为类模式类图&#xff1a;策略模式是对算法的封装&#xff0c;把一系列的算法分别封装到对应的类中&#xf…

JAXB自定义绑定– Java.util.Date / Spring 3序列化

JaxB可以处理Java.util.Date序列化&#xff0c;但是需要以下格式&#xff1a; “ yyyy-MM-ddTHH&#xff1a;mm&#xff1a;ss ”。 如果需要将日期对象格式化为另一种格式怎么办&#xff1f; 我有同样的问题时&#xff0c;我正在同春MVC 3和Jackson JSON处理器 &#xff0c;最…

双足机器人简单步态生成

让机器人行走最简单的方法是先得到一组步态曲线&#xff0c;即腿部每个关节随时间运动的角度值。可以在ADAMS或3D Max、Blender等软件中建立好机构/骨骼模型&#xff0c;设计出脚踝和髋关节的运动曲线&#xff0c;然后进行逆运动学解算&#xff0c;测量每个关节在运动过程中的转…

重新访问了访客模式

访客模式是面向对象设计中最被高估但又被低估的模式之一。 高估了它&#xff0c;因为它常常被选择得太快&#xff08; 可能是由建筑宇航员选择的 &#xff09;&#xff0c;然后以错误的方式添加时会膨胀本来非常简单的设计。 如果您不遵循教科书示例&#xff0c;那么它可能会非…

ASP.NET—013:实现带控件的弹出层(弹出框)

http://blog.csdn.net/yysyangyangyangshan/article/details/38458169 在页面中用到弹出新页面的情况比较多的&#xff0c;一般来说都是使用JS方法showModalDialog("新页面相对路径?参数1&参数2",window,"新页面样式");然后会新弹出一个模态的page页。…

java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...

一、权限计算相关分析1.如何存储权限首先说一下权限保存的问题&#xff0c;一个系统中最多有多少权限呢&#xff1f;一个大的系统中可能有成百上千个权限需要管理。怎么保存这么多的权限&#xff1f;首先&#xff0c;我们使用一个数字中的一位保存一种权限&#xff0c;那么如果…

GWT和HTML5 Canvas演示

这是我对GWT和HTML5 Canvas的第一个实验。 我的第一个尝试是创建矩形&#xff0c;仅用几行代码就得出了这样的内容&#xff1a; 码&#xff1a; public class GwtHtml5 implements EntryPoint {static final String canvasHolderId "canvasholder";static final St…

Solr管理界面详解

转载于:https://www.cnblogs.com/gslblog/p/6553813.html

一个实用的却被忽略的命名空间:Microsoft.VisualBasic:

当你看到这个命名空间的时候&#xff0c;别因为是vb的东西就匆忙关掉网页&#xff0c;那将会是您的损失&#xff0c;此命名空间中的资源最初目的是为了简化vb.net开发而创建的&#xff0c;所以microsoft.visualbasic并不属于system命名空间&#xff0c;而是独立存在的。虽然是为…

Linux基础之命令练习Day2-useradd(mod,del),groupadd(mod,del),chmod,chown,

作业一&#xff1a; 1) 新建用户natasha&#xff0c;uid为1000&#xff0c;gid为555&#xff0c;备注信息为“master” 2) 修改natasha用户的家目录为/Natasha 3) 查看用户信息配置文件的最后一行 4) 为natasha用户设置密码“123” 5) 查看用户密码配置文件的最后一行 6) 将nat…

动态表单,JSF世界早已等待

新的PrimeFaces扩展版本0.5.0带来了新的DynaForm组件。 通常&#xff0c;如果知道行/列的数量&#xff0c;元素的位置等&#xff0c;则可以通过h&#xff1a;panelGrid或p&#xff1a;panelGrid来构建非常简单的表单。 对于静态表单&#xff0c;这是正确的。 但是&#xff0c;如…

C# 定时器事件(设置时间间隔,间歇性执行某一函数,控制台程序)

定时器事件代码 static void Main(string[] args) {Method();#region 定时器事件 Timer aTimer new Timer();aTimer.Elapsed new ElapsedEventHandler(TimedEvent);aTimer.Interval seconds * 1000; //配置文件中配置的秒数aTimer.Enabled true;#endregionstring strLi…

Vmware安装Centos NAT方式设置静态IP

【Vmware中在搭建集群环境等&#xff0c;DHCP自动获取IP方式不方便&#xff0c;为了固定IP减少频繁更改配置信息&#xff0c;建议使用静态IP来配置&#xff0c;网络连接主要有三种方式 1.nat 2.桥接&#xff0c;3主机模式 &#xff0c;在这里主要介NAT方式&#xff0c; 为什么使…

1 TB /节点时快速,可预测且高度可用

世界正每秒从移动设备&#xff0c;Web和各种小工具向应用程序推送大量数据。 如今&#xff0c;更多的应用程序必须处理此数据。 为了保持性能&#xff0c;这些应用程序需要快速访问数据层。 在过去的几年中&#xff0c;RAM价格下降了&#xff0c;我们现在可以便宜得多地获得具有…

java jni 内存_Android开发之JNI内存模型

Java 与JNI 内存管理是怎样的想要弄清楚Java与JNI的内存管理的关系&#xff0c;首先要弄清楚JVM的内存模型JVM内存模型.png其中本地方法栈就是运行时调用native 方法的数据保存区。本地方法栈的大小可以设置成固定的或者是动态扩展。Java中的内存泄露JAVA 编程中的内存泄漏&…

04 linux用户群组和权限

作业一&#xff1a; 1)新建用户natasha&#xff0c;uid为1000&#xff0c;gid为555&#xff0c;备注信息为“master” 2)修改natasha用户的家目录为/Natasha 3)查看用户信息配置文件的最后一行 4)为natasha用户设置密码“123” 5)查看用户密码配置文件的最后一行 6)将natasha用…

基于 CoreText 实现的高性能 UITableView

引起UITableView卡顿比较常见的原因有cell的层级过多、cell中有触发离屏渲染的代码&#xff08;譬如&#xff1a;cornerRadius、maskToBounds 同时使用&#xff09;、像素是否对齐、是否使用UITableView自动计算cell高度的方法等。本文将从cell层级出发&#xff0c;以一个仿朋友…

Web Magic 总体架构

1.2 总体架构 WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件&#xff0c;并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy&#xff0c;但是实现方式更Java化一些。 而S…