使用GWT将非常长的文本国际化(最好包括HTML)

时间:2016-08-15 20:28:05

标签: html gwt internationalization

我正在使用GWT(第一计时器)开发一个应用程序,现在我正处于建立中心结构的阶段,以便为我的视图提供实际的基于文本的内容。

尽管显然可以内联定义那些文本值(使用UiBinder或在相应的对象上调用适当的方法),但我更容易将它们存储在中心位置,因为使用GWT {{1 }}。事实上,我的应用程序只能以一种语言提供(目前为止),所以i18n可能看起来有点矫枉过正,但我​​认为这些设施可能最适合我的要求,看看它们也是如此,必须考虑到提供所有(常量)文本内容。

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

第一个问题:冗长的字符串值。

Constants

上面的示例包含一个非常简单的字符串值,以静态字符串国际化指示的方式定义(据我所知)。要添加对另一种语言(例如德语)的支持,可以提供包含翻译的import com.google.gwt.i18n.client.Constants; public interface AppConstants extends Constants { @Constants.DefaultStringValue("User Administration") String userAdministrationTitle(); // ... } 文件:

.properties

现在,人们可能很容易滥用这种模式,从不提供userAdministrationTitle = Benutzeradministration ,而是留下一个空字符串。然后,可以为默认语言创建DefaultStringValue文件,并添加文本,就像翻译一样。然而,即便如此,(据我所知)不能为长值应用换行符只是为了保持文件格式有点格式化,如下所示:

.properties

第二个问题:格式化部分文字。

由于值是纯字符串,因此格式化的空间不大。本能地说,如果我将文本直接写入常规HTML文档并添加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. <strong>等HTML标记,我会做同样的事情。

在接下来的路上,在读取字符串并将其应用于要显示它们的窗口小部件的位置,存在一个问题:使用类似<em>的方法设置值会导致该字符串变为转义并将HTML标记与文本的其余部分一起打印,而不是解释为格式化说明。所以没有运气。

解决这个问题的一种方法是分析i18n文件提供的字符串并隔离任何HTML标记,然后使用setText(String)再次将混乱再次混合在一起并使用它来设置窗口小部件的值,这确实会导致显示格式化的文本。这听起来像是一个过度复杂的东西,所以我不太喜欢这个想法。

那么我现在正在寻找什么,亲爱的用户实际上已经阅读了这一切(谢谢!)?我正在寻找的解决方案不需要像上面描述的那样的黑客,并提供我正在寻找的功能。或者,如果我完全走错了路线,我欢迎任何指导(GWT first-timer,正如我之前提到过的那样:-))。或者基本上是关于主题的任何内容,可能有助于找到解决方案。例如,一个可接受的解决方案是像string value files used in Android development这样的系统(它允许对文本进行HTML样式化,但显然需要包含UI元素来接受它)。

1 个答案:

答案 0 :(得分:4)

幸运的是,您可以使用标准解决方案。首先,您需要创建一个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();
    }

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