我希望将 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/