Java-「本地化是什么鬼!?」
引言
大家好,我是一位零零散散的(SE)小码农,即使大家都在盂兰盆节休息,我还是操心地学习呢。
今天的Java Gold考试范围中有关本地化的问题,这是我不太关注过的内容,所以我根据黒本的答案做了个总结!
“什么是本地化信息?”
Java提供了适应不同国家和地区需求的类和接口。其中,最基础的类是java.util.Locale。这个类用于处理“语言环境信息”,如地区和语言。
嗯,这种事情无所谓啦。
…也许是因为缺乏知识,所以无法体会其中的价值吧。
哎呀,也许用这个,我能知道访问过来的人的个人信息(比如地址)吗?
(;゚д゚)ゴクリ…
本地类的使用示例1(显示国家和语言)
import java.util.Locale;
public class LocaleSample1 {
public void printLocale() {
Locale local = Locale.getDefault();
//国を表示する
System.out.println(local.getCountry());
//言語を表示する
System.out.println(local.getLanguage());
}
}
执行结果

“嘿,个人信息不会那么容易泄露的,哈哈。”
我会紧张得心跳加速,担心个人信息会不会被泄露出去呢,哈哈。
“JP是国家,ja是指日语对吗?”
语言
ISO 639 alpha-2 或 alpha-3 语言代码,或最多8个字母的注册语言子标签(用于未来扩展)。如果语言同时具有 alpha-2 和 alpha-3 代码,则必须使用 alpha-2 代码。有效语言代码的完整列表可以在 IANA 语言子标签注册处参考(搜索“Type: language”)。语言字段的大小写不敏感,但在区域设置中始终被规范化为小写。整形语言值的格式为 [a-zA-Z]{2,8}。但由于不包括扩展语言,因此它不是完整的 BCP47 语言产生式。这些可以被最新的三字母语言代码替换,因此不是必需的。
例:”en”(英语)、”ja”(日语)、”kok”(康卡尼语)
国家(地区)
ISO 3166 alpha-2 国家代码或 UN M.49 numeric-3 地区代码。有效国家代码和地区代码的完整列表可以在 IANA 语言子标签注册处参考(搜索“Type: region”)。国家(地区)字段的大小写不敏感,但在区域设置中始终被规范化为大写。整形国家/地区值的格式为 [a-zA-Z]{2}|[0-9]{3}。
例:”US”(美国)、”FR”(法国)、”029″(加勒比)
– 引用自官方参考:https://docs.oracle.com/javase/jp/8/docs/api/java/util/Locale.html
「IANA是什么语言?是什么鬼东西」

IANA语言子标签注册表:https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
构建区域设置信息的方法
生成Locale类的实例有以下5种方法:
1. 使用getDefault方法
2. 使用构造函数
3. 使用Locale常量
4. 使用构建器
5. 使用工厂方法
“五个!?太多了吧!(本田圭佑)”
在这里我写一个编程川柳…
从一开始
告诉我
最常用的(渣渣程序员内心呐喊)
「这个太冗长了,看着真是难受呢…」
Locale类的构造函数
Locale 类的构造函数通过重载实现了接受3个参数的功能:语言代码(language)、国家代码(country)和衍生信息(variant)。
・Local(String language)
・Local(String language, String country)
・Local(String language, String country, String variant)
“派生情报是什么东西!”
构造函数的第三个参数是传递给供应商或浏览器的特定代码。例如,在Windows中使用”WIN”,在Macintosh中使用”MAC”,在POSIX中使用”POSIX”。如果有两个派生信息,则用下划线分隔它们,并首先指定重要的信息。例如,如果要使用传统的西班牙语(”Traditional Spanish”)的区域设置信息,可以按照以下代码示例指定语言、国家和派生信息来生成Locale类的实例:
Locale locale = new Locale(“es”, “ES”, “Traditional_WIN”);
–引自《JavaGold黒本解説》
「… ‘Traditional Spanish’(西班牙傳統語)是什麼啊哈哈」
请将示例代码变成一个易懂的国家吧!ChatGPT老师,请告诉我!
在Java的Locale类的构造函数中,有一个参数叫variant(派生信息),请对其进行解释。
variant用于表示特定地域或文化中本地化的变体。例如,即使是相同的语言和国家,不同的地区可能存在独特的文化要素和语言差异,可以使用variant来表示这些差异。
…
让我们进一步看一个使用variant来区分特定地区或文化的例子。如果要获取代表中国广东省的本地化信息,可以指定如下variant:
Locale cantoneseLocale = new Locale(“zh”, “CN”, “HK”);
这里,”zh”表示中文的语言代码,”CN”表示中国的国家代码。而”HK”作为variant表示广东省特定地区的香港。
值得注意的是,并不是所有区域设置都需要variant。通常,只使用语言代码和国家代码就可以表示特定的本地化信息。
原来如此,它并不是必需的东西呢。
使用Locale常量进行实例化
Locale locale = Locale.CANADA_FRENCH;
有个看起来最容易使用的东西出来了吗?就只用这个就行了嘛。
只要看API文档,就能了解到并没有太多的变种可供选择。
(在Java SE 11中,只有24种。)
如果没有提供地区常量,就需要小心使用构造函数,确保不要弄错语言代码和国家代码。– 引自《JavaGold黒本解説》
「就像他能读懂我的心一样的解说…太棒了!!」
使用Builder进行实例化。
使用Builder类进行实例化的步骤如下:
1. 创建Builder类的实例
2. 使用每个Setter方法生成区域设置信息
3. 使用build方法创建Locale类的实例
Builder builder = new Locale.Builder();
.setLanguage("jp")
.setRegion("JP")
.setScript("Japan")
.build();
「脚本比构造函数更容易生成..但是脚本是什么呢?」
所以又来找ChatGPT老师了!
脚本是作为语言代码的一部分使用的符号,用于表示特定的语言。Locale.Builder类是一个用于创建Locale对象的构建器类,主要用于设置语言、国家、地区以及可选的变体和扩展,但没有直接设置脚本的方法。”ja”表示日语的语言代码,”Jpan”表示日语的脚本代码。然而,在许多情况下,脚本会自动识别,因此不需要使用setScript()方法。需要明确指定脚本代码的情况非常有限。通常情况下,只使用语言代码和国家代码就足够了。
简而言之,就是要指定语言,必须与setLanguage或setRegion一起使用,因为它通常会自动判断,所以不需要。
努力查找后才发现不必要,感觉很空虚啊。
使用工厂模式生成实例
据解释,根据我所知,这种方法似乎超出了Java Gold考试的范围。值得记住的是,使用Local类的forLanguageTag方法可以生成符合IETF语言标签的Local类实例,并返回其引用。
Locale locale = Locale.forLanguageTag("es-US-x-lvariant-POSIX");
System.out.println(locale);
应该不是考试范围,所以省略解释。
「因为一眼看不太明白它设置了什么,所以我个人也不太会使用它吧。」
今天就到这里吧!虽然学到了有关地方班级的基本知识,但是个人信息泄露之类的事情可不在资格解释中哈哈。