“此应用程序已过期”GWT 的 I18n

Posted

技术标签:

【中文标题】“此应用程序已过期”GWT 的 I18n【英文标题】:I18n of "This application is out of date" GWT 【发布时间】:2013-06-21 07:40:06 【问题描述】:

我们每 2/3 天发布一次修补程序/新版本,因此我们的用户经常遇到烦人的“此应用程序已过时”消息。因此,在我们开发出一种方法来检查应用程序是否过时并强制重新加载之前,我们至少希望将消息国际化,因为我们的大多数用户都没有使用英文版的应用程序并且看起来很奇怪。

有没有办法解决“此应用程序已过期”消息?

编辑:据我所知,虽然我还没有尝试过,但也许抓住IncompatibleRemoteServiceException 并在那里做 I18n 可以解决问题。但是我们有很多 RPC 调用...有没有更好的(是的,我的意思是更简单、更快)的方法?

【问题讨论】:

【参考方案1】:

您可以使用GWT.UncaughtExceptionHandler 全局捕获IncompatibleRemoteServiceExceptions。在那里,使用instanceof IncompatibleRemoteServiceException 检查并以任何方式向用户显示任何错误消息(例如,Google 网上论坛使用与“正在加载...”和“您的消息已发送”指示符相同的“气泡”,以及“重新加载”链接)。

当然,前提是你的AsyncCallbacks 重新抛出异常。

【讨论】:

哇!不错的方法!尽管如此,我的 AsyncCallbacks 并没有重新抛出异常。但是我们所有的AsyncCallbacks 都是MyOwnAsyncCallback<T>,它实现了AsyncCallback<T>,所以我想我可以在这里做一个解决方法,使用instance of IncompatibleRemoteServiceException 而不是做1500 次相同的捕获。有时我们只见树木不见森林!非常感谢!【参考方案2】:

我终于找到了更好的方法(至少对于我的工作流程而言)。它包括不通知用户重新加载,而是避免它。

我这样做的方法是强制浏览器不缓存 *noncache.js 文件。这可以通过创建过滤器并将其添加到应用程序 web.xml 来完成。 以下是doFilter()代码。

if (requestURI.contains(".nocache.")) 
 Date now = new Date();
 HttpServletResponse httpResponse = (HttpServletResponse) response;
 httpResponse.setHeader("Pragma", "no-cache");
 httpResponse.setHeader("Cache-control", "no-cache, no-store, must-revalidate");

filterChain.doFilter(request, response);

然后,只需添加过滤器映射<url-pattern>/*</url-pattern> 即可!对用户的透明更改:D

希望这会有所帮助。

【讨论】:

文件被称为 nocache.js 和 cache.is/html 当然是有原因的。您的“解决方案”不支持在用户当前打开应用程序时更新应用程序的用例。他们只有在刷新时才会有新版本,但同时会有IncompatibleRemoteServiceException 是的,我知道,我们现在正在努力。我们在打开的会话中遇到问题,但在新会话中,我们通过这种方法解决了问题。因此,我们减少了所有用户获取新版本的时间。我想我们最终会按照你的建议去做,但还没有足够的时间来解决它。我会告诉你的! 顺便说一句,据记录,您不应该缓存 nocache.js 文件:gwtproject.org/doc/latest/… 当然,这里只给出了 Apache 配置作为示例,但至少您已经掌握了这些信息。

以上是关于“此应用程序已过期”GWT 的 I18n的主要内容,如果未能解决你的问题,请参考以下文章

GWT验证i18n

jHipster 实体中的 i18n

Lazarus:i18n 不翻译应用程序

用 jest 模拟 vue 的 i18n

MySQL 的 i18n(印度语)支持有啥问题吗?

从 GWT-2.0.3 到 GWT-2.7.0 的应用程序升级问题?