2016-08-15 2 views
1

私はGWT(最初のタイマー)を使用してアプリケーションを開発し、私は私に実際のテキストベースのコンテンツを提供するために、中央構造を確立したいの段階で今の私です再生回数国際化する非常に長いテキスト

これらのテキスト値をインラインで定義することは可能ですが(UiBinderを使用するか、対応するオブジェクトで適切なメソッドを呼び出すこと)、GWTのConstantsを使用して可能な限り中央の場所に格納する方がはるかに快適です。確かに、私のアプリケーションは1つの言語でしか利用できないので(今のところ)、i18nは残酷と思われるかもしれませんが、私はそれらの施設が私が必要とするものに最も適していると仮定しています。すべての(一定の)テキストコンテンツを念頭に置いて設計されていなければなりません。

しかし、私のアプリケーションは、彼らはいくつかの行にまたがる可能性があり、基本的なテキストの書式を必要とするかもしれないという意味、やや長く、より複雑なあなたの平均ラベルテキストよりもテキストのいくつかの通路を備えています。私はそれらの問題を解決する方法についていくつかのアイデアを考え出しましたが、私は満足していません。

まず問題:長々と文字列値。

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

public interface AppConstants extends Constants { 
    @Constants.DefaultStringValue("User Administration") 
    String userAdministrationTitle(); 

    // ... 
} 

サンプルを上記のように定義された非常に単純な文字列値を含むことが静的文字列の国際おもむく(私の知る限り)。別の言語のサポートを追加するには、たとえば、ドイツ語、1翻訳含む.propertiesファイルを提供します:今

userAdministrationTitle = Benutzeradministration 

を、1の代わりに空の文字列を残して、簡単にポイントにこのパターンを乱用し、決してDefaultStringValueを提供することができませんでした。次に、デフォルトの言語のファイル.propertiesを作成し、翻訳のようにテキストを追加することができます。

aVeryLongText = This is a really long text that describes some features of the 
       application in enough detail to allow the user to act on a basis 
       of information rather than guesswork. 

第二の問題:フォーマット部品のその時でさえ、しかし、このように、単にいくらか良く形式のファイルを維持するために長い値のために改行を適用するには(私の知る限りでは)不可能ですテキスト

値は平易な文字列なので、そこには書式設定の余地があまりありません。本物のHTML文書に直接テキストを書き込んで、<strong><em>のようなHTMLタグを追加すると、私は同じことをやります。

文字列が読み込まれ、表示されるウィジェットに適用された時点で、問題があります。setText(String)のようなメソッドを使用して値を設定すると、その文字列がエスケープされ、書式設定の指示として解釈されるのではなく、残りのテキストと一緒に印刷されるHTMLタグ。だから運はない。

これを解決する方法は、i18nファイルによって提供される文字列を切り離してHTMLタグを分離し、次にSafeHtmlBuilderを使用して再び混乱を焼き、これを使用してウィジェットの値を設定しますフォーマットされたテキストが表示されます。しかし、それはあまりにも複雑すぎるように聞こえるので、私はその考えがあまり好きではありません。

だから私は今何を探していますか、本当にこれを全部読んでくれた親愛なるユーザー(ありがとう!)?私は上記のようなハッキングを必要としないソリューションを探しており、私が探している機能を提供しています。あるいは、私が間違った経路にいる(GWT first-timer、永遠の前に私が言いましたように:-))場合、私はどんな指針も歓迎します。または基本的に話題にあって、解決策を見つけるのに役立つものであれば何でも構いません。例えば、許容可能な解決策は、string value files used in Android developmentのようなシステムです(これは、テキストのHTMLスタイルを可能にしますが、それを受け入れるには明らかにUI要素が含まれている必要があります)。

答えて

3

UiBinderを使用している場合は、i18nサポートが組み込まれています。それ以外の場合は、MessagesおよびConstantsを使用し、setTextではなくsetHTMLで値を使用します。

長い行の場合は、バックスラッシュで行を終了することで、プロパティファイルで複数行の値を使用できるようになります。

4

幸いにも、あなたが使用できる標準的な解決策があります。まず、あなたはClientBundleを作成する必要があります:あなたは、独自のパッケージにこのバンドルを配置する必要があり

public interface HelpResources extends ClientBundle { 

    public static final HelpResources INSTANCE = GWT.create(HelpResources.class); 

    @Source("account.html") 
    public ExternalTextResource account(); 

    @Source("organization.html") 
    public ExternalTextResource organization(); 
} 

。その後、同じパッケージにHTMLファイルを追加 - 各言語に1つずつ:

account.html 
account_es.html 
organization.html 
organization_es.html 

は今、あなたがそれを使用する必要がある場合、あなたは:

private HelpResources help = GWT.create(HelpResources.class); 
... 

    try { 
     help.account().getText(new ResourceCallback<TextResource>() { 

     @Override 
     public void onError(ResourceException e) { 
      // show error message 
     } 

     @Override 
     public void onSuccess(TextResource r) { 
      String text = r.getText(); 
      // Pass this text to HTML widget 
     } 

    } catch (ResourceException e) { 
     e.printStackTrace(); 
    } 

をあなたはこのテキストを表示するためにHTML widgetを使用する必要がありますHTMLタグが含まれている場合