位于上海,服务全国!

位于上海,服务全国!

探索Java应用程序的国际化支持

作者:admin 分类: 时间:2016-01-15 15:00:48 点击量:869
Java国际化的支持,用以显示符合各种区域和文化标准格式方式的文本元素。 且多种数据格式基于语言和文化的多样性。 地区,日期,时间,和货币格式的显示根据不同区域进行智能显示。 例如,一个区域的日期格式可以是’DD-MM-YYYY',而另一个'MM-DD-YYYY’。 Java的API库提供的功能,可以支持在不断变化的情况下以最少的代码获得数据呈现的地方标准。 这个Java国际化教程针对应用程序开发的特定用途提供探索API库的思路。

概述
术语国际化通常缩写为i18n(因为在“I”和“N”之间有18个字符)。与i18n相关联,还有另一种称为本地化的机制(简称为l10n,因为在“L”和“N”之间有10个字符)。本地化可以帮助申请加入区域特定的文本组件以适应语言和区域的具体内容。 Java的API提供了方法来实现。且在API库内有充足的类和方法以支持这个机制。 其中一个支持该工具的主要类是java.util.Locales。

语言环境工作
java util.Locale类起着定制显示和格式显示数据的重要作用。实例化此类代表区域和语言的各种影响界面语言,整理,大小写映射,日期,时间,数字和货币格式等等的事项。 一旦地理位置被确定,它可以被用来以用户预期的格式显示数据。 Locale类提供了一些重要的参数其模具数据表示方法,如:
• 语言代码:一个ISO639的α-2或α-3语言代码,或语言子标签长度最多为8个字符。
• 国家或地区代码(可选):一个ISO3166的α-2国家代码或UN M.49数字-3区号。
• 各种代码(可选):用来表示一个语言环境的变化任意值。


Locale类提供了三种构造函数:
• 区域设置(String语言)
• 区域设置(String语言,String 国家)
• 区域设置(String语言,String国家,String变量)

有许多最常用的国家代码预定义的静态实例。我们可以简单地对其进行引用,而不是重新实例化Locale对象。静态实例可以参考如下。
Locale engUs=Locale.US;
Locale jpJapan=Locale.JAPAN;
一个简单的举例,以显示本地化格式的数据如下。

<%@page import="java.text.DateFormat"%>
<%@page import="java.util.Date"%>
<%@page import="java.text.NumberFormat"%>
<%@page import="java.util.Locale"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>



   content="text/html; charset=UTF-8">
Internationalization Demo
    
     
         <% Locale[] locale = { Locale.CANADA,
            Locale.CHINA, Locale.FRANCE, Locale.GERMANY,
            Locale.ITALY, Locale.JAPAN, Locale.KOREA,
            new Locale("hi", "IN") };
         for (Locale l : locale) { %>
         
             
            <% } %>
     
   
Code Name Currency Percentage Number Date Time
<%=l.getCountry()%> <%=l.getDisplayName()%> <%=NumberFormat.getCurrencyInstance(l)
                  .format(8736465.38)%>
<%=NumberFormat.getPercentInstance(l)
                  .format(87.99)%>
<%=NumberFormat.getNumberInstance(l)
                  .format(1234567890)%>
<%=DateFormat.getDateInstance(DateFormat.LONG, l)
                  .format(new Date())%>
<%=DateFormat.getTimeInstance(DateFormat.LONG, l)
                  .format(new Date())%>




图1:由上面的代码而形成的HTML表格
或者,我们可以使用包含setter方法来创建坚持以Best Common Practices (BCP)47种语言的标签语言环境的Locale.Builder类。BCP47定义了语言,区域,脚本和变量标识符的ISO标准。使用Locale.Builder,前面的代码可以做如下修改。

<%
   String[][] lr = { { "ca", "CA" }, { "ch", "CH" },
      { "fr", "FR" }, { "gr", "GR" }, { "it", "IT" },
      { "jp", "JP" }, { "kr", "KR" }, { "bn", "BD" } };
   Locale.Builder builder = new Locale.Builder();
   Locale l=null;
   for (String[] str : lr) {
   builder.clear();
   builder.setLanguage(str[0]).setRegion(str[1]);
   l=builder.build();
%>
还有另一种方式来创建Locale实例,例如使用静态Locale.forLanguageTag()方法。  在这里,我们可以使用下列方式的BCP47语言标记参数。

<%
   String[] bcp47LangTags={"fr-FR","gr-GR","it-IT",
      "jp-JP","kr-KR","hi-IN"};


   Locale l=null;
   for (String tag : bcp47LangTags) {
   l=Locale.forLanguageTag(tag);
%>
使用Locale过滤器
在编程时,我们经常需要过滤并从可用语言环境的列表匹配的一个关键变量。例如,假设有许多逗号分隔的字符串格式的语言环境清单。在这种情况下,我们可以将过滤器应用到字符串,并检索那些符合标准的语言环境。下面的代码片段演示了这个思想。
List tagList=Locale.LanguageRange.parse
      ("fr-FR,gr-GR,it-IT,jp-JP,kr-KR,hi-IN");
   System.out.println("Range of list: ");
   tagList.stream().forEach((lang)->{
      System.out.print(lang.getRange()+",");
   });
   System.out.println("");


   ListlocList=new ArrayList<>();
   locList.add("jp-JP");
   locList.add("en-UK");


   Listtags=Locale.filterTags(tagList, locList);
   System.out.println("Found tag");
   tags.stream().forEach((tag)->{
      System.out.println(tag);
   });
...
Output
Range of list:
fr-fr,fr-fx,gr-gr,it-it,jp-jp,kr-kr,hi-in,
Found tag
jp-jp
捆绑类
在java.util包中有三个重要的类,以帮助程序实现国际化功能。 他们是 ResourceBundle,ListResourceBundle,和PropertyResourceBundle。

• ResourceBundle是一个抽象类,其提供管理本地敏感资源收集的方法。 例如,一个用户界面元素的字幕可以根据所使用的语言被改变。该标题可被格式化为所使用的语言英语,法语,中文,等等,每个翻译都在自己的套装。该包是一个外部文件,在运行时被加载,以反映当前的语言环境,并使用字符串构建用户界面。
• PropertyResourceBundle是ResourceBundle的子类,其通过使用属性文件管理资源。
• ListResourceBundle也是ResourceBundle的子类。它通过键/值对数组管理资源。

实现国际化的需要
文化影响生活的各个方面,包括计算机程序文本元素的显示。 数据是手段和它们的形式,结合区域遮光,使得呈现有效。 计算机是一种愚蠢的机器,并且在其上运行的程序也不是智能的。 良好的部分是,一台计算机可以以一种方式被操纵,以弥合人机交互之间的间隙至高水平,以使用通用性足以欺骗自己。 人类有语言进行沟通,或好或坏,有太多的语言。 每一种语言都有自己的语法和语义标准。 国际化是捕捉到了这个想法,并帮助缩小人机交互的方式更有利于人类的认识差距的机制。 它提供了定义预期由用户方式呈现的上下文信息适当形式的能力。 最终的结果是提高了用户友好软件的使用,其中一个应用程序符合地区标准。 面向全球客户的商业应用程序都可以从这一功能大大受益。 采用法语交互的软件可能更受到法国人的欢迎,等等。
然而,此功能并不意味着改善性能;相反,它提供了一种方法,以改善与所述软件系统的用户交互。 交互作用出现在最终用户更习惯的处理方式中,这也是用户使用的语言格式。 这不仅提高了信息的可读性和可用性,而且增强了用户对系统的接受程度。

结论
国际化是一个大课题。 这篇文章给了我们可以实现国际化支持Java API库的一瞥。 与全球众多文化相适应的形式,为创建一致性提供了挑战。 也许最大的挑战是如何满足各种语言语法的适当调整。 他们不仅棘手,而且也难以实现。 但是,得通过Java API库,且根据区域标准来实现显示日期,时间,和货币的标准格式。

http://www.developer.com/java/data/exploring-java-internationalization-support-in-java-applications.html