7

国際化に問題があります。GWTアプリケーションで2つの言語のサポートを実装しようとしています。残念ながら、UiBinderを使用してそれを行う方法の完全な例を見つけることはできませんでした。それが私がしたことです:

私のモジュール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に3つのプロパティファイルがあります。

Message.properties

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の国際化の原則と、私の​​例が機能しない理由を説明してください。任意の提案をいただければ幸いです。

4

1 に答える 1

6

まず、ファイルにはMessage_fr.properties(resp。Message_en.properties)ではなくMessage.properties_fr(resp。 )という名前を付ける必要がありますMessage.properties_en

その後、ui:msg他。UiBinderでは、定義したインターフェイスを使用せずに、インターフェイス( extending))を生成com.google.gwt.i18n.client.Messagesします。そのために、あなたは使用しなければなりません{string.greeting}(あなたがあなたに与えたstringのはどこですか)。UiBinderジェネレーターは、のクラスに対してを実行します。これは、Javaコードで実行したことです。 ui:fieldui:withGWT.create()typeui:with

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

暗黙のメッセージインターフェイス(UiBinderによって生成される)では、上のさまざまなui:generateXxx属性がインターフェイス上の注釈(注釈のプロパティまたは注釈の値)ui:UiBinderに変換されます。 次に、ごとに1つのメソッドが生成されます。ここで、属性は同等のアノテーション(、 )を生成し、要素のコンテンツはアノテーションの値です。コンテンツ内にウィジェットがある場合、それらはテキスト内のメソッドとプレースホルダーへの引数に変換されます(値はUiBinderによって入力されます)。@Generate@GenerateKeys
ui:msg@Key@Descriptionui:msg@DefaultMessage@DefaultMessage

最初にUiBinderなしで何かを機能させ、それがどのように機能するかを理解することをお勧めします。次に、DevModeまたはコンパイラui:msgを使用-genしてUiBinderで試して、UiBinderが生成するコードを正確に確認できるようにします(実際には、手動で記述したコードのみが生成されます)。

また、を追加する必要があります。そうしないと、 (使用されることはありません)にもかかわらず、ロケール<set-property name="locale" value="en, fr" />が残ります。defaultset-property-fallback

于 2012-05-11T09:16:34.293 に答える