java - ICU4J LocaleData.MeasurementSystem

标签 java internationalization

我希望将 ICU4J 库用于 i18n。 任何人都可以建议如何使用 LocaleData.MeasurementSystem 进行 i18n 测量。 一些示例代码将不胜感激。

感谢您的阅读。 杰瑞

最佳答案

ICU 是一个不错的选择,但它的 API 很糟糕。它基本上迫使您使用包装器。
LocaleData 类不是很有用,但您可以学到一些东西。

引用和区域设置模式

如果您想知道如何引用某个单词,LocaleData 可以为您提供以下信息:

ULocale germanLocale = ULocale.forLanguageTag("de-DE");
LocaleData localeData = LocaleData.getInstance(germanLocale);
String openningQuotation = localeData
        .getDelimiter(LocaleData.QUOTATION_START);
String closingQuotation = localeData
        .getDelimiter(LocaleData.QUOTATION_END);
String quoted = MessageFormat.format("{0}{2}{1}", openningQuotation,
        closingQuotation, "Das buch");
System.out.println(quoted);

输出:

„Das buch“

如您所见,它使用特定于区域设置的标点符号。我不太明白它在哪里有用,因为引文应该作为文本的一部分提取,翻译人员的工作就是让它们正确,但是......

此类中还直接有其他内容,例如 getLocalePattern()getLocaleSeparator(),但 ICU 使用这些来显示语言环境列表,即:

Deutsch (Deutschland),Polnisch (Polen)

我真的不明白如何在应用程序中使用它们。

测量

您可能想知道给定国家/地区使用什么测量系统。这就是 LocaleData.MeasurementSystem 发挥作用的地方。同样,该类不会透露太多信息,但至少您可以区分使用 SI 系统的国家和仍然使用英里等单位的国家:

private void showDistance(ULocale locale) {
    int distance = 160;
    MeasurementSystem system = LocaleData.getMeasurementSystem(locale);
    String unit;
    if (system.equals(LocaleData.MeasurementSystem.SI)) {
        unit = "km";
    } else if (system.equals(LocaleData.MeasurementSystem.US)) {
        unit = "mi";
        distance = (int) (distance / 1.6);
    } else {
        throw new RuntimeException("Unknown measurement system.");
    }
    String distanceMessage = MessageFormat.format(
            "The distance between cities is {0} {1}.", distance, unit);
    System.out.println(distanceMessage);
}

针对不同的区域设置(德国和美国)调用它会产生:

The distance between cities is 160 km.
The distance between cities is 100 mi.

唯一的问题是,我相信他们在英国仍然使用英里,同时使用秒、公斤和其他单位。倒霉。或者也许我错了。

纸张尺寸

如果您知道以毫米为单位的纸张尺寸(ha, ha),则可以使用LocaleData.PaperSize:

private void showPaperSize(ULocale locale) {
    PaperSize paperSize = LocaleData.getPaperSize(locale);
    String msg = MessageFormat.format("The paper size is: {0}x{1} mm",
            paperSize.getWidth(), paperSize.getHeight());
    System.out.println(msg);
}

对于德国和美国,结果是:

The paper size is: 210x297 mm
The paper size is: 216x279 mm

也许您可以使用 MeasurementSystem 来了解是否可以以英寸为单位显示尺寸(1 英寸 = 25.4 毫米),并在需要时重新计算尺寸。
知道纸张尺寸是 A4 还是 Letter 的唯一方法是简单地将其宽度和高度与预定义的枚举类进行比较。太棒了。

示例集

LocaleData 可以给您的最后一件事是示例字符列表。我不确定它有何用处,但它是:

private void showExemplarCharacterSets(ULocale locale) {
    printSet("Standard:",
            LocaleData.getExemplarSet(locale, LocaleData.ES_STANDARD));
    printSet("Index chars:",
            LocaleData.getExemplarSet(locale, LocaleData.ES_INDEX));
    printSet("Auxiliary:",
            LocaleData.getExemplarSet(locale, LocaleData.ES_AUXILIARY));
    printSet("Punctuation:",
            LocaleData.getExemplarSet(locale, LocaleData.ES_PUNCTUATION));
}

private void printSet(String name, UnicodeSet set) {
    System.out.print(name);
    for (String s : set) {
        System.out.print(" ");
        System.out.print(s);
    }
    System.out.println();
}

调用showExemplarCharacterSets(germanLocale)的结果是:

Standard: a b c d e f g h i j k l m n o p q r s t u v w x y z ß ä ö ü
Index chars: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z Ä Ö Ü ß ä ö ü ſ ẞ K ss
Auxiliary: a b c d e f g h i j k l m n o p q r s t u v w x y z ß ä ö ü
Punctuation: a b c d e f g h i j k l m n o p q r s t u v w x y z ß ä ö ü

标准集是用来用这种语言创建单词的东西。它不一定适用于表意语言,但在这种情况下您可以看到标准的德语字母。
索引集应该显示索引中使用的字符 - 对于字母语言,它将是单词中的第一个字母。
辅助应该给你给定字母表之外的字母,标点符号可能应该显示一些标点符号......至少我是这么理解的。我不知道怎么办CLDR本地化人员看到了它,因为我无法在调查工具中检查这一点(顺便说一句,这很糟糕)。
不管怎样,我怀疑你是否能使用这些套装。

关于java - ICU4J LocaleData.MeasurementSystem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24483163/

相关文章:

java - while循环Int return方法内部完全死了

java - 顶级 Activity 必须位于自定义包之外吗?

unicode - 理解术语——字符编码、字体、字形

internationalization - SEO 友好的国际化 Polymer.dart

php - 如何使 PoEdit 正确解析自定义 "ngettext"实现?

c# - 如何将元数据添加到 resx 文件

java - GWT 找不到我的类的源代码

java - 构建时错误 : content is not allowed in prolog

java - 两个项目中的一个类和序列化java

database - PostgreSQL:可以用该语言定义一个 session 变量并在 View 中使用它吗?