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. Note that currently $XDG_CONFIG_HOME is unlikely to be set when locale.sh is sourced, so it will not have any effect. In the future this might change, so we kept it in. 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. v2: make sure $XDG_CONFIG_HOME and $HOME are set before using them 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..e310318 100644 --- a/locale.sh +++ b/locale.sh @@ -1,10 +1,12 @@ unset LANG -if [ -s /etc/locale.conf ]; then +if [ -n $XDG_CONFIG_HOME ] && [ -s $XDG_CONFIG_HOME/locale.conf ]; then + . $XDG_CONFIG_HOME/locale.conf +elif [ -n $HOME ] && [ -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.12