国际化和本地化
文章目录
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会读取浏览器默认的语言环境,然后加载资源包,显示到页面。
案例上手
- 创建项目
- 导入jar包
- 编写web.xml
- 编写action
- 编写struts.xml文件(第七种方式)
- jsp页面
- 资源文件
- 运行结果
- 中文环境运行结果
- 切换超链接,会发送相应参数给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";
}
}
- 运行结果