我希望在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
。
参考
GWT dynamic internationalization,Colin Alworth
答案 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。
国际化您的应用的工作流程如下:
列出您的语言区域:
<extend-property name="locale" value="en" />
<extend-property name="locale" value="fr" />
通过将default
属性设置为支持的区域设置的完整列表来删除locale
区域设置:
<set-property name="locale" value="en,fr" />
设置后备区域设置:
<set-property-fallback name="locale" value="en" />
您可以选择使用属性locale.queryparam
,locale.cookie
,locale.usemeta
,locale.useragent
和locale.searchorder
来确定区域设置的确定方式(请参阅{ {1}}表示默认值和接受值。
最后,添加代码以选择区域设置(例如上面的动态I18N.gwt.xml
)
答案 1 :(得分:2)
<强> 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)
<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应用程序启动之前,可以在客户端进行任何其他修改。