如果我使用该toString方法格式化double ,那么我将获得double的完整精度.例如(使用Scala语法):
java.text.MessageFormat.format ("{0}", Math.PI.toString)
Run Code Online (Sandbox Code Playgroud)
将导致包含以下内容的字符串:
3.141592653589793
Run Code Online (Sandbox Code Playgroud)
但是,此值未本地化.如果我将double值作为盒装传递Double,则为:
java.text.MessageFormat.format ("{0}", Math.PI.asInstanceOf[AnyRef])
Run Code Online (Sandbox Code Playgroud)
(AnyRef是Scala的类型,它等效于Object在爪哇),那么结果是具有截短的精度的本地化字符串:
3.142
Run Code Online (Sandbox Code Playgroud)
即使我在格式字符串中添加了更多提示,结果也是一样的:
java.text.MessageFormat.format ("{0,number}", Math.PI.asInstanceOf[AnyRef])
Run Code Online (Sandbox Code Playgroud)
通过指定自定义格式,我可以获得完整的精度:
java.text.MessageFormat.format ("{0,number,#.###############}", Math.PI.asInstanceOf[AnyRef])
Run Code Online (Sandbox Code Playgroud)
但这需要一些关于双倍大小和精度的知识.如果我打印任何双值(不仅仅是Pi),并且想要保留值的完整精度,那么这种方法意味着我必须动态地更改格式字符串 - 如果(在我的情况下)这不是很方便)格式字符串实际上是从资源包中获取的.
例如,考虑一个double值1.0e37.首先转换为字符串并使用"{0}"作为格式字符串,从而产生适当但未本地化的字符串值1.0E37.如果我把它作为Double带有格式字符串"{0,number}" 的盒子传递给我,那么我得到了荒谬的价值10,000,000,000,000,000,000,000,000,000,000,000,000.
简而言之,我似乎无法找到一个格式字符串来保留双精度的完整精度而不先将其转换为字符串 - 而这是我宁愿像瘟疫一样避免的东西.是否有一个数字格式字符串,可以输出double的完整精度作为本地化值?
更新:
只是为了澄清为什么我不想将双精度转换为字符串:
toString就我能说的而言,返回一个有效的Java双字面值.作为字符串,传递给结果时不会本地化MessageFormat.format.例如,假设我想输出值的本地化形式1234.567.toString会回来的"1234.567",MessageFormat.format会留下来的.精细.我有我的精确输出.然而,在德国,如果出现这种情况,这将更有意义"1.234,567".即使在美国/英国,如果出现这种情况,这看起来会更好"1,234.567".Integer,Boolean或任何其他非浮点基元类型传递给 …鉴于复数规则的不寻常性质,我们如何在 ICU MessageFormat 中表示俄语?
MessageFormat 支持复数形式{arg, plural, =1 {one} other {other}}和更复杂的形式{arg, plural, =0 {none} =1 {one} =2 {few} other {several}}。
然而,有时不经过一些计算,无法直接通过数字确定要使用的文本;我们该怎么做?俄语根据数字的最后一位数字有 3 个复数规则,但 11-14 除外。
我查看过的信息:
俄语复数化
http://www. Russianlessons.net/lessons/lesson11_main.php
消息格式规则
http://userguide.icu-project.org/formatparse/messages
各种语言的复数规则数量
https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals
在Struts2 Web应用程序的某个Java类中,我有这行代码:
try {
user = findByUsername(username);
} catch (NoResultException e) {
throw new UsernameNotFoundException("Username '" + username + "' not found!");
}
Run Code Online (Sandbox Code Playgroud)
我的老师要我将throw语句更改为:
static final String ex = "Username '{0}' not found!" ;
// ...
throw new UsernameNotFoundException(MessageFormat.format(ex, new Object[] {username}));
Run Code Online (Sandbox Code Playgroud)
但是我没有看到在这种情况下使用MessageFormat的意义.是什么让这比简单的字符串连接更好?正如MessageFormat的JDK API所说:
MessageFormat提供了一种以与语言无关的方式生成连接消息的方法.使用此选项可构建为最终用户显示的消息.
我怀疑最终用户会看到这个异常,因为它只会由应用程序日志显示,我有一个Web应用程序的自定义错误页面.
我应该更改代码行还是坚持使用当前代码?
据我了解,ReportEvent函数需要通过注册表关联的消息文本文件才能接收格式正确的消息。是否有任何常见的事件 ID 或任何简单的方法来报告没有关联消息文本文件的事件?
或者可能是,是否有我可以在我的应用程序中使用的特殊通用事件源?类似 RegisterEventSource(NULL, "Application") 的东西?
MessageFormat类很酷,因为我们可以插入参数并直接使用它进行格式化.这使我能够直接在消息包属性文件中轻松覆盖日期格式.
举个例子:
MessageFormat.format("Test inserting a date param here: {0,date,dd/MM/yyyy HH'h'mm} -> OK cool", new Date() );
Run Code Online (Sandbox Code Playgroud)
但是,如果我需要在不同的时区显示日期怎么办?
我知道我可以在将它们注入我的包中之前格式化所有日期,但是格式化每个显示的日期都很麻烦...
在工作中我们正在使用
org.springframework.context.support.ReloadableResourceBundleMessageSource
我可能会尝试覆盖它并创建我自己的MessageFormat,它会考虑使用好的时区.但它可能不适合我们的架构.
你还有其他选择吗?
我正在尝试评估哪一个使用,所以会感谢做出这个决定的其他人的任何反馈.似乎有两个大的翻译项目:
http://messageformat.meteor.com/
PROS
笔记:
PROS
利弊? - 只有JSON格式,没有yaml,编辑非常繁琐 - 没有用于管理字符串的webUI
还有一些其他项目,如https://github.com/Nemo64/meteor-translator, 但上面两个似乎是最彻底的.我错过了其他人吗?
选择合适的工具时人们会使用哪些其他标准?messageFormat与i18next的基础技术似乎是一个因素.
1)页面中有多种语言
我正在尝试做一个双语应用程序但是:
点击:"只通过网络发送当前客户端语言所需的翻译"
这是否意味着语言只能是A或B,而不是混合,基于会话自动切换?
即如何在页面中提供助手以进行多次翻译
EN: {{tr "string", 'en'}}
FR: {{tr "string", 'fr'}}
Run Code Online (Sandbox Code Playgroud)
2)提取动态数据
至少messageFormat项目将捕获/提取静态页面中的字符串,但如果我已经在复杂的mongo集合中有很多内容,有没有办法捕获它?
感谢包装创作者或该领域其他人的任何见解.
javascript internationalization messageformat meteor i18next
我知道之前曾问过类似的问题,但不完全相同...本地化复合字符串的首选方法是什么?使用java.util.Formatter和快捷方式,还是java.text.MessageFormat?我知道Java教程推荐后者。但是我不确定,尤其是java.text.MessageFormat似乎不支持非常不幸的新java.time api。
如何使用MessageFormat十六进制格式化数字?我有一个现有的MessageFormat模式,客户想要将它从十进制数更改为三位数的十六进制数。这可以使用MessageFormat吗?还是我必须切换到更强大的格式化程序?还是有什么别的技巧?
我开始学习iOS Stringsdict 文件,并在使用以下语法的项目中找到了一些现有代码:
<key>zero</key>
<string>You no message.</string>
Run Code Online (Sandbox Code Playgroud)
根据 CLDR,zero在英语中是无效的复数形式,我们希望使用明确的复数规则(=0使用 ICU MessageFormat 时)
我试图找到如何在 iOS Stringsdict 文件中使用显式复数规则,但找不到任何方法来实现这一点。有人可以确认这是否受支持吗?
解决方案示例(我无法测试它们,但也许有人可以?)
<key>0</key>
<string>You no message.</string>
Run Code Online (Sandbox Code Playgroud)
或者
<key>=0</key>
<string>You no message.</string>
Run Code Online (Sandbox Code Playgroud)
关于 ICU MessageFormat 的 CLDR 实现的显式复数规则部分的额外参考:
https://formatjs.io/guides/message-syntax/#plural-format
=value 这用于匹配特定值,而不管当前语言环境的多个类别。
更新到 Flutter 3.7.0 后,我在构建应用程序时收到此错误消息:
[app_en.arb:scanCode_fieldNotMatched] ICU 语法错误:预期为“标识符”,但发现为“0”。要匹配的字段是“{0}”
.arb 本地化文件中变量的写入方式似乎发生了变化。
messageformat ×10
java ×5
localization ×2
cldr ×1
dart ×1
date-format ×1
double ×1
event-log ×1
flutter ×1
formatter ×1
hex ×1
i18next ×1
ios ×1
javascript ×1
meteor ×1
scala ×1
spring ×1
string ×1
winapi ×1
windows ×1