2012-01-30 158 views
3

在我的应用程序(GWT(EXT_GWT)+ Spring)中,我需要设置用户(登录后)他的母语,而不需要参数。例如:用户在登录表单填写登录&,然后以准备工作形式重定向(此表单必须使用本地用户语言,我从db获取的语言环境)。我的语言文件写在.properties文件中,并在module.gwt.xml config中枚举。GWT动态国际化

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

谢谢!

回答

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时,您正在编译所有字符串,不管它们是否被使用。为了改善这一点,考虑每个地区所需的分割点,并确保只加载其中的一个。
5

我认为,从DB你应该重定向他receving用户区域信息后,URL,例如(如果他是来自俄罗斯):

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

例如,可以保存应用程序是在局部boolen标志会话和执行该步骤:

  • 获得当前区域LocaleInfo.getCurrentLocale().getLocaleName();
  • 与用户的区域价值
  • 如果不同进行比较,获得使用GWT.getModuleBaseURL()
  • 在结束
  • 化妆本地化标志真正构建新的URL基于以前的基础URL与?locale=locale_value并将其保存到会话基础URL;
  • 重定向到新的URL中使用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 认为这将有助于您!

+0

非常感谢BraginiNI,但我需要的方法没有得到参数(你的URL方法):( – 2012-01-30 16:43:50

+1

可能是我错了,但我想你不能用另一种方式实现这样的逻辑。找到解决方案后它PLZ – BraginiNI 2012-01-30 16:47:25

+0

一种可能的方式 - 在JSP页面的页眉写的语言环境,但我有html页面:( – 2012-01-30 17:07:44