2016-08-15 1 views
1

Я разрабатываю приложение с использованием GWT (первый таймер), и теперь я на том этапе, когда хочу создать центральную структуру для предоставления фактического текстового контента для моего Просмотры.Интернационализация очень длинных текстов с GWT (желательно включая HTML)

Несмотря на то, что возможно определить эти текстовые значения inline (используя UiBinder или вызвать соответствующие методы для соответствующих объектов), мне было бы гораздо удобнее хранить их в центральном месте, как это возможно, используя GWT's Constants. Действительно, мое приложение будет доступно только на одном языке (на данный момент), поэтому все-таки i18n может показаться излишним, но я предполагаю, что эти объекты могут быть лучше всего подходят для того, что мне нужно, так как они тоже , должно быть, было разработано с учетом всего (постоянного) текстового контента.

Однако мое приложение имеет несколько фрагментов текста, которые несколько длиннее и сложнее, чем ваш средний текст ярлыка, то есть они могут охватывать несколько строк и могут потребовать базового форматирования текста. Я придумал несколько идей о том, как исправить эти проблемы, но я далек от удовлетворения.

Первая проблема: Длинные строки.

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

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

    // ... 
} 

Образец выше, содержит очень простое строковое значение, определенное таким образом, что статической строку интернационализации диктует (насколько я знаю). Для того, чтобы добавить поддержку для другого языка, скажем, немецкий, один обеспечит .properties файл, содержащий перевод:

userAdministrationTitle = Benutzeradministration 

Теперь можно легко злоупотребить эту модель до точки и никогда не обеспечивают 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-документ и добавлял HTML-теги, такие как <strong> или <em>.

Дальше по дороге, в точке, где строки считываются и применяются к виджету, который будет отображать их, возникает проблема: установка значения с использованием метода, такого как setText(String), приводит к тому, что строка будет экранирована, а HTML-теги, которые будут печататься вместе с остальной частью текста, а не интерпретироваться как инструкции форматирования. Так не повезло.

Способ решения этой проблемы заключается в том, чтобы отключить строку, предоставленную файлом i18n, и изолировать любые HTML-теги, а затем снова объединить беспорядок вместе с помощью SafeHtmlBuilder и использовать это, чтобы установить значение виджета, что действительно приведет к отображению форматированного текста. Однако это звучит как большая часть сложностей, поэтому мне не совсем нравится эта идея.

Итак, что я ищу сейчас, дорогой пользователь, который на самом деле прочитал это полностью (спасибо!)? Я ищу решения, которые не требуют таких хаков, как описанные выше, и предоставляют функциональность, которую я ищу.В качестве альтернативы, я приветствую любое руководство, если я ошибаюсь полностью (первый таймер GWT, как я упоминал одну вечность назад :-)). Или в основном что-нибудь, что по теме, и может помочь найти решение. Допустимым решением, например, была бы такая система, как string value files used in Android development (которая позволяет создавать HTML-тексты, но, очевидно, требует, чтобы содержащиеся элементы пользовательского интерфейса принимали это).

ответ

3

Если вы используете UiBinder, поддержка i18n встроена. В противном случае используйте «Сообщения» и «Константы» и используйте значение с помощью setHTML, а не setText.

Для длинных строк вы должны иметь возможность использовать многострочные значения в файлах свойств, заканчивая строками с обратной косой чертой.

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-файлы в одном пакете - один для каждого языка:

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.