--- /dev/null
+# AX-ZSH: Alex' Modular ZSH Configuration
+# 12_locale.zprofile: Initialize locale settings
+
+# This is only relevant for interactive shells (because the user has to
+# manually enter data when the validation fails):
+[[ -z "$PS1" ]] && return 0
+
+# Make sure that LANG and LC_MESSAGES are either unset or set to something sane,
+# that is, follow the "xx_ZZ.*" syntax.
+fix_locale() {
+ local encoding locale
+
+ locale="$1:r"
+ encoding="$1:e"
+
+ if [[ -z "$1" || "$locale" =~ '.*_.*' || ${#locale%%_*} -ne 2 ]]; then
+ echo "$1"
+ else
+ locale="${locale:0:2}_${locale:0:2:u}"
+ [[ -n "$encoding" ]] && locale="$locale.$encoding"
+ echo "$locale"
+ fi
+}
+[[ -n "$LANG" ]] && LANG=$(fix_locale "$LANG")
+[[ -n "$LC_MESSAGES" ]] && LANG=$(fix_locale "$LC_MESSAGES")
+unfunction fix_locale
+
+# Validate the locale(7) settings in interactive shells and try to mimic the
+# tset(1) behaviour.
+while true; do
+ lc_messages=$(locale 2>/dev/null | fgrep LC_MESSAGES | cut -d'=' -f2)
+ [[ "$lc_messages" = '"C"' && "$LANG" != 'C' && "$LC_ALL" != 'C' ]] && lc_messages=$LANG
+ lc_messages=$lc_messages:gs/\"//
+ locale=$lc_messages:r
+ [[ ( "$OSTYPE" =~ '^linux-gnu' || "$OSTYPE" = 'cygwin') && $locale != 'C' ]] \
+ && encoding=$lc_messages:e:l:gs/-// \
+ || encoding=$lc_messages:e
+ [[ -n "$encoding" ]] && locale="$locale.$encoding"
+ [[ -z "$LANG$LANGUAGE$LC_ALL$LC_MESSAGES" ]] && unset lc_messages
+
+ if [[ -n "$LANG$LANGUAGE$LC_ALL$LC_MESSAGES" ]] && locale -a 2>/dev/null | grep "^$locale\$" >/dev/null; then
+ # The locale setting seems to be valid: one of the LANG,
+ # LANGUAGE, LC_ALL and/or LC_MESSAGES is set and the locale is
+ # included in "locale -a" output. Good!
+ break
+ fi
+
+ echo "ax-zsh: unknown/unsupported locale ${lc_messages:-unknown}" >&2
+ unset locale
+ while [[ -z "$locale" ]]; do
+ if ! read "locale?Locale? "; then
+ echo >&2
+ break 2
+ fi
+ done
+ if [[ -n "$locale" ]]; then
+ export LANG=$locale
+ unset LANGUAGE LC_ALL LC_MESSAGES
+ fi
+done
+unset lc_messages locale encoding
+
+case "$LANG" in
+ *_*)
+ # LANG contains at least one "_" ("aa_BB" form).
+ if [[ -z "$LANGUAGE" ]]; then
+ # But LANGUAGE isn't set, so set it automatically to
+ # "aa_BB:aa" form.
+ export LANGUAGE=${LANG%.*}:${${LANG%.*}%_*}
+ fi
+esac