Изменить определение локали (в отличие от настройки локали)

8

Предварительное замечание : Этот вопрос не о настройке локали путем изменения 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. Это не идеальное решение, поскольку при обновлении системы эти измененные файлы могут быть снова перезаписаны.

Мои вопросы:

  1. Есть ли лучшие варианты, связанные с локалью, чтобы получить желаемую функцию, чем изменение конкретного файла локали системы?
  2. Есть ли какие-либо проблемы при изменении определенного файла определения локали? (И как можно предотвратить перезапись этого файла в случае системных обновлений?)
  3. Было бы лучше определить новый конкретный вариант существующего файла локали и использовать его в LC_*настройках? (И как этот новый файл / определение будет правильно предоставлен системе?)
  4. Любые другие предложения?
Janis
источник
Я бы посоветовал вам скопировать интересующий вас файл локали, дать этой копии уникальное имя (например, en_XX- я не знаю, какие здесь ограничения, проб и ошибок может быть достаточно), внести любые необходимые изменения и используйте его как локаль. Вам придется
заново составить
1
Возможно, вы захотите прочитать мой вопрос , который содержит подробную информацию о том, что я сделал. Я еще не собрал его, но пока это работает довольно хорошо. Просто установите LC_TIME/etc/environmentили /etc/default/localeили в /etc/locale.confзависимости от дистрибутива) измененную локаль (я назвал мою isodate.UTF-8), и соответствующий формат будет выбран из этой настроенной локали только на время / дату. Вот как я настроил мою другую en_USнастройку для отображения даты / времени ISO.
0xC0000022L
1
@Janis: в Debian и Ubuntu вы также захотите поместить имя вашей локали /var/lib/locales/supported.d/local(или один из других файлов в ней) и запускать dpkg-reconfigure localesот имени суперпользователя для определения локали, которое будет скомпилировано. И да, установкаLC_TIME на указание на настроенную локаль кажется наименее навязчивым методом из всех, что я видел до сих пор. Вот почему ваша система имеет глобальные настройки, которые LC_TIMEмогут отличаться от «общего языка».
0xC0000022L
@ 0xC0000022L; Ваш опыт здесь очень ценен. С предложениями пока я пойду для нового файла локали. Я все еще не решил, должен ли я использовать copyподход на разделах, или оставить другие разделы избыточными (так, чтобы я мог diffпротив исходного файла).
Янис

Ответы:

5

В недавнем вопросе я спросил, что является лучшей практикой для такого рода изменений. Ответа пока не было. Тем не менее, я могу дать вам рецепт, который я использую, который хорошо себя зарекомендовал. Все программы правильно выбирают дату.

Мое описание для Ubuntu, но, вероятно, будет работать на Debian и Mint.

Препараты

Скопируйте локаль, которую вы хотите настроить, /usr/share/i18n/localesв новый файл. Например

cp /usr/share/i18n/locales/de_DE /usr/share/i18n/locales/de_DE@isodate

Настройте все, кроме LC_TIMEразделов, чтобы:

copy "de_DE"

Настройте LC_TIMEраздел в соответствии с желаемым результатом. Вы можете использовать настройки из моего выше связанного вопроса в качестве шаблона. Похоже, это именно то, что вы хотите.

Если ваша локаль не использует нотацию «AM / PM», установите для нее пустое значение:

t_fmt_ampm ""
am_pm   "";""

Сделать это известным системе

Отредактируйте файл /var/lib/locales/supported.d/localи добавьте туда информацию о вашем определении языка. Т.е. добавьте строку, подобную этой, если имя вашего файла выше isodate, измените иначе:

de_DE.UTF-8@isodate UTF-8

Если /var/lib/locales/supported.d/localне существует, создайте файл с таким именем. Не помещайте свои изменения в соответствующий enили deфайл в этой папке, так как они могут получить перезаписаны , как только language-pack-*-baseи language-pack-*пакеты на вашей системе получать обновления.

Теперь запустите dpkg-reconfigure locales:

# dpkg-reconfigure locales
Generating locales...
  de_DE.UTF-8@isodate... done
  de_DE.UTF-8... up-to-date
Generation complete.

В вашем случае это будет означать, что de_DE.UTF-8@isodateлокаль была сгенерирована (при условии, что у вас нет проблем с синтаксисом).

И наконец, добавьте следующее /etc/default/locale:

LC_TIME="de_DE.UTF-8@isodate"

Это обеспечит переопределение только LC_TIME локали по умолчанию, определенной с помощью LANG.

Зарегистрируйтесь заново, и вы сможете увидеть новую дату / время ISO при использовании dateили другие инструменты, использующие соответствующую функцию времени выполнения libc.


Намерение здесь состоит в том, чтобы сделать наименьшее навязчивое изменение, при этом не работая против системы (например, против менеджера пакетов и друзей) Конечно, вы также можете просто создать копию вашей локали, установить ее аналогичным образом, как описано выше, а затем настроить LANG. Дело в том, что до тех пор, пока вы не хотите, чтобы ваши изменения были перезаписаны обновлением пакета, вы должны использовать настраиваемую копию (независимо от того, какую настройку вы используете; т. Е. copyИли просто сохранять разделы такими, какими они были в оригинал). И измените ли вы, LANGчтобы указать на полное настроенное определение локали - или вы добавите LC_TIME указывать только на соответствующий настраиваемый раздел с тем же именем настраиваемого файла определения локали - вам не удастся изменить одну из глобальных настроек.

0xC0000022L
источник
3
В качестве наилучшей практики вы должны суффиксить свой язык с помощью @something like en_US.UTF-8@isodate.
Стефан Шазелас
@ StéphaneChazelas: Ха! Потрясающие. Однако, вы можете не и как это повлияет на именование файлов и как вы обратитесь к локализации в и соответственно? Ты можешь сказать? copyLC_IDENTIFICATION/etc/default/locale/var/lib/locales/supported.d/local
0xC0000022L
1
Вы должны создать en_US@isodateфайл определения и использовать его localedefдля создания правильных файлов; подробнее см. sourceware.org/git/?p=glibc.git;a=blob;f=localedata/READMEsourceware.org/git/?p=glibc.git;a=blob;f=localedata/locales/ ... для примера).
Стивен Китт
1
Да, в любом случае вы захотите изменить раздел LC_IDENTIFICATION (en_US @ isodate), так как это другой языковой стандарт. Команда end будет localedef -i en_US@isodate -f UTF-8 en_US.UTF-8@isodate, я не уверен насчет конфигурации, специфичной для Debian, мой комментарий был в основном о том, как назвать локаль.
Стефан Шазелас
1
Насколько я понимаю, в Debian вы добавили бы свое определение локали /usr/local/share/i18n/locales, добавили в него поддерживаемые пары локаль / charmap /usr/local/share/i18n/SUPPORTEDи запустили dpkg-reconfigure locales(см. Также /etc/locale.gen).
Стивен Китт