Как я могу интернационализировать страницу GWT UIBinder с сообщениями?
Я пытаюсь интернационализировать приложение 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();
}
Однако это не работает. Как я могу это сделать?
Ответы
Ответ 1
Update:
Поскольку Игорь написал свой ответ, появился новый метод использования сообщений в подшивке.
<span>This <ui:text from="{msgRes.message}" /> has been internationalized</span>
Этот метод использует GWT интеграцию с текстовым ресурсом UiBinder
Ответ 2
Update:
пожалуйста, проверьте logan answer ниже для решения, доступного в последних версиях GWT.
У меня была (на самом деле) та же проблема, что и у вас - после перехода на GWT 2.0 у меня был файл свойств, который я хотел использовать в своих файлах UiBinder. К сожалению, я не мог заставить его работать так, как хотелось бы - кажется, разработчики GWT хотят, чтобы люди использовали синтаксис, описанный в i18n guide for 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
title и т.д., а не для содержимого divs:/Вы можете заполнить те, которые содержатся в классе за шаблоном UiBinder, но должен быть лучший способ.
Я надеялся, что вы можете установить внутренний HTML через innerHTML
(так как UiBinder должен распознать этот метод и позволить установить его через шаблон XML/UiBinder), но, увы, в прошлый раз, когда я его проверил, он не работал:/
Ответ 3
Известна проблема с UiBinder в сочетании с интернационализацией, см. также этот последний поток в gwt bugtracker: 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