NixOS:如何精细地配置语言环境设置?

NixOS: How to granularly configure locale settings?

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

  i18n = {
    consoleFont = "Lat2-Terminus16";
    consoleKeyMap = "us";
    defaultLocale = "en_US.UTF-8";
  };

这是我所知道的在 NixOS 中控制区域设置的唯一方法,而且它太宽泛了。我想要更精细的控制,这样我就可以混合使用美国英语和哥伦比亚西班牙语。 (这是我工作的结果,而不是个人选择。)具体来说,我需要这些设置:

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=

在我的工作桌面上 (运行 Ubuntu 18.04),如果我在 bash 中评估 locale,这就是我所看到的。在我家的 NixOS 系统上,每个变量要么设置为美国英语,要么什么都不设置:

[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_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.extralocalesettings 是设置这些的地方。例如:

i18n.extraLocaleSettings = {
  LC_MESSAGES = "en_US.UTF-8";
  LC_TIME = "de_DE.UTF-8";
}