如何创建具有特定脚本代码的区域设置?
How can I create a Locale with a specific script code?
我正在尝试将此字符串 az_AZ_#Latn
、found here 转换为语言环境,但我无法解析 #Latn
部分。
如果我这样做 new Locale("az_AZ_#Latn")
我会丢失 #Latn
部分(脚本代码)。
我也尝试过使用来自 commons-lang 的 LocaleUtils
,但我收到一条错误消息,指出它是一种无效格式。
#Latn 指的是脚本,在这种情况下是拉丁文。
来自 java 文档:
script
ISO 15924 alpha-4 script code. You can find a full list of valid script codes in the IANA Language Subtag Registry (search for "Type: script"). The script field is case insensitive, but Locale always canonicalizes to title case (the first letter is upper case and the rest of the letters are lower case).
Well-formed script values have the form [a-zA-Z]{4}
Example: "Latn" (Latin), "Cyrl" (Cyrillic)
如果您想使用脚本创建语言环境,您可以使用它的构建器。
例如:
Locale locale = new Locale.Builder()
.setLanguage("az")
.setRegion("AZ")
.setScript("Latn")
.build();
如docs中所写:
It is not possible to set a script code on a Locale object in a
release earlier than JDK 7.
但是你可以使用 Locale builder
来制作它:
Locale locale = new Locale.Builder().setLanguage("az").setRegion("AZ").setScript("Latn").build();
您可以通过调用locale.getScript()
获取脚本
编辑:
这是我将字符串转换为语言环境的方法(不适用于扩展):
public static Locale stringToLocale(String locale){
if(locale == null || locale.isEmpty()) return null;
String[] parts = locale.split("_");
if(parts.length == 1) return new Locale(parts[0]);
if(parts.length == 2) return new Locale(parts[0],parts[1]);
if(parts.length == 3)
if(parts[2].charAt(0) != '#') return new Locale(parts[0],parts[1],parts[2]);
else return new Locale.Builder().setLanguage(parts[0]).setRegion(parts[1]).setScript(parts[2].substring(1)).build();
if(parts.length == 4) return new Locale.Builder().setLanguage(parts[0]).setRegion(parts[1]).setVariant(parts[2]).setScript(parts[3].charAt(0)=='#'? parts[3].substring(1):null).build();
return null;
}
//works for the toString output expect for extensions. test: for(Locale l: Locale.getAvailableLocales()) System.out.println(l.equals(stringToLocale(l.toString())));
// output : true true true...
用法:
Locale l = stringToLocale("az_AZ_#Latn");
Locale.Builder
能够处理语言环境的脚本信息。 Builder
class 的文档还包括这个示例代码:
Locale aLocale = new Locale.Builder().setLanguage("sr")
.setScript("Latn")
.setRegion("RS")
.build();
通过使用生成器,您必须自己拆分字符串并删除任何不受支持的字符,例如 #
.
使用 3-arg 构造函数 java.util.Locale.Locale(String, String, String)
是不正确的,因为您可能不打算使用 Latn
而是脚本来指定变体。
如果格式一致(您的输入看起来总是一样),您可以按 #
和 _
拆分并得到部分。
参见以下示例:
var input = "az_AZ#Latn"
var lns = input.split("#")
var l = lns[0].split("_")
var locale = new Locale.Builder()
.setLanguage(l[0])
.setRegion(l[1])
.setScript(lns[1])
.build()
locale.getLanguage() // ==> "az"
locale.getCountry() // ==> "AZ"
locale.getScript() //==> "Latn"
我正在尝试将此字符串 az_AZ_#Latn
、found here 转换为语言环境,但我无法解析 #Latn
部分。
如果我这样做 new Locale("az_AZ_#Latn")
我会丢失 #Latn
部分(脚本代码)。
我也尝试过使用来自 commons-lang 的 LocaleUtils
,但我收到一条错误消息,指出它是一种无效格式。
#Latn 指的是脚本,在这种情况下是拉丁文。
来自 java 文档:
script ISO 15924 alpha-4 script code. You can find a full list of valid script codes in the IANA Language Subtag Registry (search for "Type: script"). The script field is case insensitive, but Locale always canonicalizes to title case (the first letter is upper case and the rest of the letters are lower case). Well-formed script values have the form [a-zA-Z]{4} Example: "Latn" (Latin), "Cyrl" (Cyrillic)
如果您想使用脚本创建语言环境,您可以使用它的构建器。
例如:
Locale locale = new Locale.Builder()
.setLanguage("az")
.setRegion("AZ")
.setScript("Latn")
.build();
如docs中所写:
It is not possible to set a script code on a Locale object in a release earlier than JDK 7.
但是你可以使用 Locale builder
来制作它:
Locale locale = new Locale.Builder().setLanguage("az").setRegion("AZ").setScript("Latn").build();
您可以通过调用locale.getScript()
编辑:
这是我将字符串转换为语言环境的方法(不适用于扩展):
public static Locale stringToLocale(String locale){
if(locale == null || locale.isEmpty()) return null;
String[] parts = locale.split("_");
if(parts.length == 1) return new Locale(parts[0]);
if(parts.length == 2) return new Locale(parts[0],parts[1]);
if(parts.length == 3)
if(parts[2].charAt(0) != '#') return new Locale(parts[0],parts[1],parts[2]);
else return new Locale.Builder().setLanguage(parts[0]).setRegion(parts[1]).setScript(parts[2].substring(1)).build();
if(parts.length == 4) return new Locale.Builder().setLanguage(parts[0]).setRegion(parts[1]).setVariant(parts[2]).setScript(parts[3].charAt(0)=='#'? parts[3].substring(1):null).build();
return null;
}
//works for the toString output expect for extensions. test: for(Locale l: Locale.getAvailableLocales()) System.out.println(l.equals(stringToLocale(l.toString())));
// output : true true true...
用法:
Locale l = stringToLocale("az_AZ_#Latn");
Locale.Builder
能够处理语言环境的脚本信息。 Builder
class 的文档还包括这个示例代码:
Locale aLocale = new Locale.Builder().setLanguage("sr")
.setScript("Latn")
.setRegion("RS")
.build();
通过使用生成器,您必须自己拆分字符串并删除任何不受支持的字符,例如 #
.
使用 3-arg 构造函数 java.util.Locale.Locale(String, String, String)
是不正确的,因为您可能不打算使用 Latn
而是脚本来指定变体。
如果格式一致(您的输入看起来总是一样),您可以按 #
和 _
拆分并得到部分。
参见以下示例:
var input = "az_AZ#Latn"
var lns = input.split("#")
var l = lns[0].split("_")
var locale = new Locale.Builder()
.setLanguage(l[0])
.setRegion(l[1])
.setScript(lns[1])
.build()
locale.getLanguage() // ==> "az"
locale.getCountry() // ==> "AZ"
locale.getScript() //==> "Latn"