#! /bin/sh

set -e

. /usr/share/debconf/confmodule

# Avoid locale errors when using apt-install (logical consequence
# of the fact that locales is not yet installed).
export IT_LANG_OVERRIDE=C


db_get debian-installer/locale
LOCALE="$RET"

# Set locale to C if it has not yet been set
# This can happen during e.g. s390 installs where localechooser is not run
[ "$LOCALE" ] || LOCALE="C.UTF-8"

if [ "$LOCALE" != "C" ] && [ "$LOCALE" != "C.UTF-8" ]; then
	db_get debian-installer/language
	LANGLIST="$RET"
fi

EXTRAS=""
if db_get localechooser/supported-locales; then
	EXTRAS="$(echo "$RET" | sed 's/,//g')"
fi

LANGUAGE="${LOCALE%%_*}"

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 language.
	db_get localechooser/languagelist
	ORIG_LANGUAGE="$RET"
	db_get debian-installer/country
	COUNTRY="$RET"

	if grep -q "^$ORIG_LANGUAGE;" /usr/share/localechooser/languagelist; then
		SUPPORTEDLOCALES=/usr/share/localechooser/SUPPORTED
		if [ ! -f "$SUPPORTEDLOCALES" ]; then
			SUPPORTEDLOCALES=/usr/share/i18n/SUPPORTED
		fi

		LOCALE_TRANSLATIONS="$(grep "^$ORIG_LANGUAGE;" /usr/share/localechooser/languagelist | cut -d';' -f4)"
		newlocale="$(echo "$LOCALE" | sed "s/_[A-Z][A-Z]*/_$COUNTRY/")"
		if grep -q "^${newlocale%%[.@]*}[.@ ]" $SUPPORTEDLOCALES && \
		   [ "$newlocale" != "$LOCALE_TRANSLATIONS" ]; then
			LOCALE="$newlocale"
			LANGLIST="$(grep "^$ORIG_LANGUAGE;" /usr/share/localechooser/languagelist | cut -d';' -f5)"
		fi
	fi
	;;
esac

# Enable translations
if [ "$LOCALE" != "C" ] && [ "$LOCALE" != "C.UTF-8" ] || [ "$EXTRAS" ]; then
	apt-install locales || true
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
}

# Set global locale and language, and make sure the glibc locale is
# generated.
DESTFILE="/target/etc/default/locale"
if [ -e $DESTFILE ]; then
	if grep -q '^LANG=' $DESTFILE; then
		sed -i 's/^LANG=.*/LANG=\"'"$LOCALE_TRANSLATIONS"'\"/' $DESTFILE
	elif grep -q '^# LANG=' $DESTFILE; then
		sed -i 's/^# LANG=.*/LANG=\"'"$LOCALE_TRANSLATIONS"'\"/' $DESTFILE
	else
		echo "LANG=\"$LOCALE_TRANSLATIONS\"" >> $DESTFILE
	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
		if grep -q '^LANGUAGE=' $DESTFILE; then
			sed -i 's/^LANGUAGE=.*/LANGUAGE=\"'"$LANGLIST"'\"/' $DESTFILE
		elif grep -q '^# LANGUAGE=' $DESTFILE; then
			sed -i 's/^# LANGUAGE=.*/LANGUAGE=\"'"$LANGLIST"'\"/' $DESTFILE
		else
			echo "LANGUAGE=\"$LANGLIST\"" >> $DESTFILE
		fi
	fi
fi
# Fallback in case the file wasn't provided by locales, or the format
# changed.
if [ ! -e "$DESTFILE" ] || ! grep -q '^LANG=' $DESTFILE; then
	mkdir -p "${DESTFILE%/*}"
	echo "LANG=\"$LOCALE_TRANSLATIONS\"" >> $DESTFILE
	if echo "$LANGLIST" | grep -q ":"; then
		echo "LANGUAGE=\"$LANGLIST\"" >> $DESTFILE
	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 /target/etc/default/locale "$category" "$LOCALE"
	done
fi

# For languages that have no chance to be displayed at the Linux console
# let's set root's environment with a non localized environment
ROOTPROFILE="/target/root/.profile"
# We must map the language to its "level" from languagelist
LANGUAGECODE=`echo $LOCALE|cut -f1 -d_`
# For language with multiple entries such as pt/pt_BR or zh_CN/zh_TW
# we don't really care about the entry we will match as the level will always
# be the same
LEVEL=`cat /usr/share/localechooser/languagelist |\
	cut -f 2-3 -d\; | \
	grep "$LANGUAGECODE" | \
	head -n 1 | \
	cut -f1 -d\;`
if [ "$LEVEL" = "3" ] || [ "$LEVEL" = "4" ]; then
	echo "# Installed by Debian Installer:" >>$ROOTPROFILE
	echo "#  no localization for root because $LOCALE" >>$ROOTPROFILE
	echo "#  cannot be properly displayed at the Linux console" >>$ROOTPROFILE
	echo "LANG=C.UTF-8" >>$ROOTPROFILE
	echo "LANGUAGE=C.UTF-8" >>$ROOTPROFILE
fi

locale_gen () {
	local loc
	for loc; do
		# Create a skeleton locale-langpack subdirectory so that
		# /usr/share/language-tools/language-options knows that this
		# locale is supposed to have a meaningful existence.
		mkdir -p "/target/usr/share/locale-langpack/${loc%_*}"
	done
	log-output -t localechooser chroot /target /usr/sbin/locale-gen "$@"
}

if [ "$LOCALE" != C ] && [ "$LOCALE" != "C.UTF-8" ]; then
	locale_gen "$LOCALE" || true
fi
if [ "$EXTRAS" ]; then
	locale_gen $EXTRAS || true
fi

exit 0
