2012-05-11 4 views
6

У меня проблема с интернационализацией. Я пытаюсь реализовать поддержку двух языков в своем приложении GWT. К сожалению, я не нашел полного примера, как это сделать с помощью UiBinder. Вот что я сделал:Как реализовать i18n в приложении GWT?

Мой модуль 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> 

Мой интерфейс Message.java:

package com.myexample.i18nexample.client; 

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

public interface Message extends Constants { 

    String greeting(); 
} 

тот же пакет com.myexample.i18nexample.client имеет три свойства файла :

Message.properti эс:

greeting = hello 

Message_en.properties:

greeting = hello 

Message_fr.properties:

greeting = bonjour 

Мой 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> 

При запуске приложения, я всегда получаю выход в браузере:

Default greeting 

Почему? Что я делаю не так?

Я попытался запустить приложение из разных 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 

Результат не меняется. Хотя я ожидал в последнем случае сообщение bonjour.

Если, например, я использую g:Buttton вместо сообщения ui:msg:

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

Тогда я получаю в результате кнопки с текстом "hello"

И если я ввожу URL:

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

Текст на кнопке изменяется на "bonjour". Здесь все работает так, как ожидалось. Но почему интернационализация не работает в моем первом случае?

И есть разница между следующими ли:

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

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

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

Должны ли быть разные результаты в этих случаях? Как правильно писать?

Пожалуйста, объясните мне принципы интернационализации в GWT и почему мой пример не работает. Любые предложения были бы весьма признательны.

ответ

6

Во-первых, файлы должны быть названы Message_fr.properties (соответственно Message_en.properties), не Message.properties_fr (соотв. Message.properties_en).

Затем ui:msg et al. в UiBinder будет сформировать интерфейс (расширение com.google.gwt.i18n.client.Messages)), не использовать тот, который вы определили. Для этого вам необходимо использовать {string.greeting} (где string - ui:field, который вы указали на ваш ui:with). Генератор UiBinder будет делать GWT.create() на type классе вашего ui:with, что то, что вы сделали в Java коде:

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

В неявном интерфейсе Messages (генерируемой UiBinder), различные атрибуты ui:generateXxx на ui:UiBinder будет преобразован в аннотации на интерфейсе (свойства аннотации @Generate или значение аннотации @GenerateKeys).
Затем, один метод будет генерироваться для каждого ui:msg, где атрибуты генерировать эквивалентные аннотации (@Key, @Description) и содержание ui:msg элемента является значение @DefaultMessage аннотации. Когда у вас есть или виджеты внутри контента, они будут преобразованы в аргументы метода и заполнителей в текст @DefaultMessage (значения будут заполнены UiBinder).

Я предлагаю вам сначала сделать что-то без UiBinder и понять как это работает; затем попробуйте ui:msg в UiBinder, используя -gen в DevMode или компиляторе, чтобы вы могли точно определить, какой код создает UiBinder (да, это действительно только генерирует код, который вы могли бы написать сами вручную).

Кроме того, вы должны добавить <set-property name="locale" value="en, fr" />, или у вас все еще будет локаль default, несмотря на set-property-fallback (она никогда не будет использоваться)).

+0

Простите меня, '.properties' файлы, конечно, на самом деле правильно названы. Это просто опечатка. Спасибо за ваш ответ. Но, к сожалению, это не добавляет ясности для меня и моей проблемы. Все работает правильно без использования UiBinder. Но я хочу понять, как правильно интернационализировать приложение с помощью UiBinder. –

+0

Не могли бы вы написать то, что мне нужно для исправления или предоставить ссылку на полный заполненный образец? Я буду очень признателен! –

+1

См. Https://developers.google.com/web-toolkit/doc/latest/DevGuideUiBinderI18n. Если вы хотите использовать 'ui: msg', вы должны предоставить файлы свойств в том же пакете, названный так же, как интерфейс UiBinder с суффиксом 'ImplGenMessages'. Кроме того, вы можете использовать 'com/google/gwt/i18n/client/LocalizedResource_ .properties' и/или затем централизовать все ваши сообщения. И снова используйте '-gen' и посмотрите на сгенерированный код. –

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