#java #gwt #servlets #internationalization
#java #большой объем #сервлеты #интернационализация #gwt
Вопрос:
Каков наилучший способ реализовать интернационализацию GWT на стороне сервера?
-
Используйте собственные файлы свойств Java (не уверен, как читать и как найти нужный языковой файл) (строка unicode должна быть в кодировке ASCII)
-
Использовать GWTI18N.java — Модуль GWT, который обеспечивает беспрепятственное использование GWT I18N как на клиенте, так и на сервере и использует «метод java.lang.reflect.Proxy»
-
Используйте Kotori I18N — …
-
Другие идеи?
Как я могу найти и передать локализацию от клиента к серверу?
На стороне сервера у меня есть сервлет, который по-прежнему не использует какой-либо зависящий от 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");