【问题标题】:Loading GWT Messages from a Database从数据库加载 GWT 消息
【发布时间】:2010-04-04 20:38:33
【问题描述】:

在 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 中干净的数据库驱动消息的建议。

【问题讨论】:

    标签: java gwt internationalization


    【解决方案1】:

    GWT 的内置 Dictionary 类是前进的最佳方式。这是official documentation 的使用方法。

    【讨论】:

    • +1 这是个好主意。这个想法是,您将像 var dict = {'key':'value'} 这样的 JSON 映射打印到主机页面的 HTML 中,然后在您的 GWT 代码中调用 Dictionary dict = Dictionary.getDictionary("dict"); 以在您的 GWT 代码中获取类似映射的对象。
    • 我目前正在处理的应用程序的设置方式,这在行为上类似于 Lars 提到的“一次性”方法,因为有一个主机页面,所以所有消息(数千,在 Lars 的情况下)将在单个文件中一起存储和检索。
    【解决方案2】:

    假设您的应用程序每个语言环境有 500 条消息,平均每条消息有 60 个字符。当用户登录或选择他的语言时,我不会三思而后行:这是

    【讨论】:

    • 宽带连接没有问题,数据库速度很快。您是否只是在 onModuleLoad 之后将所有消息加载到单例中? (当区域设置可用时)。我有数以千计的消息,因此需要某种形式的聚合来防止消息类的大小爆炸(fx。每个视图都有特定消息的类)
    • 好吧,在我的情况下,事件是不同的(在我的情况下,用户登录触发属性加载)。但是,鉴于您有大量消息要检索,如您所说,对单个视图进行检索可能是有意义的。当用户访问视图时,您可以将消息延迟加载到静态列表或映射中,而不必在特定用户的每个页面访问时重新加载它。如果您的视图扩展了一个公共父类(就像我正在开发的应用程序中的情况一样),您可能可以在两者之间添加一个类并在其中包含所有逻辑和数据结构。
    【解决方案3】:

    我认为您可能会发现这篇文章很有用: http://googlewebtoolkit.blogspot.com/2010/02/putting-test-data-in-its-place.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+blogspot/NWLT+(Google+Web+Toolkit+Blog)&utm_content=Google+Reader

    您可以做的是设置一个 TextResource,然后您可以在运行时更改文本。我还没有尝试过,但我非常有信心这会奏效。

    【讨论】:

    • 这不是一个坏主意,我将尝试实现一个资源,通过 REST api 从服务器加载 JSON 格式的消息。
    【解决方案4】:

    为了优化性能,您可以将消息放在 js 资源中,例如:http://host.com/app/js/messages.js?lang=en,然后将此资源映射到将从缓存中获取消息字典的 servlet(例如单例 bean)和将其写入响应。

    要进一步优化,您可以:
    - 在资源 URL 中添加一个参数,例如:.../messages.js?lang=en&version={消息的最后更新日期}
    - {消息的最后更新日期} 存储在数据库中的某处
    - 每当用户更新消息时,{last updated date of messages} 就会改变
    - 在对浏览器的响应中,设置 Cache-control 来告诉浏览器缓存您的消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多