国际化和本地化

01 国际化和本地化

为什么要国际化?

  • 互联网发展迅猛,将不同地区的人都联系在了一起,共享互联网上的各种 web 资源。因为互联网是在欧美国家率先发展起来的,所以网上所存在的大多数资源都是英文,对于非英文国家,想要阅读这些东西,难免有些障碍。在中国也是如此,大多数WEB程序采用的是中文字符,也给其他国家的人造成了阅读上的困难。一些业务范围扩展到海外的国际化公司,为了让不同国家的人都能了解本公司产品信息,于是定制了多个版本,通过不同的URL访问。如下面的微软官网:
    • 中国
      国际化和本地化
    • 美国
      国际化和本地化
    • 日本国际化和本地化

国际化 & 本地化

  • 是指程序在不做任何修改的情况下,就可以在不同的国家或地区的不同语言环境下,按照当地的语言和格式习惯显示字符。国际化又称为i18n(internationalization)。
  • 本地化:一个国际化的程序,当他运行在本地机器上时,需要根据本地机器的语言和地区设置显示相应的字符,这个过程叫本地化,又称为L10N(Localization)

Java的国际化

1. Locale:语言环境

  • 构造方法
    国际化和本地化
  • ISO规定语言及国家代码
语言 代码 国家 代码
汉语 zh 中国 CN
英语 en 英语 US
英语 en 英语 GB

2. ResourceBundle:资源包

国际化和本地化
国际化和本地化

3. 案例

package javai18n;

import java.util.Locale;
import java.util.ResourceBundle;

public class Test {
	
	public static void main(String[] args) {
		//Locale的这个对象封装了不同的语言,不同国家和地区的语言环境
		Locale locale = new Locale("en","US");
		//ResourceBundle资源包包含了特定于locale也就是语言环境的资源对象,从参数也可以看出
		ResourceBundle bundle = ResourceBundle.getBundle("MyResource",locale);
		String name = bundle.getString("msg");
		System.out.println(name);
		Locale locale1 = new Locale("zh","CN");
		ResourceBundle bundle1 = ResourceBundle.getBundle("MyResource",locale1);
		String name1 = bundle1.getString("msg");
		System.out.println(name1);
	}
}

国际化和本地化
国际化和本地化
注:properties文件不要以utf-8来保存,要用别的编码来写,删掉再写一遍
国际化和本地化

国际化和本地化

02 struts2对国际化的支持

Struts2对国际化提供了非常好的支持,它对Java的国际化实现方式做了一个封装,提供了更友好、更便利的国际化实现

资源的加载方式

国际化和本地化
注:下面那个案例就是这样加载的,是第7步,虽然第一次访问jsp页面没有传递任何语言参数,但是Action会读取浏览器默认的语言环境,然后加载资源包,显示到页面。

案例上手

  1. 创建项目
  2. 导入jar包
  3. 编写web.xml
  4. 编写action
    国际化和本地化
  5. 编写struts.xml文件(第七种方式)
    国际化和本地化
  6. jsp页面
    国际化和本地化
  7. 资源文件
    国际化和本地化
  • 运行结果
    • 中文环境运行结果
      国际化和本地化
    • 切换超链接,会发送相应参数给Action,即使不继承ActionSupport也可以
      国际化和本地化
    • 改变语言环境
      国际化和本地化国际化和本地化

消息格式化

1. 占位符(struts2沿袭了这种风格)

国际化和本地化

2. OGNL表达式

国际化和本地化

案例

国际化和本地化

package com.test;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}
	

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	public String execute() {
		return "success";
	}
	
	public String loginExecute() {
		if(this.username.equals("") || this.username==null) {
			System.out.println(this.username);
			return "failure";
		}
		return "success";
	}
}

国际化和本地化
国际化和本地化
国际化和本地化

  • 运行结果
    国际化和本地化
    国际化和本地化
    国际化和本地化
    国际化和本地化