Application: IBM Lotus Domino 8.5 for Linux (xSeries).
Условия: сервер Lotus Domino 8.5 запущен с использованием англоязычной "локали" "en_US.UTF-8", менять которую на иную нежелательно.
Задача: привести формат времени и даты, используемый сервером Lotus Domino, к формату, применяемому в русскоязычных интерфейсах (формат даты и времени "локали" "en_US" "MM/DD/YYYY HH:mm:SS", а нам требуется получить на выходе "DD/MM/YYYY HH:mm:SS").
Для начала проверим, какие "локали" система может использовать на данный момент:
# locale -a
C
en_US.utf8
POSIX
en_US.utf8
POSIX
У меня, как правило, на свежеустановленном сервере, "en_US.utf8" - основная "локаль" интерфейса, используемая по умолчанию; это задаётся в соответствующем конфигурационном файле:
# echo /etc/default/locale
LANG="en_US.UTF-8"
Просмотрим детали, составляющие конфигурацию используемой "локали":
$ locale
LANG=en_US.UTF-8
LANGUAGE=
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=
LANGUAGE=
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=
Нас интересует только переменная LC_TIME, которая определяет, какую "локаль" использовать при отображении всего, что имеет отношение к дате и времени. Смотрим, что у нас со форматом отображения времени сейчас:
$ locale LC_TIME -k
abday="Sun;Mon;Tue;Wed;Thu;Fri;Sat"
....
d_fmt="%m/%d/%Y"
....
....
d_fmt="%m/%d/%Y"
....
Параметр d_fmt определяет последовательность отображения элементов даты. В нашем случае значение месяца выводится впереди значения дня; следует добиться их обратного расположения, попутно заменив символы разделителя.
Добавим в систему поддержку ещё одной "локали", если это не было сделано на этапе её установки:
# dpkg-reconfigure locales
В предложенном списке "локалей", дополнительно к уже отмеченным, выбираем "ru_RU.UTF-8 UTF-8":
....
en_US.UTF-8 UTF-8
....
ru_RU.UTF-8 UTF-8
....
en_US.UTF-8 UTF-8
....
ru_RU.UTF-8 UTF-8
....
Оставляем англоязычную "локаль" "en_US.UTF-8 UTF-8" в качестве действующей по умолчанию:
....
Default locale for the system environment:
en_US.UTF-8
....
Default locale for the system environment:
en_US.UTF-8
....
В результате, после генерирования всех отмеченных "локалей", мы должны увидеть как минимум следующее:
Generating locales (this might take a while)...
en_US.UTF-8... done
ru_RU.UTF-8... done
Generation complete.
en_US.UTF-8... done
ru_RU.UTF-8... done
Generation complete.
Проверяем, какие "локали" нам теперь доступны:
# locale -a
C
en_US.utf8
POSIX
ru_RU.utf8
en_US.utf8
POSIX
ru_RU.utf8
Ради интереса пробуем присвоить переменной LC_TIME новое значение:
$ LC_TIME="ru_RU.UTF-8"
$ export LC_TIME
$ export LC_TIME
Посмотрим, как изменилась конфигурация используемой "локали":
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="ru_RU.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=
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="ru_RU.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=
Видно, что в общем для работы используется "локаль" по умолчанию, кроме отображения даты и времени.
Посмотрим, как изменились параметры отображения даты и времени:
$ locale LC_TIME -k
abday="Вск;Пнд;Втр;Срд;Чтв;Птн;Сбт"
....
d_fmt="%d.%m.%Y"
....
....
d_fmt="%d.%m.%Y"
....
То, что нужно, параметр d_fmt указывает на формат вывода даты, более близкий русскому, нежели американцу.
Теперь подскажем системе запускать сервер Lotus Domino с особыми параметрами "локали". У меня для запуска используется специально созданная учётная запись "notes". В файле настроек и переменных окружения пользователя "notes", расположенном в специфичном каталоге "/var/lib/notes/", вносим указание экспорта требуемого значения переменной LC_TIME:
# echo /var/lib/notes/.bash_profile
....
export LC_TIME="ru_RU.UTF-8"
....
export LC_TIME="ru_RU.UTF-8"
....
В качестве последнего штриха, который может и не понадобится (в зависимости от текущей конфигурации сервер Lotus Domino), указываем серверу Lotus Domino на используемый формат даты и времени:
# echo /var/lib/notes/data/notes.ini
# Используем 'D', 'M' и 'Y' для установки последовательности отображения составляющих даты
DateOrder=DMY
# Используем символ '/', '-' или '.' в качестве разделителей составляющих даты
DateSeparator=.
# Используем символ '/', '-' или ':' в качестве разделителей составляющих времени
TimeSeparator=:
# Вибираем тип часов между '12_HOUR' и '24_HOUR'
ClockType=24_HOUR
DateOrder=DMY
# Используем символ '/', '-' или '.' в качестве разделителей составляющих даты
DateSeparator=.
# Используем символ '/', '-' или ':' в качестве разделителей составляющих времени
TimeSeparator=:
# Вибираем тип часов между '12_HOUR' и '24_HOUR'
ClockType=24_HOUR
Теперь перезапускаем сервер Lotus Domino с новым значением переменной LC_TIME и получаем в журнал событий дату и время в "русском" варианте.