我们正在使用Tapestry 5.4-beta-4。我的问题是:
我需要将带有语言环境数据的文件保存在外部位置,并使用不同的文件名,然后使用tapestry通常的app.properties或pageName_locale.properties。这些文件汇集了应该在所有页面上根据需要使用的消息(因此没有tapestry通常的one_page-one_message_file)。在应用程序启动期间检索文件并将其加载到tapestry中。目前我这样做:
@Contribute(ComponentMessagesSource.class)
public void contributeComponentMessagesSource(OrderedConfiguration<Resource> configuration, List<String> localeFiles, List<String> languages) {
for(String language: languages){
for(String fileName : localeFiles){
String localeFileName = fileName + "_" + language + ".properties";
Resource resource = new Resource(localeFileName );
configuration.add(localeFileName, resource, "before:AppCatalog");
}
}
}
上面的代码的工作原理是注入页面的消息对象填充了所有消息。不幸的是,这些只是默认情况下的消息(首先在tapestry.supported-locales列表中)。这永远不会改变。
我们希望将区域设置设置为浏览器区域设置,并将其发送到标头中的服务。这适用于以传统方式(通过app.properties)传递给tapestry的消息,但不适用于上述代码中设置的消息。实际上,如果浏览器语言发生更改,则Messages对象也会更改,但只会为app.properties中的那些键分配新值。来自外部文件的密钥始终具有默认值。
我的猜测是,tapestry不知道它应该刷新来自Messages对象的哪些键(来自外部文件的键不会链接到任何页面)。 有没有办法可以通过我们保持当前的文件结构来解决这个问题?
答案 0 :(得分:0)
我认为问题在于您将语言(语言环境)添加到您为ComponentMessagesSource提供的文件名中。
例如,如果您提交
example_de.properties
Tapestry尝试加载
example_de_<locale>.properties
如果该文件不存在,它将回退到原始文件(即example_de.properties)。
相反,你应该贡献
example.properties
并且Tapestry会自动将该语言添加到文件名中(有关实际实现,请参阅MessagesSourceImpl.findBundleProperties())。
@Contribute(ComponentMessagesSource.class)
public void contributeComponentMessagesSource(OrderedConfiguration<Resource> configuration, List<String> localeFiles, List<String> languages) {
for(String language: languages){
for(String fileName : localeFiles){
String localeFileName = fileName + ".properties";
Resource resource = new Resource(localeFileName );
configuration.add(localeFileName, resource, "before:AppCatalog");
}
}
}