国际化
locale,英译为 区域设置
语言不同,还有要使两国用户都满意。
为什么需要locale
提供程序的国际化版本时,所有程序消息都需要转换为本地语言。
直接翻译是不够的,还有许多更细微的差异,英语与德语数字不同,小数点和十进制数逗号相反。
日期也是,美国月日年,德国日月年,中国年月日。
指定locale
locale由5个部分组成
1.语言由2-3个小写字母表示,英语en,德语de,中文ch等。
2.可选的脚本,由首字母4个字母表示,拉丁文Latn,西里尔文Cyrl,繁体中文Hant。
3.可选的国家或地区,由2个大写字母或3个数字表示,美国US,瑞士CH,中国CN,日本JP。
4.可选的变体,指定各种杂项特性,方言和拼写规则,很少用了,挪威语的变体尼诺斯克语。
5.可选的拓展,拓展描述了日期和数字等内容偏好,u-和两个字母开头,日历ca,数字nu。
泰语数字,拓展u-nu-thai。
语言和国家看起来有点乱是由本地语言导出的,德语从Deutsch,中文zhongwen,de和zh。
locale是用标签描述的,标签由各个元素通过字符连接起来,en-US,zh-CN。
瑞士由4中官方语言(德,法,意大利,托罗曼斯语),讲德语瑞士人希望用de-CH,货币值表示成瑞士法郎而不是欧元。
标签构建Locale对象
Locale usEnglish = Locale.forLanguageTag("en-US");
toLanguageTag方法可以用于给定locale的语言标签
Locale.US.toLanguageTag()生成的字符串是"en-US"。
为方便起见,各个国家的Locale对象和语言都已经预定义了。
getAvailableLocales方法会返回由Java虚拟机能够识别的所有locale构成的数组。
注释:Locale.getISOLanguages()获取所有语言代码,Locale.getISOCountries()获取所有国家代码。
默认locale
getDefault可以获得作为本地操作系统的一部分存储的默认locale。
setDefault来改变默认的Java locale,此改变只对程序有效,不会对操作系统产生影响。
注释:UNIX中,数字,货币,日期分别设置LC_NUMERIC,LC_MONETARY,LC_TIME环境变量来指定不同的locale。
Java不关注这些。
提示:测试一下,改变默认locale,启动程序时提供语言和地域特性,将它设为de-CH:
java -Duser.language=de -Duser.region=CH MyProgram
package 第7章国际化;
import java.util.Locale;
public class DefaultLocale {
public static void main(String[] args) {
Locale displayLocale = Locale.getDefault(Locale.Category.DISPLAY);
Locale formatLocale = Locale.getDefault(Locale.Category.FORMAT);
System.out.println(displayLocale.toString());
System.out.println(formatLocale.toString());
}
}
显示名字
getDisplayName返回描述locale的字符串,不是两个字母组成的代码,而是面向用户形式来表现。
German (Switzerland)
字符串显示为德语
package 第7章国际化;
import java.util.Locale;
public class DefaultLocale {
public static void main(String[] args) {
var loc = new Locale("zh","CN");
System.out.println(loc.getDisplayName(Locale.GERMAN));
}
}