首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ICU4J LocaleData.MeasurementSystem

ICU4J LocaleData.MeasurementSystem
EN

Stack Overflow用户
提问于 2014-06-30 04:58:37
回答 1查看 461关注 0票数 0

我希望将ICU4J库用于i18n。有人能建议如何使用LocaleData.MeasurementSystem来测量i18n吗?一些样本代码将是值得赞赏的。

感谢您的阅读。曾傑瑞

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-30 12:27:25

ICU是一个不错的选择,但它的API是可怕的。它基本上强迫你使用包装纸。

LocaleData类并不那么有用,但是您可以学到很少的东西。

引文和地区模式

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

代码语言:javascript
复制
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);

产出:

“大桶”

如您所见,它使用特定于地区的标点符号。我不太明白它可能有用的地方,因为引号应该作为文本的一部分来摘录,翻译的工作就是把它们做好,但是.

这个类中还有其他直接的东西,如getLocalePattern()getLocaleSeparator(),但是ICU使用它们来显示区域列表,即:

德国(德国),波兰(波兰)

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

测量

您可能想知道在给定的国家使用什么测量系统。这就是LocaleData.MeasurementSystem进来的地方。同样,这门课并没有透露太多的信息,但至少你可以把使用SI系统的国家和仍然使用英里这样的东西的国家区分开来:

代码语言:javascript
复制
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

代码语言:javascript
复制
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毫米。

也许您可以使用MeasurementSystem来知道是否可以以英寸为单位显示大小(1英寸= 25.4毫米),并在需要时重新计算大小。

了解纸张大小的唯一方法是A4或字母,例如简单地将其宽度和高度与预定义的枚举类进行比较。太棒了。

样本集

LocaleData给您的最后一件事是示例字符列表。我不知道这有什么用,但在这里:

代码语言:javascript
复制
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、g、h、i、j、l、m、n、p、q、r、t、w、x、y、zü 索引字符:a B、C、D、E、F、G、H、I、K、L、M、N、O、Q、R、S、T、U、V、W、X、Y、Z、a、b、c、d、e、f、h、j、l、m、n、p、p、q、r、t、u、w、x、y、z、ſẞKss 辅助性:a b、c、d、f、g、h、i、j、l、m、n、p、q、r、t、w、x、y、zü 标点符号:a b、c、d、f、g、h、i、j、l、n、p、q、r、t、w、x、y、zü

标准集是用来在这种语言中创建单词的东西。表意语言不一定成立,但在这种情况下,你可以看到标准的德语字母。

索引集应该显示在索引中使用的字符--对于字母语言来说,它将是单词中的第一个字母。

助词应该给你的字母是外部给定的字母表,标点符号应该显示一些标点符号。至少我就是这么理解的。我不知道CLDR本地化器是如何看待它的,因为我无法在调查工具中检查这一点(顺便说一句,这很可怕)。

不管怎么说,我怀疑你能不能用这些套。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24483163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档