2

我想在gwt-localeSpring 的帮助下设置用户选择的语言环境LocaleContextHolder

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

我实际上在 Spring MVC 中有登录界面,在gwtp. 登录之前在外部界面中选择的相同语言环境用户也必须传递给gwt

不幸的是,我没有看到任何 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读作:

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();
    }
}

用于 gwt 加载的 home.jsp

<!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=enor添加?locale=kh到 gwt url 效果很好,但只想告诉 GWT 我希望以编程方式使用此语言环境并希望它始终与该语言环境一起工作。

当我查看*.html源代码时,我可以看到注入的<meta>标签具有正确的localeSpringController.

在此处输入图像描述

参考

GWT 动态国际

我如何更改应用程序的语言环境

4

3 回答 3

6

使用动态主机页面,您可以在其中注入正确的<meta name="gwt:property" content="locale=XXX">.

记住 GWT引导序列:一旦你onModuleLoad被调用,就已经选择了排列(包括语言环境)。您必须更改引导顺序,以便它为用户选择正确的排列。?locale=XXX这样做(因为该locale属性具有<property-provider>读取locale查询字符串参数的 a 等),以及<meta>上述内容。

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

最后,您的 存在一些问题*.gwt.xml,首先是kh不是有效的 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" />
    

或者,您可以选择使用属性locale.queryparamlocale.cookielocale.usemetalocale.useragent和确定区域设置的方式locale.searchorder(请参阅I18N.gwt.xml它们的默认值和可接受的值)。

最后,添加代码以选择语言环境(例如<meta>上面的动态)

于 2013-04-30T08:21:53.420 回答
2

受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";
}
于 2013-05-01T10:12:07.483 回答
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 应用程序启动之前在客户端完成。

于 2014-07-30T20:29:40.237 回答