国际化和本地化
- 国际化,Internationalization,I18N
- 本地化,Localization,L10N
- 目标: 编写在任何受支持的区域设置中都能正常运行(且外观表现本地化)的代码
- 国际化主要采用Unicode编码格式
数字、日期和时间国际化
- 语言
- 数字格式
- 时间/日期格式
- 货比
- 身份证、社保号码和护照
- 电话号码、地址和邮政编码
- 度量衡
- 禁忌
- 名字和称谓
这里写代码片
资源包和属性文件
资源包
Resource Bundle,用于保存于运行环境相关的资源,如消息文本、菜单及按钮标签等,每个资源包对应一种用户Locale
资源包的命名格式
- <包名>_<语言代码>_<国家/地区代码>
如:myRes_zh_CN
- <包名>_<语言代码>
如:myLabels_en
- <包名>_<语言代码>_<国家/地区代码>
资源包的两种表现形式:
属性文件(Properties File)
- 后缀:*.properties
- java.util.ResourceBundle类,读取资源包的工具
- unicode转换工具:
native2ascii a.properties b.properties
资源绑定类(Resource Bundle Class)
- 保存的也是国际化的key-value属性信息,但格式不限于字符串类型
- java.util.ListResourceBundle类,采用二维对象数组Object[][]形式保存国际化资源
- 子类实现
getContent()
方法
getBundle
getBundle 使用基本名称、指定的语言环境和默认语言环境(从 Locale.getDefault 获得)来生成候选包名称 序列。如果指定语言环境的语言、国家/地区和变量都是空字符串,则基本名称就是唯一的候选包名称。否则,从指定语言环境(language1、country1 和 variant1)和默认语言环境(language2、country2 和 variant2)的属性值生成下列序列:baseName + “_” + language1 + “_” + country1 + “_” + variant1
baseName + “_” + language1 + “_” + country1
baseName + “_” + language1
baseName + “_” + language2 + “_” + country2 + “_” + variant2
baseName + “_” + language2 + “_” + country2
baseName + “_” + language2
baseName
消息格式化
java.text.MessageFormat,用于格式化包含有可变参数的文本消息
- 调用MessageFormat.format()方法,替换占位符
相关术语:
- 消息模式,Message Pattern
- 占位符,Placeholder
- 类型和样式:
{<index>, <type>, <style>}
- number:integer/currency/percent/#.##(用于格式化浮点数)
- Date:Short/Medium/Long/Full
- Time:Short/Medium/Long/Full
- choice:(选择格式,结合java.text.ChoiceFormat使用)
- 类型和样式:
国际化中的消息格式化
使用资源包保存消息模式字符串