2012-05-11 21 views
6

Tôi gặp vấn đề với quốc tế. Tôi đang cố gắng triển khai hỗ trợ hai ngôn ngữ trong ứng dụng GWT của mình. Thật không may tôi không bao giờ tìm thấy một ví dụ hoàn chỉnh làm thế nào để làm điều đó với sự giúp đỡ của UiBinder. Đó là những gì tôi đã làm:Làm cách nào để triển khai i18n trong ứng dụng GWT?

mô-đun của tôi 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> 

giao diện My Message.java:

package com.myexample.i18nexample.client; 

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

public interface Message extends Constants { 

    String greeting(); 
} 

Các gói phần mềm tương tự com.myexample.i18nexample.client có ba thuộc tính tập tin :

Message.properti es:

greeting = hello 

Message_en.properties:

greeting = hello 

Message_fr.properties:

greeting = bonjour 

tập tin UiBinder My 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> 

Khi ứng dụng bắt đầu, tôi luôn nhận được đầu ra trong trình duyệt:

Default greeting 

Tại sao? Tôi đang làm gì sai?

Tôi cố gắng để chạy các ứng dụng từ URL khác nhau:

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 

Kết quả không thay đổi. Mặc dù tôi mong đợi trong trường hợp cuối cùng là một tin nhắn bonjour.

Nếu ví dụ tôi sử dụng một g:Buttton thay vì thông điệp ui:msg:

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

Sau đó, tôi nhận được như là kết quả của các nút với văn bản "hello"

Và nếu tôi nhập URL:

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

Văn bản trên nút thay đổi thành "bonjour". Ở đây mọi thứ hoạt động như mong đợi. Nhưng tại sao quốc tế hóa không hoạt động trong trường hợp đầu tiên của tôi?

Và cho dù có sự khác biệt giữa những điều sau đây:

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

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

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

Nếu có kết quả khác nhau trong những trường hợp này? Làm thế nào để viết đúng?

Vui lòng giải thích cho tôi nguyên tắc quốc tế hóa trong GWT và lý do tại sao ví dụ của tôi không hoạt động. Mọi đề xuất sẽ được đánh giá cao.

Trả lời

6

Trước tiên, các tệp phải được đặt tên Message_fr.properties (resp. Message_en.properties), không phải Message.properties_fr (resp. Message.properties_en).

Sau đó, ui:msg et al. trong UiBinder sẽ tạo ra một giao diện (mở rộng com.google.gwt.i18n.client.Messages)), không sử dụng giao diện mà bạn đã xác định. Đối với điều đó, bạn phải sử dụng {string.greeting} (trong đó stringui:field bạn đã cung cấp cho số ui:with) của mình. Máy phát điện UiBinder sẽ làm một GWT.create() trên lớp type của ui:with của bạn, đó là những gì bạn muốn đã được thực hiện trong mã Java:

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

Trong giao diện Tin nhắn ngầm (tạo ra bởi UiBinder) thì khác nhau ui:generateXxx thuộc tính trên ui:UiBinder sẽ được chuyển thành chú thích trên giao diện (thuộc tính của chú thích @Generate hoặc giá trị của chú thích @GenerateKeys).
Sau đó, một phương thức sẽ được tạo cho mỗi ui:msg, trong đó các thuộc tính tạo chú thích tương đương (@Key, @Description) và nội dung của phần tử ui:msg là giá trị của chú thích @DefaultMessage. Khi bạn có hoặc các vật dụng bên trong nội dung, chúng sẽ được chuyển thành các đối số cho phương thức và trình giữ chỗ trong văn bản @DefaultMessage (các giá trị sẽ được điền bởi UiBinder).

Tôi khuyên bạn nên tạo một thứ gì đó hoạt động mà không cần UiBinder trước và hiểu cách hoạt động của; sau đó thử ui:msg trong UiBinder, sử dụng -gen trong DevMode hoặc trình biên dịch để bạn có thể thấy chính xác mã nào mà UiBinder tạo (có, nó thực sự chỉ tạo mã mà bạn có thể tự viết bằng tay).

Ngoài ra, bạn nên thêm <set-property name="locale" value="en, fr" /> hoặc bạn vẫn sẽ có miền địa phương default xung quanh, mặc dù set-property-fallback (nó sẽ không bao giờ được sử dụng)).

+0

Xin lỗi, các tệp '.properties' của khóa học thực sự được đặt tên chính xác. Nó chỉ là một lỗi đánh máy. Cảm ơn bạn vì câu trả lời. Nhưng tiếc là nó không thêm rõ ràng cho tôi và vấn đề của tôi. Mọi thứ hoạt động bình thường mà không cần sử dụng UiBinder. Nhưng tôi muốn hiểu cách quốc tế hóa một ứng dụng chính xác với UiBinder. –

+0

Bạn có thể viết chính xác những gì tôi cần sửa chữa hoặc cung cấp liên kết đến mẫu đã hoàn thành đầy đủ không? Tôi sẽ rất biết ơn! –

+1

Xem https://developers.google.com/web-toolkit/doc/latest/DevGuideUiBinderI18n Nếu bạn muốn sử dụng 'ui: msg', bạn phải cung cấp các tệp thuộc tính trong cùng một gói, được đặt tên giống với giao diện UiBinder với hậu tố 'ImplGenMessages'. Ngoài ra, bạn có thể sử dụng 'com/google/gwt/i18n/client/LocalizedResource_ .properties' và/nhưng sau đó tập trung tất cả thư của bạn. Và một lần nữa, sử dụng '-gen' và nhìn vào mã được tạo ra. –