(JavaEE-13)国际化开发.md

>

JavaWeb-国际化

国际化开发概述

  • 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据
  • 国际化又称为 i18n:internationalization

合格的国际化软件

  • 软件实现国际化,需具备哪些特征:

    • 对于程序中固定使用的文本元素,例如菜单栏、导航条等中使用的文本元素、或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不同语言的文本为之服务
    • 对于程序动态产生的数据,例如(日期,货币等),软件应能根据当前所在的国家或地区的文化习惯进行显示

固定文本元素的国际化

  • 对于软件中的菜单栏、导航条、错误提示信息,状态信息等这些固定不变的文本信息,可以把它们写在一个properties文件中,并根据不同的国家编写不同的properties文件。这一组properties文件称之为一个资源包
  • 在JavaAPI中提供了一个ResourceBundle 类用于描述一个资源包,并且 ResourceBundle类提供了相应的方法getBundle,这个方法可以根据来访者的国家地区自动获取与之对应的资源文件予以显示

创建资源包和资源文件

  • 一个资源包中的每个资源文件都必须拥有共同的基名。除了基名,每个资源文件的名称中还必须有标识其本地信息的附加部分。例如:一个资源包的基名是“myproperties”,则与中文、英文环境相对应的资源文件名则为:

    • “myproperites_zh.properties” “myproperites_en.properties”
  • 每个资源包都应有一个默认资源文件,这个文件不带有标识本地信息的附加部分。若ResourceBundle对象在资源包中找不到与用户匹配的资源文件,它将选择该资源包中与用户最相近的资源文件,如果再找不到,则使用默认资源文件。例如:
    • myproperites.properties

资源文件的书写格式

  • 资源文件的内容通常采用“关键字=值”的形式,软件根据关键字检索值显示在页面上。一个资源包中的所有资源文件的关键字必须相同,值则为相应国家的文字
  • 并且资源文件中采用的是properties格式文件,所以文件中的所有字符都必须是ASCII字码,对于像中文这样的非ACSII字符,须先进行编码。(java提供了一个native2ascII命令用于编码)。属性文件是不能保存中文的

编程实现固定文本的国际化

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

    Locale currentLocale = Locale.getDefault();
    ResourceBundle myResources = ResourceBundle.getBundle(basename, currentLocale);

  • basename为资源包基名(且必须为完整路径)。
  • 如果与该locale对象匹配的资源包子类找不到。一般情况下,则选用默认资源文件予以显示
  • 加载资源文件后, 程序就可以调用ResourceBundle 实例对象的 getString 方法获取指定的资源信息名称所对应的值:String value = myResources.getString(“key");
  • 在WEB应用中实现固定文本的国际化

动态数据的国际化

  • 数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)
  • Locale 类
    • Locale 实例对象代表一个特定的地理,政治、文化区域
    • 一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)

DateFormat类(国际化日期)

  • DateFormat 类可以将一个日期/时间对象格式化为表示某个国家地区的日期/时间字符串
  • DateFormat 类除了可按国家地区格式化输出日期外,它还定义了一些用于描述日期/时间的显示模式的 int 型的常量,包括FULL, LONG, MEDIUM, DEFAULT, SHORT,实例化DateFormat对象时,可以使用这些常量,控制日期/时间的显示长度
  • DateFormat类
    • 例如,对于日期/时间“2005年9月15日下午4时41分20秒”,如设置了DateFormat的显示模式,则日期/时间显示样式分别为:

      • SHORT模式完全是数字的,在中文环境下显示为“05-9-15 下午4:41”;在英文环境下为“9/15/05 4:41 PM”
      • MEDIUM模式比SHORT模式长些,在中文环境显示为“2005-9-15 16:41:20”;在英文环境下显示为“Sep 15, 2005 4:41:20 PM”
      • LONG模式比MEDIUM模式更长一些,在中文环境下显示为“2005年9月15日 下午04时41分20秒”;在英文环境下显示为“September 15, 2005 4:41:20 PM CST”
      • FULL模式指定日期/时间的完整格式,在中文环境下显示为“2005年9月15日 星期四 下午04时41分20秒 CST”;在英文环境下,这个日期/时间显示为“Thursday, September 15, 2005 4:41:20 PM CST”
  • 实例化DateFormat类
    • 实例化DateFormat类有九种方式,以下三种为带参形式,下面列出的三种方式也可以分别不带参,或只带显示样式的参数

      • getDateInstance(int style, Locale aLocale):以指定的日期显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理时间值部分
      • getTimeInstance(int style, Locale aLocale):以指定的时间显示模式和本地信息来获得DateFormat实例对象,该实例对象不处理日期值部分
      • getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale):以单独指定的日期显示模式、时间显示模式和本地信息来获得DateFormat实例对象
  • DateFormat 对象的方法
    • format: 将date对象格式化为符合某个本地环境习惯的字符串
    • parse:将字符串解析为日期/时间对象
    • 注意:parse和format完全相反,一个是把date时间转化为相应地区和国家的显示样式,一个是把相应地区的时间日期转化成date对象,该方法在使用时,解析的时间或日期要符合指定的国家、地区格式,否则会抛异常
  • DateFormat 对象通常不是线程安全的,每个线程都应该创建自己的 DateFormat 实例对象

NumberFormat类

  • NumberFormat 可以将一个数值格式化为符合某个国家地区习惯的数值字符串,也可以将符合某个国家地区习惯的数值字符串解析为对应的数值
  • NumberFormat 类的方法:
    • format 方法:将一个数值格式化为符合某个国家地区习惯的数值字符串
    • parse 方法:将符合某个国家地区习惯的数值字符串解析为对应的数值
  • 实例化NumberFormat类时,可以使用locale对象作为参数,也可以不使用,下面列出的是使用参数的
  • getNumberInstance(Locale locale):以参数locale对象所标识的本地信息来获得具有多种用途的NumberFormat实例对象
  • getIntegerInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理整数的NumberFormat实例对象
  • getCurrencyInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理货币的NumberFormat实例对象
  • getPercentInstance(Locale locale):以参数locale对象所标识的本地信息来获得处理百分比数值的NumberFormat实例对象

练习

  • 编写一个能国际化显示的登陆页面
  • 请创建一个date对象,并把date对象中表示日期部分的时间值,以及表示时间部分的时间值,分别以short、long模式进行格式化输出(国家设置为中国)
  • 请将时间值:09-11-28 上午10时25分39秒 CST,反向解析成一个date对象
  • 请将整数198,输出为货币形式:$198,并将$198反向解析成整数198

MessageFormat(动态文本)

  • 如果一个字符串中包含了多个与国际化相关的数据,可以使用MessageFormat类对这些数据进行批量处理
  • 例如:At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage

    以上字符串中包含了时间、数字、货币等多个与国际化相关的数据,对于这种字符串,可以使用MessageFormat类对其国际化相关的数据进行批量处理

  • MessageFormat 类如何进行批量处理呢?
    • MessageFormat类允许开发人员用占位符替换掉字符串中的敏感数据(即国际化相关的数据)
    • MessageFormat类在格式化输出包含占位符的文本时,messageFormat类可以接收一个参数数组,以替换文本中的每一个占位符

模式字符串与占位符

  • At 12:30 pm on jul 3,1998, a hurricance destroyed 99 houses and caused $1000000 of damage
  • 模式字符串:
    • At {0} on {1},a destroyed {2} houses and caused {3} of damage
  • 格式化模式字符串
    • On {0}, a hurricance destroyed {1} houses and caused {2} of damage
  • MessageFormat类
    • MessageFormat(String pattern)

      • 实例化MessageFormat对象,并装载相应的模式字符串
    • format(object obj[])
      • 格式化输出模式字符串,参数数组中指定占位符相应的替换对象
      • format(new Object[ ]{date, new Integer(99), new Double(1E7) })

    String pattern = “On {0}, a hurricance destroyed {1} houses and caused " + “{2} of damage.“;
    MessageFormat msgFmt = new MessageFormat(pattern,Locale.US);

    //准备参数数组
    String datetime = “Jul 3, 1998 12:30 PM”;
    Date date = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.US).parse(datetime);
    Object [] msgArgs = {date, new Integer(99),new Double(1E7)};

    //执行格式化操作
    String result = msgFmt.format(msgArgs);
    System.out.println(result);

  • 占位符有三种方式书写方式:
    • {argumentIndex}: 0-9 之间的数字,表示要格式化对象数据在参数数组中的索引号
    • {argumentIndex,formatType}: 参数的格式化类型
    • {argumentIndex,formatType,FormatStyle}: 格式化的样式,它的值必须是与格式化类型相匹配的合法模式、或表示合法模式的字符串

    String pattern = “At {0, time, short} on {0, date}, a destroyed‘\n‘“+ “{1} houses and caused {2, number, currency} of damage.“;
    MessageFormat msgFmt = new MessageFormat(pattern,Locale.US);

    String datetimeString = “Jul 3, 1998 12:30 PM”;
    Date date = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
    DateFormat.SHORT,Locale.US).parse(datetimeString);
    String event = “a hurricance”;
    Object []msgArgs = {date, event, new Integer(99), new Double(1E7)};

    String result = msgFmt.format(msgArgs);
    System.out.println(result);

http://blog.163.com/meihua_can/blog/static/18543529220114221315952/

(JavaEE-13)国际化开发.md,布布扣,bubuko.com

时间: 2024-10-13 08:15:36

(JavaEE-13)国际化开发.md的相关文章

Ubuntu 13.04 & 开发板 ---- NFS服务配置

Ubuntu sudo apt-get install nfs-kernel-server sudo apt-get install rpcbind sudo vim /etc/exports /home/xxx *(rw, sync, no_root_squash) sudo /etc/init.d/nfs-kernel-server restart sudo /etc/init.d/rpcbind restart 开发板 mount -o nolock xxx:/home/xxx /mnt/

JavaEE(22) - JAAS开发安全的应用

1. 安全域.角色和用户组 容器提供的两种安全性控制:声明式安全控制和编程式安全控制 安全域是指用户.用户组和ACL的逻辑集合.服务器支持的两种常用安全域:RDBMS安全域和文件系统安全域. 2. JAAS基本流程 初始化请求-->初始化认证-->URL授权-->完成原来的请求-->调用EJB的业务方法 对JavaEE应用程序而言,用户提交的认证信息经过一次认证后,可以透明的传递到其他层.授权过程则需要执行多次. 3. 管理Weblogic服务器上的用户和组 4. 在Web应用中声

JavaEE(28) - JAAS开发安全的应用

1. 安全域.角色和用户组 容器提供的两种安全性控制:声明式安全控制和编程式安全控制 安全域是指用户.用户组和ACL的逻辑集合.服务器支持的两种常用安全域:RDBMS安全域和文件系统安全域. 2. JAAS基本流程 初始化请求-->初始化认证-->URL授权-->完成原来的请求-->调用EJB的业务方法 对JavaEE应用程序而言,用户提交的认证信息经过一次认证后,可以透明的传递到其他层.授权过程则需要执行多次. 3. 管理Weblogic服务器上的用户和组 4. 在Web应用中声

JavaEE(21) - JAAS开发安全的应用

1. 安全域.角色和用户组 容器提供的两种安全性控制:声明式安全控制和编程式安全控制 安全域是指用户.用户组和ACL的逻辑集合.服务器支持的两种常用安全域:RDBMS安全域和文件系统安全域. 2. JAAS基本流程 初始化请求-->初始化认证-->URL授权-->完成原来的请求-->调用EJB的业务方法 对JavaEE应用程序而言,用户提交的认证信息经过一次认证后,可以透明的传递到其他层.授权过程则需要执行多次. 3. 管理Weblogic服务器上的用户和组 4. 在Web应用中声

JavaEE 13中核心技术

(1)Extensible Markup Language (XML) XML是一种可以用来定义其它标记语言的语言 (2)JavaServer Pages (JSPs) 用以创建动态网页 (3)Java servlets 提供的功能大多与JSP类似,不过实现的方式不同 (4)Java Database Connectivity (JDBC) 以一种统一的方式来对各种各样的数据库进行存取 (5)Java Transaction Architecture (JTA) 可以存取各种事务 (6)Java

VStudio2015 开发MD风格的windows软件(附上使用第三方库教程)

MD就是Google的一个安卓5.0+好看界面,都知道win下没有,那么就有大牛弄出了C#版的MD 特别说明:开发环境是.net 4.6 下面开始教程喂! 新建一个工程,这些不要我说了吧,如果没一点基础,还是去Google吧 #windows窗体程序就可以 之后右上方有个解决方案资源管理器 如图所示找到添加引用即可啦! 打开后看到介里,去找那个dll 之后你会发现: 多了一个介个那么你成功了一半 之后找那个dll找到后用鼠标拖动到如图所示: 源码:https://github.com/Frank

No.13 程序开发

1. 扎实的基本功  (基本功很重要) 快速的输入能力 避免   编程懒惰.光看不练是不行的,危险的 编程最大的奥秘在 编码 理想的输入方式(学习时,照着代码) 整体看看程序,试图理解 将其分为几个小的段落 逐段逐段的理解程序,并将其输入电脑 学习过程三个阶段 吸收(学渣在此) 大脑中归纳整理(我在此) 输出:系统.条例化.文档.程序.讲解.传授等等(到此阶段基本能理解到位了)(加强这个阶段,把自己带到这个阶段,并且这个阶段会督促自己完成前两个阶段) 对某个小的知识点也可以采用这种方法 看书.理

【读书笔记《Android游戏编程之从零开始》】13.游戏开发基础(Paint 画笔)

1.Paint画笔 Panit(画笔)是绘图额辅助类,其类中包含文字和位图额样式.颜色等属性信息.Paint 的常用方法如下: setAntiAlias(boolean aa) 作用:设置画笔是否无锯齿 参数:true 表示无锯齿,false 表示有锯齿,默认为 false . setAlpha(int a) 作用:设置画笔的透明度 参数:透明值 setTextAlign(Paint.Align align) 作用:设置绘制文本的锚点 参数:Paint.Align 类中的常量 measureTe

iOS多语言(国际化)开发(跟随系统 + APP内手动设置)

一:跟随系统切换语言 1>创建好项目工程后, 新建一个多语言文件: 2>添加要设置的语言类型: 3>添加成功 细心的朋友可能会发现在English后面写的是3 Files Localized,这是因为英语是系统默认添加的,而且同时为Main.storyboard 和 LaunchScreen.storyboard设置了多语言,我在自己添加的时候没有勾选这两项. 3>使用多语言文件在应用内设置对应语言 "label"="label"; &quo