ICU4J LocaleData.MeasurementSystem

时间:2014-06-30 04:58:38

标签: java internationalization

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

感谢阅读。 杰里

1 个答案:

答案 0 :(得分:0)

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);
}

为不同的语言环境(德语和美国)调用它会产生:

  

城市之间的距离是160公里   城市之间的距离是100英里。

唯一的问题是,我相信他们仍然在英国使用里程,同时使用秒,公斤和其他工作人员。倒霉。或许我错了。

纸张尺寸

如果您知道纸张尺寸以毫米(公顷,公顷)为单位,您可以使用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);
}

德国和美国的结果是:

  

纸张尺寸为:210x297毫米
  纸张尺寸为: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)的结果是:

  

标准:a b c d e f g h i j k l m n o p q r s t u v w x yzßäöü   索引字符: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 yzÄÖÜÜ€äsẞKss
  辅助:a b c d e f g h i j k l m n o p q r s t u v w x yzßäöü   标点符号:a b c d e f g h i j k l m n o p q r s t u v w x yzßäöüü

标准集是用于在该语言中创建单词的东西。对于表意语言来说并不一定如此,但在这种情况下,您可以看到标准的德语字母 索引集用于显示在索引中使用的字符 - 对于字母语言,它将是单词中的第一个字母 辅助应该给你给定字母表外部的字母,标点符号应该显示一些标点符号......至少这是我理解它的方式。我不确定CLDR本地人如何看待它,因为我无法在调查工具中检查这一点(顺便说一下,这很糟糕)。
无论如何,我怀疑你可以使用这些套装。