使用 GWT 国际化超长文本(最好包括 HTML)
Internationalizing Very Long Texts With GWT (preferably including HTML)
我正在使用 GWT 开发一个应用程序(初学者),现在正处于我想要建立一个中央结构来为我的视图提供实际的基于文本的内容的阶段。
尽管显然可以内联定义这些文本值(使用 UiBinder 或在相应对象上调用适当的方法),但我更愿意将它们存储在一个中心位置,因为使用 GWT 的 Constants
。事实上,我的应用程序将只提供一种语言(目前),所以完全国际化可能看起来有点过分,但我假设这些设施可能最适合我的需要,看看它们如何,也是, 必须在设计时考虑到提供所有(恒定的)文本内容。
但是,我的应用程序包含几段文本,这些文本比一般的标签文本更长更复杂,这意味着它们可能跨越多行并且可能需要基本的文本格式。我想出了几个关于如何解决这些问题的想法,但我并不满意。
第一个问题: 冗长的字符串值。
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 标签,如 <strong>
或 <em>
,我会做同样的事情。
再往下走,在读取字符串并将其应用于要显示它们的小部件时,有一个问题:使用 setText(String)
之类的方法设置值会导致该字符串被转义并且 HTML 标签与文本的其余部分一起打印,而不是被解释为格式化指令。所以运气不好。
解决这个问题的一种方法是剖析 i18n 文件提供的字符串并隔离任何 HTML 标签,然后使用 SafeHtmlBuilder
再次将混乱组合在一起并使用它来设置小部件的值,这确实会导致显示格式化文本。不过,这听起来过于复杂,所以我不太喜欢这个想法。
那么我现在在寻找什么,亲爱的用户,实际上一直阅读了这篇文章(谢谢!)?我正在寻找不需要像上面描述的那样的黑客攻击的解决方案,并提供我正在寻找的功能。或者,如果我完全走错了路,我欢迎任何指导(GWT 初学者,正如我在永恒之前提到的:-))。或者基本上任何与主题相关且可能有助于找到解决方案的内容。例如,一个可接受的解决方案是像 string value files used in Android development 这样的系统(它允许对文本进行 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();
}
如果包含 HTML 个标签,您需要使用 HTML widget 来显示此文本。
如果您使用的是 UiBinder,则内置了 i18n 支持。否则,使用 Messages 和 Constants 并将值与 setHTML 而不是 setText 一起使用。
对于长行,您应该能够通过以反斜杠结束行来在属性文件中使用多行值。
我正在使用 GWT 开发一个应用程序(初学者),现在正处于我想要建立一个中央结构来为我的视图提供实际的基于文本的内容的阶段。
尽管显然可以内联定义这些文本值(使用 UiBinder 或在相应对象上调用适当的方法),但我更愿意将它们存储在一个中心位置,因为使用 GWT 的 Constants
。事实上,我的应用程序将只提供一种语言(目前),所以完全国际化可能看起来有点过分,但我假设这些设施可能最适合我的需要,看看它们如何,也是, 必须在设计时考虑到提供所有(恒定的)文本内容。
但是,我的应用程序包含几段文本,这些文本比一般的标签文本更长更复杂,这意味着它们可能跨越多行并且可能需要基本的文本格式。我想出了几个关于如何解决这些问题的想法,但我并不满意。
第一个问题: 冗长的字符串值。
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 标签,如 <strong>
或 <em>
,我会做同样的事情。
再往下走,在读取字符串并将其应用于要显示它们的小部件时,有一个问题:使用 setText(String)
之类的方法设置值会导致该字符串被转义并且 HTML 标签与文本的其余部分一起打印,而不是被解释为格式化指令。所以运气不好。
解决这个问题的一种方法是剖析 i18n 文件提供的字符串并隔离任何 HTML 标签,然后使用 SafeHtmlBuilder
再次将混乱组合在一起并使用它来设置小部件的值,这确实会导致显示格式化文本。不过,这听起来过于复杂,所以我不太喜欢这个想法。
那么我现在在寻找什么,亲爱的用户,实际上一直阅读了这篇文章(谢谢!)?我正在寻找不需要像上面描述的那样的黑客攻击的解决方案,并提供我正在寻找的功能。或者,如果我完全走错了路,我欢迎任何指导(GWT 初学者,正如我在永恒之前提到的:-))。或者基本上任何与主题相关且可能有助于找到解决方案的内容。例如,一个可接受的解决方案是像 string value files used in Android development 这样的系统(它允许对文本进行 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();
}
如果包含 HTML 个标签,您需要使用 HTML widget 来显示此文本。
如果您使用的是 UiBinder,则内置了 i18n 支持。否则,使用 Messages 和 Constants 并将值与 setHTML 而不是 setText 一起使用。
对于长行,您应该能够通过以反斜杠结束行来在属性文件中使用多行值。