如何创建具有特定脚本代码的区域设置?

How can I create a Locale with a specific script code?

我正在尝试将此字符串 az_AZ_#Latnfound 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"