【问题标题】:GWT dynamic internationalizationGWT 动态国际化
【发布时间】:2012-01-31 13:32:19
【问题描述】:

在我的应用程序(GWT(EXT_GWT) + Spring)中,我需要设置用户(登录后)他的母语,而不需要获取参数。例如:用户在登录表单中填写他的登录名和密码,然后在准备工作表单中重定向(此表单必须使用本地用户语言。我从 db 获得的区域设置)。我的语言文件写在 .properties 文件中,并在 module.gwt.xml 配置中枚举。

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

谢谢!

【问题讨论】:

    标签: gwt internationalization


    【解决方案1】:

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

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

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

    • 获取当前语言环境LocaleInfo.getCurrentLocale().getLocaleName();
    • 将其与用户的区域设置值进行比较
    • 如果不同,使用GWT.getModuleBaseURL()获取基本url
    • 基于先前的基本 url 构造新的 url,并以 ?locale=locale_value 结尾
    • 将本地化标志设为真并保存到会话中;
    • 使用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);
            }
          }     
        }
    

    有关 GWT 本地化的更多信息,您可以在此处找到 Internationalizing a GWT Application 和此处 Internationalizing a GWT Application 认为它会帮助你!

    【讨论】:

    • 非常感谢 BraginiNI,但我需要没有获取参数的方法(您的 url 方法):(
    • 可能是我弄错了,但我想你不能用另一种方式实现这样的逻辑。如果您能找到解决方案,请发布它。
    • 一种可能的方法 - 在 jsp 页面的标题 处写入语言环境。但我有 html 页面 :(
    • 为什么你不想使用jsp而不是html?我在我的 gwt 应用程序中使用 jsp,它工作正常。但是使用 标签,您还需要以编程方式更改语言环境。
    • 使用 Location.createUrlBuilder() 更好地构造 URL。
    【解决方案2】:

    使用内置的国际化并按预期使用它,如果不重新加载页面,您将无法执行此操作。内置的 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 时,您正在编译所有字符串,无论它们是否被使用。为了改善这种情况,请考虑为所需的每个区域设置一个拆分点,并确保只加载其中一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      相关资源
      最近更新 更多