
This makes zsh act like 'sh', but only for the function local function. This way, we do not affect the user's shell, but get the behavior we want.
96 lines
2.6 KiB
Bash
Executable File
96 lines
2.6 KiB
Bash
Executable File
#!/bin/sh
|
|
# vi: ts=4 noexpandtab
|
|
#
|
|
# Author: Ben Howard <ben.howard@canonical.com>
|
|
# Author: Scott Moser <scott.moser@ubuntu.com>
|
|
# (c) 2012, Canonical Group, Ltd.
|
|
#
|
|
# Purpose: Detect invalid locale settings and inform the user
|
|
# of how to fix them.
|
|
#
|
|
|
|
locale_warn() {
|
|
local bad_names="" bad_lcs="" key="" val="" var="" vars=""
|
|
local w1 w2 w3 w4 remain
|
|
|
|
# if shell is zsh, act like sh only for this function (-L).
|
|
# The behavior change will not permenently affect user's shell.
|
|
[ "${ZSH_NAME+zsh}" = "zsh" ] && emulate -L sh
|
|
|
|
# locale is expected to output either:
|
|
# VARIABLE=
|
|
# VARIABLE="value"
|
|
# locale: Cannot set LC_SOMETHING to default locale
|
|
while read -r w1 w2 w3 w4 remain; do
|
|
case "$w1" in
|
|
locale:) bad_names="${bad_names} ${w4}";;
|
|
*)
|
|
key=${w1%%=*}
|
|
val=${w1#*=}
|
|
val=${val#\"}
|
|
val=${val%\"}
|
|
vars="${vars} $key=$val";;
|
|
esac
|
|
done
|
|
for bad in $bad_names; do
|
|
for var in ${vars}; do
|
|
[ "${bad}" = "${var%=*}" ] || continue
|
|
val=${var#*=}
|
|
[ "${bad_lcs#* ${val}}" = "${bad_lcs}" ] &&
|
|
bad_lcs="${bad_lcs} ${val}"
|
|
break
|
|
done
|
|
done
|
|
bad_lcs=${bad_lcs# }
|
|
[ -n "$bad_lcs" ] || return 0
|
|
|
|
printf "_____________________________________________________________________\n"
|
|
printf "WARNING! Your environment specifies an invalid locale.\n"
|
|
printf " This can affect your user experience significantly, including the\n"
|
|
printf " ability to manage packages. You may install the locales by running:\n\n"
|
|
|
|
local bad invalid="" to_gen="" sfile="/usr/share/i18n/SUPPORTED"
|
|
local pkgs=""
|
|
if [ -e "$sfile" ]; then
|
|
for bad in ${bad_lcs}; do
|
|
grep -q -i "${bad}" "$sfile" &&
|
|
to_gen="${to_gen} ${bad}" ||
|
|
invalid="${invalid} ${bad}"
|
|
done
|
|
else
|
|
printf " sudo apt-get install locales\n"
|
|
to_gen=$bad_lcs
|
|
fi
|
|
to_gen=${to_gen# }
|
|
|
|
local pkgs=""
|
|
for bad in ${to_gen}; do
|
|
pkgs="${pkgs} language-pack-${bad%%_*}"
|
|
done
|
|
pkgs=${pkgs# }
|
|
|
|
if [ -n "${pkgs}" ]; then
|
|
printf " sudo apt-get install ${pkgs# }\n"
|
|
printf " or\n"
|
|
printf " sudo locale-gen ${to_gen# }\n"
|
|
printf "\n"
|
|
fi
|
|
for bad in ${invalid}; do
|
|
printf "WARNING: '${bad}' is an invalid locale\n"
|
|
done
|
|
|
|
printf "To see all available language packs, run:\n"
|
|
printf " apt-cache search \"^language-pack-[a-z][a-z]$\"\n"
|
|
printf "To disable this message for all users, run:\n"
|
|
printf " sudo touch /var/lib/cloud/instance/locale-check.skip\n"
|
|
printf "_____________________________________________________________________\n\n"
|
|
|
|
# only show the message once
|
|
: > ~/.cloud-locale-test.skip 2>/dev/null || :
|
|
}
|
|
|
|
[ -f ~/.cloud-locale-test.skip -o -f /var/lib/cloud/instance/locale-check.skip ] ||
|
|
locale 2>&1 | locale_warn
|
|
|
|
unset locale_warn
|