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

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

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

  • Используйте GWTI18N.java - модуль GWT, который дает вам полное использование GWT I18N как на клиенте, так и на сервере и использует "java.lang.reflect.Proxy method"

  • Используйте Kotori I18N -...

  • Другие идеи?

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

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

Ответ 1

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

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

Цель состоит в том, чтобы позволить разработчику GWT использовать свои интерфейсы констант и сообщений на стороне сервера (см. интернационализацию). Реализация основана на java-отражении api. Он загружает файлы свойств из пути к классам (той же папке, что и интерфейс). Он поддерживает константы, константыWithLookup, сообщения (множественное число тоже). Лицензия - 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");