GWT I18N на стороне сервера

#java #gwt #servlets #internationalization

#java #большой объем #сервлеты #интернационализация #gwt

Вопрос:

Каков наилучший способ реализовать интернационализацию GWT на стороне сервера?

  1. Используйте собственные файлы свойств Java (не уверен, как читать и как найти нужный языковой файл) (строка unicode должна быть в кодировке ASCII)

  2. Использовать GWTI18N.java — Модуль GWT, который обеспечивает беспрепятственное использование GWT I18N как на клиенте, так и на сервере и использует «метод java.lang.reflect.Proxy»

  3. Используйте Kotori I18N — …

  4. Другие идеи?

Как я могу найти и передать локализацию от клиента к серверу?

На стороне сервера у меня есть сервлет, который по-прежнему не использует какой-либо зависящий от GWT источник, не лучше ли этого не делать?

Ответ №1:

Я нашел это решение, и оно выглядит очень хорошо

gwt-i18n-server — Обеспечивает простую поддержку функции gwt i18n на стороне сервера

Цель состоит в том, чтобы разрешить разработчику GWT использовать свои константы и интерфейсы сообщений на стороне сервера (см. интернационализация). Реализация основана на java reflect api. Он загружает файлы свойств из classpath (той же папки, что и интерфейс). Он поддерживает константы, ConstantsWithLookup, сообщения (тоже во множественном числе). Лицензия — LGPL.

Текущую локаль клиента можно найти следующим образом:

 LocaleInfo.getCurrentLocale().getLocaleName()
  

Ответ №2:

Следуя другим потокам здесь, в SO, я придумал это решение, которое также учитывает кодировку, используемую для файлов свойств (что может вызвать проблемы, поскольку ResourceBundle использует по умолчанию «ISO-8859-1»):

 import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.ResourceBundle;

public class MyResourceBundle {

    // feature variables
    private ResourceBundle bundle;
    private String fileEncoding;

    public MyResourceBundle(Locale locale, String fileEncoding){
        this.bundle = ResourceBundle.getBundle("com.app.Bundle", locale);
        this.fileEncoding = fileEncoding;
    }

    public MyResourceBundle(Locale locale){
        this(locale, "UTF-8");
    }

    public String getString(String key){
        String value = bundle.getString(key); 
        try {
            return new String(value.getBytes("ISO-8859-1"), fileEncoding);
        } catch (UnsupportedEncodingException e) {
            return value;
        }
    }
}
  

Способ использования этого был бы очень похож на обычное использование ResourceBundle:

 private MyResourceBundle labels = new MyResourceBundle("es", "UTF-8");
String label = labels.getString(key)
  

Или вы можете использовать альтернативный конструктор, который по умолчанию использует UTF-8:

 private MyResourceBundle labels = new MyResourceBundle("es");