From 59928ce72da10f1c45a0aa08c9dd3a439fdd74a0 Mon Sep 17 00:00:00 2001 From: "David Kaspar [Dee'Kej]" Date: Fri, 18 May 2018 18:30:20 +0200 Subject: lang.{sh,csh} cleanup before moving to 'setup' package The dependance on 'consoletype' binary has been removed. --- etc/profile.d/lang.csh | 145 ++++++++++++++++++++++++------------------------- etc/profile.d/lang.sh | 135 +++++++++++++++++++-------------------------- 2 files changed, 125 insertions(+), 155 deletions(-) diff --git a/etc/profile.d/lang.csh b/etc/profile.d/lang.csh index c6a44664..f6ec891d 100644 --- a/etc/profile.d/lang.csh +++ b/etc/profile.d/lang.csh @@ -1,83 +1,78 @@ -# /etc/profile.d/lang.csh - set i18n stuff +# /etc/profile.d/lang.csh - exports environment variables, and provides fallback +# for CJK languages that can't be displayed in console. -set sourced=0 +if (${?LANG}) then + set LANG_backup=${LANG} +endif -if ($?LANG) then - set saved_lang=$LANG - if ( -f "$HOME/.i18n" ) then - eval `sed -ne 's|^[[:blank:]]*\([^#=]\{1,\}\)=\([^=]*\)|setenv \1 \2;|p' "$HOME/.i18n"` - set sourced=1 +foreach config (/etc/locale.conf "${HOME}/.i18n") + if (-f "${file}") then + # NOTE: We are using eval & sed here to avoid invoking of any commands & functions from those files. + eval `sed -r -e 's/^[[:blank:]]*([[:upper:]_]+)=([[:print:][:digit:]\._-]+|"[[:print:][:digit:]\._-]+")/setenv \1 \2;/;t;d' ${config}` endif - setenv LANG $saved_lang - unset saved_lang -else - foreach file (/etc/locale.conf "$HOME/.i18n") - if ( -f $file ) then - eval `sed -ne 's|^[[:blank:]]*\([^#=]\{1,\}\)=\([^=]*\)|setenv \1 \2;|p' $file` - set sourced=1 - endif - end +end + +if (${?LANG_backup}) then + set LANG="${LANG_backup}" endif -if ($sourced == 1) then - if ($?LC_ALL && $?LANG) then - if ($LC_ALL == $LANG) then - unsetenv LC_ALL - endif +unset LANG_backup config + +# ---------------------------------------------- + +# The LC_ALL is not supposed to be set in /etc/locale.conf according to 'man 5 locale.conf'. +# If it is set, then we we expect it is user's explicit override (most likely from ~/.i18n file). +# See 'man 7 locale' for more info about LC_ALL. +if (${?LC_ALL}) then + if (${LC_ALL} != ${LANG}) then + setenv LC_ALL + else + unsetenv LC_ALL endif - - set consoletype=`/sbin/consoletype stdout` +endif + +# The ${LANG} manipulation is necessary only in virtual terminal (a.k.a. console - /dev/tty*): +set in_console=`tty | grep --quiet -e '/dev/tty'; echo $?` - if ($?LANG) then - switch ($LANG) - case *.utf8*: - case *.UTF-8*: - if ( $?TERM ) then - if ( "$TERM" == "linux" ) then - if ( "$consoletype" == "vt" ) then - switch ($LANG) - case en_IN*: - breaksw - case ja*: - case ko*: - case si*: - case zh*: - case ar*: - case fa*: - case he*: - case *_IN*: - setenv LANG en_US.UTF-8 - breaksw - endsw - endif - endif - endif - breaksw - case *: - if ( $?TERM ) then - if ( "$TERM" == "linux" ) then - if ( "$consoletype" == "vt" ) then - switch ($LANG) - case en_IN*: - breaksw - case ja*: - case ko*: - case si*: - case zh*: - case ar*: - case fa*: - case he*: - case *_IN*: - setenv LANG en_US - breaksw - endsw - endif - endif - endif - breaksw - endsw - endif - unsetenv SYSFONTACM - unsetenv SYSFONT - unsetenv consoletype +if (${?LANG} && ${TERM} == 'linux' && in_console == 0) then + set utf8_used=`echo ${LANG} | grep --quiet -E -i -e '^.+\.utf-?8$'; echo $?` + + if (${utf8_used} == 0) then + switch (${LANG}) + case en_IN*: + breaksw + + case ja*: + case ko*: + case si*: + case zh*: + case ar*: + case fa*: + case he*: + case *_IN*: + setenv LANG en_US.UTF-8 + breaksw + endsw + else + switch (${LANG}) + case en_IN*: + breaksw + case ja*: + case ko*: + case si*: + case zh*: + m case ar*: + case fa*: + case he*: + case *_IN*: + setenv LANG en_US + breaksw + endsw + endif + + # NOTE: We are not exporting the ${LANG} here again on purpose. + # If user starts GUI session from console manually, then + # the previously set LANG should be okay to use. endif + +unset in_console utf8_used diff --git a/etc/profile.d/lang.sh b/etc/profile.d/lang.sh index 4a759f53..0252b0fe 100644 --- a/etc/profile.d/lang.sh +++ b/etc/profile.d/lang.sh @@ -1,90 +1,65 @@ -# /etc/profile.d/lang.sh - set i18n stuff +# /etc/profile.d/lang.sh - exports environment variables, and provides fallback +# for CJK languages that can't be displayed in console. -sourced=0 +if [ -n "${LANG}" ]; then + LANG_backup="${LANG}" +fi + +for config in /etc/locale.conf "${HOME}/.i18n"; do + # NOTE: We are using eval & sed here to avoid invoking of any commands & functions from those files. + if [ -f "${config}" ]; then + eval $(sed -r -e 's/^[[:blank:]]*([[:upper:]_]+)=([[:print:][:digit:]\._-]+|"[[:print:][:digit:]\._-]+")/export \1=\2/;t;d' ${config}) + fi +done -if [ -n "$LANG" ]; then - saved_lang="$LANG" - [ -f "$HOME/.i18n" ] && . "$HOME/.i18n" && sourced=1 - LANG="$saved_lang" - unset saved_lang -else - for langfile in /etc/locale.conf "$HOME/.i18n" ; do - [ -f $langfile ] && . $langfile && sourced=1 - done +if [ -n "${LANG_backup}" ]; then + LANG="${LANG_backup}" fi -if [ "$sourced" = 1 ]; then - [ -n "$LANG" ] && export LANG || unset LANG - [ -n "$LC_ADDRESS" ] && export LC_ADDRESS || unset LC_ADDRESS - [ -n "$LC_CTYPE" ] && export LC_CTYPE || unset LC_CTYPE - [ -n "$LC_COLLATE" ] && export LC_COLLATE || unset LC_COLLATE - [ -n "$LC_IDENTIFICATION" ] && export LC_IDENTIFICATION || unset LC_IDENTIFICATION - [ -n "$LC_MEASUREMENT" ] && export LC_MEASUREMENT || unset LC_MEASUREMENT - [ -n "$LC_MESSAGES" ] && export LC_MESSAGES || unset LC_MESSAGES - [ -n "$LC_MONETARY" ] && export LC_MONETARY || unset LC_MONETARY - [ -n "$LC_NAME" ] && export LC_NAME || unset LC_NAME - [ -n "$LC_NUMERIC" ] && export LC_NUMERIC || unset LC_NUMERIC - [ -n "$LC_PAPER" ] && export LC_PAPER || unset LC_PAPER - [ -n "$LC_TELEPHONE" ] && export LC_TELEPHONE || unset LC_TELEPHONE - [ -n "$LC_TIME" ] && export LC_TIME || unset LC_TIME - if [ -n "$LC_ALL" ]; then - if [ "$LC_ALL" != "$LANG" ]; then - export LC_ALL - else - unset LC_ALL - fi +unset LANG_backup config + +# ---------------------------------------------- + +# The LC_ALL is not supposed to be set in /etc/locale.conf according to 'man 5 locale.conf'. +# If it is set, then we we expect it is user's explicit override (most likely from ~/.i18n file). +# See 'man 7 locale' for more info about LC_ALL. +if [ -n "${LC_ALL}" ]; then + if [ "${LC_ALL}" != "${LANG}" ]; then + export LC_ALL else - unset LC_ALL - fi - [ -n "$LANGUAGE" ] && export LANGUAGE || unset LANGUAGE - [ -n "$LINGUAS" ] && export LINGUAS || unset LINGUAS - [ -n "$_XKB_CHARSET" ] && export _XKB_CHARSET || unset _XKB_CHARSET - - consoletype=$CONSOLETYPE - if [ -z "$consoletype" ]; then - consoletype=$(/sbin/consoletype stdout) + unset LC_ALL fi +fi - if [ -n "$LANG" ]; then - case $LANG in - *.utf8*|*.UTF-8*) - if [ "$TERM" = "linux" ]; then - if [ "$consoletype" = "vt" ]; then - case $LANG in - ja*) LANG=en_US.UTF-8 ;; - ko*) LANG=en_US.UTF-8 ;; - si*) LANG=en_US.UTF-8 ;; - zh*) LANG=en_US.UTF-8 ;; - ar*) LANG=en_US.UTF-8 ;; - fa*) LANG=en_US.UTF-8 ;; - he*) LANG=en_US.UTF-8 ;; - en_IN*) ;; - *_IN*) LANG=en_US.UTF-8 ;; - esac - fi - fi - ;; - *) - if [ "$TERM" = "linux" ]; then - if [ "$consoletype" = "vt" ]; then - case $LANG in - ja*) LANG=en_US ;; - ko*) LANG=en_US ;; - si*) LANG=en_US ;; - zh*) LANG=en_US ;; - ar*) LANG=en_US ;; - fa*) LANG=en_US ;; - he*) LANG=en_US ;; - en_IN*) ;; - *_IN*) LANG=en_US ;; - esac - fi - fi - ;; - esac +# The ${LANG} manipulation is necessary only in virtual terminal (a.k.a. console - /dev/tty*): +if [ -n "${LANG}" ] && [ "${TERM}" = 'linux' ] && tty | grep --quiet -e '/dev/tty'; then + if grep --quiet -E -i -e '^.+\.utf-?8$' <<< "${LANG}"; then + case ${LANG} in + ja*) LANG=en_US.UTF-8 ;; + ko*) LANG=en_US.UTF-8 ;; + si*) LANG=en_US.UTF-8 ;; + zh*) LANG=en_US.UTF-8 ;; + ar*) LANG=en_US.UTF-8 ;; + fa*) LANG=en_US.UTF-8 ;; + he*) LANG=en_US.UTF-8 ;; + en_IN*) true ;; + *_IN*) LANG=en_US.UTF-8 ;; + esac + else + case ${LANG} in + ja*) LANG=en_US ;; + ko*) LANG=en_US ;; + si*) LANG=en_US ;; + zh*) LANG=en_US ;; + ar*) LANG=en_US ;; + fa*) LANG=en_US ;; + he*) LANG=en_US ;; + en_IN*) true ;; + *_IN*) LANG=en_US ;; + esac fi - unset SYSFONTACM SYSFONT consoletype + # NOTE: We are not exporting the ${LANG} here again on purpose. + # If user starts GUI session from console manually, then + # the previously set LANG should be okay to use. fi -unset sourced -unset langfile -- cgit v1.2.1