GWT динамическая интернационализация - PullRequest
3 голосов
/ 30 января 2012

В моем приложении (GWT (EXT_GWT) + Spring) мне нужно указать пользователю (после входа в систему) его родной язык, без получения параметров.Например: пользователь заполняет свой логин и пароль при входе в форму, а затем перенаправляет на готовую к работе форму (эта форма должна быть на родном языке пользователя. Язык, который я получаю из db).Мои языковые файлы написаны в файлах .properties и перечислены в файле config.gwt.xml config.

Итак, вопрос - как я могу установить язык?Может быть с сеансом или после записи параметров?Но я не понимаю, как GWT перед загрузкой страницы выбирает нужный язык.Некоторые методы для установки локали в gwt перед загрузкой страницы?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 30 января 2012

Я думаю, что после получения информации о локали пользователя из db вы должны перенаправить его на URL, например (если он из России):

http://www.example.org/myapp.html?locale=ru

Например, вы можете сохранить флаг Boolen, чтобы приложение было локализованов сеансе и выполните следующие действия:

  • получите текущий языковой стандарт LocaleInfo.getCurrentLocale().getLocaleName();
  • сравните его со значением языкового стандарта пользователя
  • , если оно отличается, получите базовый URL, используя GWT.getModuleBaseURL()
  • создание нового URL-адреса на основе предыдущего базового URL-адреса с ?locale=locale_value в конце
  • создание флага локализации true и сохранение его в сеансе;
  • перенаправление на новый URL-адрес с использованием Window.Location.replace(newUrl)

Например, метод localizeApp может выглядеть следующим образом:

    void localizeApp(User user) {
      if (!localized) {
        String currentLocale = LocaleInfo.getCurrentLocale().getLocaleName();
        if (!locale.equals(user.getLocale)) {
          String url = GWT.getModuleBaseURL();
          String newUrl = url + "?locale="+currentLocale;
          localized = true; //and save to session here
          Window.Location.replace(newUrl);
        }
      }     
    }

Более подробную информацию о локализации в GWT вы можете найти здесь Интернационализация GWT-приложения и здесь Интернационализация приложения GWT Думаю, это поможет вам!

4 голосов
/ 31 января 2012

Используя встроенную интернационализацию и используя ее по назначению, вы не сможете сделать это без перезагрузки страницы.Встроенный i18n полагается только на загрузку скомпилированной перестановки, которая соответствует выбранной локали.Это означает, что вы не можете просто добавить метатег, вы не можете просто перевернуть настройку и не сможете читать из встроенного класса LocalInfo.

Два варианта, как я вижу,Во-первых, сделайте перезагрузку менее дорогой, чтобы вы могли использовать то, что поставляется с GWT i18n.Для этого выньте оставшуюся часть приложения из входа в систему, создав новое приложение или используя точки разделения, чтобы загружалось как можно меньше кода.Файлы компиляции должны быть кешированными, поэтому они не должны влиять на время загрузки, а только на время, необходимое для запуска приложения.

Второй вариант, если вы не ограничиваете перезагрузку: не используйте встроенный I18n, но найдите другой способ извлечения строк на основе данных времени выполнения (в отличие от обычного подхода во время компиляции).

  • GWT документирует один такой способ сделать это с помощью класса Dictionary, позволяя вам читать из строк, загруженных javascript (см. http://code.google.com/webtoolkit/doc/latest/DevGuideI18n.html#DevGuideDynamicStringInternationalization).. Это можно сделать, загрузив файл JS с этимистрок после входа в систему (рассмотрите ScriptInjector для этого, чтобы вы знали, когда он будет готов). Это дает дополнительное преимущество, заключающееся в том, что вам не нужно перекомпилировать для изменения строк, если вы считаете это преимуществом, и недостатком, который необходим длястроки в JS, а не java и файлы свойств (хотя некоторая тщательная работа сервера может позволить вам сгенерировать этот js из java / properties).
  • Создайте несколько интерфейсов I18n вместо одного. Вероятно, все они должны реализовывать общийинтерфейс, чтобы вы могли передавать экземпляры всем, что им нужно, виджетам и т. д. Проблема с этим подходом заключается в том, что при использовании встроенного I18n вы компилируете все строки, независимо от того, используются они или нетЧтобы улучшить это, рассмотрим точку разделения для каждоготребуется кейл, и убедитесь, что вы загружаете только один из них.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...