We use the first configuration file we find out of: * $XDG_CONFIG_HOME/locale.conf * /etc/locale.conf * /etc/rc.conf All subsequent config files are ignored. E.g., an emtpy /etc/locale.conf means that LOCALE from rc.conf is ignored. This will easily allow users to set one locale to be used for daemons/boot and a separate one to be used for users consoles etc. This eliminates the need for DAEMON_LOCALE, so remove that functionality. A post-install note will be added. The constraints that led to this suggestion: 1) The default locale should work even if locale-gen has not been run, i.e., it should be "C". 2) It is common to want the system locale to be "English", which a priori "C" satisfies. However, "C" is not UTF-8, which causes issues when the user locale is in UTF-8 (as it is the system locale that configures the console mode). 3) Users might (and often do) want a different locale than what is used system-wide. Moreover, different users might want different locales. In case this seems far-fetched: This computer is shared by two people neither of whose mother tongue is English (and whose mother tongue is not the same). I also want all my daemons to output in English so I can paste the output in bug reports etc. Signed-off-by: Tom Gundersen <teg@jklm.no> --- functions | 24 ++++++++---------------- locale.sh | 10 ++++++---- rc.conf.5.txt | 13 +++---------- 3 files changed, 17 insertions(+), 30 deletions(-) diff --git a/functions b/functions index e8ff7b8..7e7549a 100644 --- a/functions +++ b/functions @@ -9,7 +9,14 @@ localevars=(LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION LC_ALL) -vconsolevars=(KEYMAP KEYMAP_TOGGLE FONT FONT_MAP FONT_UNIMAP) + +# clear the TZ envvar, so daemons always respect /etc/localtime +unset TZ + +# sanitize the locale settings +unset "${localevars[@]}" + +. /etc/profile.d/locale.sh if [[ $1 == "start" ]]; then if [[ $STARTING ]]; then @@ -66,12 +73,6 @@ if (( $? != 3 )); then fi unset TERM_COLORS -# clear the TZ envvar, so daemons always respect /etc/localtime -unset TZ - -# sanitize the locale settings -unset "${localevars[@]}" - parse_envfile() { local file=$1 validkeys=("${@:2}") ret=0 lineno=0 key= val= local -r quotes=$'[\'"]' comments=$'[;#]*' @@ -723,15 +724,6 @@ if (( RC_FUNCTIONS_HOOK_FUNCS_DEFINED != 1 )); then declare -r RC_FUNCTIONS_HOOK_FUNCS_DEFINED=1 fi -if [[ $DAEMON_LOCALE != [nN][oO] ]]; then - export LANG=${LOCALE:-C} - if [[ -r /etc/locale.conf ]]; then - parse_envfile /etc/locale.conf "${localevars[@]}" - fi -else - export LANG=C -fi - # set colors if [[ $USECOLOR != [nN][oO] ]]; then if tput setaf 0 &>/dev/null; then diff --git a/locale.sh b/locale.sh index c465f6f..48c3c50 100644 --- a/locale.sh +++ b/locale.sh @@ -1,10 +1,12 @@ unset LANG -if [ -s /etc/locale.conf ]; then +if [ -s $XDG_CONFIG_HOME/locale.conf ]; then + . $XDG_CONFIG_HOME/locale.conf +elif [ -s $HOME/.config/locale.conf ]; then + . $HOME/.config/locale.conf +elif [ -s /etc/locale.conf ]; then . /etc/locale.conf -fi - -if [ -z "$LANG" ] && [ -s /etc/rc.conf ]; then +elif [ -s /etc/rc.conf ]; then LANG=$(. /etc/rc.conf 2>/dev/null; echo "$LOCALE") fi diff --git a/rc.conf.5.txt b/rc.conf.5.txt index 73c2423..8983871 100644 --- a/rc.conf.5.txt +++ b/rc.conf.5.txt @@ -190,21 +190,14 @@ FONT_MAP in /etc/vconsole.conf takes precedence (see vconsole.conf(5)), and is r This sets your system language, which will be used by all i18n-friendly applications and utilities. See `locale -a` (or locale.gen) for available options. -LANG in /etc/locale.conf takes precedence (see locale.conf(5)), and is recommended. +LANG in /etc/locale.conf takes precedence (see locale.conf(5)), and is recommended. User-specific +locale settings which override both /etc/locale.conf and /etc/rc.conf are set in +$XDG_CONFIG_HOME/locale.conf using the same syntax as /etc/locale.conf. If unset, it falls back to the C locale. LOCALE="en_US.UTF-8" -*DAEMON_LOCALE=* - - - If set to 'no', export the C locale to daemons and during the boot process. - - Otherwise, export LANG (or LOCALE) as configured in /etc/locale.conf (or /etc/rc.conf). - -Leave this unset, unless you have a specific reason to set it to 'no'. - - DAEMON_LOCALE="yes" - *USECOLOR=* Use ANSI color sequences in start-up messages, unless set to 'no'. -- 1.7.11.4