Локализация datepicker компонента

Добрый день, столкнулся с вопросом, как локализовать компонент datePicker.
Сейчас в системе присутствуют три языка (английский, русский, туркменский), на первых двух локализация работает отлично, но для последнего буду использовать перебор в строке, интересует, как указать FirstDayWeek и как получить названия месяца

Добрый день.

Не совсем понятно, чего Вы хотите добиться.

Сейчас DatePicker вообще не локализуется на туркменский язык или Вас не устраивает стандартная локализация?

Глеб

Да именно, нет туркменского языка, что рекомендуете сделать ?

Причина по которой DatePicker не имеет туркменской локализации в том, что Java не имеет соответствующих строк локализации. К счастью Вы можете переопределить LocaleService и предоставить свою локализацию для определенной локали.

Для этого необходимо:

  1. Расширить LocaleService:
import com.vaadin.server.LocaleService;
import com.vaadin.shared.ui.ui.UIState;
import com.vaadin.ui.UI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

public class CustomLocaleService extends LocaleService {

    public CustomLocaleService(UI ui, UIState.LocaleServiceState state) {
        super(ui, state);
    }

    @Override
    protected UIState.LocaleData createLocaleData(Locale locale) {
        if ("tk".equals(locale.toLanguageTag())) {
            // CAUTION: Copied from super class
            UIState.LocaleData localeData = new UIState.LocaleData();
            localeData.name = locale.toString();

            Calendar c = Calendar.getInstance(locale);
            c.set(2015, 0, 1);
            DateFormatSymbols dfs = createDateFormatSymbols(locale);
            SimpleDateFormat shortMonthFormat = new SimpleDateFormat("MMM", dfs);
            SimpleDateFormat longMonthFormat = new SimpleDateFormat("MMMM", dfs);

            int monthsInYear = c.getMaximum(Calendar.MONTH) + 1;
            localeData.shortMonthNames = new String[monthsInYear];
            localeData.monthNames = new String[monthsInYear];
            for (int month = 0; month < monthsInYear; month++) {
                c.set(Calendar.MONTH, month);
                String shortMonth = shortMonthFormat.format(c.getTime());
                String longMonth = longMonthFormat.format(c.getTime());
                localeData.shortMonthNames[month] = shortMonth;
                localeData.monthNames[month] = longMonth;
            }

//            final DateFormatSymbols dfs = new DateFormatSymbols(locale);

            // Client expects 0 based indexing, DateFormatSymbols use 1 based
            localeData.shortDayNames = new String[7];
            localeData.dayNames = new String[7];
            String[] sDayNames = dfs.getShortWeekdays();
            String[] lDayNames = dfs.getWeekdays();
            for (int i = 0; i < 7; i++) {
                localeData.shortDayNames[i] = sDayNames[i + 1];
                localeData.dayNames[i] = lDayNames[i + 1];
            }

            /*
             * First day of week (0 = sunday, 1 = monday)
             */
            final Calendar cal = new GregorianCalendar(locale);
            localeData.firstDayOfWeek = cal.getFirstDayOfWeek() - 1;

            /*
             * Date formatting (MM/DD/YYYY etc.)
             */
            DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT,
                    locale);
            DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT,
                    locale);
            if (!(dateFormat instanceof SimpleDateFormat)) {
                getLogger().warn("Unable to get default date pattern for locale "
                        + locale.toString());
                dateFormat = new SimpleDateFormat();
            }
            if (!(timeFormat instanceof SimpleDateFormat)) {
                getLogger().warn("Unable to get default time pattern for locale "
                        + locale.toString());
                timeFormat = new SimpleDateFormat();
            }
            final String datePattern = ((SimpleDateFormat) dateFormat).toPattern();
            final String timePattern = ((SimpleDateFormat) timeFormat).toPattern();

            localeData.dateFormat = datePattern.trim();

            final boolean twelveHourClock = timePattern.indexOf("a") > -1;
            // TODO there are other possibilities as well, like 'h' in french
            // (ignore them, too complicated)
            final String hourMinDelimiter = timePattern.indexOf(".") > -1 ? "."
                    : ":";

            localeData.twelveHourClock = twelveHourClock;
            localeData.hourMinuteDelimiter = hourMinDelimiter;
            if (twelveHourClock) {
                final String[] ampm = dfs.getAmPmStrings();
                localeData.am = ampm[0];
                localeData.pm = ampm[1];
            }

            return localeData;
        } else {
            return super.createLocaleData(locale);
        }
    }

    private DateFormatSymbols createDateFormatSymbols(Locale locale) {
        DateFormatSymbols dfs = new DateFormatSymbols(locale);

        dfs.setWeekdays(new String[]{"", "ВОСКРЕСЕНЬЕ", "ПОНЕДЕЛЬНИК", "ВТОРНИК", "СРЕДА", "ЧЕТВЕРГ", "ПЯТНИЦА", "СУББОТА"});
        dfs.setShortWeekdays(new String[]{"", "ВС", "ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ"});
        dfs.setMonths(new String[]{"ЯНВАРЬ", "ФЕВРАЛЬ", "МАРТ", "АПРЕЛЬ", "МАЙ",
                "ИЮНЬ", "ИЮЛЬ", "АВГУСТ", "СЕНТЯБРЬ", "ОКТЯБРЬ", "НОЯБРЬ", "ДЕКАБРЬ", ""});
        dfs.setShortMonths(new String[]{"ЯНВ", "ФЕВ", "МАР", "АПР", "МАЙ",
                "ИЮН", "ИЮЛ", "АВГ", "СЕН", "ОКТ", "НОЯ", "ДЕК", ""});

        return dfs;
    }

    private static Logger getLogger() {
        return LoggerFactory.getLogger(CustomLocaleService.class);
    }
}
  1. Расширить AppUI, где создавать и возвращать свою реализацию LocaleService:
import com.haulmont.cuba.web.AppUI;
import com.vaadin.server.LocaleService;

public class DemoAppUI extends AppUI {
    private LocaleService customLocaleService =
            new CustomLocaleService(this, getState(false).localeServiceState);

    @Override
    public LocaleService getLocaleService() {
        return customLocaleService;
    }
}

  1. Зарегистрировать свою реализацию в web-spring.xml:
...
<bean id="cuba_AppUI" class="com.company.demo.web.DemoAppUI" scope="prototype"/>
...

Демо: datepicker-localization.zip (82.1 КБ)

Глеб

1 симпатия