带有语言环境消息的外部文件,其中包含tapestry 5中的页面

时间:2014-07-31 15:55:58

标签: localization locale tapestry

我们正在使用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对象的哪些键(来自外部文件的键不会链接到任何页面)。 有没有办法可以通过我们保持当前的文件结构来解决这个问题?

1 个答案:

答案 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");
        }
    }
}