【Java】I18N国际化

       i18n(其来源是英文单词internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。

       这就要求,仅仅是页面语言的翻译是不够的,即便在一个国家在不同地区都可能会存在不同习惯方言操作习惯等等(例如我们国家搜索结果习惯左对齐,但是有的国家就习惯右对齐),这就导致了“本地化”(L10n)机制的出现。

       国际化和本地化的出现,在语言、文化、书写习惯、阅读习惯、符合当地主题的全面配置,使得一个Web应用程序在运行时能够根据客户端请求所来自的国家和语言显示不同的用户界面。

【示例】

根据以上简介和查看的具体软件的配置,理解一下i18n吧,所以小编查看了一下QQi18n配置文件,如下:



	
	
	
	
				
		
		
	
	
	
		
	
	
		
	

又查看了一下要读取的LangList.xml文件,很壮观,如下:



	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

【实践】

1.locale方法

     Java.Util中有一个locale方法,该方法的其中一个构造方法为:

    Locale(Stringlanguage,String country):根据语言和国家构造一个语言环境。每个国家都有一个locale信息,通过对象可以取得locale信息,locale信息来源于操作系统。如下:

package com.bjpowernode.i18n;

import java.util.Locale;

public class I18nSample {

	public static void main(String[] args) {

		Locale defaultLocale = Locale.getDefault();
		System.out.println("country=" + defaultLocale.getCountry());
		System.out.println("language=" + defaultLocale.getLanguage());

	}
}

运行结果为:

country=CN

language=zh

      但是在我们下面的实践中,为了方便我们就直接进行设置了。

2.ResourceBundle资源包

       我们需要将硬编码文本转移到外部的资源文件,对资源文件的命名必须使用一定的规则,一般是以“统一字符+locale信息”命名,MessagesBundle_zh_CN.propertiesMessagesBundle_en_US.properties。准备资源包的过程,就是把对应不同语言的用户所涉及的文本和图片保存在多个文本文件中,客户端根据不同的环境需要进行更换。这些文件被称为“属性文件”,所有属性文件合在一起被称为资源包(ResourceBundle)。

        因为资源文件必须是Latin-1后者Unicode编码的字符,所以实践过程中,准备英文好说,准备中文的话,需要使用相应的Unicode编码,使用jdk自带的native2ascii.exe,将中文资源文件进行转换,如下:

【Java】I18N国际化_第1张图片

【Java】I18N国际化_第2张图片

也可以直接在资源文件中添加,会自动转换成Unicode编码,如下:

【Java】I18N国际化_第3张图片

结果如下:

【Java】I18N国际化_第4张图片

Demo中我们中文和英文准备的都是:k1=你好/hello,k2=再见/goodbye

【实践代码】

package com.bjpowernode.i18n;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

public class I18nSample {

	public static void main(String[] args) {
		// 为了实验,就不每次都修改操作系统的语言了,直接设置locale信息
		// Locale currentLocale = new Locale("zh", "CN");
		Locale currentLocale = new Locale("en", "US");

		System.out.println("country=" + currentLocale.getCountry());
		System.out.println("language=" + currentLocale.getLanguage());

		// 根据locale信息寻找相应的资源包中的配置
		ResourceBundle rb = ResourceBundle.getBundle(
				"com.bjpowernode.resources.MessagesBundle", currentLocale);
		System.out.println(rb.getString("k1"));
		System.out.println(rb.getString("k2"));
		// 在配置文件中用占位符来加入自定义设置,如登陆时显示:你好,***
		MessageFormat mf = new MessageFormat(rb.getString("k1"));
		System.out.println(mf.format(new Object[] { "张三" }));
	}
}

运行结果为:

country=US

language=en

hello,{0}

good bye

hello,张三

你可能感兴趣的:(【Java】,Java)