2010-02-18 7 views
21

Estoy tratando de internacionalizar una aplicación UIBinder con archivos de propiedades. Dado que ya tenemos muchas traducciones expuestas por la interfaz com.google.gwt.i18n.client.Messages (GWT 1.7.1), nos gustaría reutilizar estos mensajes.¿Cómo puedo internacionalizar una página de GWT UIBinder con mensajes?

he intentado lo siguiente:

<!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> 

La clase MessageConstants se parece a esto:

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

Sin embargo, esto no funciona. ¿Cómo puedo hacer esto?

Respuesta

27

actualización:

Desde Igor escribió su respuesta, ha habido un nuevo método de usar mensajes de aglutinante de la interfaz de usuario.

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

Este método utiliza text resource UiBinder integration

+1

Si mejora su contestar con un enlace a la documentación, estoy seguro de que recibiría los merecidos votos :) (Yo quería editar y agregar el enlace yo mismo, pero después de un rápido vistazo a los documentos, parece que no puedo encontrar el método que se están refiriendo a). –

+0

Gracias por los comentarios Igor. No estoy seguro de dónde encontré este truco, pero definitivamente no estaba en la documentación. ¿Conoces a alguien que trabaje en Google a quien podría molestar para agregarlo a los documentos de GWT? – logan

+1

Desearía saberlo;) Pero puede comunicarse con los desarrolladores de GWT a través de la [lista de discusión de GWT] (http://groups.google.com/group/google-web-toolkit) o ​​abrir un nuevo ticket en su [bugtracker] (http://code.google.com/p/google-web-toolkit/issues/list). –

8

Existe un problema conocido con el UiBinder en combinación con la internacionalización, vea también este hilo reciente en el bugtracker de gwt: http://code.google.com/p/google-web-toolkit/issues/detail?id=4355.

En comment 4 se da una solución:

Si el archivo UiBinder se llama, por ejemplo, 'LoginView.ui.xml' luego llamar el archivo de propiedades LoginViewLoginViewUiBinderImplGenMessages.properties (Aparece sí 'LoginView' dos veces) y lo puso al lado de la vista de archivos java en el paquete fuente, por lo que en total tendrá 3 archivos:

LoginView.ui.xml 
LoginView.java 
LoginViewLoginViewUiBinderImplGenMessages.properties 
+0

Gracias, buena información de GWT en los comentarios sobre ese tema - todo el i18n con UiBinder parece todavía áspero en los bordes a mí, deseo que el equipo de GWT haría menos " hacky ". –

+0

Es posible que también desee consultar el script de python propuesto con GWTP para centralizar sus cadenas localizadas en el mismo archivo: http://code.google.com/p/gwt-platform/wiki/MergeLocale –

13

Actualización:
marque logan's answer a continuación para una solución disponible en las versiones recientes de GWT.


tuve (en realidad, tener) el mismo problema que usted - después de migrar a GWT 2.0 Yo tenía un archivo de propiedades que quería utilizar en mis archivos UiBinder. Desafortunadamente, no pude hacer que funcionara como quería, parece que los desarrolladores de GWT quieren que la gente use la sintaxis descrita en el i18n guide for UiBinder, donde se crea una interfaz de mensaje durante la compilación para cada plantilla de UiBinder, etc.

de todos modos, todavía se puede utilizar Messages interfaces externas como esto:

<!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> 

sin embargo, que sólo funciona para cosas como título Button 's, etc, no contenido de divs:/usted puede llenar los de la clase detrás la plantilla de UiBinder, pero debería haber una mejor manera.

Tenía la esperanza de que se podría establecer el código HTML interno a través de innerHTML (ya UiBinder debe reconocer que el método y permita establecer su valor a través de XML plantilla/UiBinder) pero por desgracia, la última vez que lo comprobé que no funcionaba:/

Cuestiones relacionadas