Отдельные языковые и форматные локали в приложении калитки?


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

Если вы задаете локаль сеанса, чтобы сказать Locale.Немецкий, вы получаете как немецкий формат чисел и дат, так и немецкие ресурсы (например, MyForm_de.собственности).

Мы обошли это, установив языковой стандарт сеанса в языковой стандарт числа и даты, а затем используя пользовательский ComponentStringResourceLoader для загрузки строк (return супер.loadStringResource(clazz, ключ, язык != ноль ? новая Локаль (язык): локаль, стиль, вариация)). Однако похоже, что строки кэшируются, потому что если я войду в систему как разные пользователи, я начну получать смесь языков.

Кто-нибудь знает, как управлять кэшированием (предполагая, что это вызывает проблему)? Примечание: Я не хочу препятствовать кэшированию (так как это, вероятно, повредит производительности). Я думаю, что хочу переопределить поведение кэширования, чтобы оно корректно работало с нашими обычаями загрузчик ресурсов.

Или есть ли вообще лучший подход к решению этой проблемы?

Вот код, который мы использовали для пользовательского StringResourceLoader.

ComponentStringResourceLoader myComponentStringResourceLoader = new ComponentStringResourceLoader() {
@Override
public String loadStringResource(Class<?> clazz, String key, Locale locale, String style, String variation) {
   return super.loadStringResource(clazz, key, getLoggedOnUser().getUILanguageLocale(), style, variation);
  }
};
getResourceSettings().getStringResourceLoaders().add(0, myComponentStringResourceLoader);

Вот код для установки локали сеанса (используется для форматирования чисел и дат).

getSession().setLocale(getLoggedOnUser().getNumberAndDateLocale());
1 2

1 ответ:

Вы можете использовать локаль сеанса для i18n меток и либо переопределить #getLocale (), либо #getConverter () для компонентов, которые должны использовать другую локаль для дат. Я думаю, вы говорите о текстовом поле,которое должно отображать его значение в немецком языке. Если да, то просто создайте поле GermanTextField, которое всегда возвращает Locale.Немецкий язык в своем #getLocale ().