GWT动态区域设置

时间:2013-04-30 06:42:57

标签: gwt localization internationalization locale

我希望在Spring gwt-locale的帮助下设置LocaleContextHolder用户选择的语言环境。

public static final String getCurrentLocale() {
    return LocaleContextHolder.getLocale().getLanguage();
}

我实际上在Spring MVC中有登录界面,在gwtp中有内部仪表板。在登录之前,必须在外部接口中选择相同的区域设置用户{.1}}。

不幸的是,我没有看到任何gwt内置的Locale setter。

我的gwt默认语言区为X.gwt.xml                    

kh

我的<inherits name="com.google.gwt.uibinder.UiBinder" /> <inherits name="com.google.gwt.inject.Inject" /> <inherits name="com.gwtplatform.mvp.Mvp" /> <inherits name="gwtquery.plugins.droppable.Droppable"/> <source path="client" /> <source path="shared" /> <define-configuration-property name="gin.ginjector" is-multi-valued="false"/> <set-configuration-property name="gin.ginjector" value="com.prayagupd.client.mvp.XGInjector"/> <set-configuration-property name="UiBinder.useSafeHtmlTemplates" value="true" /> <extend-property name="locale" values="kh" /> <extend-property name="locale" values="en" /> <set-property name="locale" value="kh"/> <set-property-fallback name="locale" value="kh"/> <entry-point class="com.prayagupd.client.XEntryPoint"/> 读作:

XEntryPoint.java

home.jsp for gwt-loading

public class XEntryPoint implements EntryPoint {

    private final IUserServiceAsync rpc = GWT.create(IUserService.class);

    @Override
    public void onModuleLoad() {
            //
        rpc.getLocale(new AsyncCallback<String>() {

            @Override
            public void onSuccess(String locale) {
                GWT.log("Locale From Spring : " + locale);
                GWT.log("Locale From GWT : " + LocaleInfo.getCurrentLocale().getLocaleName());
                            //here i want to set locale to gwt
                            //something like GWTLocale.setLocale(locale);
            }

            @Override
            public void onFailure(Throwable caught) {
                GWT.log(caught.getMessage());
            }
        });
            DelayedBindRegistry.bind(ginjector);
            ginjector.getPlaceManager().revealCurrentPlace();
    }
}

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > <%@tag import="java.util.Calendar"%> <%@ tag body-content="scriptless"%> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="spr" tagdir="/WEB-INF/tags"%> <%@ attribute name="isgwt" required="true" type="java.lang.Boolean"%> <!-- <!DOCTYPE html> --> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link rel="shortcut icon" type="image/png" href="/images/favicon.png" /> <script type="text/javascript" src="js/reload.captcha.js"></script> <script type="text/javascript" src="js/date.picker.js"></script> <link rel="stylesheet" href="/styles/innerstyle.css" type="text/css" /> <c:if test="${not isgwt}"> <link rel="stylesheet" href="/styles/mainstyler.css" type="text/css" /> <script type="text/javascript" src="js/modernizer.custom.js"></script> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/jquery-ui-custom.min.js"></script> <script src="js/jquery.thumbnailScroller.js"></script> </c:if> <c:if test="${isgwt}"> <meta name="gwt:property" content="locale=${locale}"> <script type="text/javascript" language="javascript" src="upd/upd.nocache.js"></script> </c:if> <script type="text/javascript"> $(window).load(function() { $('#slider').nivoSlider(); }); </script> <title><c:out value="${locale}"></c:out><spring:message code="page.header" /></title> </head> <body> <c:choose> <c:when test="${empty username}"> <div class="header_con"> <div class="header_in"> <spr:header /> <spr:login /> <div class="clear"></div> </div> <div class="main_con"> <jsp:doBody /> <spr:footer /> </div> <div class="clear"></div> </div> </c:when> <c:otherwise> <div id="mainHolder"> <div id="wrapper"> <spr:headerInner /> <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position: absolute; width: 0; height: 0; border: 0"></iframe> <div> <div id="gwt_holder"> <c:if test="${isgwt}"> <div id="loader" class="loader"> </div> </c:if> <div id="gwt"></div> </div> </div> </div> </div> </c:otherwise> </c:choose> </body> </html> ?locale=en添加到gwt url可以很好地工作,但是只想告诉GWT我想要以编程方式使用这个语言环境并希望它始终使用该语言环境。

当我查看?locale=kh源代码时,我可以看到*.html标记已从<meta>传入正确的locale

enter image description here

参考

GWT dynamic internationalization,Colin Alworth

How i change the locale language of the application

3 个答案:

答案 0 :(得分:6)

使用dynamic host page注入正确的<meta name="gwt:property" content="locale=XXX">

记住GWT bootstrap sequence:一旦你的onModuleLoad被调用,就已经选择了排列(包括语言环境)。您必须更改引导序列,以便为用户选择正确的置换。 ?locale=XXX执行此操作(因为locale属性具有<property-provider>,其中包含locale查询字符串参数,以及<meta>上方。

另见https://code.google.com/p/google-web-toolkit-incubator/wiki/ServerSideLocaleSelection一些想法(请注意:已弃用的项目!)

最后,您的*.gwt.xml存在一些问题,首先是kh不是valid locale

国际化您的应用的工作流程如下:

  1. 列出您的语言区域:

    <extend-property name="locale" value="en" />
    <extend-property name="locale" value="fr" />
    
  2. 通过将default属性设置为支持的区域设置的完整列表来删除locale区域设置:

    <set-property name="locale" value="en,fr" />
    
  3. 设置后备区域设置:

    <set-property-fallback name="locale" value="en" />
    
  4. 您可以选择使用属性locale.queryparamlocale.cookielocale.usemetalocale.useragentlocale.searchorder来确定区域设置的确定方式(请参阅{ {1}}表示默认值和接受值。

    最后,添加代码以选择区域设置(例如上面的动态I18N.gwt.xml

答案 1 :(得分:2)

solution启发的Thomas Broyer

<强> X.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.3.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.3.0/distro-source/core/src/gwt-module.dtd">
<module rename-to="x">
    <inherits name="com.google.gwt.user.User"/>
    <inherits name="com.google.gwt.i18n.I18N" />
    <inherits name="com.google.gwt.http.HTTP" />
    <inherits name="com.google.gwt.json.JSON"/>

    <inherits name="com.google.gwt.uibinder.UiBinder" />
    <inherits name="com.google.gwt.inject.Inject" />
    <inherits name="com.gwtplatform.mvp.Mvp" />
    <inherits name="gwtquery.plugins.droppable.Droppable"/>

    <source path="client" />
    <source path="shared" />

    <define-configuration-property name="gin.ginjector" is-multi-valued="false"/>
    <set-configuration-property name="gin.ginjector" value="com.prayagupd.client.mvp.XGInjector"/>
    <set-configuration-property name="UiBinder.useSafeHtmlTemplates" value="true" /> 

    <extend-property name="locale" values="kh" />
    <extend-property name="locale" values="en" />
    <set-property-fallback name="locale" value="kh"/>

    <entry-point class="com.prayagupd.client.XEntryPoint"/>

</module>

而且,home.jsp

<c:if test="${isgwt}">
<meta name="gwt:property" content="locale=${locale}">
<script type="text/javascript" language="javascript" src="upd/upd.nocache.js"></script>
</c:if>

从Spring Controller传递的语言环境

{
    //...
    modelMap.put("locale", locale);
    return "home";
}

答案 2 :(得分:0)

除了一件事,Thomas Broyer的回答是正确的。您不必强制使用“动态主机页面”,可以在客户端动态定义元标记:

<script type="text/javascript">
    $.ajax("rest/service/default-locale").done(function(data) {
        if (data) {           
            var metaLocale = $("<meta name='gwt:property' content='locale=" + data + "'>");
            $("head").append(metaLocale);
        }
        var jsLink = $("<script src='myapp.nocache.js'>");
        $("head").append(jsLink);
    });
</script>

这样,在GWT应用程序启动之前,可以在客户端进行任何其他修改。