国际化(i18n)

  • 国际化(Internationalization)指的是同一个网站可以支持多种不同的语言,以方便不同国家,不同语种的用户访问。
  • 关于国际化我们想到的最简单的方案就是为不同的国家创建不同的网站,比如苹果公司,他的英文官网是:http://www.apple.com而中国官网是http://www.apple.com/cn
  • 苹果公司这种方案并不适合全部公司,而我们希望相同的一个网站,而不同人访问的时候可以根据用户所在的区域显示不同的语言文字,而网站的布局样式等不发生改变。
  • 于是就有了我们说的国际化,国际化总的来说就是同一个网站不同国家的人来访问可以显示出不同的语言。但实际上这种需求并不强烈,一般真的有国际化需求的公司,主流采用的依然是苹果公司的那种方案,为不同的国家创建不同的页面。所以国际化的内容我们了解一下即可。
  • 国际化的英文Internationalization,但是由于拼写过长,老外想了一个简单的写法叫做I18N,代表的是Internationalization这个单词,以I开头,以N结尾,而中间是18个字母,所以简写为I18N。以后我们说I18N和国际化是一个意思。
  • 当然国际化不仅仅是语言的国际化,还包括日期、时间、数字等。
  • 国际化最常见的应用就是登录页面,像这种国际化的页面,如果在英文环境下登录则显示英文内容,中文环境下显示中文内容。

原理

 

  • 那我们说这个是如何做到的呢?

n 首先我们需要知道,用户使用的是哪种语言,这个问题最好解决,因为浏览器在发送请求时会发送如下请求头:

u Accept-Language: zh-CN,en-US

u 这个头的意思是告诉服务器,当前浏览器优先使用的语言是zh-CN.

l zh 代表中文

l CN 代表中国

l zh-CN 连起来代表简体中文

l 而en-US是我们第二种可以使用的语言

u 通过该头就可以判断用户使用的语言

  • 已经知道用户使用的语言了,下一步需要我们根据不同的语言显示不同的内容,那我们想一下,如果说我们在页面中把这些诸如:登录、用户名、密码等信息都写死了。那么,将不能再修改,所以在页面中这些需要国际化的内容都是需要动态获取的,也就是他们实际上都是变量。
  • 我们一般采取的方式是将这些需要国际化的内容写到一个资源配置文件中,然后程序根据不同的语言加载不同的文件,就达到了一个国际化的目的。
  • java.util.Locale

核心类

n 作用:Locale表示一个语言环境的类,通过该类可以创建和获取指定的表示一个国家和语言的对象,国际化的操作主要使用Locale对象来表示当前语言环境。

n 常量:

u static public final Locale CHINA

u static public final Locale GERMANY

u static public final Locale US

l 这些常量可以直接返回指定的语言和国家Locale对象

n 方法:

u public static Locale getDefault()

u 获得当前语言环境

n 构造器:

u public Locale(String language, String country)

l 两个参数的构造器,用来根据语言和国家创建Locale对象。

l 比如:new Locale(“zh”,”CN”)就是创建了一个简体中文的环境。

u public Locale(String language)

l 一个参数的构造器,用来根据语言创建Locale对象

l 比如:new Locale(“en”)创建了一个英文环境对象

u 常见的语言和国家

语言

代码

国家

代码

简体中文

zh

中国

CN

英语

en

美国

US

德语

de

德国

DE

法语

fr

法国

FR

日语

ja

日本

JP

 

  • java.util.ResourceBundle

n 作用:根据不同的Locale对象加载国际化资源文件

n 方法:

u public static final ResourceBundle getBundle(String baseName)

l 根据资源包的基础名加载资源文件(使用系统默认的Locale对象)

u public static final ResourceBundle getBundle(String baseName,Locale locale)

l 根据资源包的基础名和Locale对象加载资源

l 这两个方法返回的都是一个ResourceBundle对象

u public final String getString(String key)

l 根据资源的key获取到资源的值,返回一个字符串

n 外部资源文件

u 外部资源文件我们一般放到src目录下

u 资源文件是一个properties类型的文件

u 文件名的规则是:

l 基础名_语言_国家.properties

l 如:

n res_zh_CN.properties

n res_en_US.propreties

n 这样ResourceBundle将会根据不同的Bundle加载不同的资源文件

l 文件中是键值对的结构:

username=USERNAME

password=PASSWORD

login=LOGIN

 

  • java.text.DateFormat

n 作用:格式化日期

n 常用方法:

u public final static DateFormat getDateInstance(int style)

l style是代表日期的风格

l 不设置Loacle默认当前服务器的语言环境

u public final static DateFormat getDateInstance(int style, Locale aLocale)

l style是代表日期的风格

l aLocale代表当前服务器语言环境

u style需要通过DateFormat中的常量来设置:

l public static final int FULL = 0;

l public static final int LONG = 1;

l public static final int MEDIUM = 2;

l public static final int SHORT = 3;

l public static final int DEFAULT = MEDIUM;

  • java.text.NumberFormat

n 作用:格式化数字

n 方法:

u public static NumberFormat getNumberInstance(Locale inLocale)

l 获取NumberFormat对象

u public final String format(double number)

l 格式化一个数字,返回String类型