我希望将ICU4J库用于i18n。有人能建议如何使用LocaleData.MeasurementSystem来测量i18n吗?一些样本代码将是值得赞赏的。
感谢您的阅读。曾傑瑞
发布于 2014-06-30 12:27:25
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);产出:
“大桶”
如您所见,它使用特定于地区的标点符号。我不太明白它可能有用的地方,因为引号应该作为文本的一部分来摘录,翻译的工作就是把它们做好,但是.
这个类中还有其他直接的东西,如getLocalePattern()或getLocaleSeparator(),但是ICU使用它们来显示区域列表,即:
德国(德国),波兰(波兰)
我不太明白如何在您的应用程序中使用它们。
测量
您可能想知道在给定的国家使用什么测量系统。这就是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毫米。
也许您可以使用MeasurementSystem来知道是否可以以英寸为单位显示大小(1英寸= 25.4毫米),并在需要时重新计算大小。
了解纸张大小的唯一方法是A4或字母,例如简单地将其宽度和高度与预定义的枚举类进行比较。太棒了。
样本集
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、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本地化器是如何看待它的,因为我无法在调查工具中检查这一点(顺便说一句,这很可怕)。
不管怎么说,我怀疑你能不能用这些套。
https://stackoverflow.com/questions/24483163
复制相似问题