Проблема с отображением календаря

Добрый день. Интересует как можно выставить первый день недели понедельник? По умолчанию стоит воскресенье. Если задать свойства firstVisibleDayOfWeek и lastVisibleDayOfWeek в соответствующие значения - обрезается воскресенье. Так же ознакомился с демонстрацией работы календаря по данной ссылке.

https://demo.cuba-platform.com/sampler/#main/0/sample?id=month-calendar

Никаких дополнительных настроек не увидел. Руками задаю начальную и конечную дату - результат тот же

Так же в файле конфигураций был поменян формат отображения (locale) на русский стандарт. Это так же не помогло

Можете помочь?

Добрый день!

Проблема заключается в том, что FirstDayOfWeek зависит от локали, например Воскресение для U.S, Понедельник во Франции и т.д. Также это значение нельзя поменять для определенной локали. Я могу посоветовать следующее:

  1. Задать другую локаль (у которой первый день недели Понедельник) для конкретного объекта календаря. Для этого Вам нужно получить Vaadin Calendar из WebCalendar и воспользоваться соответствующим методом:

CUBA v7+

calendar.unwrap(com.vaadin.v7.ui.Calendar.class).setLocale(Locale.UK);

CUBA v6

calendar.unwrap(com.vaadin.ui.Calendar.class).setLocale(Locale.UK);
  1. В качестве альтернативы п.1, можно вызвать метод явного задания первого дня недели:
calendar.unwrap(com.vaadin.v7.ui.Calendar.class).setFirstDayOfWeek(java.util.Calendar.MONDAY);

См. GitHub issue.

  1. Т.к. локаль для календаря берется из сесии пользователя, то можно добавить в список доступных локалей ту, у которой Понедельник первый день недели и использовать ее. Например, в указанном вами примере, можно заметить, что для русской локали первый день Понедельник, а для английской - Воскресение.

image

image

С уважением,
Глеб

2 симпатии

Большое спасибо за помощь! Первый пункт помог. К сожалению, в Java.Util.Locale нет русской локали, но немецкая тоже ничего.

Воспользуйтесь методом создания Locale:

Local ruLocale = Locale.forLanguageTag("ru-RU");
1 симпатия

Обнаружилась проблема отображения в dateField:

image

Мы можем видеть, что там так же первый день - Вс.
Не подскажете как исправить на Пн?

dateField тоже зависит от Locale как и Calendar.

При попытке провернуть тот же трюк вываливается класс-каст ошибка.

@Inject
private DateField<Date> startdtField;
...
@Subscribe
private void onInit(InitEvent event) {
getScreenData().loadAll();
//startdtField.unwrap(com.vaadin.v7.ui.DateField.class).setLocale(Locale.forLanguageTag("ru-RU"));
startdtField.unwrap(com.vaadin.ui.DateField.class).setLocale(Locale.forLanguageTag("ru-RU"));
}

image
При использовании 7 версии класс помечается как Depreacted

Скажите, а какая локаль у ваших пользователей? Какие локали есть в вашем проекте? С какой локалью пользователи входят?

Это очень нетипичное поведение, которое мы не наблюдаем в наших проектах. Мы никогда не ставим локаль в UI компоненты, они настраиваются фреймворком автоматически по локали сессии. Было бы полезно увидеть пример проекта, где воспроизводится такое поведение.

calendar

а как можно настроить локаль всего проекта?

В платформе 7 здесь:
image

Далее, указанные тут локали становятся доступны у пользователя:
image

А DateField (как и Calendar) стандартно отображают неделю исходя из локали текущего пользователя.

1 симпатия

У нас уже присутствуют настройки локали:

image

Так же данные локали доступны и в настройке пользователя:

image

Но, как ни странно, без строгого указания локали у календаря не получается отображать его с ПН в качестве первого дня недели. Да и очень не хотелось бы указывать руками локаль для UI компонентов.

Вот это очень странное поведение. Я с таким ни разу не сталкивался.
Можете предоставить тестовый проект, где это воспроизводится?
Обычно это очень ускоряет поиск причины.

1 симпатия

Аналогичная проблема при работе с DateField в нашем приложении (неделя начинается с воскресенья) :frowning:
Пользователи работают с русской локалью…

Прикладываю наш зазипованный проект. К сожалению, внутренней базы в приложении нет, но надеюсь исходники помогут разобраться в проблеме.
timesheets.zip (178.7 КБ)

Добрый день.

После глубокого изучения проблемы, выяснилось, что дело в версии Java. Для сравнения:

Java 11
Locale: ru

Month names
Short │ Long
янв. │ январь
февр.│ февраль
март │ март
апр. │ апрель
май │ май
июнь │ июнь
июль │ июль
авг. │ август
сент. │ сентябрь
окт. │ октябрь
нояб. │ ноябрь
дек. │ декабрь

Day names
Short │ Long
вс │ воскресенье
пн │ понедельник
вт │ вторник
ср │ среда
чт │ четверг
пт │ пятница
сб │ суббота

First Day Of Week: 1 (Sunday)

Java 8
Locale: ru

Month names
Short │ Long
Янв. │ Январь
Февр.│ Февраль
Март │ Март
Апр. │ Апрель
Май │ Май
Июнь│ Июнь
Июль│ Июль
Авг. │ Август
Сент.│ Сентябрь
Окт. │ Октябрь
Нояб.│ Ноябрь
Дек. │ Декабрь

Day names
Short │ Long
Вс │ воскресенье
Пн │ понедельник
Вт │ вторник
Ср │ среда
Чт │ четверг
Пт │ пятница
Сб │ суббота

First Day Of Week: 2 (Moday)

Есть похожий тикет в openjdk: Calendar instance returns different first day of week in JDK 10, в котором есть ссылка на JDK 9 Release Notes:

In JDK 9, the default locale data uses data derived from the Unicode Consortium’s Common Locale Data Repository (CLDR). As a result, users may see differences in locale sensitive services behavior and/or translations. For example, CLDR does not provide localized display names for most 3-letter time zone IDs, thus the display names may be different from JDK 8 and older. The JDK continues to ship with the legacy JRE locale data and the system property java.locale.providers can be used to configure the lookup order. To enable behavior compatible with JDK 8, the system property can be set with:
-Djava.locale.providers=COMPAT,SPI
For more detail, refer to the JEP 252.

Если применить рекомендуемые параметры в setenv.sh/setenv.bat:

CATALINA_OPTS="-Xmx512m -Dfile.encoding=UTF-8 -Djava.locale.providers=COMPAT,SPI,CLDR"
...

И перезапустить приложение, то календарь снова отображает привычные данные.

Глеб

5 симпатий

Глеб, спасибо! Решили.

Здравствуйте, а в Java 11(в частности в Liberica) никто не пытался исправлять эту проблему?