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


8

初步备注:这个问题是不是有关设置通过更改语言环境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. 还有其他建议吗?

我建议您复制感兴趣的语言环境文件,并为该副本指定一个唯一的名称(例如,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可以将其设置为不同于“总体语言环境”。
2015年

@ 0xC0000022L; 您在这里的经验非常宝贵。到目前为止的建议,我将去一个新的区域设置文件。我还不确定是否应该使用copyon部分方法,还是保留其他部分冗余(以便可以diff处理原始文件)。
贾尼斯

Answers:


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不存在,请创建该名称的文件。不要将您的更改放入该文件夹中的相应文件ende文件中,因为一旦系统上的language-pack-*-baseand 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 仅指向自定义区域设置定义文件的相同名称的相关自定义部分-您将无法调整全局设置之一。


3
最佳做法是,您在语言环境后缀@something like en_US.UTF-8@isodate
斯特凡Chazelas

@StéphaneChazelas:哈!太棒了 但是,您将不能copy使用LC_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/README(和sourceware.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特定的配置,我的评论主要是关于如何命名区域。
斯特凡Chazelas

1
据我了解,在Debian上,您可以在中添加语言环境定义,在/usr/local/share/i18n/locales中添加受支持的语言环境/字符映射对/usr/local/share/i18n/SUPPORTED,然后运行dpkg-reconfigure locales(另请参见/etc/locale.gen)。
史蒂芬·基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.