2012-05-11 20 views
6

Tengo un problema con la internacionalización. Estoy tratando de implementar el soporte de dos idiomas en mi aplicación GWT. Desafortunadamente, nunca encontré un ejemplo completo de cómo hacerlo con la ayuda de UiBinder. Eso es lo que hice:¿Cómo implementar i18n en la aplicación GWT?

Mi módulo I18nexample.gwt.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<module rename-to='i18nexample'> 
<inherits name="com.google.gwt.user.User" /> 
<inherits name='com.google.gwt.user.theme.clean.Clean' /> 
<inherits name="com.google.gwt.i18n.I18N" /> 
<inherits name="com.google.gwt.i18n.CldrLocales" /> 
<entry-point class='com.myexample.i18nexample.client.ExampleI18N' /> 
<servlet path="/start" class="com.myexample.i18nexample.server.StartServiceImpl" /> 
    <extend-property name="locale" values="en, fr" /> 
    <set-property-fallback name="locale" value="en" /> 
</module> 

Mi interfaz Message.java:

package com.myexample.i18nexample.client; 

import com.google.gwt.i18n.client.Constants; 

public interface Message extends Constants { 

    String greeting(); 
} 

El mismo paquete com.myexample.i18nexample.client tiene tres archivo de propiedades :

Message.properti es:

greeting = hello 

Message_en.properties:

greeting = hello 

Message_fr.properties:

greeting = bonjour 

mi archivo UiBinder Greeting.ui.xml:

<!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:generateFormat="com.google.gwt.i18n.rebind.format.PropertiesFormat" 
    ui:generateKeys="com.google.gwt.i18n.rebind.keygen.MD5KeyGenerator" 
    ui:generateLocales="default" > 
    <ui:with type="com.myexample.i18nexample.client.Message" field="string" /> 
    <g:HTMLPanel> 
     <ui:msg key="greeting" description="greeting">Default greeting</ui:msg>  
    </g:HTMLPanel> 
</ui:UiBinder> 

Cuando se inicia la aplicación, siempre me dan la salida en el navegador:

Default greeting 

¿Por qué? ¿Qué estoy haciendo mal?

Me trataron de ejecutar la aplicación de diferentes URL:

http://127.0.0.1:8888/i18nexample.html?gwt.codesvr=127.0.0.1:9997 

http://127.0.0.1:8888/i18nexample.html?locale=en&gwt.codesvr=127.0.0.1:9997 

http://127.0.0.1:8888/i18nexample.html?locale=fr&gwt.codesvr=127.0.0.1:9997 

El resultado no cambia. Aunque esperaba en el último caso un mensaje bonjour.

Si por ejemplo yo uso un g:Buttton en lugar del mensaje ui:msg:

<g:HTMLPanel> 
    <g:Button text="{string.greeting}" />  
</g:HTMLPanel> 

en cuando me siento como resultado del botón con el texto "hello"

Y si entro en la URL:

http://127.0.0.1:8888/i18nexample.html?locale=fr&gwt.codesvr=127.0.0.1:9997 

El texto del botón cambia a "bonjour". Aquí todo funciona como se espera. Pero, ¿por qué la internacionalización no funciona en mi primer caso?

Y si hay una diferencia entre lo siguiente:

<ui:msg description="greeting">Default greeting</ui:msg> 

<ui:msg description="greeting">hello</ui:msg> 

<ui:msg description="greeting"></ui:msg> 

Debería existir diferentes resultados en estos casos? Cómo escribir correctamente?

Explíqueme los principios de la internacionalización en GWT y por qué mi ejemplo no funciona. Cualquier sugerencia sería muy apreciada.

Respuesta

6

En primer lugar, los archivos se deben nombrar Message_fr.properties (resp. Message_en.properties), no Message.properties_fr (resp. Message.properties_en).

Luego ui:msg et al. en UiBinder se generar una interfaz (que se extiende com.google.gwt.i18n.client.Messages)), no utilice uno que haya definido. Para eso, debe usar {string.greeting} (donde string es el ui:field que entregó a su ui:with). El generador UiBinder hará un GWT.create() en la clase de su typeui:with, que es lo que se ha hecho en código Java:

Message string = GWT.create(Message.class); 
String localizedGreeting = string.greeting(); 

En la interfaz de mensajes implícitos (generada por UiBinder), los diversos atributos ui:generateXxx en el ui:UiBinder se transformará en anotaciones en la interfaz (propiedades de la anotación @Generate, o el valor de la anotación @GenerateKeys).
Luego, se generará un método para cada ui:msg, donde los atributos generan anotaciones equivalentes (@Key, @Description) y el contenido del elemento ui:msg es el valor de la anotación @DefaultMessage. Cuando tenga o widgets dentro del contenido, se convertirán en argumentos para el método y los marcadores de posición en el texto @DefaultMessage (UiBinder rellenará los valores).

Le sugiero que haga algo que funcione sin UiBinder primero, y entienda cómo funciona; luego pruebe el ui:msg en UiBinder, usando -gen en DevMode o en el compilador para que pueda ver exactamente qué código genera UiBinder (sí, realmente solo genera código que podría haber escrito usted mismo a mano).

Además, debe agregar un <set-property name="locale" value="en, fr" /> o aún tendrá la configuración regional default, a pesar del set-property-fallback (nunca se usará).

+0

Perdónenme, los archivos '.properties' por supuesto están nombrados correctamente. Es solo un error tipográfico. Gracias por su respuesta. Pero desafortunadamente no agrega claridad para mí y mi problema. Todo funciona correctamente sin el uso de UiBinder. Pero quiero entender cómo internacionalizar una aplicación correctamente exactamente con UiBinder. –

+0

¿Podría escribir exactamente lo que necesito para corregir o proporcionar un enlace a la muestra completa? ¡Estaría muy agradecido! –

+1

Consulte https://developers.google.com/web-toolkit/doc/latest/DevGuideUiBinderI18n. Si desea usar 'ui: msg', debe proporcionar los archivos de propiedades en el mismo paquete, con el mismo nombre que la interfaz de UiBinder. con un sufijo 'ImplGenMessages'. Alternativamente, puede usar 'com/google/gwt/i18n/client/LocalizedResource_ .properties' y/pero luego centralizar todos sus mensajes. Y de nuevo, use '-gen' y mire el código generado. –

Cuestiones relacionadas