Localization 如何在Wicket中将转换器或渲染器国际化?

Localization 如何在Wicket中将转换器或渲染器国际化?,localization,internationalization,wicket,translation,Localization,Internationalization,Wicket,Translation,我正在翻译一个web应用程序,wicket:message和properties文件的工作通常进展顺利。但是Wicket总是希望有一个用于查找字符串的组件。 我如何翻译转换器和渲染器(即IConverter和IChoiceRenderer的实现),这些转换器和渲染器在其方法中无法访问任何Wicket组件 到目前为止,我找到了一种方法-Application.get().getResourceSettings().getLocalizer().getString(key,null)-但我必须将字符

我正在翻译一个web应用程序,wicket:message和properties文件的工作通常进展顺利。但是Wicket总是希望有一个用于查找字符串的组件。
我如何翻译转换器和渲染器(即
IConverter
IChoiceRenderer
的实现),这些转换器和渲染器在其方法中无法访问任何Wicket组件


到目前为止,我找到了一种方法-
Application.get().getResourceSettings().getLocalizer().getString(key,null)
-但我必须将字符串设置为“全局”,即与应用程序类关联。这不利于分离和重用。我怎样才能做得更好?

如果我理解你的问题

您可以使用基于包的属性,这意味着如果您将键/值放入包中的属性文件“package.properties”。该包下任何子包的每个本地化资源都会返回与请求的键关联的值,直到您在另一个属性文件中重写它为止

文件名在Wicket 1.6.x之前的版本中为“package.properties”,在Wicket 1.6之前的版本中为“Wicket package.properties”+

但是,它仅适用于componet,在componet之外(当component参数为null时),可以使用:

WicketApplication.properties(WebApplication类是WicketApplication.class,此属性文件在同一个包中)

wicket package.properties(基于包,将其放置在与页面相同的包中)

LocalizedPage.html(标记模板)


本地化页面
文本

LocalizePage.java(代码)

公共类本地化页面扩展网页{
私有静态最终长serialVersionUID=1L;
公共本地化页面(){
超级();
}
@凌驾
受保护的void onInitialize(){
super.onInitialize();
添加(新标签(“localizedLabel”,新AbstractReadOnlyModel()){
私有静态最终长serialVersionUID=1L;
@凌驾
公共字符串getObject(){
返回WicketApplication.get().getResourceSettings().getLocalizer().getString(“applicationGlobalProperty”,null);
}
}));
}
}

参见

上的完整示例,我认为你应该发明自己的方法来实现这一点。在我当前的项目中,我们注册了自己的IStringResourceLoader,如下所示:

IStringResourceLoader stringResourceLoader = new OurOwnResourceLoaderImpl();               
Application.get().getResourceSettings().getStringResourceLoaders().add(stringResourceLoader);
例如,在IChoiceRenderer中,我们只调用Application.get().getLocalizer().getString(“key”,null)

在我们的IStringResourceLoader中,我们正在根据自己的约定寻找具有某种字符串模式的捆绑包(属性文件)

或者,您可以通过org.apache.wicket.resource.loader.BundleStringResourceLoader在应用程序#init中注册分布在库jar中的本地化包(即属性文件)

好吧,没有标准的方法可以做到这一点,所以选择哪条路取决于你自己

更新:

我找到了另一个解决方案,您的库/扩展可以自行注册自己的本地化,这样您就无需触摸应用程序init或创建自己的IstringResourceLoader

有一个预先注册的字符串资源加载器org.apache.wicket.resource.loader.InitializerStringResourceLoader(请参阅wickets默认IResourceSetting实现,即ResourceSetting及其构造函数),它使用wicket的初始化器机制-请参阅IIInitializer javadoc-基本上可以在jar类根中添加wicket.properties文件(即,它在默认/无包中)并且在文件中有:

initializer=i.am.robot.MyInitilizer
然后i.am.robot.MyInitilizer:

public class MyInitializer implements IInitializer {

    /**
     * @param application
     *            The application loading the component
     */
    void init(Application application) {
        // do whatever want
    }

    /**
     * @param application
     *            The application loading the component
     */
     void destroy(Application application) {

     }

}

现在,您在与IIInitializer实现(在我们的示例MyInitializer中)相同的包和相同的名称中创建本地化包。

我想我找到了另一种方法

我注意到,
IStringResourceLoader
还有一个方法
stringloadstringresource(Class-clazz,String-key,Locale-Locale,String-style);
(还有一个参数用于更新Wicket版本的变体)它不需要组件。
clazz
应该是一个组件类,但是…它实际上不必是:)

我能够用一种新方法实现我自己的
类MyLocalizer extends Localizer
getString(字符串键、类cl、IModel模型、区域设置、字符串默认值)

其工作方式与
getString(字符串键、组件组件、IModel模型、字符串默认值)

但是直接使用类而不是组件。它仍然使用相同的属性缓存和资源加载器

然后我编写了一个
抽象类MyConverter实现了IConverter
,它有一个
MyLocalizer getLocalizer()
和一些
getString
方法,比如
组件
类。基本上它是
getLocalizer().getString(key,getClass(),model,locale,defaultValue)
,因此属性现在可以附加到转换器类


似乎有效:)

Afaik这对应用程序无效。get().getResourceSettings().getLocalizer().getString(键,null)。它使用层次结构中的包,从组件所在的包开始,然后上升到父包。它必须知道何时开始在包的层次结构中查找,但是当你告诉组件为null时,它不会。那么,我如何从基于包的属性中获取字符串呢?是的,你是对的,不可能使用getString(key,null)。在本例中,全局属性文件位于以应用程序类命名的属性文件中,例如WicketApplication,我在查看LocalizedPage时做了一个小示例,它使用和标记(它使用属性本身),而不是中的标签“localizedLabel”
public class LocalizedPage extends WebPage {

    private static final long serialVersionUID = 1L;

    public LocalizedPage() {
        super();
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();

        add(new Label("localizedLabel", new AbstractReadOnlyModel<String>() {

            private static final long serialVersionUID = 1L;

            @Override
            public String getObject() {
                return WicketApplication.get().getResourceSettings().getLocalizer().getString("applicationGlobalProperty", null);
            }
        }));

    }

}
IStringResourceLoader stringResourceLoader = new OurOwnResourceLoaderImpl();               
Application.get().getResourceSettings().getStringResourceLoaders().add(stringResourceLoader);
initializer=i.am.robot.MyInitilizer
public class MyInitializer implements IInitializer {

    /**
     * @param application
     *            The application loading the component
     */
    void init(Application application) {
        // do whatever want
    }

    /**
     * @param application
     *            The application loading the component
     */
     void destroy(Application application) {

     }

}