国际化程序实现原理

国际化程序实现原理

所谓国际化的程序指的是同一个代码可以根据不同的国家实现不同的语言描述,但是程序处理的核心业务是相同的

1、国际化问题简介

现在假设有一款全世界都认可的企业管理平台,那么这个企业老板决定将这个产品推广到全世界各个大型上市公司,这些公司可能来自不同的国家

同过分析可以发现,如果想要实现国家化的程序开发, 那么需要解决以下两点:

  • 如何可以定义保存文字的文件信息
  • 如何可以根据不同区域语言的编码读取指定的资源信息

2、Locale类

如果要想实现国际化,那么首先需要解决的就是不同国家用用户的语言编码问题,而在java.util包中提供有一个专门描述区域和语言编码的类:Locale,主要可以使用Locale类中的两个构造方法进行实例化

  • 构造方法:public Locale(String language)
  • 构造方法:public Locale(Stirng language , String country)

此时需要的是国家和语言的代码,而中国的代码:zh_CN、美国的代码:en_US。获取语言编码的最简单的方式就是通过IE浏览器

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		Locale locale = new Locale("zh", "CN");
		System.out.println(locale);
	}
}

如果现在想要自动获得当前的运行环境,那么现在就可以利用Locale类本身默认的方式进行实例化

  • 读取本地默认环境:public static Locale getDefault()
public class JavaAPIDemo {
   public static void main(String[] args) throws ParseException {
      Locale locale = Locale.getDefault();
      System.out.println(locale);
      
   }
}

在实际开发过程之中,很多人可能并不关心国家和语言的编码,所以为了简化,Locale也将世界上著名的国家的编码设置为了常量

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		Locale locale = Locale.CHINA;
		System.out.println(locale);
	}
}

3、读取资源文件:ResourceBundle

现在一斤准备好了资源文件,那么随后就需要进行资源文件的读取操作了,读取资源文件主要依靠java.util.ResourceBundle类完成,定义如下:

  • public abstracet class ResourceBundle extends Object

ResourceBundle是一个抽象类,如果说现在想要进行此类对象的实例化可以直接使用该类中提供的一个static方法完成:

  • public sattic final ResourceBundle getBundle(String baseName)
    • baseName:描述的是资源文件的名称,但是没有后缀
  • 根据key读取资源内容:public final String getString(String key)

范例:使用ResourceBundle类读取内容

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		ResourceBundle resource = ResourceBundle.getBundle("Resource.message");
		String info = resource.getString("info");
		System.out.println(info);
	}
}

如果资源没有放在包里面,则直接编写资源名称即可

如果资源未找到会报“java.util.MissingResourceException: Can’t find bundle for base name message, locale zh_CN”异常

如果key不存在会报“java.util.MissingResourceException: Can’t find resource for bundle java.util.PropertyResourceBundle, key infos”异常

4、实现国际化程序

现在国际化程序的实现前期准备工作已经全部完成了,也就是说依靠资源文件、Locale,ResourceBundle类就可以实现国际化处理操作了

进行国际化程序实现(核心关键:读取资源信息)

①、在Resource文件夹下创建message_zh_CN.properties

info=欢迎您的访问!

②、在Resource文件夹下创建message_en_US.properties

info=welcome

③、通过程序进行指定区域的资源文字加载

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		ResourceBundle resource = ResourceBundle.getBundle("Resource.message");
		String info = resource.getString("info");
		System.out.println(info);
	}
}
// 结果:欢迎您的访问!

此时中国利用ResouceBundle类读取资源的时候并没有设置一个明确的Locale对象,但是发现“message_zh_CN”的文件起作用了,因为默认加载了班底的Locale的资源

④、如果现在有需要也可以修改当前的Locale环境,则可以使用ResourceBundle类中的如下方法:

  • 获取ResourceBundle:public static final ResourceBundle getBundle(String baseName , Locale locale)
public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		Locale locale = new Locale("en", "US");
		ResourceBundle resource = ResourceBundle.getBundle("Resource.message" , locale);
		String info = resource.getString("info");
		System.out.println(info);
	}
}
//输出的结果是 welcome

如果现在没有指定的资源文件存在时,那么没有设置区域的资源文件不会被读取

资源读取顺序:读取指定区域的资源文件 > 默认的本地资源 > 没有公共的资源(没有区域设置的)

5、格式化文本显示

登录成功后,一般会显示这样的信息:xx欢迎您…

也就是说这个时候会显示用户名,那么此时如果这些内容保存在了资源文件里面,则需要通过占位符来进行描述,同时对于读取出来的数据也需要进行消息格式化的处理

范例:修改资源文件

资源文件info
中文资源文件info=欢迎您的访问. 当前的日期是{1}
英文资源文件info=Welcome{0} Date:{1}

如果有需要,则可以继续添加{1},{2}…

如果此时需要进行资源读取,则会将占位符的信息一起读取出来,因此需要利用MessageFormat类进行格式化处理

在MessageFormat类中提供有一个格式化文本的方法:public static String format(String pattren , Object… arguments)

范例:格式化文本实现国际化

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		Locale locale = new Locale("en", "US");
		ResourceBundle resource = ResourceBundle.getBundle("Resource.message" , locale);
		String info = resource.getString("info");
		System.out.println(MessageFormat.format(info , "linlin" , new SimpleDateFormat("yyyy-MM-dd").format(new Date())));
	}
}
//结果:Welcomelinlin Date:2022-05-12

如果在日后开发过程中见到资源文件里面出现有{0},{1}…表示的就是占位符,需要进行格式化处理


下一篇:开发支持类库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyRedScarf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值