Locale 尼克松:如何精确地配置语言环境设置?

Locale 尼克松:如何精确地配置语言环境设置?,locale,nixos,Locale,Nixos,在运行NixOS 19.03的家用笔记本电脑上,在/etc/NixOS/configuration.nix中,我使用默认的区域设置: i18n = { consoleFont = "Lat2-Terminus16"; consoleKeyMap = "us"; defaultLocale = "en_US.UTF-8"; }; LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC=es_CO.U

在运行NixOS 19.03的家用笔记本电脑上,在
/etc/NixOS/configuration.nix
中,我使用默认的区域设置:

  i18n = {
    consoleFont = "Lat2-Terminus16";
    consoleKeyMap = "us";
    defaultLocale = "en_US.UTF-8";
  };
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=es_CO.UTF-8
LC_TIME=es_CO.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=es_CO.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=es_CO.UTF-8
LC_NAME=es_CO.UTF-8
LC_ADDRESS=es_CO.UTF-8
LC_TELEPHONE=es_CO.UTF-8
LC_MEASUREMENT=es_CO.UTF-8
LC_IDENTIFICATION=es_CO.UTF-8
LC_ALL=
这是我所知道的在NixOS中控制语言环境设置的唯一方法,而且太广泛了。我想要更精确的控制,这样我就可以混合使用美国英语和哥伦比亚西班牙语。(这是我工作的结果,不是个人选择。)具体来说,我需要以下设置:

  i18n = {
    consoleFont = "Lat2-Terminus16";
    consoleKeyMap = "us";
    defaultLocale = "en_US.UTF-8";
  };
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=es_CO.UTF-8
LC_TIME=es_CO.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=es_CO.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=es_CO.UTF-8
LC_NAME=es_CO.UTF-8
LC_ADDRESS=es_CO.UTF-8
LC_TELEPHONE=es_CO.UTF-8
LC_MEASUREMENT=es_CO.UTF-8
LC_IDENTIFICATION=es_CO.UTF-8
LC_ALL=
在我的工作桌面(运行Ubuntu18.04)上,如果我在bash中计算
locale
,我就会看到这样的结果。在我家的NixOS系统上,这些变量要么设置为US English,要么不设置:

[jeff@jbb-dell:~/nix-jbb]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
我想也许我应该编辑
/etc/locale.conf
,将工作系统中的设置复制到其中。但是,当(在NixOS系统上)我将该文件打印到屏幕上时,除了
LANG
,它不包含上述任何变量:

[jeff@jbb-dell:~/nix-jbb]$ cat /etc/locale.conf
LANG=en_US.UTF-8

[jeff@jbb-dell:~/nix-jbb]$

因此,其他变量,如
LC\u NUMERIC
,必须在其他地方设置。我担心如果我编辑
/etc/locale.conf
会破坏我的系统。编辑该文件是在NixOS中设置细粒度语言环境信息的正确方法吗?如果没有,那是什么?

我从来没有见过NixOS的设置,但我想你可以通过以下方法解决这个问题:

  services.xserver.displayManager = {
    sessionCommands = ''
      export LC_NUMERIC=es_CO.UTF-8
      export LC_TIME=es_CO.UTF-8
      export LC_MONETARY=es_CO.UTF-8
      export LC_PAPER=es_CO.UTF-8
      export LC_NAME=es_CO.UTF-8
      export LC_ADDRESS=es_CO.UTF-8
      export LC_TELEPHONE=es_CO.UTF-8
      export LC_MEASUREMENT=es_CO.UTF-8
      export LC_IDENTIFICATION=es_CO.UTF-8
    '';
  };
这应该适用于所有本地(图形)会话。如果您也使用ssh访问此计算机,则可能还会将相同的导出添加到
~/.bashrc

如果不想为所有用户设置,也可以将导出添加到
~/.xession
,而不是如上所示的
/etc/nixos/configuration.nix

该选项是设置这些导出的位置。例如:

i18n.extrallocalesettings={
LC_MESSAGES=“en_US.UTF-8”;
LC_TIME=“de_de.UTF-8”;
}
这似乎是可行的——这是我在尼克松对话论坛上询问大家后所采用的解决方案,很久以前。