2013-04-30 2 views
2

Я хочу установить gwt-locale, взяв пользовательский язык с помощью Spring LocaleContextHolder.GWT Dynamic Locale

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

home.jsp для GWT-загрузка

<!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 или ?locale=kh в GWT URL работает отлично, но хочу сказать GWT только один раз, что я хочу эту локаль программно и хотите работать всегда с этой локалью вперед.

Когда я смотрю на *.html исходный код, я могу видеть вводил <meta> тег с правильной locale передается от SpringController.

enter image description here

Ссылки

GWT dynamic internationalization, Колин Alworth

How i change the locale language of the application

ответ

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 для каких-то идей (BEWARE: устаревший проект)

Наконец, есть несколько проблем с *.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" /> 
    

По желанию, вы можете выбрать, как локаль определяется с помощью свойства locale.queryparam, locale.cookie, locale.usemeta, locale.useragent и locale.searchorder (см I18N.gwt.xml по их умолчанию и принятых значений) ,

И, наконец, добавить код для выбора локали (например, динамическое <meta> выше)

+0

Я добавил '<с: если тест = "$ {isgwt}"> ' в 'home.jsp' (обновленный 'home.jsp' выше) Пропускает параметр locale из' SpringController'. Но 'LocaleInfo.getCurrentLocale(). GetLocaleName()' всегда возвращает 'kh', даже если вы пропустите' locale = en' из 'SpringController'. ** Все, что отсутствует или неуместно ?? ** – prayagupd

+0

У вас должно быть '', либо удалить строку, либо установить 'значение' в' kh, en'; но тогда '? locale = en' не должно было работать. Вы уверены, что '$ {locale}' из Spring верен? –

+0

Я попытался удалить '' to ' '. True '? Locale = kh' не работает. Я обновил скриншот выше, чтобы доказать правильность 'locale', передаваемого из' SpringController'. [html-source-with-meta] (http://i.stack.imgur.com/wKlLD.png) GWT предупреждает меня 'com.google.gwt.core.ext.BadPropertyValueException: свойство 'locale' не может быть установлено к неожиданному значению «default» – prayagupd

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"; 
} 
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.

Смежные вопросы