在GWT中,通常使用如下界面加载i18n字符串:
public interface StatusMessage extends Messages {
String error(String username);
:
}
然后从 StatusMessage.property 文件加载实际字符串:
error=User: {0} does not have access to resource
这是一个很好的解决方案,但是我的客户端对于将i18n字符串放在数据库中的要求是不可置信的,因此可以在运行时更改它们(尽管它不是要求它们实时更改)。
一种解决方案是创建一个异步服务,该服务采用消息ID 和用户区域设置并返回一个字符串。我已经实现了这个并且发现它非常难看(它引入了大量与服务器的额外通信,加上它使得属性占位符替换相当复杂)。
所以我的问题是这个,我可以用一些好的方式实现一个自定义消息提供程序,它可以一次性加载来自后端的消息(对于当前用户会话)。如果它也可以挂钩到默认的GWT消息机制,那么我会非常高兴(即我可以创建一个像上面这样的界面并继续使用好的 {0},{1} ... 财产置换格式)。
欢迎在GWT中使用干净的数据库驱动消息的其他建议。
答案 0 :(得分:3)
GWT的内置Dictionary课程是向前发展的最佳方式。这是关于如何使用它的official documentation。
答案 1 :(得分:1)
假设您的应用程序每个区域设置有500条消息,每条消息平均有60个字符。当用户登录或选择他的语言时,我不会考虑加载所有这些:它是< 50k的数据,如果您可以假设宽带连接可用,则不应该是一个问题...您的“一举”建议。我已经在一个GWT应用程序中执行了此操作,但它不是消息,而是从数据库中读取的属性。
答案 2 :(得分:1)
您可以做的是设置TextResource然后,您可以在运行时更改文本。我没有尝试过,但我非常有信心这会有用。
答案 3 :(得分:0)
为了优化性能,您可以将消息放在js资源中,例如:http://host.com/app/js/messages.js?lang=en,然后将此资源映射到servlet,该servlet将从缓存中获取消息字典(例如,单例bean) )并将其写入回复。
为了进一步优化,您可以:
- 将参数放入资源URL,例如:... / messages.js?lang = en& version = {上次更新消息的日期}
- {最后更新的消息日期}存储在DB中的某处
- 每当用户更新消息时,{最后更新的消息日期}将发生变化
- 在对浏览器的响应中,将Cache-control设置为您希望告诉浏览器缓存您的消息。