初步评论: 这个问题是不是关于环境LC_ALL
通过更改、LC_TIME
、等来更改语言环境LANG
,这更像是更改语言环境定义,例如/usr/share/i18n/locales/de_DE
分别在 、 或 中,以获得有关比更改这些系统设置更合适的选项的建议。
这意图是为了获得ISO 时间表示 %Y-%m-%d
并且%H:%M:%S
没有不良副作用。
我在网上找到的建议仍然不合适(例如,将语言环境设置为“丹麦语”将不会保留母语的拼写工作日名称)。
现在,我目前看到的获得所需行为的唯一选择是更改/usr/share/i18n/locales/de_DE
.这不是一个完美的解决方案,因为随着系统更新,这些更改的文件可能会再次被覆盖。
我的问题是:
- 有没有比更改特定系统区域设置文件更好的区域设置相关选项来获得所需的功能?
- 更改特定区域设置定义文件时是否会出现任何问题? (如何防止系统更新时该文件被覆盖?)
- 最好定义一个新的现有语言环境文件的特定变体并在
LC_*
设置中使用它? (系统如何正确地了解该新文件/定义?) - 还有其他建议吗?
答案1
在一个最近的问题我问这种改变的最佳实践是什么。还没有答案。不过,我可以给你我正在使用的食谱,事实证明它效果很好。所有程序都正确选择日期。
我的描述适用于 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
。
date
重新登录,当使用或其他工具使用相应的 libc 运行时函数时,您应该能够看到新的 ISO 日期/时间。
意图这里是在不工作的情况下进行最少侵入性的改变反对系统(例如针对包管理器和朋友)。当然,您也可以简单地创建您的语言环境的副本,以与上述类似的方式安装它,然后进行调整LANG
。关键是,只要您不想冒更改被软件包更新覆盖的风险,您就可以必须使用定制副本(无论您想要什么定制;即copy
或简单地保留原始部分)。以及是否更改LANG
为指向满的自定义区域设置定义 -或者不管你添加 LC_TIME
仅指向自定义区域设置定义文件的同名的相关自定义部分 - 您将无法调整全局设置之一。