freebsd-dev/usr.sbin/pc-sysinstall/backend/functions-localize.sh
Josh Paetzel 441ded2d91 Improve pc-sysinstall's localization options to include support for GDM & KDM
desktop login managers.

PR:	bin/154686
Submitted by:	kmoore
Approved by:	kib (mentor, implicit)
2011-02-18 15:06:35 +00:00

541 lines
13 KiB
Bash
Executable File

#!/bin/sh
#-
# Copyright (c) 2010 iXsystems, Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD$
# Functions which runs commands on the system
. ${BACKEND}/functions.sh
. ${BACKEND}/functions-parse.sh
# Function which localizes a FreeBSD install
localize_freebsd()
{
sed -i.bak "s/lang=en_US/lang=${LOCALE}/g" ${FSMNT}/etc/login.conf
rm ${FSMNT}/etc/login.conf.bak
};
localize_x_desktops() {
# Check for and customize KDE lang
##########################################################################
# Check if we can localize KDE via skel
if [ -e "${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals" ] ; then
sed -i '' "s/Country=us/Country=${COUNTRY}/g" ${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals
sed -i '' "s/Country=us/Country=${COUNTRY}/g" ${FSMNT}/root/.kde4/share/config/kdeglobals
sed -i '' "s/Language=en_US/Language=${SETLANG}:${LOCALE}/g" ${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals
fi
# Check if we have a KDE root config
if [ -e "${FSMNT}/root/.kde4/share/config/kdeglobals" ] ; then
sed -i '' "s/Language=en_US/Language=${SETLANG}:${LOCALE}/g" ${FSMNT}/root/.kde4/share/config/kdeglobals
fi
# Check for KDM
if [ -e "${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc" ] ; then
sed -i '' "s/Language=en_US/Language=${LOCALE}.UTF-8/g" ${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc
fi
# Check for and customize GNOME / GDM lang
##########################################################################
# See if GDM is enabled and customize its lang
cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep "gdm_enable=\"YES\"" >/dev/null 2>/dev/null
if [ "$?" = "0" ] ; then
echo "gdm_lang=\"${LOCALE}.UTF-8\"" >> ${FSMNT}/etc/rc.conf
fi
};
# Function which localizes a PC-BSD install
localize_pcbsd()
{
# Check if we have a localized splash screen and copy it
if [ -e "${FSMNT}/usr/local/share/pcbsd/splash-screens/loading-screen-${SETLANG}.pcx" ]
then
cp ${FSMNT}/usr/local/share/pcbsd/splash-screens/loading-screen-${SETLANG}.pcx ${FSMNT}/boot/loading-screen.pcx
fi
};
localize_x_keyboard()
{
KEYMOD="$1"
KEYLAY="$2"
KEYVAR="$3"
COUNTRY="$4"
OPTION="grp:alt_shift_toggle"
SETXKBMAP=""
if [ "${COUNTRY}" = "NONE" -o "${COUNTRY}" = "us" -o "${COUNTRY}" = "C" ] ; then
#In this case we don't need any additional language
COUNTRY=""
OPTION=""
else
COUNTRY=",${COUNTRY}"
fi
if [ "${KEYMOD}" != "NONE" ]
then
SETXKBMAP="-model ${KEYMOD}"
KXMODEL="${KEYMOD}"
else
KXMODEL="pc104"
fi
if [ "${KEYLAY}" != "NONE" ]
then
localize_key_layout "$KEYLAY"
SETXKBMAP="${SETXKBMAP} -layout ${KEYLAY}"
KXLAYOUT="${KEYLAY}"
else
KXLAYOUT="us"
fi
if [ "${KEYVAR}" != "NONE" ]
then
SETXKBMAP="${SETXKBMAP} -variant ${KEYVAR}"
KXVAR="(${KEYVAR})"
else
KXVAR=""
fi
# Setup .xprofile with our setxkbmap call now
if [ ! -z "${SETXKBMAP}" ]
then
if [ ! -e "${FSMNT}/usr/share/skel/.xprofile" ]
then
echo "#!/bin/sh" >${FSMNT}/usr/share/skel/.xprofile
fi
# Save the keyboard layout for user / root X logins
echo "setxkbmap ${SETXKBMAP}" >>${FSMNT}/usr/share/skel/.xprofile
chmod 755 ${FSMNT}/usr/share/skel/.xprofile
cp ${FSMNT}/usr/share/skel/.xprofile ${FSMNT}/root/.xprofile
# Save it for KDM
if [ -e "${FSMNT}/usr/local/kde4/share/config/kdm/Xsetup" ] ; then
echo "setxkbmap ${SETXKBMAP}" >>${FSMNT}/usr/local/kde4/share/config/kdm/Xsetup
fi
fi
# Create the kxkbrc configuration using these options
if [ -d "${FSMNT}/usr/share/skel/.kde4/share/config" ] ; then
echo "[Layout]
DisplayNames=${KXLAYOUT}${COUNTRY}
IndicatorOnly=false
LayoutList=${KXLAYOUT}${KXVAR}${COUNTRY}
Model=${KXMODEL}
Options=${OPTION}
ResetOldOptions=true
ShowFlag=true
ShowSingle=false
SwitchMode=WinClass
Use=true " >${FSMNT}/usr/share/skel/.kde4/share/config/kxkbrc
fi
};
localize_key_layout()
{
KEYLAYOUT="$1"
# Set the keylayout in rc.conf
case ${KEYLAYOUT} in
am) KEYLAYOUT_CONSOLE="hy.armscii-8" ;;
ch) KEYLAYOUT_CONSOLE="swissgerman.iso" ;;
cz) KEYLAYOUT_CONSOLE="cz.iso2" ;;
de) KEYLAYOUT_CONSOLE="german.iso" ;;
dk) KEYLAYOUT_CONSOLE="danish.iso" ;;
ee) KEYLAYOUT_CONSOLE="estonian.iso" ;;
es) KEYLAYOUT_CONSOLE="spanish.iso" ;;
fi) KEYLAYOUT_CONSOLE="finnish.iso" ;;
is) KEYLAYOUT_CONSOLE="icelandic.iso" ;;
jp) KEYLAYOUT_CONSOLE="jp.106" ;;
nl) KEYLAYOUT_CONSOLE="dutch.iso.acc" ;;
no) KEYLAYOUT_CONSOLE="norwegian.iso" ;;
pl) KEYLAYOUT_CONSOLE="pl_PL.ISO8859-2" ;;
ru) KEYLAYOUT_CONSOLE="ru.koi8-r" ;;
sk) KEYLAYOUT_CONSOLE="sk.iso2" ;;
se) KEYLAYOUT_CONSOLE="swedish.iso" ;;
tr) KEYLAYOUT_CONSOLE="tr.iso9.q" ;;
gb) KEYLAYOUT_CONSOLE="uk.iso" ;;
*) if [ ! -z "${KEYLAYOUT}" ]
then
KEYLAYOUT_CONSOLE="${KEYLAYOUT}.iso"
fi
;;
esac
if [ ! -z "${KEYLAYOUT_CONSOLE}" ]
then
echo "keymap=\"${KEYLAYOUT_CONSOLE}\"" >>${FSMNT}/etc/rc.conf
fi
};
# Function which prunes other l10n files from the KDE install
localize_prune_langs()
{
get_value_from_cfg localizeLang
KEEPLANG="$VAL"
if [ -z "$KEEPLANG" ] ; then
KEEPLANG="en"
fi
export KEEPLANG
echo_log "Pruning other l10n files, keeping ${KEEPLANG}"
# Create the script to do uninstalls
echo '#!/bin/sh
for i in `pkg_info | grep "kde-l10n" | cut -d " " -f 1`
do
echo "$i" | grep "${KEEPLANG}-kde"
if [ "$?" != "0" ] ; then
pkg_delete ${i}
fi
done
' > ${FSMNT}/.pruneLangs.sh
chmod 755 ${FSMNT}/.pruneLangs.sh
chroot ${FSMNT} /.pruneLangs.sh >/dev/null 2>/dev/null
rm ${FSMNT}/.pruneLangs.sh
};
# Function which sets COUNTRY SETLANG and LOCALE based upon $1
localize_get_codes()
{
TARGETLANG="${1}"
# Setup the presets for the specific lang
case $TARGETLANG in
af)
COUNTRY="C"
SETLANG="af"
LOCALE="af_ZA"
;;
ar)
COUNTRY="C"
SETLANG="ar"
LOCALE="en_US"
;;
az)
COUNTRY="C"
SETLANG="az"
LOCALE="en_US"
;;
ca)
COUNTRY="es"
SETLANG="es:ca"
LOCALE="ca_ES"
;;
be)
COUNTRY="be"
SETLANG="be"
LOCALE="be_BY"
;;
bn)
COUNTRY="bn"
SETLANG="bn"
LOCALE="en_US"
;;
bg)
COUNTRY="bg"
SETLANG="bg"
LOCALE="bg_BG"
;;
cs)
COUNTRY="cz"
SETLANG="cs"
LOCALE="cs_CZ"
;;
da)
COUNTRY="dk"
SETLANG="da"
LOCALE="da_DK"
;;
de)
COUNTRY="de"
SETLANG="de"
LOCALE="de_DE"
;;
en_GB)
COUNTRY="gb"
SETLANG="en_GB:cy"
LOCALE="en_GB"
;;
el)
COUNTRY="gr"
SETLANG="el:gr"
LOCALE="el_GR"
;;
es)
COUNTRY="es"
SETLANG="es"
LOCALE="es_ES"
;;
es_LA)
COUNTRY="us"
SETLANG="es:en_US"
LOCALE="es_ES"
;;
et)
COUNTRY="ee"
SETLANG="et"
LOCALE="et_EE"
;;
fr)
COUNTRY="fr"
SETLANG="fr"
LOCALE="fr_FR"
;;
he)
COUNTRY="il"
SETLANG="he:ar"
LOCALE="he_IL"
;;
hr)
COUNTRY="hr"
SETLANG="hr"
LOCALE="hr_HR"
;;
hu)
COUNTRY="hu"
SETLANG="hu"
LOCALE="hu_HU"
;;
it)
COUNTRY="it"
SETLANG="it"
LOCALE="it_IT"
;;
ja)
COUNTRY="jp"
SETLANG="ja"
LOCALE="ja_JP"
;;
ko)
COUNTRY="kr"
SETLANG="ko"
LOCALE="ko_KR"
;;
nl)
COUNTRY="nl"
SETLANG="nl"
LOCALE="nl_NL"
;;
nn)
COUNTRY="no"
SETLANG="nn"
LOCALE="en_US"
;;
pa)
COUNTRY="pa"
SETLANG="pa"
LOCALE="en_US"
;;
pl)
COUNTRY="pl"
SETLANG="pl"
LOCALE="pl_PL"
;;
pt)
COUNTRY="pt"
SETLANG="pt"
LOCALE="pt_PT"
;;
pt_BR)
COUNTRY="br"
SETLANG="pt_BR"
LOCALE="pt_BR"
;;
ru)
COUNTRY="ru"
SETLANG="ru"
LOCALE="ru_RU"
;;
sl)
COUNTRY="si"
SETLANG="sl"
LOCALE="sl_SI"
;;
sk)
COUNTRY="sk"
SETLANG="sk"
LOCALE="sk_SK"
;;
sv)
COUNTRY="se"
SETLANG="sv"
LOCALE="sv_SE"
;;
uk)
COUNTRY="ua"
SETLANG="uk"
LOCALE="uk_UA"
;;
vi)
COUNTRY="vn"
SETLANG="vi"
LOCALE="en_US"
;;
zh_CN)
COUNTRY="cn"
SETLANG="zh_CN"
LOCALE="zh_CN"
;;
zh_TW)
COUNTRY="tw"
SETLANG="zh_TW"
LOCALE="zh_TW"
;;
*)
COUNTRY="C"
SETLANG="${TARGETLANG}"
LOCALE="en_US"
;;
esac
export COUNTRY SETLANG LOCALE
};
# Function which sets the timezone on the system
set_timezone()
{
TZONE="$1"
cp ${FSMNT}/usr/share/zoneinfo/${TZONE} ${FSMNT}/etc/localtime
};
# Function which enables / disables NTP
set_ntp()
{
ENABLED="$1"
if [ "$ENABLED" = "yes" -o "${ENABLED}" = "YES" ]
then
cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep 'ntpd_enable="YES"' >/dev/null 2>/dev/null
if [ "$?" != "0" ]
then
echo 'ntpd_enable="YES"' >>${FSMNT}/etc/rc.conf
echo 'ntpd_sync_on_start="YES"' >>${FSMNT}/etc/rc.conf
fi
else
cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep 'ntpd_enable="YES"' >/dev/null 2>/dev/null
if [ "$?" != "0" ]
then
sed -i.bak 's|ntpd_enable="YES"||g' ${FSMNT}/etc/rc.conf
fi
fi
};
# Starts checking for localization directives
run_localize()
{
KEYLAYOUT="NONE"
KEYMOD="NONE"
KEYVAR="NONE"
while read line
do
# Check if we need to do any localization
echo $line | grep "^localizeLang=" >/dev/null 2>/dev/null
if [ "$?" = "0" ]
then
# Set our country / lang / locale variables
get_value_from_string "$line"
localize_get_codes ${VAL}
get_value_from_string "$line"
# If we are doing PC-BSD install, localize it as well as FreeBSD base
if [ "${INSTALLTYPE}" != "FreeBSD" ]
then
localize_pcbsd "$VAL"
fi
# Localize FreeBSD
localize_freebsd "$VAL"
# Localize any X pkgs
localize_x_desktops "$VAL"
fi
# Check if we need to do any keylayouts
echo $line | grep "^localizeKeyLayout=" >/dev/null 2>/dev/null
if [ "$?" = "0" ] ; then
get_value_from_string "$line"
KEYLAYOUT="$VAL"
fi
# Check if we need to do any key models
echo $line | grep "^localizeKeyModel=" >/dev/null 2>/dev/null
if [ "$?" = "0" ] ; then
get_value_from_string "$line"
KEYMOD="$VAL"
fi
# Check if we need to do any key variant
echo $line | grep "^localizeKeyVariant=" >/dev/null 2>/dev/null
if [ "$?" = "0" ] ; then
get_value_from_string "$line"
KEYVAR="$VAL"
fi
# Check if we need to set a timezone
echo $line | grep "^timeZone=" >/dev/null 2>/dev/null
if [ "$?" = "0" ] ; then
get_value_from_string "$line"
set_timezone "$VAL"
fi
# Check if we need to set a timezone
echo $line | grep "^enableNTP=" >/dev/null 2>/dev/null
if [ "$?" = "0" ] ; then
get_value_from_string "$line"
set_ntp "$VAL"
fi
done <${CFGF}
if [ "${INSTALLTYPE}" != "FreeBSD" ] ; then
# Do our X keyboard localization
localize_x_keyboard "${KEYMOD}" "${KEYLAYOUT}" "${KEYVAR}" "${COUNTRY}"
fi
# Check if we want to prunt any other KDE lang files to save some disk space
get_value_from_cfg localizePrune
if [ "${VAL}" = "yes" -o "${VAL}" = "YES" ] ; then
localize_prune_langs
fi
# Update the login.conf db, even if we didn't localize, its a good idea to make sure its up2date
run_chroot_cmd "/usr/bin/cap_mkdb /etc/login.conf" >/dev/null 2>/dev/null
};