论坛首页 Java企业应用论坛

(A10)Tapestry Core:Localization

浏览 2218 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-09  

本文翻译出处 http://tapestry.apache.org/tapestry5/tapestry-core/guide/localization.html

本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。

chinajavawolf

本地化
本地化全部是关于用正确的语言获得正确的文本给用户的。
本地化在Tapestry中支持的很好。Tapestry 允许你很轻松的将提供给用户的文本从应用部分分离出来。。。甚至从你的Java代码和你的组件模板中分离。你可以用其他的语言翻译你的信息并让Tapestry装配起来。
组件信息目录
每一个组件类都可以拥有自己的组件信息目录。一个组件信息目录是一组有”.properties”扩展名的文件。这些属性文件都是使用java.util.ResourceBundle的同样格式。就像这行key=value。这些文件与组件的HTML模板放在一个包里。
因此一个类名为org.example.myapp.pages.MyPage,你就应该有一个主要的属性文件org/example/myapp/pages/MyPage.properties
如果你有一个这些值的译文,你应该提供额外的属性文件,添加一个ISO语言代码。这样,如果你有一法语译文,你可以创建一个MyPage_fr.properties文件。
在多语言特定文件里的任何值将替换来自主属性文件的值。如果你有一个甚至更多的特定资源,就像法国人说法语,你因该创建MyPage_fr_FR.properties文件(语言代码加上国家代码,你甚至可以添加变量。。。但这未必是你需要的,这实际上超出了习惯的语言代码)。
在目录中的信息通过key值被访问。当访问目录信息时Tapestrykey值不区分大小写。
信息目录的继承
如果一个组件类是另一个组件类的子类,那么它继承那个基类的信息目录。他自己的信息目录扩展和替换继承自基类的值。
这样,你可以有一个组件基类包含通用信息,并且在子类中扩展或者替换这些信息(就像你扩充或替换组件基类的方法一样)。当然这要工作在很多你愿意支持的继承层上。
应用信息目录
 

Tapestry 4支持一个大的应用信息目录,这在Tapestry5.05中提供了。.

<o:p>如果文件WEB-INF/AppName.properties存在于上下文内,它将被作为一个全局应用的信息目录。这个AppName源自你在web.xml文件中配置的过滤器的名字。查找这个文件区分大小写。这个属性文件可以被本地化。单独的页面和组件可以覆盖定义在这个消息目录中的值。</o:p>

本地化的组件模板
同样的查找机制应用于组件模板。Tapestry将在每个组件模板的版本中搜索一个本地版本然后应用最匹配的。这样你就可以用MyPage_fr.html给法国用户,MyPage.html给其他用户。
访问本地信息
上面讨论了创建什么样的文件和把他们放到哪里,但没涉及到如何使用这些信息。
可以有两种方式访问信息:
  •  在组件模板中使用message:绑定前缀。
  • 通过注入组件信息对象。
在第一种方案里,你可以使用message:绑定前缀给组件参数,或使用模板表达式。
  1. <t:layout title="message:page-title">  
  2.     
  3.  ${message:greeting}, ${user.name}!   
  4.     
  5.  . . .   
  6. t:layout>  
这里,page-title的信息从消息目录中萃取而来并被交给Border组件的title参数。
另外,greeting信息被萃取和写入响应作为模板的一部分。
 “prop”照样作为默认的绑定前缀,因此,user.name是一个属性路径,不是信息key
你可以用一组属性文件扩展这些内容。
page-title=Your Account
greeting=Welcome back
或许,一个法国版是:
page-title=Votre Compte
greeting=Bienvenue en arriere
你可以注入你的组件信息目录在你的类中,当作一个Message接口的实例
  1. @Inject  
  2. private Messages _messages;  
随后你可以get()信息,或者format()它们。
  1. public String getCartSummary()        
  2. {   
  3.    if (_items.isEmpty())   
  4.      return _messages.get("no-items");   
  5.         
  6.    return _messages.format("item-summary", _items.size());   
  7. }  
Format()操作使用java.text.Formatter工作,输出你期望的漂亮的格式。
no-items=Your shopping cart is empty.    
item-summary=You have %d items in your cart.
Tapestry模板中做同样简单,但有时它更容易在Java代码中使用.
遗失key
如果你关联了一个在信息目录中没有的key值,Tapestry不会抛出异常(那样做会让刚开始开发应用非常沮丧)。当一个key值不能被定位,一个”placeholder”信息被产生,例如"[[missing key: key-not-found]]"
重载
如果你在信息目录中更改了一个属性文件,你将立刻看到改变。就像组件类和组件模板一样。
Asset(是一些web应用中用到的资源,如图象,视频等)本地化
当注入assets时,注入的asset将被很好的本地化。查找最匹配的给当前区域制造,随后最终的Asset将表现出来
区域选择
每个请求的区域是从HTTP请求的头信息中被确定的。请求的区域反映web浏览器的环境或是用户在客户端进行的键盘选择。这可以很明确,例如,识别英式英语和美式英语。
Tapestry限定请求区域,将已知的内容放到请求清单内。Tapestry使用配置符号tapestry.supported-locales去选择有效的区域给每个请求。这个值是一个逗号分隔的区域名列表。Tapestry在列表中查找最匹配请求区域。例如,一个"fr_FR"请求区域将匹配”fr”而不是”de”。如果没有找到匹配的,那么在列表里的第一个区域名字被作为有效的区域(把这个当作默认的对应无匹配)。这样最根本的提供给讲法语的,就要将”fr”做为区域列表里的第一个。
转换区域
Tapestry目前不支持区域转换,但不久就会支持了。决心效仿Tapestry的行为:存储一个cookie在客户端在下次访问时提供默认的区域,并且在session中存储区域名(如果session存在)。
TODO:我相信这已经被Kent实现了。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics