Русские буквы в CustomizedSystemMessages

Добрый день!
Возникла необходимость выводить информацию по ошибкам на руссском языке:

@Override
public SystemMessages getSystemMessages(SystemMessagesInfo systemMessagesInfo) {
    CustomizedSystemMessages messages = new CustomizedSystemMessages();
    String message = "Нажмите на данное вообщение или Esc";
    messages.setInternalErrorCaption("Личный кабинет - внутренняя ошибка"); messages.setInternalErrorMessage(message);
    messages.setSessionExpiredCaption("Личный кабинет - Сессия устарела"); messages.setSessionExpiredMessage(message);
    messages.setCommunicationErrorCaption("Личный кабинет - коммуникационная ошибка"); messages.setCommunicationErrorMessage(message);
    messages.setCookiesDisabledCaption("Личный кабинет - cookies отключены"); messages.setCookiesDisabledMessage(message);
    messages.setAuthenticationErrorCaption("Личный кабинет - ошибка аутентификации"); messages.setAuthenticationErrorMessage(message);
    return messages;
}

Однако на экране выводится “вопросики” (см. вложение err.jpg )
Все кодировки указаны как UTF-8.
Как это лечится?

31701.jpg

а в какой среде развёрнуто приложение?

А ошибки закинуть в resource bundle и закодировать в юникод? Сие поможет вам.

Среда - Oracle Linux 7.3

Интересная мысль! А есть пример или описание как это сделать?

а у вас на чём проект? у меня spring-boot. Если интересно - могу дать фрагменты.

А так можете погуглить про i18n. Можете ошибки на разных языках делать и показывать их в зависимости от локали. Ну или с дефолтной локали.

Сам проект скомпилирован на Eclipse.

Не среда :slight_smile:

В папке resources создайте папку errors и положите туда файл errors.properties

примерная структура файла такая:

error1=Я сломался
error2=Меня сломали
...

Далее вам необходим bean ‘ReloadableResourceBundleMessageSource’

Вот моя инициализация:

@Bean 
public ReloadableResourceBundleMessageSource messageSource() { 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 
    messageSource.setBasename("classpath:errors/errors");
    messageSource.setCacheSeconds(3600);
    return messageSource;
}

Выставлять кэш не обязательно, думаю.
Потом сервис, который по id будет доставать сообщение[code]
@Component
public class ErrorMessage {

@Autowired
private MessageSource messageSource;

public String getMessage(String id) {
return messageSource.getMessage(id, null, null);
}
}
[/code]Ну а дальше в нужном классе

@Autowired
private ErrorMessage errorMessage
....


String error1 = errorMessage.getMessage("error1");

Выбор текста сообщения в зависимости от локализации - это не совсем тот вопрос который меня интересовал. Хотя, спасибо за пример, думаю что потом обязательно его применю.
Вопрос был в другом - когда происходит сброс состояния на сервере приложения (передеплоено приложение, инвалидирована сессия и др.) фреймворк vaadin через com.vaadin.server.CustomizedSystemMessages, выдает сообщение в браузер заранее определенное текстовое сообщение о данном случае (есть еще и про отключенные куки, про проблемы с коммуникациями и т.д.):

[code]
Contains the system messages used to notify the user about various critical situations that can occur.

Use VaadinService.setSystemMessagesProvider(SystemMessagesProvider) to customize.

The defaults defined in this class are:

sessionExpiredURL = null
sessionExpiredNotificationEnabled = true
sessionExpiredCaption = “”
sessionExpiredMessage = “Take note of any unsaved data, and click here to continue.”
communicationErrorURL = null
communicationErrorNotificationEnabled = true
communicationErrorCaption = “Communication problem”
communicationErrorMessage = “Take note of any unsaved data, and click here to continue.”
internalErrorURL = null
internalErrorNotificationEnabled = true
internalErrorCaption = “Internal error”
internalErrorMessage = “Please notify the administrator.
Take note of any unsaved data, and click here to continue.”
cookiesDisabledURL = null
cookiesDisabledNotificationEnabled = true
cookiesDisabledCaption = “Cookies disabled”
cookiesDisabledMessage = "This application requires cookies to function.
Please enable cookies in your browser and click here to try again.
[/code]На английском языке все отображаеться нормально. А с русским текстом проблемы. Дело в том что, данный текст генерируеться в UTF-8, а отображаеться “вопросами”, хотя весь проект и все элементы на UTF-8 выводяться нормально.
Есть подозрение, что данный текст при преобразовании в javascript “ломаеться”, хотя в теле основной страницы отображаеться корректно:

<script type="text/javascript" src="./VAADIN/vaadinPush.js?v=7.7.3"></script>
  <script type="text/javascript" src="./VAADIN/vaadinBootstrap.js?v=7.7.3"></script>
  <script type="text/javascript">//<![CDATA[
if (!window.vaadin) alert("Failed to load the bootstrap javascript: ./VAADIN/vaadinBootstrap.js?v=7.7.3");
vaadin.initApplication("cabinet-59742920",{"theme":"cabinet","versionInfo":{"vaadinVersion":"7.7.3","atmosphereVersion":"2.2.9.vaadin2"},"widgetset":"kd.kaps.cabinet.widgetset.CabinetWidgetset","widgetsetReady":true,"comErrMsg":{"caption":"Личный кабинет - коммуникационная ошибка","message":"Нажмите на данное вообщение или Esc","url":null},"authErrMsg":{"caption":"Личный кабинет - ошибка аутентификации","message":"Нажмите на данное вообщение или Esc","url":null},"sessExpMsg":{"caption":"Личный кабинет - Сессия устарела","message":"Нажмите на данное вообщение или Esc","url":null},"vaadinDir":"./VAADIN/","standalone":true,"heartbeatInterval":300,"serviceUrl":"."});
//]]></script>

В юникод поробуйте, что ли. Чтобы вместо символов - коды.

А что с настройками локали у пользователя, под которым запускается сервер приложений?
Что выводит под ним команда locale?

Попробую. Как реализую сообщу результат. Склоняюсь к мысли, что это может помочь!

Команда locale выдает следующее:

$ locale
LANG=en_US.UTF-8
LC_CTYPE=“en_US.UTF-8”
LC_NUMERIC=“en_US.UTF-8”
LC_TIME=“en_US.UTF-8”
LC_COLLATE=“en_US.UTF-8”
LC_MONETARY=“en_US.UTF-8”
LC_MESSAGES=“en_US.UTF-8”
LC_PAPER=“en_US.UTF-8”
LC_NAME=“en_US.UTF-8”
LC_ADDRESS=“en_US.UTF-8”
LC_TELEPHONE=“en_US.UTF-8”
LC_MEASUREMENT=“en_US.UTF-8”
LC_IDENTIFICATION=“en_US.UTF-8”
LC_ALL=

если это именно под тем юзером, под которым запускается сервер приложений, то я пока не знаю, в какую сторону копать

Попробовал. под Windows 7 все работает нормально, а под Linux сообщения выводяться по умолчанию на английском…

В своём бине скажите системе какую локаль использовать :slight_smile: