Как я могу интернационализировать страницу GWT UIBinder с сообщениями? - PullRequest
22 голосов
/ 18 февраля 2010

Я пытаюсь интернационализировать приложение UIBinder с помощью файлов свойств.Поскольку у нас уже есть много переводов, предоставляемых интерфейсом com.google.gwt.i18n.client.Messages (GWT 1.7.1), мы хотели бы повторно использовать эти сообщения.

Я попробовал следующее:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
 xmlns:g="urn:import:com.google.gwt.user.client.ui" 
 xmlns:res="ui:with:be.credoc.iov.webapp.client.MessageConstants">

 <g:HTMLPanel>
  <div>
   <res:msg key="email">Emaileke</res:msg>:
   <g:TextBox ui:field="email" />
  </div>
 </g:HTMLPanel>
</ui:UiBinder>

Класс MessageConstants выглядит следующим образом:

@DefaultLocale("nl")
public interface MessageConstants extends Messages {
 String email();
}

Однако это не работает.Как я могу это сделать?

Ответы [ 3 ]

28 голосов
/ 30 августа 2011

Обновление:

С тех пор, как Игорь написал свой ответ, появился новый способ использования сообщений в пользовательском интерфейсе.

<span>This <ui:text from="{msgRes.message}" /> has been internationalized</span>

Этот метод использует текстовый ресурс GWT интеграции UiBinder

13 голосов
/ 18 февраля 2010

Обновление:
проверьте ответ логана ниже для решения, доступного в последних версиях GWT.


У меня было (на самом деле, есть) та же проблема, что и у вас - после перехода на GWT 2.0 у меня был файл свойств, который я хотел использовать в своих файлах UiBinder.К сожалению, я не смог заставить его работать так, как хотел - кажется, разработчики GWT хотят, чтобы люди использовали синтаксис, описанный в руководстве i18n для UiBinder - где интерфейс сообщения создается во время компиляции для каждогоШаблон UiBinder и т. Д.

В любом случае, вы все равно можете использовать внешние Messages интерфейсы, например:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui">
    <ui:with field='cc' type='path.to.i18n.SomeMessages'/>
    <ui:with field='res' type='path.to.resource.ResourceBundle'/>
    <ui:style>
        .required {
      color: red;
      font-weight: bold;
    }
    .right {
      text-align: right;    
    }
    .textBox {
      margin-right: 7px;
    }
    </ui:style>
    <g:HTMLPanel styleName='{res.style.form} {res.style.mbox}' ui:field='mainPanel'>
        <h2 ui:field='loginHeader' />
      <h3 ui:field='loginLabel' />
      <div class='{style.textBox}'><g:TextBox ui:field="loginBox" /></div>
      <h3 ui:field='passwordLabel' />
    <div class='{style.textBox}'><g:PasswordTextBox ui:field="passwordBox" /></div>
    <div><g:CheckBox ui:field='rememberMeCheckBox' text='{cc.rememberMeCheckboxText}' /></div>
    <div class='{style.right}'><g:Button ui:field='submitButton' text='{cc.loginSubmitButtonText}' /></div>
    </g:HTMLPanel>
</ui:UiBinder> 

Хотя это работает только для таких вещей, как заголовок Button и т. Д., не содержимое div: / Вы можете заполнить их в классе за шаблоном UiBinder, но должен быть лучший способ.

Я надеялся, что вы можете установить внутренний HTML черезinnerHTML (поскольку UiBinder должен распознавать этот метод и позволять устанавливать его значение с помощью шаблона XML / UiBinder), но, увы, в прошлый раз, когда я проверял, он не работал: /

8 голосов
/ 18 февраля 2010

Существует известная проблема с UiBinder в сочетании с интернационализацией, см. Также эту недавнюю ветку об отслеживателе ошибок gwt: http://code.google.com/p/google-web-toolkit/issues/detail?id=4355.

В комментарий 4 решение дано:

Если ваш файл UiBinder называется, скажем, «LoginView.ui.xml», то вызовите файл свойств LoginViewLoginViewUiBinderImplGenMessages.properties (да, «LoginView» появится дважды) и поместите его рядом с файлом Java представления висходный пакет, так что всего у вас будет 3 файла:

LoginView.ui.xml
LoginView.java
LoginViewLoginViewUiBinderImplGenMessages.properties
...