217 lines
7.6 KiB
Bash
Executable File
217 lines
7.6 KiB
Bash
Executable File
#! /bin/sh
|
|
set -e
|
|
|
|
. /usr/share/debconf/confmodule
|
|
|
|
# We need to duplicate this code because localechooser has the right to
|
|
# assume that its later scripts are only run once, but oem-config doesn't
|
|
# have that luxury.
|
|
|
|
db_get debian-installer/locale
|
|
LOCALE="$RET"
|
|
|
|
db_get debian-installer/language
|
|
LANGLIST="$RET"
|
|
|
|
db_get debian-installer/country
|
|
COUNTRY="$RET"
|
|
|
|
db_get localechooser/supported-locales
|
|
EXTRAS="$(echo "$RET" | sed 's/,//g')"
|
|
|
|
LOCALE_TRANSLATIONS="$LOCALE"
|
|
|
|
case ${LOCALE%%_*} in
|
|
pt|zh)
|
|
# In the special cases of Portuguese and Chinese, selecting a
|
|
# different location may imply a different dialect of the language.
|
|
# In such cases, make LANG reflect the selected language (for
|
|
# messages, character types, and collation) and make the other
|
|
# locale categories reflect the selected location.
|
|
db_get localechooser/languagelist
|
|
ORIG_LANGUAGE="$RET"
|
|
|
|
if grep -q "^$ORIG_LANGUAGE;" /usr/lib/ubiquity/localechooser/languagelist; then
|
|
newlocale="$(echo "$LOCALE" | sed "s/_[A-Z][A-Z]*/_$COUNTRY/")"
|
|
if grep -q "^${newlocale%%[.@]*}[.@ ]" /usr/share/i18n/SUPPORTED && \
|
|
[ "$newlocale" != "$LOCALE" ]; then
|
|
LOCALE="$newlocale"
|
|
LANGLIST="$(grep "^$ORIG_LANGUAGE;" /usr/lib/ubiquity/localechooser/languagelist | cut -d';' -f6)"
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
# It is relatively common for the combination of language and location (as
|
|
# selected on the timezone page) not to identify a supported combined
|
|
# locale. For example, this happens when the user is a migrant, or when
|
|
# they prefer to use a different language to interact with their computer
|
|
# because that language is better-supported.
|
|
#
|
|
# In such cases, we would like to be able to use a locale reflecting the
|
|
# selected language in LANG for messages, character types, and collation,
|
|
# and to make the other locale categories reflect the selected location.
|
|
# This means that we have to guess at a suitable locale for the selected
|
|
# location, and we do not want to ask yet another locale-related question.
|
|
# Nevertheless, some cases are ambiguous: a user who has asked for the
|
|
# English language and identifies their location as Switzerland will get
|
|
# different numeric representation depending on which Swiss locale we pick.
|
|
#
|
|
# The goal of identifying a reasonable default for migrants makes things
|
|
# easier: it is reasonable to default to French for France despite the
|
|
# existence of several minority languages there, because anyone who prefers
|
|
# those languages will probably already have selected them and won't arrive
|
|
# here. However, in some cases we're unsure, and in some cases we actively
|
|
# don't want to pick a "preferred" language: selecting either Greek or
|
|
# Turkish as the default language for migrants to Cyprus would probably
|
|
# offend somebody! In such cases we simply punt to the old behaviour of not
|
|
# setting up a locale reflecting the location, which is suboptimal but is at
|
|
# least unlikely to give offence.
|
|
#
|
|
# Our best shot at general criteria for selecting a default language in
|
|
# these circumstances are as follows:
|
|
#
|
|
# * Exclude special-purpose (e.g. en_DK) and artificial (e.g. la_AU,
|
|
# tlh_GB) locales.
|
|
# * If there is a language specific to or very strongly associated with the
|
|
# country in question, prefer it unless it has rather few native
|
|
# speakers.
|
|
# * Exclude minority languages that are relatively unlikely to be spoken by
|
|
# migrants who have not already selected them as their preferred language
|
|
# earlier in the installer.
|
|
# * If there is an official national language likely to be seen in print
|
|
# media, road signs, etc., then prefer that.
|
|
# * In cases of doubt, selecting no default language is safe.
|
|
#
|
|
# This code is currently duplicated between here and
|
|
# ubiquity/d-i/patches/localechooser-post-base-installer.patch. Please keep
|
|
# them in sync until the duplication can be removed.
|
|
|
|
combined="$(echo "$LOCALE" | sed "s/_[A-Z][A-Z]*/_$COUNTRY/")"
|
|
if [ "$LOCALE" = "$LOCALE_TRANSLATIONS" ] && \
|
|
! grep -q "^${combined%%[.@]*}[.@ ]" /usr/share/i18n/SUPPORTED; then
|
|
available="$(grep ' UTF-8' /usr/share/i18n/SUPPORTED | \
|
|
grep "_$COUNTRY[.@ ]" | cut -d' ' -f1 | sort -u)"
|
|
if [ "$(echo "$available" | wc -l)" = 1 ]; then
|
|
combined="$available"
|
|
else
|
|
case $COUNTRY in
|
|
AU) deflang=en ;;
|
|
CN) deflang=zh ;;
|
|
DE) deflang=de ;;
|
|
DK) deflang=da ;;
|
|
DZ) deflang=ar ;;
|
|
ES) deflang=es ;;
|
|
# Somewhat unclear: Oromo has the greatest number of
|
|
# native speakers; English is the most widely spoken
|
|
# language and taught in secondary schools; Amharic is
|
|
# the official language and was taught in primary
|
|
# schools.
|
|
ET) deflang=am ;;
|
|
FI) deflang=fi ;;
|
|
FR) deflang=fr ;;
|
|
GB) deflang=en ;;
|
|
# Irish (Gaelic) is strongly associated with Ireland,
|
|
# but nearly all its native speakers also speak English,
|
|
# and migrants are likely to use English.
|
|
IE) deflang=en ;;
|
|
IT) deflang=it ;;
|
|
MA) deflang=ar ;;
|
|
MK) deflang=mk ;;
|
|
NG) deflang=en ;;
|
|
NL) deflang=nl ;;
|
|
NZ) deflang=en ;;
|
|
IL) deflang=he ;;
|
|
# Filipino is a de facto version of Tagalog, which is
|
|
# also spoken; English is also an official language.
|
|
PH) deflang=fil ;;
|
|
PK) deflang=ur ;;
|
|
PL) deflang=pl ;;
|
|
RU) deflang=ru ;;
|
|
# Chinese has more speakers, but English is the "common
|
|
# language of the nation" (Wikipedia) and official
|
|
# documents must be translated into English to be
|
|
# accepted.
|
|
SG) deflang=en ;;
|
|
SN) deflang=wo ;;
|
|
TR) deflang=tr ;;
|
|
TW) deflang=zh ;;
|
|
UA) deflang=uk ;;
|
|
US) deflang=en ;;
|
|
ZM) deflang=en ;;
|
|
*) deflang= ;;
|
|
esac
|
|
combined="$(grep ' UTF-8' /usr/share/i18n/SUPPORTED | \
|
|
grep "${deflang}_$COUNTRY[.@ ]" | head -n1 | \
|
|
cut -d' ' -f1)"
|
|
fi
|
|
|
|
if [ "$combined" ]; then
|
|
LOCALE="$combined"
|
|
fi
|
|
fi
|
|
|
|
set_field () {
|
|
local file category value
|
|
file="$1"
|
|
category="$2"
|
|
value="$3"
|
|
|
|
if grep -qs "^#* *$category=" "$file"; then
|
|
sed -i "s,^#* *$category=.*,$category=\"$value\"," "$file"
|
|
else
|
|
echo "$category=\"$value\"" >> "$file"
|
|
fi
|
|
}
|
|
|
|
if [ -e /etc/environment ]; then
|
|
sed -i "s,^LANG=.*,LANG=\"$LOCALE_TRANSLATIONS\"," /etc/environment
|
|
fi
|
|
if grep -qs "^LANG=" /etc/default/locale; then
|
|
sed -i "s,^LANG=.*,LANG=\"$LOCALE_TRANSLATIONS\"," /etc/default/locale
|
|
else
|
|
echo "LANG=\"$LOCALE_TRANSLATIONS\"" >> /etc/default/locale
|
|
fi
|
|
# We set LANGUAGE only if the languagelist is a list of
|
|
# languages with alternatives. Otherwise, setting it is useless
|
|
if echo "$LANGLIST" | grep -q ":"; then
|
|
# Adjust /etc/environment if LANGUAGE is already set, but otherwise
|
|
# leave it alone.
|
|
if grep -q "^LANGUAGE=" /etc/environment; then
|
|
sed -i "s,^LANGUAGE=.*,LANGUAGE=\"$LANGLIST\"," /etc/environment
|
|
fi
|
|
if grep -q "^LANGUAGE=" /etc/default/locale; then
|
|
sed -i "s,^LANGUAGE=.*,LANGUAGE=\"$LANGLIST\"," /etc/default/locale
|
|
else
|
|
echo "LANGUAGE=\"$LANGLIST\"" >> /etc/default/locale
|
|
fi
|
|
else
|
|
if [ -e /etc/environment ]; then
|
|
sed -i "/^LANGUAGE=/d" /etc/environment
|
|
fi
|
|
if [ -e /etc/default/locale ]; then
|
|
sed -i "/^LANGUAGE=/d" /etc/default/locale
|
|
fi
|
|
fi
|
|
if [ "$LOCALE_TRANSLATIONS" != "$LOCALE" ]; then
|
|
for category in \
|
|
LC_NUMERIC LC_TIME LC_MONETARY LC_PAPER LC_NAME LC_ADDRESS \
|
|
LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION; do
|
|
set_field /etc/default/locale "$category" "$LOCALE"
|
|
done
|
|
mkdir -p "/usr/share/locale-langpack/${LOCALE%_*}"
|
|
/usr/sbin/locale-gen --no-purge "$LOCALE" || true
|
|
fi
|
|
|
|
if [ -e /etc/default/gdm ]; then
|
|
sed -i "s,^#*LANG=.*,LANG=$LOCALE_TRANSLATIONS,g" /etc/default/gdm
|
|
fi
|
|
|
|
LANGCODE="${LOCALE_TRANSLATIONS%%_*}"
|
|
LANGCODE="${LANGCODE%%.*}"
|
|
LANGCODE="${LANGCODE%%@*}"
|
|
mkdir -p "/usr/share/locale-langpack/${LANGCODE%_*}"
|
|
/usr/share/locales/install-language-pack "$LANGCODE" '' || true
|
|
|
|
# TODO: kbd/cyr handling?
|