I18N-国际化消息和日志

作者&投稿:许利 (若有异议请与网页底部的电邮联系)
~


摘要:     对于许多软件开发者来说 一提到国际化(亦称为 i n)支持就会感到害怕 要使编写的代码能够面向外国使用者 确实需要费一翻思量 因为在现有软件的代码中添加国际化支持可不是一件轻而易举的事 对于许多软件开发者来说 一提到国际化(亦称为 i n)支持就会感到害怕 要使编写的代码能够面向外国使用者 确实需要费一翻思量 因为在现有软件的代码中添加国际化支持可不是一件轻而易举的事 如果您感觉到软件需要支持不同语言和语言环境 哪怕这种可能性很小 从一开始就做国际化项目的准备 比起项目开始后再试图添加国际化支持也要明智得多     有人问 国际化 是什么意思? 国际化远不止于将用户界面消息翻译成不同的语言 它还涉及到处理不同的字符编码 日期/时间/货币的显示形式 以及跨多区域时存在的一些其他差异 介绍 i nlog     本文的目的并不在于讨论那些关于国际化的琐碎的方面 而是通过研究一个称为 I N Messages and Logging (简称 i nlog) 的开源项目 来介绍引入国际化功能时需要执行的一些必要的任务i nlog 允许您在 Java 应用程序内集成国际化的消息 这是通过向以下内容提供 API 来完成的 +标注 Java 类以识别国际化消息 +从所有支持的语言环境资源包中获取国际化消息 +创建特定于语言环境的异常 并在其中使用国际化的消息 +使用任何日志框架创建国际化消息日志 +自动生成特定于语言环境的资源包 +自动生成帮助及参考文档   定义国际化消息     国际化软件时一项最为乏味的工作莫过于维护资源绑定包了 资源绑定包是包含 name=value 这种信息对的属性文件 ( properties) 其中 name 是资源绑定包的关键字字符串 (key string) 而 value 是翻译过的消息字符串本身 习惯上为每种语言创建一个资源绑定包 在每个绑定包中关键字的设置是唯一的 而各个关键字相关的值就要翻译成各种语言了 资源绑定文件的名称应该指明它是为哪种语言创建的 例如 mybundle_en properties 文件中的消息是用英语写的 而 mybundle_de properties 包含德语消息     i nlog 提供了一些用于定义资源绑定消息及其关键字字符串的标注 用于将资源注入到 i nlog 的自定义 Ant 任务中 您可以自动生成资源绑定包 而不必为确保属性文件与访问属性文件的 Java 代码之间的一致性作过多的工作     @I NMessage 标注被放在常量上 这些常量就是资源绑定包的关键字字符串使用的常量 使用这些常量可以迫使执行编译时检查 例如代码中引入的拼写错误(如常量名称的拼写错误)和使用过时消息或已删除消息 这些错误在编译时就可以被探测到 以下是使用此标注的示例 java 代码

           @I NMessage( Hello { } You last visited on { date} )           public static final String MSG_WELE = example wele msg ;  

    上面的示例定义了一条国际化消息 常量的值定义了资源绑定包的关键字字符串(key string) 标注的值是一条实际翻译好的消息 您可以将这些标注过的常量放到应用程序的任何类或接口中 可以将它们放在单独的类或接口中(将所有消息定义集中到一个地点) 也可以放在使用到它们的类中     @I NResourceBundle 标注用于定义存放消息的资源绑定包文件( properties 文件) 它可以标注整个类或接口 也可以标注特定的部分 如果您标注了一个类或接口 则该类或接口中的所有 @I NMessage 标注都将被存储在该标注定义的资源绑定包中(默认情况下) 如果只将标注放在特定的常量上 那么它就只是那个常量的绑定包 以下是使用此标注的示例 java 代码

           @I NResourceBundle( baseName = messages                                 defaultLocale = en )  

    以上代码的意思是 所有被 @I NMessage 标注的相关消息都将放置在名为 messages_en properties 绑定包文件中 下面是一个更复杂的示例(包含一系列国际化消息的接口) java 代码

           @I NResourceBundle( baseName = messages                                   defaultLocale = en )             public interface Messages {                @I NMessage( Hello { } You last visited on { date} )                String MSG_WELE = wele msg ;                           @I NMessage( An error occurred please try again )                String MSG_ERR = error occurred ;                           @I NMessage( The value is { } )                String MSG_VALUE = value ;             }  

检索国际化消息     定义了国际化常量后 就可以使用 i nlog 的核心类提供的 API mazz i n Msg 该 API 用于装载存放于资源绑定属性文件中的消息 它还用于将值作为变量参数进行传递 从而替换消息中的占位符(例如 { } { date}) 另外 此 API 将您从直接使用 JDK 类进行编码的工作中解放出来 也许您需要阅读一下 Javadoc 的 java text MessageFormat 部分 以获得对 i nlog 工作原理的初步认识 尤其是它如何使用本地化的数据替换占位符 下面是 Msg 类的使用实例 java 代码

           // 使用静态工厂方法创建一个 Msg 对象           // 假设默认绑定包的名字是 messages            System out println( Msg createMsg( Messages MSG_WELE                                               name                                               date ) );  

和java 代码

           // 使用构造函数创建一个 Msg 对象           Msg msg = new Msg( new Msg BundleBaseName( messages ) );           try {              String hello = msg getMsg(Messages MSG_WELE name date );              do something            }           catch (Exception e) {              throw new RuntimeException( msg getMsg( Messages MSG_ERR ) );           }  

  name 和 date 参数是传递一个任意参数列表的示例 每个对象代表各个位置上要被替换掉的占位符({ } 和 { date} 分别基于前面给出的 Messages MSG_WELE 中的定义)     Msg 对象会根据 绑定包的名称 及其当前的语言环境设置获知使用哪种语言环境的资源绑定包 绑定包的名称 是绑定包文件的名称减去语言环境符号和扩展名(在上面的示例中 绑定包的名称是 messages) 您可以通过传递到 Msg 的构造函数或者特定的静态工厂方法的方式 来定义 Msg 对象使用的 绑定包的名称 如果不进行明确地指定 将使用默认的 messages 绑定包的名称 在 Msg 对象的生命周期内将一直存在 可以通过调用 Msg 对象的 setLocale() 来切换语言环境(默认语言环境是 JVM 使用的语言环境) 如果您使用了 Msg 对象并且要求根据(被分配了 Msg 对象的)使用者的需要来切换语言环境 这将是非常有用的

本地化的异常     i nlog 提供了两个基本的异常类(分别用于已查看和未查看的异常 LocalizedException 和 LocalizedRuntimeException) 可以这两个类创建自己的本地化异常子类 这些类都具有构造函数 其函数签名与 Msg 类非常相似 在使用构造函数时 通过调用资源绑定包的关键字和占位符的变量参数列表的方法来指定异常消息 同时还可以选择绑定包的名称和语言环境 这样一来 异常消息就可以使用本地化的各种语言 其原理就是利用了 Msg 可以检索本地化的消息 创建国际化消息的日志     i nlog 提供了一种方法 可以通过该方法记录国际化的日志信息 日志系统的主类是 mazz i n Logger 它提供了 trace debug info warn error 和 fatal 方法等一些典型的设置 需要指出的是 与传递一个消息本身组成的字符串不同 您为占位符传递的是资源绑定包的关键字字符串和参数列表 它使用具有保护作用的 mazz i n Msg 类来获取实际的本地化消息     通过使用工厂类 mazz i n LoggerFactory 来获得 Logger 对象 与 log j 等获得对象的方式基本相同 而不同的是记录日志消息的方法 该方法与通过 mazz i n Msg 对象获取消息非常类似 java 代码

           public static final mazz i n Logger LOG =                          mazz i n LoggerFactory getLogger(MyClass class);                       LOG debug(Messages MSG_VALUE value);                       try {                         }           catch (Exception e) {              LOG warn(e Messages MSG_ERR);           }  

    如果没有启用日志级别 则不会查找绑定包 也不会执行任何字符串连接 这一条件有效地加快了日志调用的速度 如果日志消息与特定的表达式相关联 则需要将表达式的第一个参数传递给日志方法 如果启用了栈倾卸设置 这将允许栈跟踪倾卸消息(请往下看)     i nlog 的日志框架中还添加了许多其他的功能 这些功能并非潜在的 第三方的日志框架所能媲美 首先要介绍的功能就是 可以告诉 Logger 是否倾卸异常的栈跟踪 您可能需要查看一个特定运行任务的所有异常的栈跟踪 也可能不想看 请注意 对于在 FATAL 日志级别上的异常 不能禁用此功能 使用该方法记录的致命异常必需允许倾卸栈跟踪 对于其他的日志级别 日志程序只有在系统属性 i nlog dump stack traces 设置为 true (或者在代码中调用 Logger setDumpStackTraces(true))的时候才会倾泄栈跟踪     i nlog 日志框架附加的第二项功能是 在记录与一个消息关联的资源绑定包关键字的同时 记录消息本身 资源绑定包关键字对于所有语言环境都是相同的 也就是说 无论消息是用何种语言写成的 关键字是不变的 可以把这些关键字想象成 消息的 ID 或 错误的代码 这在生成涉及到这些代码的帮助文档时非常有用 用户将可以参考文档中的额外帮助文本 以得知到底要传递什么消息(关于如何生成这种文档 请查看下文) 在默认情况下 此功能处于启用状态 要禁用此功能 只需将系统属性 i nlog dump keys 设置为 false 或者在代码中调用 Logger setDumpLogKeys(false)     提供消息 ID 避免在已禁用日志级别上拼接字符串 这些 i nlog 提供的日志机制也许已经足够了 也许有人会争论说 将(除用户界面消息以外的)日志消息国际化是一种负担而且也没有必要 我有时也感到很难说服这种观点 如果项目没有这种需求 您当然不必使用国际化日志 即使不使用 i nlog 提供的日志功能 还可以使用它提供的其他功能嘛     但是 我还是可以举出一些具体的例子来证明使用国际化消息的好处 请注意 i nlog 允许定义一个不同的语言环境供日志程序使用(日志语言环境) 该语言环境区别于 Msg 实例使用的语言环境 这就可以帮助使用我的开发团队的语言来记录日志消息 而我的用户界面使用用户可以阅读的语言(可能与开发团队使用的语言不同) 例如 我的用户说德语 而软件是由说法语的法国团队开发的 在这种情况下 德国用户碰到一个问题时 就可以正常地给法国开发团队发送日志 软件可以默认地将语言环境设置为 Locale FRENCH 另一方面 如果德国用户希望自行调试问题 法语的日志消息根本不会有任何帮助 在这种情况下 德国用户简单地通过设置系统属性 将日志消息记录为德语 关于如何切换日志语言环境的信息 请参考 mazz i n LoggerLocale Javadoc 自动生成资源绑定包     i nlog 提供了一个 Ant 任务 用于自动生成资源绑定包属性文件 以避免开发者担负手动向属性文件中添加消息 清理过时消息的任务     该 Ant 任务将扫描类以查找 @I N 标注 并根据这些标注为您创建资源绑定包 这意味着 无论添加多少 @I NMessage 标注字段 它们都将被加入到资源绑定包中 如果您删除了一个国际化消息常量 则该消息也将从 Ant 任务生成的资源绑定包结果中删除 要运行该 Ant 任务 需要在 Ant 脚本中添加以下类似代码 xml 代码

           <taskdef name= i n                     classpat                    classname= mazz i n ant I NAntTask />                      <i n outputdir= ${classes dir} verify= true verbose= true >           <classpath refid= my classpath />              <classfileset dir= ${classes dir} />           i n>  

    必需让 Ant 任务知道含有国际化标注类及其依赖关系的类的类路径 还必须给出类文件集 其中包含文件集的文件列表供扫描国际化标注之用 建议您在第一次运行 Ant 任务的时候采用 冗长 模式 以便知道 Ant 任务的执行内容 一旦得到了想要的效果 再将 冗长 模式关闭 执行此任务之后 资源绑定包属性文件将出现在指定的输出目录中 生成帮助文档     使用此 Ant 任务的另一个可选功能是生成帮助文档 该文档是由所有对资源绑定包关键字名称及其消息值的引用组成的 另外还包含了对这些消息的描述 这是一个可在 @I NMessage 标注中指定的可选属性 help 属性 属性值可以是深入描述消息的任何字符串 可以将文档想象成在特定情况下将传递的具体消息 自动生成的帮助文档可以提供消息关键字 消息本身以及消息描述之间的交叉引用 java 代码

           @I NMessage( value= The value is { }                          help= This will show you the value of your                              + current counter If this value is over                              + you should reset it )           String MSG_VALUE = value ;                      @I NMessage( value= Memory has { } free bytes left                          help= The VM is very low on memory Increase Xmx            String MSG_LOW_MEM = low memory ;  

    大多数情况下 您可以将其作为 消息的 ID 或者 错误的代码 列表使用 可以将其中的资源绑定包关键字当成一个 消息 ID 或者 错误的代码 要生成帮助文档 需要在 任务中使用 内部标记 xml 代码

           <i n outputdir= ${classes dir} >           <classpath refid= my classpath />              <classfileset dir= ${classes dir} />              <helpdoc outputdir= ${doc dir}/help />           i n>  

  对于每个生成的资源绑定包 都可以在 <helpdoc> 中指定的目录下找到一个相应的帮助文档 文档是根据用于描述文档样式的模板生成的 默认情况下 模板是一个简单的 HTML 页 使用 <table> 标记消息代码 而输出就是帮助文档 在 <helpdoc> 标记中还可以指定一些其他的属性来自定义一个模板 以满足自行定制帮助文档外观的需求 有关更多信息 请查阅 mazz i n ant Helpdoc 类的 Javadoc     在帮助文档的生成结束之后 您就可以得到一个(或一些)包含消息关键字代码 消息内容及任何 help 属性定义内容的文档了 本地化

  我们已经讨论了许多关于如何通过获取翻译的消息和本地化的消息国际化软件的内容 嵌入国际化功能之后 剩下的工作就是手动处理那些需要被本地化的资源绑定属性文件(由 <i n> Ant 任务生成或者自行手动编写)了 必须确保将所有资源绑定包的消息翻译成需要支持的语言 而且这些消息包含的数据也进行相应的本地化 通过定义占位符属性(例如 { date} 将使用目标语言环境的格式和语言输出日期字符串)可以完成许多本地化方面的工作 不言而喻的是 必须找一家优秀的翻译和本地化公司

   小结

lishixinzhi/Article/program/Java/hx/201311/26737




海信KFR-35GW\/18N-2重要参数
这款海信KFR-35GW\/18N-2空调是一款壁挂式设计,专为卧室使用打造,适合面积在15-22平方米的居室。它具备冷暖功能,冬季能提供电辅加热,为您的居住空间带来舒适的温度调节。空调采用1.5P匹数,能够满足一般家庭的日常需求。它的能效等级为3级,尽管不是顶级能效,但依然在节能方面表现出良好的性能,有...

模拟人生2BL 18N补丁~
补丁后缀为package的直接解压到我的文档-EA Games-模拟人生2-Downloads 没有这个文件夹的话就自己建一个……好感度没有要求……已发,记得查收 用的话就是点击另一个小人会出现选项 不明白的话再用百度Hi找我……亲的意思是把补丁下载好了然后再发?……那得多大一附件……...

索尼VGN-TZ18N索尼VGN-TZ18N(宝石红)显示屏
索尼VGN-TZ18N是一款配备有11.1英寸显示屏的笔记本电脑,其屏幕比例适中,为用户提供了良好的视觉体验。它采用了先进的TFT LCD背光技术,分辨率为1366×768,确保了清晰明亮的画面表现。在图形处理能力上,VGN-TZ18N搭载的是集成显卡,具体型号为Intel GMA950。尽管这不是一款独立显卡,但能满足日常的...

1\/4-18n p s c底孔是多少?
35Mn:化学成份:碳C:0.32~0.40硅Si:0.17~0.37锰Mn:0.70~1.00硫S:≤0.035磷P:≤0.035铬Cr:≤0.25镍Ni:≤0.30铜Cu:≤0.25;35Mn2:化学成分: 碳C:0.32~0.39硅Si:0.17~0.37锰Mn:1.40~1.80磷P:《0.025硫S:《0.025铬Cr:《0.30镍Ni:《0.30铜Cu...

求耽美广播剧~!18N!
其实俺觉得耽美广播剧大都是18N的...尤其是日本那边的,你要有兴趣可以去听那些CV的DRAMA 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 ONE有引力 2009-06-01 · TA获得超过3743个赞 知道小有建树答主 回答量:482 采纳率:0% 帮助的人:555万 我也去答题访问个人页 关注 展开全部 三...

科颜氏眼霜18N213
18表示产地美国 第3码英文字母,表示年份。字母和年份对应如下:F、G、H、(注意没有I,具体原因不详)J、K、L、M分别代表2009、2010、2011、2012、2013、2014、2015年。第4码表示月份。1-9月用数字表示,10月、11月、12月用英文单词首字母来表示(10月October用O表示,11月November用N表示,12月...

18n60场效应管参数
18N60场效应管参数如下:1、最大漏极电压(VDSS):600V。2、最大漏极电流(ID):18A,3、最大功率(PD):200W。4、静态漏极电阻(RDS(on)):0.5Ω。5、开启时间(tON):15ns。6、关闭时间(tOFF):100ns。7、栅-源阈值电压(VGS(th)):3-5V。8、栅极电容(CGS):1300pF。9、...

national电饭煲sr-ea18n糊锅怎么回事?
打开电饭锅底座下面的盖板,找到调节螺丝后,用起子稍为松四分之一圈,然后固定好,试一试煮饭的效果,如果还是不行,再进行调整,...饭跳闸之后,在不拔电源线情况下,看煮饭指示灯亮不亮,如果亮,就是里面的叶片开关粘连,拔下电源,拆开底拨开即可,如果不亮(此时保温灯亮),就是温控器有问题(...

砼18N\/mm2是什么等级的
18N\/mm2就是18MPa的混凝土,就是C18的。属于中等标号偏下的吧,接近于C20的。

科颜氏批号查询18N302代表生产日期什么时候
生产日期为2016年3月1日。未开封保质期为3年,开封后保质期为1年。科颜氏是从2008年开始采用六码批号的,其实台湾专柜的科颜氏产品都贴有详细的繁体中文标,并标明了到期年月。如:18H30N(中文标到期年月:2014年3月)日期主要看中间两位(第三和第四位)。第一二位为:18,代表产地。第三位为...

连云区18810636558: Linux: 请问/etc/sysconfig/i18n文件是什么作用? -
甄别整蛋: /etc/sysconfig/i18n 这里存放的是系统的区域语言设置, i18n是 国际化internationalization的缩写 i和n之间正好18个字母 第一行 表明你当前系统的语言环境变量设置 ,这里是 zh_CN.GB18030 第二行 表明系统预置了那些语言支持 ,不在项目中的语言不能正常显示 第三行 定义控制台终端字体,你文本登录的时候显示的字体就是这个 latarcyrheb-sun16

连云区18810636558: 什么是i18n,并简述如何对一个 -
甄别整蛋: 可以叫做本地化测试I18N,区别于国际化测试.就是将版本语言进行更改,比如将英文的windows改成中文的windows就是本地化.本地化测试的对象是的本地化版本.International testing(国际化测试),国际化测试的目的是测试的国际化支持能力,发现的国际化的潜在问题,保证在世界不同区域中都能正常运行.国际化测试使用每种可能的国际输入类型,针对任何区域性或区域设置检查产品的功能是否正常,国际化测试的重点在于执行国际字符串的输入/输出功能.国际化测试数据必须包含东亚语言、德语、复杂脚本字符和英语(可选)的混合字符.

连云区18810636558: il8n 代表什么意思? 全称是什么? -
甄别整蛋: i18n是“国际化”的简称,在系统库上提供一种多国语言的支持机制,i18n是一整套的API,需要改写应用.使用了i18n API的应用程序就可以直接输入输出中文(或其它语种),根本无需外挂中文平台如:

连云区18810636558: “AuI18N”是什么? -
甄别整蛋: Au是Auto Update的缩写. I18N是Internationalization的缩写(原因是I和n之间一共有18个字母). 连起来的意思就是自动更新国际化(国际化的概念想必学编程的都知道,我就不细说了).

连云区18810636558: I18N是什么意思?
甄别整蛋: 人们常把I18N作为“国际化”的简称,其来源是英文单词 internationalization的首末字符i和n之间的字符数为18. 基於他们的英文单字长度过长,常被分别简称成i18n(18意味著在国际化这个单字中,i 和 n 之间有 18 个字母)及L10n.使用大写的 L 以利区分 i18n 中的 i .

连云区18810636558: 关于java中的fmt标签的用法?? -
甄别整蛋: fmt标签,主要两个功能 I18N 国际化类 消息类 和formatting 数字日期格式化类<%@ page language="java" contentType="text/html; charset=gb2312"%><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %><%@ taglib uri="...

连云区18810636558: i18n是什么 -
甄别整蛋: I18N就是Internationalization的缩写,其原因是I和n之间一共有18个字母.

连云区18810636558: SSH项目中的ApplicationResources - zh - CN.properties是干什么的配置? -
甄别整蛋: 是用于I18N(即国际化语言)配置的,其来源是英文单词 internationalization的首末字符i和n.18为中间的字符数. 对于Web应用来说,同样的页面在不同的语言环境下需要显示不同的效果,就应开发支持多国语言、国际化的Web应用.ApplicationResources_zh_CN.properties是用来配置中国语言---汉字的配置文件

连云区18810636558: python模块i18n怎么导入 -
甄别整蛋: Python通过gettext模块支持国际化(i18n),可以实现程序的多语言界面的支持,下面是我的多语言支持实现:1. 在python安装目录下的./Tools/i18n/(windows下例 D:\Program Files\Python25\Tools\i18n)目录中找到pygettext.py运行之,生成翻译...

连云区18810636558: 如何解决 linux 的乱码问题 -
甄别整蛋: 出现这种情况的原因为两种操作系统的中文压缩方式不同,在windows环境中中文压缩一般为gbk,而在linux环境中为utf8,这就导致了在windows下能正常显示 txt文件在linux环境下打开呈现了乱码状态.解决方法:在linux用iconv命令,输入命令...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网