GWT动态国际化

时间:2012-01-30 11:15:29

标签: gwt internationalization

在我的应用程序(GWT(EXT_GWT)+ Spring)中,我需要设置用户(登录后)他的母语,而不是获取参数。例如:用户填写他的登录信息并通过登录表单传递,然后以准备工作的形式重定向(此表单必须使用本机用户语言。我从db获取的区域设置)。我的语言文件是在.properties文件中编写的,并在module.gwt.xml config。

中枚举

所以问题是 - 我如何设置语言?也许有会话或邮政参数?但我不明白GWT在加载页面之前如何选择所需的语言环境。在加载页面之前在gwt设置区域设置的一些方法?

谢谢!

2 个答案:

答案 0 :(得分:5)

我认为,在收到来自db的用户区域设置信息后,您应该将其重定向到url,例如(如果他来自俄罗斯):

http://www.example.org/myapp.html?locale=ru

例如,您可以保存应用程序已在会话中本地化的boolen标志并执行以下步骤:

  • 获取当前区域设置LocaleInfo.getCurrentLocale().getLocaleName();
  • 将其与用户的区域设置值进行比较
  • 如果不同,请使用GWT.getModuleBaseURL()
  • 获取基本网址
  • 根据以前的基本网址构建新网址,结尾为?locale=locale_value
  • 将localize标志设为true并将其保存到会话中;
  • 使用Window.Location.replace(newUrl)
  • 重定向到新网址

例如localizeApp方法可能如下所示:

    void localizeApp(User user) {
      if (!localized) {
        String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
        if (!locale.equals(user.getLocale)) {
          String url = GWT.getModuleBaseURL();
          String newUrl = url + "?locale="+currentLocale;
          localized = true; //and save to session here
          Window.Location.replace(newUrl);
        }
      }     
    }

您可以在此处Internationalizing a GWT ApplicationInternationalizing a GWT Application找到更多关于GWT本地化的信息 想想它会对你有所帮助!

答案 1 :(得分:4)

使用内置国际化并按预期使用它,如果不重新加载页面,则无法执行此操作。内置的i18n仅依赖于加载与所选语言环境相对应的已编译排列。这意味着您不能只添加元标记,不能只是翻转设置,而且您将无法从内置的LocalInfo类中读取。

我认为有两种选择。首先,让重装更便宜,所以你可以使用GWT自带的i18n。要执行此操作,请通过创建新应用程序或使用拆分点从登录中分离应用程序的其余部分,以便加载尽可能少的代码。编译文件应该是缓存,因此它不应该影响下载时间,只影响启动应用程序所需的时间。

第二个选项,遵循不重新加载的约束:不要使用内置的I18n,而是根据运行时数据找到另一种方法来拉入字符串(与通常的编译时方法相反)。

  • GWT记录了一种使用Dictionary类的方法,允许您从javascript加载的字符串中读取(参见http://code.google.com/webtoolkit/doc/latest/DevGuideI18n.html#DevGuideDynamicStringInternationalization)。这可以通过在登录后加载带有这些字符串的JS文件来完成(考虑ScriptInjector,这样你知道什么时候准备就绪)。这有一个额外的好处,你不需要重新编译来改变字符串,如果你认为这是一个优点,并且你需要在JS中使用字符串,而不是java和属性文件(尽管一些仔细的服务器工作可能允许)你要从java / properties中生成那个js。
  • 制作多个I18n接口,而不只是一个。它们应该都可以实现一个通用接口,这样你就可以将实例传递给任何需要它们的东西,小部件等。这种方法的问题是当你使用内置的I18n时,你正在编译所有的字符串,无论他们是否被使用。要改善这种情况,请考虑所需的每个区域设置的分割点,并确保只加载其中一个区域。