使用GWT国际化超长文本(最好包括HTML)

使用GWT国际化超长文本(最好包括HTML),html,gwt,internationalization,Html,Gwt,Internationalization,我正在使用GWT(first timer)开发一个应用程序,现在我想建立一个中心结构,为我的视图提供实际的基于文本的内容 即使很明显可以内联定义这些文本值(使用UiBinder或对相应的对象调用适当的方法),我也会更轻松地将它们存储在中心位置,就像使用GWT的常量一样。事实上,我的应用程序将只提供一种语言(目前),因此i18n的所有方式似乎都有些过分,但我假设这些设施可能最适合我的需要,看看它们是如何在设计时也必须考虑到提供所有(恒定)文本内容的 但是,我的应用程序的几个文本段比一般的标签文本长

我正在使用GWT(first timer)开发一个应用程序,现在我想建立一个中心结构,为我的视图提供实际的基于文本的内容

即使很明显可以内联定义这些文本值(使用UiBinder或对相应的对象调用适当的方法),我也会更轻松地将它们存储在中心位置,就像使用GWT的
常量一样。事实上,我的应用程序将只提供一种语言(目前),因此i18n的所有方式似乎都有些过分,但我假设这些设施可能最适合我的需要,看看它们是如何在设计时也必须考虑到提供所有(恒定)文本内容的

但是,我的应用程序的几个文本段比一般的标签文本长一些,也更复杂一些,这意味着它们可能跨越几行,并且可能需要基本的文本格式。关于如何解决这些问题,我提出了一些想法,但我还远远不能满足

第一个问题:字符串值过长

import com.google.gwt.i18n.client.Constants;

public interface AppConstants extends Constants {
    @Constants.DefaultStringValue("User Administration")
    String userAdministrationTitle();

    // ...
}
上面的示例包含一个非常简单的字符串值,其定义方式是静态字符串国际化规定的(据我所知)。要添加对另一种语言(如德语)的支持,可以提供包含翻译的
.properties
文件:

userAdministrationTitle = Benutzeradministration
现在,您可以很容易地滥用此模式到一定程度,并且从不提供
DefaultStringValue
,而是留下一个空字符串。然后,可以为默认语言创建一个
.properties
文件,并像翻译一样添加文本。然而,即使如此,(据我所知)也不可能仅仅为了保持文件格式良好而对长值应用换行符,如下所示:

aVeryLongText = This is a really long text that describes some features of the
                application in enough detail to allow the user to act on a basis
                of information rather than guesswork.
第二个问题:格式化部分文本

由于这些值是纯字符串,因此没有太多的格式化空间。本能地,如果我将文本直接写入常规HTML文档并添加HTML标记,如
,我会做同样的事情

再往前走,在读取字符串并将其应用到要显示它们的小部件的点上,有一个问题:使用类似
setText(String)的方法设置值
导致该字符串被转义,HTML标记与其余文本一起打印,而不是解释为格式化指令。所以没有运气

解决这一问题的一种方法是分离i18n文件提供的字符串并隔离任何HTML标记,然后使用
SafeThmlBuilder
再次烘焙这些混乱,并使用它们设置小部件的值,这确实会导致显示格式化的文本。不过,这听起来有点过于复杂,所以我不太喜欢这个想法


那么,亲爱的用户,我现在在寻找什么呢?我一直在读这篇文章(谢谢!)?我正在寻找的解决方案,不需要像上面描述的那样的黑客,并提供我所寻找的功能。或者,如果我完全走错了路,我欢迎任何指导(GWT first timer,正如我在很久以前提到的:-))。或者基本上是关于主题的任何东西,可能有助于找到解决方案。例如,一个可接受的解决方案是类似的系统(它允许对文本进行HTML样式化,但显然需要包含UI元素才能接受)。

幸运的是,您可以使用一个标准解决方案。首先,您需要创建ClientBundle:

public interface HelpResources extends ClientBundle {

    public static final HelpResources INSTANCE = GWT.create(HelpResources.class);

    @Source("account.html")
    public ExternalTextResource account();

    @Source("organization.html")
    public ExternalTextResource organization();
}
您需要将此捆绑包放入自己的包中。然后将HTML文件添加到同一个包中-每种语言一个:

account.html
account_es.html
organization.html
organization_es.html
现在,当您需要使用它时,您可以:

private HelpResources help = GWT.create(HelpResources.class);
...

    try {
        help.account().getText(new ResourceCallback<TextResource>() {

        @Override
        public void onError(ResourceException e) {
            // show error message
        }

        @Override
        public void onSuccess(TextResource r) {
            String text = r.getText();
            // Pass this text to HTML widget
        }

    } catch (ResourceException e) {
        e.printStackTrace();
    }
private HelpResources help=GWT.create(HelpResources.class);
...
试一试{
help.account().getText(新的ResourceCallback()){
@凌驾
公共无效onError(资源例外e){
//显示错误消息
}
@凌驾
成功时公共无效(textr资源){
String text=r.getText();
//将此文本传递到HTML小部件
}
}捕获(资源异常e){
e、 printStackTrace();
}

如果此文本包含HTML标记,则需要使用来显示此文本。

幸运的是,您可以使用标准解决方案。首先,您需要创建ClientBundle:

public interface HelpResources extends ClientBundle {

    public static final HelpResources INSTANCE = GWT.create(HelpResources.class);

    @Source("account.html")
    public ExternalTextResource account();

    @Source("organization.html")
    public ExternalTextResource organization();
}
您需要将此捆绑包放入自己的包中。然后将HTML文件添加到同一个包中-每种语言一个:

account.html
account_es.html
organization.html
organization_es.html
现在,当您需要使用它时,您可以:

private HelpResources help = GWT.create(HelpResources.class);
...

    try {
        help.account().getText(new ResourceCallback<TextResource>() {

        @Override
        public void onError(ResourceException e) {
            // show error message
        }

        @Override
        public void onSuccess(TextResource r) {
            String text = r.getText();
            // Pass this text to HTML widget
        }

    } catch (ResourceException e) {
        e.printStackTrace();
    }
private HelpResources help=GWT.create(HelpResources.class);
...
试一试{
help.account().getText(新的ResourceCallback()){
@凌驾
公共无效onError(资源例外e){
//显示错误消息
}
@凌驾
成功时公共无效(textr资源){
String text=r.getText();
//将此文本传递到HTML小部件
}
}捕获(资源异常e){
e、 printStackTrace();
}

如果此文本包含HTML标记,则需要使用来显示此文本。

如果使用UiBinder,i18n支持是内置的。否则,请使用消息和常量,并将该值与setHTML而不是setText一起使用


对于长行,您应该能够通过以反斜杠结束行来使用属性文件中的多行值。

如果您使用的是UiBinder,i18n支持是内置的。否则,请使用消息和常量,并将该值与setHTML而不是setText一起使用

对于长线,您应该能够在特性文件中使用多行值,方法是以反斜杠结束行