Предварительное замечание : Этот вопрос не о настройке локали путем изменения LC_ALL
, LC_TIME
, LANG
и т.д., это скорее об изменении локали определения , например , в /usr/share/i18n/locales/de_DE
, или соответственно, чтобы получить предложения о более подходящих вариантов , чем изменения этих параметров системы.
Цель состоит в получении времени представления ISO %Y-%m-%d
и %H:%M:%S
без нежелательных побочных эффектов.
Все предложения, которые я обнаружил в сети, все же были неуместны (например, установка для локали «danish» не будет поддерживать записанные названия дня недели на родном языке).
Теперь единственный выбор, который я сейчас вижу, чтобы получить желаемое поведение, это изменить определение моей родной локали в /usr/share/i18n/locales/de_DE
. Это не идеальное решение, поскольку при обновлении системы эти измененные файлы могут быть снова перезаписаны.
Мои вопросы:
- Есть ли лучшие варианты, связанные с локалью, чтобы получить желаемую функцию, чем изменение конкретного файла локали системы?
- Есть ли какие-либо проблемы при изменении определенного файла определения локали? (И как можно предотвратить перезапись этого файла в случае системных обновлений?)
- Было бы лучше определить новый конкретный вариант существующего файла локали и использовать его в
LC_*
настройках? (И как этот новый файл / определение будет правильно предоставлен системе?) - Любые другие предложения?
en_XX
- я не знаю, какие здесь ограничения, проб и ошибок может быть достаточно), внести любые необходимые изменения и используйте его как локаль. Вам придетсяLC_TIME
(в/etc/environment
или/etc/default/locale
или в/etc/locale.conf
зависимости от дистрибутива) измененную локаль (я назвал моюisodate.UTF-8
), и соответствующий формат будет выбран из этой настроенной локали только на время / дату. Вот как я настроил мою другуюen_US
настройку для отображения даты / времени ISO./var/lib/locales/supported.d/local
(или один из других файлов в ней) и запускатьdpkg-reconfigure locales
от имени суперпользователя для определения локали, которое будет скомпилировано. И да, установкаLC_TIME
на указание на настроенную локаль кажется наименее навязчивым методом из всех, что я видел до сих пор. Вот почему ваша система имеет глобальные настройки, которыеLC_TIME
могут отличаться от «общего языка».copy
подход на разделах, или оставить другие разделы избыточными (так, чтобы я могdiff
против исходного файла).Ответы:
В недавнем вопросе я спросил, что является лучшей практикой для такого рода изменений. Ответа пока не было. Тем не менее, я могу дать вам рецепт, который я использую, который хорошо себя зарекомендовал. Все программы правильно выбирают дату.
Мое описание для Ubuntu, но, вероятно, будет работать на Debian и Mint.
Препараты
Скопируйте локаль, которую вы хотите настроить,
/usr/share/i18n/locales
в новый файл. НапримерНастройте все, кроме
LC_TIME
разделов, чтобы:Настройте
LC_TIME
раздел в соответствии с желаемым результатом. Вы можете использовать настройки из моего выше связанного вопроса в качестве шаблона. Похоже, это именно то, что вы хотите.Если ваша локаль не использует нотацию «AM / PM», установите для нее пустое значение:
Сделать это известным системе
Отредактируйте файл
/var/lib/locales/supported.d/local
и добавьте туда информацию о вашем определении языка. Т.е. добавьте строку, подобную этой, если имя вашего файла вышеisodate
, измените иначе:Если
/var/lib/locales/supported.d/local
не существует, создайте файл с таким именем. Не помещайте свои изменения в соответствующийen
илиde
файл в этой папке, так как они могут получить перезаписаны , как толькоlanguage-pack-*-base
иlanguage-pack-*
пакеты на вашей системе получать обновления.Теперь запустите
dpkg-reconfigure locales
:В вашем случае это будет означать, что
de_DE.UTF-8@isodate
локаль была сгенерирована (при условии, что у вас нет проблем с синтаксисом).И наконец, добавьте следующее
/etc/default/locale
:Это обеспечит переопределение только
LC_TIME
локали по умолчанию, определенной с помощьюLANG
.Зарегистрируйтесь заново, и вы сможете увидеть новую дату / время ISO при использовании
date
или другие инструменты, использующие соответствующую функцию времени выполнения libc.Намерение здесь состоит в том, чтобы сделать наименьшее навязчивое изменение, при этом не работая против системы (например, против менеджера пакетов и друзей) Конечно, вы также можете просто создать копию вашей локали, установить ее аналогичным образом, как описано выше, а затем настроить
LANG
. Дело в том, что до тех пор, пока вы не хотите, чтобы ваши изменения были перезаписаны обновлением пакета, вы должны использовать настраиваемую копию (независимо от того, какую настройку вы используете; т. Е.copy
Или просто сохранять разделы такими, какими они были в оригинал). И измените ли вы,LANG
чтобы указать на полное настроенное определение локали - или вы добавитеLC_TIME
указывать только на соответствующий настраиваемый раздел с тем же именем настраиваемого файла определения локали - вам не удастся изменить одну из глобальных настроек.источник
en_US.UTF-8@isodate
.copy
LC_IDENTIFICATION
/etc/default/locale
/var/lib/locales/supported.d/local
en_US@isodate
файл определения и использовать егоlocaledef
для создания правильных файлов; подробнее см. sourceware.org/git/?p=glibc.git;a=blob;f=localedata/README (и sourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/ ... для примера).localedef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate
, я не уверен насчет конфигурации, специфичной для Debian, мой комментарий был в основном о том, как назвать локаль./usr/local/share/i18n/locales
, добавили в него поддерживаемые пары локаль / charmap/usr/local/share/i18n/SUPPORTED
и запустилиdpkg-reconfigure locales
(см. Также/etc/locale.gen
).