锁定老帖子 主题:国际化消息和日志
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||
---|---|---|---|
作者 | 正文 | ||
发表时间:2007-04-02
I18N Messages and Logging (国际化消息和日志)作者 John Mazzitelli
有人问“国际化”是什么意思? 国际化远不止于将用户界面消息翻译成不同的语言。 它还涉及到处理不同的字符编码、日期/时间/货币的显示形式、以及跨多区域时存在的一些其他差异。 介绍
|
第 1, 2 页 |
国际化的消息和日志
第 1, 2 页
本地化的异常
i18nlog
提供了两个基本的异常类(分别用于已查看和未查看的异常-- LocalizedException
和 LocalizedRuntimeException
),可以这两个类创建自己的本地化异常子类。 这些类都具有构造函数,其函数签名与 Msg
类非常相似。 在使用构造函数时,通过调用资源绑定包的关键字和占位符的变量参数列表的方法来指定异常消息,同时还可以选择绑定包的名称和语言环境。 这样一来,异常消息就可以使用本地化的各种语言,其原理就是利用了 Msg
可以检索本地化的消息。
<!---->
创建国际化消息的日志
i18nlog
提供了一种方法,可以通过该方法记录国际化的日志信息。 日志系统的主类是 mazz.i18n.Logger
。 它提供了 trace
、debug
、info
、warn
、error
和 fatal
方法等一些典型的设置。 需要指出的是,与传递一个消息本身组成的字符串不同,您为占位符传递的是资源绑定包的关键字字符串和参数列表。 它使用具有保护作用的 mazz.i18n.Msg
类来获取实际的本地化消息。
通过使用工厂类 mazz.i18n.LoggerFactory
来获得 Logger
对象,与 log4j
等获得对象的方式基本相同。 而不同的是记录日志消息的方法,该方法与通过 mazz.i18n.Msg
对象获取消息非常类似:
java 代码- public static final mazz.i18n.Logger LOG =
- mazz.i18n.LoggerFactory.getLogger(MyClass.class);
- ...
- LOG.debug(Messages.MSG_VALUE, value);
- ...
- try {
- ...
- }
- catch (Exception e) {
- LOG.warn(e, Messages.MSG_ERR);
- }
如果没有启用日志级别,则不会查找绑定包,也不会执行任何字符串连接。这一条件有效地加快了日志调用的速度。 如果日志消息与特定的表达式相关联,则需要将表达式的第一个参数传递给日志方法。 如果启用了栈倾卸设置,这将允许栈跟踪倾卸消息(请往下看)。
i18nlog
的日志框架中还添加了许多其他的功能,这些功能并非潜在的、第三方的日志框架所能媲美。 首先要介绍的功能就是,可以告诉 Logger
是否倾卸异常的栈跟踪。 您可能需要查看一个特定运行任务的所有异常的栈跟踪,也可能不想看。 请注意,对于在 FATAL
日志级别上的异常,不能禁用此功能,使用该方法记录的致命异常必需允许倾卸栈跟踪。 对于其他的日志级别,日志程序只有在系统属性 i18nlog.dump-stack-traces
设置为 true
(或者在代码中调用 Logger.setDumpStackTraces(true)
)的时候才会倾泄栈跟踪。
i18nlog
日志框架附加的第二项功能是,在记录与一个消息关联的资源绑定包关键字的同时,记录消息本身。 资源绑定包关键字对于所有语言环境都是相同的,也就是说,无论消息是用何种语言写成的,关键字是不变的。 可以把这些关键字想象成“消息的 ID”或“错误的代码”。 这在生成涉及到这些代码的帮助文档时非常有用,用户将可以参考文档中的额外帮助文本,以得知到底要传递什么消息(关于如何生成这种文档,请查看下文)。 在默认情况下,此功能处于启用状态,要禁用此功能,只需将系统属性 i18nlog.dump-keys
设置为 false
或者在代码中调用 Logger.setDumpLogKeys(false)
。
提供消息 ID、避免在已禁用日志级别上拼接字符串,这些 i18nlog
提供的日志机制也许已经足够了。 也许有人会争论说,将(除用户界面消息以外的)日志消息国际化是一种负担而且也没有必要。 我有时也感到很难说服这种观点。 如果项目没有这种需求,您当然不必使用国际化日志。 即使不使用 i18nlog
提供的日志功能,还可以使用它提供的其他功能嘛。
但是,我还是可以举出一些具体的例子来证明使用国际化消息的好处。 请注意,i18nlog
允许定义一个不同的语言环境供日志程序使用(日志语言环境),该语言环境区别于 Msg
实例使用的语言环境。 这就可以帮助使用我的开发团队的语言来记录日志消息,而我的用户界面使用用户可以阅读的语言(可能与开发团队使用的语言不同)。 例如,我的用户说德语,而软件是由说法语的法国团队开发的。 在这种情况下,德国用户碰到一个问题时,就可以正常地给法国开发团队发送日志,软件可以默认地将语言环境设置为 Locale.FRENCH
。 另一方面,如果德国用户希望自行调试问题,法语的日志消息根本不会有任何帮助。 在这种情况下,德国用户简单地通过设置系统属性,将日志消息记录为德语。 关于如何切换日志语言环境的信息,请参考 mazz.i18n.LoggerLocale
Javadoc。
自动生成资源绑定包
i18nlog
提供了一个 Ant 任务,用于自动生成资源绑定包属性文件,以避免开发者担负手动向属性文件中添加消息、清理过时消息的任务。
该 Ant 任务将扫描类以查找 @I18N
标注,并根据这些标注为您创建资源绑定包。 这意味着,无论添加多少 @I18NMessage
标注字段,它们都将被加入到资源绑定包中。 如果您删除了一个国际化消息常量,则该消息也将从 Ant 任务生成的资源绑定包结果中删除。 要运行该 Ant 任务,需要在 Ant 脚本中添加以下类似代码:
xml 代码- <taskdef name="i18n"
- classpathref="i18nlog-jar.classpath"
- classname="mazz.i18n.ant.I18NAntTask" />
-
- <i18n outputdir="${classes.dir}" verify="true" verbose="true">
- <classpath refid="my.classpath" />
- <classfileset dir="${classes.dir}"/>
- i18n>
必需让 Ant 任务知道含有国际化标注类及其依赖关系的类的类路径 <classpath></classpath>
,还必须给出类文件集 <classfileset></classfileset>
,其中包含文件集的文件列表供扫描国际化标注之用。 建议您在第一次运行 Ant 任务的时候采用“冗长”模式,以便知道 Ant 任务的执行内容。 一旦得到了想要的效果,再将“冗长”模式关闭。 执行此任务之后,资源绑定包属性文件将出现在指定的输出目录中。
生成帮助文档
使用此 Ant 任务的另一个可选功能是生成帮助文档,该文档是由所有对资源绑定包关键字名称及其消息值的引用组成的,另外还包含了对这些消息的描述。 这是一个可在 @I18NMessage
标注中指定的可选属性,help
属性。 属性值可以是深入描述消息的任何字符串。 可以将文档想象成在特定情况下将传递的具体消息。 自动生成的帮助文档可以提供消息关键字、消息本身以及消息描述之间的交叉引用:
java 代码- @I18NMessage( value="The value is {0}",
- help="This will show you the value of your"
- +" current counter. If this value is over"
- +" 1000, you should reset it.")
- String MSG_VALUE = "value";
-
- @I18NMessage( value="Memory has {0} free bytes left",
- help="The VM is very low on memory. Increase -Xmx"
- String MSG_LOW_MEM = "low-memory";
大多数情况下,您可以将其作为“消息的 ID”或者“错误的代码”列表使用,可以将其中的资源绑定包关键字当成一个“消息 ID”或者“错误的代码”。 要生成帮助文档,需要在 <i18n></i18n>
任务中使用 <helpdoc></helpdoc>
内部标记:
xml 代码- <i18n outputdir="${classes.dir}">
- <classpath refid="my.classpath" />
- <classfileset dir="${classes.dir}"/>
- <helpdoc outputdir="${doc.dir}/help"/>
- i18n>
对于每个生成的资源绑定包,都可以在 <helpdoc>
中指定的目录下找到一个相应的帮助文档。 文档是根据用于描述文档样式的模板生成的。 默认情况下,模板是一个简单的 HTML 页,使用 <table>
标记消息代码,而输出就是帮助文档。 在 <helpdoc>
标记中还可以指定一些其他的属性来自定义一个模板,以满足自行定制帮助文档外观的需求。 有关更多信息,请查阅 mazz.i18n.ant.Helpdoc
类的 Javadoc。
在帮助文档的生成结束之后,您就可以得到一个(或一些)包含消息关键字代码、消息内容及任何 "help" 属性定义内容的文档了。
本地化
我们已经讨论了许多关于如何通过获取翻译的消息和本地化的消息国际化软件的内容。 嵌入国际化功能之后,剩下的工作就是手动处理那些需要被本地化的资源绑定属性文件(由 <i18n>
Ant 任务生成或者自行手动编写)了。 必须确保将所有资源绑定包的消息翻译成需要支持的语言,而且这些消息包含的数据也进行相应的本地化。 通过定义占位符属性(例如,{0,date}
将使用目标语言环境的格式和语言输出日期字符串)可以完成许多本地化方面的工作。 不言而喻的是,必须找一家优秀的翻译和本地化公司。
小结
这篇文章介绍了如何通过一个新的开源项目 i18nlog
在应用程序中溶入国际化功能。 使用该开源项目提供的工具和 API 可以自动管理资源绑定包属性文件(.properties),检索和管理这些绑定包中的本地化消息,甚至还可以生成供最终用户使用的帮助文档。
资源
i18nlog
用户指南: i18nlog.sourceforge.net/doc/users-guide.htmli18nlog
API: i18nlog.sourceforge.net/api- 本地化消息时使用的占位符语法:java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html
John Mazzitelli 是一位 JBoss 开发者,Red Hat 的带头人,目前正致力于 “Boss Operations Network 管理平台”的实现。