metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2015-04-05 11:41 am

Ад локалей и дней недели

Белорусско-украинские линуксоиды познакомили меня с кромешным адом - номера дней недели в локалях линукса это пиздец живородящий.
https://github.com/GNOME/gnome-shell/blob/master/js/ui/calendar.js#L599
https://git.gnome.org/browse/gnome-shell/tree/src/shell-util.c#n181
https://bugzilla.gnome.org/show_bug.cgi?id=747346#c5
https://sourceware.org/glibc/wiki/Locales

Дни недели существуют в следующих вариантах:
ISO8601 - 1..7 начиная с понедельника
жабаскриптовый Date.getDay - 0..6 начиная с воскресенья.
Человекочитабельный номер 1..7, зависит от локали.

В локалях линукса есть такие параметры:
week DAYSINWEEK;WEEKSTARTDATE;MINWEEKLEN
first_weekday N - number of day in the week to be shown in the first column of a calendar. Defaults to 1.

Первый параметр состоит из 3 чисед.
DAYSINWEEK is usually 7;
MINWEEKLEN is the minimal length of the first week in year (usually 4).

WEEKSTARTDATE is most confusing - it should be some date that corresponds to the beginning of a week. It is typically either 19971130 (Sunday) or 19971201 (Monday), the former being used almost by all glibc locales (see below). Это параметр NL_TIME_WEEK_1STDAY/week-1stday.

Единственная локаль, в которой я нашел 19971201 (неделя начинается с понедельника) - это ru_UA. Все остальные либо по умолчанию, либо явно указанный 19971130 (неделя начинается с воскресенья)
Причем эти два числа - они захардкожены в gnome-shell/tree/src/shell-util.c для расчета нумерации дней недели.

first_weekday - это безумный параметр, отвечающий за отображение дней недели по колонкам календаря. Это вот самый адовый параметр, его значение, как я понимаю, относится к домену "человекочитабельных номеров для недели, зависящих от локали".

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

Теперь еще вопрос: если в программе-органайзере записано событие "каждое воскресенье" - какой из типов данных там будет использован и не сломается ли оно все в прах, если заменить в локали начало дней недели?

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting