2014-04-14 16:26:48 +02:00
|
|
|
|
{
|
|
|
|
|
config,
|
|
|
|
|
lib,
|
|
|
|
|
pkgs,
|
|
|
|
|
...
|
|
|
|
|
}:
|
2025-04-28 21:54:33 +07:00
|
|
|
|
let
|
2025-05-18 12:35:11 +03:00
|
|
|
|
sanitizeUTF8Capitalization =
|
|
|
|
|
lang: (lib.replaceStrings [ "utf8" "utf-8" "UTF8" ] [ "UTF-8" "UTF-8" "UTF-8" ] lang);
|
2025-04-28 21:54:33 +07:00
|
|
|
|
aggregatedLocales =
|
2025-05-18 12:35:11 +03:00
|
|
|
|
[
|
|
|
|
|
"${config.i18n.defaultLocale}/${config.i18n.defaultCharset}"
|
|
|
|
|
]
|
|
|
|
|
++ lib.pipe config.i18n.extraLocaleSettings [
|
2025-05-22 16:50:43 +03:00
|
|
|
|
# See description of extraLocaleSettings for why is this ignored here.
|
|
|
|
|
(lib.filterAttrs (n: v: n != "LANGUAGE"))
|
2025-05-18 12:35:11 +03:00
|
|
|
|
(lib.mapAttrs (n: v: (sanitizeUTF8Capitalization v)))
|
|
|
|
|
(lib.mapAttrsToList (LCRole: lang: lang + "/" + (config.i18n.localeCharsets.${LCRole} or "UTF-8")))
|
|
|
|
|
]
|
|
|
|
|
++ (builtins.map sanitizeUTF8Capitalization (
|
|
|
|
|
lib.optionals (builtins.isList config.i18n.extraLocales) config.i18n.extraLocales
|
|
|
|
|
))
|
2025-05-02 13:47:54 +07:00
|
|
|
|
++ (lib.optional (builtins.isString config.i18n.extraLocales) config.i18n.extraLocales);
|
2025-04-28 21:54:33 +07:00
|
|
|
|
in
|
2013-09-04 13:05:09 +02:00
|
|
|
|
{
|
|
|
|
|
###### interface
|
|
|
|
|
|
2009-03-06 12:25:38 +00:00
|
|
|
|
options = {
|
2013-09-04 13:05:09 +02:00
|
|
|
|
|
2009-03-06 12:25:38 +00:00
|
|
|
|
i18n = {
|
2024-08-24 22:05:25 +02:00
|
|
|
|
glibcLocales = lib.mkOption {
|
|
|
|
|
type = lib.types.path;
|
2022-08-26 11:26:24 +02:00
|
|
|
|
default = pkgs.glibcLocales.override {
|
2024-08-24 22:05:25 +02:00
|
|
|
|
allLocales = lib.any (x: x == "all") config.i18n.supportedLocales;
|
2017-02-02 08:58:32 +02:00
|
|
|
|
locales = config.i18n.supportedLocales;
|
|
|
|
|
};
|
2024-08-24 22:05:25 +02:00
|
|
|
|
defaultText = lib.literalExpression ''
|
2022-08-26 11:26:24 +02:00
|
|
|
|
pkgs.glibcLocales.override {
|
2024-09-04 12:21:09 -04:00
|
|
|
|
allLocales = lib.any (x: x == "all") config.i18n.supportedLocales;
|
2017-02-02 08:58:32 +02:00
|
|
|
|
locales = config.i18n.supportedLocales;
|
2021-11-26 01:16:05 +01:00
|
|
|
|
}
|
|
|
|
|
'';
|
2024-08-24 22:05:25 +02:00
|
|
|
|
example = lib.literalExpression "pkgs.glibcLocales";
|
2017-02-02 08:58:32 +02:00
|
|
|
|
description = ''
|
|
|
|
|
Customized pkg.glibcLocales package.
|
|
|
|
|
|
|
|
|
|
Changing this option can disable handling of i18n.defaultLocale
|
|
|
|
|
and supportedLocale.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2024-08-24 22:05:25 +02:00
|
|
|
|
defaultLocale = lib.mkOption {
|
|
|
|
|
type = lib.types.str;
|
2009-03-06 12:25:38 +00:00
|
|
|
|
default = "en_US.UTF-8";
|
|
|
|
|
example = "nl_NL.UTF-8";
|
2013-10-30 17:37:45 +01:00
|
|
|
|
description = ''
|
2025-05-18 12:35:11 +03:00
|
|
|
|
The default locale. It determines the language for program messages,
|
|
|
|
|
the format for dates and times, sort order, and so on. Setting the
|
|
|
|
|
default character set is done via {option}`i18n.defaultCharset`.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
defaultCharset = lib.mkOption {
|
|
|
|
|
type = lib.types.str;
|
|
|
|
|
default = "UTF-8";
|
|
|
|
|
example = "ISO-8859-8";
|
|
|
|
|
description = ''
|
|
|
|
|
The default locale character set.
|
2013-10-30 17:37:45 +01:00
|
|
|
|
'';
|
2009-03-06 12:25:38 +00:00
|
|
|
|
};
|
|
|
|
|
|
2024-11-16 21:55:45 +07:00
|
|
|
|
extraLocales = lib.mkOption {
|
2025-05-02 13:47:54 +07:00
|
|
|
|
type = lib.types.either (lib.types.listOf lib.types.str) (lib.types.enum [ "all" ]);
|
2024-11-16 21:55:45 +07:00
|
|
|
|
default = [ ];
|
2025-05-18 12:35:11 +03:00
|
|
|
|
example = [ "nl_NL.UTF-8/UTF-8" ];
|
2024-11-16 21:55:45 +07:00
|
|
|
|
description = ''
|
|
|
|
|
Additional locales that the system should support, besides the ones
|
|
|
|
|
configured with {option}`i18n.defaultLocale` and
|
|
|
|
|
{option}`i18n.extraLocaleSettings`.
|
2025-05-02 13:47:54 +07:00
|
|
|
|
Set this to `"all"` to install all available locales.
|
2024-11-16 21:55:45 +07:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2024-08-24 22:05:25 +02:00
|
|
|
|
extraLocaleSettings = lib.mkOption {
|
|
|
|
|
type = lib.types.attrsOf lib.types.str;
|
2018-03-07 15:30:29 +01:00
|
|
|
|
default = { };
|
|
|
|
|
example = {
|
|
|
|
|
LC_MESSAGES = "en_US.UTF-8";
|
|
|
|
|
LC_TIME = "de_DE.UTF-8";
|
|
|
|
|
};
|
|
|
|
|
description = ''
|
2025-05-18 12:35:11 +03:00
|
|
|
|
A set of additional system-wide locale settings other than `LANG`
|
|
|
|
|
which can be configured with {option}`i18n.defaultLocale`. Note that
|
|
|
|
|
the `/UTF-8` suffix used in {option}`i18n.extraLocales` indicates a
|
|
|
|
|
character set, and it must not be added manually here. To use a
|
|
|
|
|
non-`UTF-8` character set such as ISO-XXXX-8, the
|
|
|
|
|
{option}`i18n.localeCharsets` can be used.
|
2025-05-22 16:50:43 +03:00
|
|
|
|
|
|
|
|
|
Note that if the [`LANGUAGE`
|
|
|
|
|
key](https://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html)
|
|
|
|
|
is used in this option, it is ignored when computing the locales
|
|
|
|
|
required to be installed, because the possible values of this key are
|
|
|
|
|
more diverse and flexible then the others.
|
2025-05-18 12:35:11 +03:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
localeCharsets = lib.mkOption {
|
|
|
|
|
type = lib.types.attrsOf lib.types.str;
|
|
|
|
|
default = { };
|
|
|
|
|
example = {
|
|
|
|
|
LC_MESSAGES = "ISO-8859-15";
|
|
|
|
|
LC_TIME = "ISO-8859-1";
|
|
|
|
|
};
|
|
|
|
|
description = ''
|
|
|
|
|
Per each {option}`i18n.extraLocaleSettings`, choose the character set
|
|
|
|
|
to use for it. Essentially defaults to UTF-8 for all of them.
|
2018-03-07 15:30:29 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2024-08-24 22:05:25 +02:00
|
|
|
|
supportedLocales = lib.mkOption {
|
|
|
|
|
type = lib.types.listOf lib.types.str;
|
2025-04-27 18:29:09 +07:00
|
|
|
|
visible = false;
|
2024-08-24 22:05:25 +02:00
|
|
|
|
default = lib.unique (
|
2025-04-28 21:54:33 +07:00
|
|
|
|
[
|
|
|
|
|
"C.UTF-8/UTF-8"
|
|
|
|
|
"en_US.UTF-8/UTF-8"
|
|
|
|
|
]
|
|
|
|
|
++ aggregatedLocales
|
2022-06-26 16:24:31 +02:00
|
|
|
|
);
|
2009-06-05 17:19:30 +00:00
|
|
|
|
example = [
|
|
|
|
|
"en_US.UTF-8/UTF-8"
|
|
|
|
|
"nl_NL.UTF-8/UTF-8"
|
|
|
|
|
"nl_NL/ISO-8859-1"
|
|
|
|
|
];
|
|
|
|
|
description = ''
|
|
|
|
|
List of locales that the system should support. The value
|
|
|
|
|
`"all"` means that all locales supported by
|
|
|
|
|
Glibc will be installed. A full list of supported locales
|
2017-09-03 18:00:35 +00:00
|
|
|
|
can be found at <https://sourceware.org/git/?p=glibc.git;a=blob;f=localedata/SUPPORTED>.
|
2009-06-05 17:19:30 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-03-06 12:25:38 +00:00
|
|
|
|
};
|
2012-10-18 11:54:07 -04:00
|
|
|
|
|
2009-03-06 12:25:38 +00:00
|
|
|
|
};
|
2012-10-18 11:54:07 -04:00
|
|
|
|
|
2013-09-04 13:05:09 +02:00
|
|
|
|
###### implementation
|
2009-06-05 17:19:30 +00:00
|
|
|
|
|
2013-09-04 13:05:09 +02:00
|
|
|
|
config = {
|
2025-04-27 18:30:11 +07:00
|
|
|
|
warnings =
|
2025-05-02 13:47:54 +07:00
|
|
|
|
lib.optional
|
|
|
|
|
(
|
|
|
|
|
!(
|
|
|
|
|
(lib.subtractLists config.i18n.supportedLocales aggregatedLocales) == [ ]
|
|
|
|
|
|| lib.any (x: x == "all") config.i18n.supportedLocales
|
|
|
|
|
)
|
|
|
|
|
)
|
2025-04-27 18:30:11 +07:00
|
|
|
|
''
|
|
|
|
|
`i18n.supportedLocales` is deprecated in favor of `i18n.extraLocales`,
|
|
|
|
|
and it seems you are using `i18n.supportedLocales` and forgot to
|
|
|
|
|
include some locales specified in `i18n.defaultLocale`,
|
|
|
|
|
`i18n.extraLocales` or `i18n.extraLocaleSettings`.
|
|
|
|
|
|
|
|
|
|
If you're trying to install additional locales not specified in
|
|
|
|
|
`i18n.defaultLocale` or `i18n.extraLocaleSettings`, consider adding
|
|
|
|
|
only those locales to `i18n.extraLocales`.
|
|
|
|
|
'';
|
2009-06-05 17:19:30 +00:00
|
|
|
|
|
2015-04-19 22:45:08 +02:00
|
|
|
|
environment.systemPackages =
|
2020-06-11 10:22:20 +02:00
|
|
|
|
# We increase the priority a little, so that plain glibc in systemPackages can't win.
|
2024-08-24 22:05:25 +02:00
|
|
|
|
lib.optional (config.i18n.supportedLocales != [ ]) (lib.setPrio (-1) config.i18n.glibcLocales);
|
2009-06-05 17:19:30 +00:00
|
|
|
|
|
2014-06-13 17:56:46 +02:00
|
|
|
|
environment.sessionVariables = {
|
2014-04-18 19:03:50 +02:00
|
|
|
|
LANG = config.i18n.defaultLocale;
|
|
|
|
|
LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive";
|
2018-03-07 15:30:29 +01:00
|
|
|
|
} // config.i18n.extraLocaleSettings;
|
2014-04-18 19:03:50 +02:00
|
|
|
|
|
2024-08-24 22:05:25 +02:00
|
|
|
|
systemd.globalEnvironment = lib.mkIf (config.i18n.supportedLocales != [ ]) {
|
2017-02-02 08:58:32 +02:00
|
|
|
|
LOCALE_ARCHIVE = "${config.i18n.glibcLocales}/lib/locale/locale-archive";
|
2015-04-19 22:45:08 +02:00
|
|
|
|
};
|
2009-06-05 17:19:30 +00:00
|
|
|
|
|
2013-09-04 13:05:09 +02:00
|
|
|
|
# ‘/etc/locale.conf’ is used by systemd.
|
2019-09-14 19:51:29 +02:00
|
|
|
|
environment.etc."locale.conf".source = pkgs.writeText "locale.conf" ''
|
|
|
|
|
LANG=${config.i18n.defaultLocale}
|
2024-08-24 22:05:25 +02:00
|
|
|
|
${lib.concatStringsSep "\n" (
|
|
|
|
|
lib.mapAttrsToList (n: v: "${n}=${v}") config.i18n.extraLocaleSettings
|
|
|
|
|
)}
|
2019-09-14 19:51:29 +02:00
|
|
|
|
'';
|
2012-07-24 13:53:17 -04:00
|
|
|
|
|
2013-09-04 13:05:09 +02:00
|
|
|
|
};
|
2009-03-06 12:25:38 +00:00
|
|
|
|
}
|