更改语言环境定义(与语言环境设置相反)

Jan*_*nis 8 date locale

初步备注:这个问题是不是有关设置通过更改语言环境LC_ALLLC_TIMELANG等等,这是相当要改变一个区域的定义,在例如/usr/share/i18n/locales/de_DE,或者说,以获取有关比改变这些系统设置更合适的选择建议。

目的是获得ISO时间表示 %Y-%m-%d,并%H:%M:%S没有不良副作用。

我在网上发现的建议都不合适(例如,将语言环境设置为“丹麦语”将不会保留母语拼写的工作日名称)。

现在,我目前看到的获得所需行为的唯一选择是在/usr/share/i18n/locales/de_DE. 这不是一个完美的解决方案,因为随着系统更新,这些更改的文件可能会再次被覆盖。

我的问题是:

  1. 是否有比更改特定系统语言环境文件更好的语言环境相关选项来获得所需的功能?
  2. 更改特定区域设置定义文件时是否会出现任何问题?(以及如何防止在系统更新时覆盖此文件?)
  3. 定义现有语言环境文件的特定变体并在LC_*设置中使用它会更好吗?(以及如何正确地使系统知道该新文件/定义?)
  4. 还有其他建议吗?

0xC*_*22L 6

最近的一个问题中,我询问了这种更改的最佳实践是什么。还没有答案。但是,我可以给你我正在使用的食谱,事实证明它很好用。所有程序都正确地选择了日期。

我的描述适用于 Ubuntu,但可能适用于 Debian 和 Mint。

准备工作

将要自定义的语言环境复制/usr/share/i18n/locales到新文件中。例如

cp /usr/share/i18n/locales/de_DE /usr/share/i18n/locales/de_DE@isodate
Run Code Online (Sandbox Code Playgroud)

调整除部分之外的所有LC_TIME内容:

copy "de_DE"
Run Code Online (Sandbox Code Playgroud)

调整LC_TIME部分以匹配您想要的结果。您可以使用我上面链接问题中的设置作为模板。看起来这几乎正是您想要的。

如果您的语言环境不使用“AM/PM”符号,请将它们设置为空:

t_fmt_ampm ""
am_pm   "";""
Run Code Online (Sandbox Code Playgroud)

让系统知道

编辑文件/var/lib/locales/supported.d/local并在那里添加有关您的语言环境定义的信息。即,如果上面的文件名是isodate,则添加这样的行,否则进行调整:

de_DE.UTF-8@isodate UTF-8
Run Code Online (Sandbox Code Playgroud)

如果/var/lib/locales/supported.d/local不存在,则创建一个具有该名称的文件。不要将更改放入该文件夹中的相应ende文件,因为一旦系统上的language-pack-*-baselanguage-pack-*包收到更新,它们可能会被覆盖。

现在运行dpkg-reconfigure locales

# dpkg-reconfigure locales
Generating locales...
  de_DE.UTF-8@isodate... done
  de_DE.UTF-8... up-to-date
Generation complete.
Run Code Online (Sandbox Code Playgroud)

在您的情况下,这将表明de_DE.UTF-8@isodate语言环境已生成(假设您没有语法问题)。

最后但并非最不重要的是将以下内容添加到/etc/default/locale

LC_TIME="de_DE.UTF-8@isodate"
Run Code Online (Sandbox Code Playgroud)

这将确保 LC_TIME覆盖使用LANG.

重新登录,您应该能够在使用date或使用相应 libc 运行时功能的其他工具时看到新的 ISO 日期/时间。


这里的目的是进行最少侵入性的更改,同时也不会对系统起作用(例如,对包管理器和朋友)。当然,您也可以简单地创建您的区域设置的副本,以上述类似的方式安装它,然后调整LANG. 关键是,只要您不想冒更改被包更新覆盖的风险,您就必须使用自定义副本(无论您进行何种自定义;即,copy或者只是将部分保持原样原本的)。以及您是否更改LANG为指向完全自定义的区域设置定义 -或者您是否添加 LC_TIME 仅指向自定义区域设置定义文件的同名的相关自定义部分 - 您将无法调整全局设置之一。

  • 作为最佳实践,您可以在您的区域设置后缀 @something,例如 `en_US.UTF-8@isodate`。 (3认同)
  • 据我了解,在 Debian 上,您可以在 `/usr/local/share/i18n/locales` 中添加区域设置定义,在 `/usr/local/share/i18n/SUPPORTED` 中添加受支持的区域设置/字符映射对,然后运行“dpkg-reconfigure locales”(另请参阅“/etc/locale.gen”)。 (2认同)