null

Локализация виджета "календарь" в PrimeFaces

Виджет календаря в JSF-библиотеке PrimeFaces удобен в использовании и вполне себе хорошо работает, но у него есть один почти фатальный недостаток - календарь в нём не локализован, и выбранная в приложении локаль этим виджетом не подхватывается:

Нелокализованный виджет календаря

Вообще говоря, в этом есть определённая логика - виджет календаря "родом" из JS-библиотеки JQuery UI и может "не видеть" параметры локализации самого PrimeFaces. OK, смотрим описания тегов и видим, что у этого компонента есть аж два атрибута, отвечающих за локализацию - lang и locale. Устанавливаем их в нужные нам значения:

<p:calendar id="someDate" value="#{exampleBean.someDate}" 
    size="8" showOn="button" lang="ru" locale="ru" />

Проверяем, ничего не изменилось:

Ничего не изменилось - календарь по-прежнему английский

Ладно, нам не привыкать. Идём в гугл, находим замечательную страницу в Wiki, где указано, что в комплекте поставки PrimeFaces идёт только английская локаль календаря - остальное надо доставлять руками. Ищем на той же страничке русскую локаль, находим, исправляем явные ошибки (например, "суботу"), получается что-то подобное:

PrimeFaces.locales ['ru'] = {
    closeText: 'Закрыть',
    prevText: 'Назад',
    nextText: 'Вперёд',
    currentText: 'Home',
    monthNames: ['Январь', 'Февраль' , 'Март' , 'Апрель' , 'Май' , 'Июнь' , 'Июль' , 'Август' , 'Сентябрь','Октябрь','Ноябрь','Декабрь' ],
    monthNamesShort: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек' ],
    dayNames: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
    dayNamesShort: ['Воск','Пон' , 'Вт' , 'Ср' , 'Четв' , 'Пят' , 'Суб'],
    dayNamesMin: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
    weekHeader: 'Неделя',
    FirstDay: 1,
    isRTL: false,
    showMonthAfterYear: false,
    yearSuffix:'',
    timeOnlyTitle: 'Только время',
    timeText: 'Время',
    hourText: 'Час',
    minuteText: 'Минута',
    secondText: 'Секунда',
    currentText: 'Сегодня',
    ampm: false,
    month: 'Месяц',
    week: 'неделя',
    day: 'День',
    allDayText: 'Весь день'
};

Добавляем это куда-нибудь в подключаемые JS-файлы нашего приложения (например, под Liferay мне проще добавить это в файлы темы оформления). Атрибут "lang" у компонента можно убрать, нам нужен только атрибут "locale". Пересобираем всё, развёртываем и радуемся:

Календарь локализован

Ура, теперь всё заработало!

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.

Ничего не найдено. n is 0