nix-tools/livecd/util-lng.sh
2014-12-09 00:17:46 +01:00

140 lines
No EOL
3.8 KiB
Bash

#!/bin/bash
kernel_cmdline ()
{
for param in $(/bin/cat /proc/cmdline); do
case "${param}" in
$1=*) echo "${param##*=}"; return 0 ;;
$1) return 0 ;;
*) continue ;;
esac
done
[ -n "${2}" ] && echo "${2}"
return 1
}
get_country() {
local COUNTRY=$(kernel_cmdline lang)
echo $COUNTRY
}
get_keyboard() {
local KEYBOARD=$(kernel_cmdline keytable)
echo $KEYBOARD
}
get_layout() {
local LAYOUT=$(kernel_cmdline layout)
echo $LAYOUT
}
_find_legacy_keymap() {
file="/opt/livecd/kbd-model-map"
while read -r line || [[ -n $line ]]; do
if [[ -z $line ]] || [[ $line == \#* ]]; then
continue
fi
mapping=( $line ); # parses columns
if [[ ${#mapping[@]} != 5 ]]; then
continue
fi
if [[ "$KEYMAP" != "${mapping[0]}" ]]; then
continue
fi
if [[ "${mapping[3]}" = "-" ]]; then
mapping[3]=""
fi
X11_LAYOUT=${mapping[1]}
X11_MODEL=${mapping[2]}
X11_VARIANT=${mapping[3]}
x11_OPTIONS=${mapping[4]}
done < $file
}
_write_x11_config_file() {
# find a x11 layout that matches the keymap
# in isolinux if you select a keyboard layout and a language that doesnt match this layout,
# it will provide the correct keymap, but not kblayout value
local X11_LAYOUT=
local X11_MODEL="pc105"
local X11_VARIANT=""
local X11_OPTIONS="terminate:ctrl_alt_bksp"
_find_legacy_keymap
# layout not found, use KBLAYOUT
if [[ -z "$X11_LAYOUT" ]]; then
X11_LAYOUT="$KBLAYOUT"
fi
# create X11 keyboard layout config
mkdir -p "${DESTDIR}/etc/X11/xorg.conf.d"
if [ -e /run/openrc ]; then
local XORGKBLAYOUT="${DESTDIR}/etc/X11/xorg.conf.d/20-keyboard.conf"
else
local XORGKBLAYOUT="${DESTDIR}/etc/X11/xorg.conf.d/00-keyboard.conf"
fi
echo "" >> "$XORGKBLAYOUT"
echo "Section \"InputClass\"" > "$XORGKBLAYOUT"
echo " Identifier \"system-keyboard\"" >> "$XORGKBLAYOUT"
echo " MatchIsKeyboard \"on\"" >> "$XORGKBLAYOUT"
echo " Option \"XkbLayout\" \"$X11_LAYOUT\"" >> "$XORGKBLAYOUT"
echo " Option \"XkbModel\" \"$X11_MODEL\"" >> "$XORGKBLAYOUT"
echo " Option \"XkbVariant\" \"$X11_VARIANT\"" >> "$XORGKBLAYOUT"
echo " Option \"XkbOptions\" \"$X11_OPTIONS\"" >> "$XORGKBLAYOUT"
echo "EndSection" >> "$XORGKBLAYOUT"
# fix por keyboardctl
if [ -f "${DESTDIR}/etc/keyboard.conf" ]; then
sed -i -e "s/^XKBLAYOUT=.*/XKBLAYOUT=\"${X11_LAYOUT}\"/g" ${DESTDIR}/etc/keyboard.conf
fi
}
set_locale() {
# hack to be able to set the locale on bootup
local LOCALE=$(get_country)
local KEYMAP=$(get_keyboard)
local KBLAYOUT=$(get_layout)
# set a default value, in case something goes wrong, or a language doesn't have
# good defult settings
[ -n "$LOCALE" ] || LOCALE="en_US"
[ -n "$KEYMAP" ] || KEYMAP="us"
[ -n "$KBLAYOUT" ] || KBLAYOUT="us"
# set keymap
if [ -e /run/openrc ]; then
sed -i "s/keymap=.*/keymap=\"${KEYMAP}\"/" ${DESTDIR}/etc/conf.d/keymaps
else
echo "KEYMAP=us" > ${DESTDIR}/etc/vconsole.conf
sed -i "s/^KEYMAP=.*/KEYMAP=\"${KEYMAP}\"/" ${DESTDIR}/etc/vconsole.conf
fi
# load keymaps
loadkeys "$KEYMAP"
_write_x11_config_file
# set systemwide language
echo "LANG=${LOCALE}.UTF-8" > ${DESTDIR}/etc/locale.conf
echo "LC_MESSAGES=${LOCALE}.UTF-8" >> ${DESTDIR}/etc/locale.conf
echo "LANG=${LOCALE}.UTF-8" >> ${DESTDIR}/etc/environment
# generate LOCALE
local TLANG=${LOCALE%.*} # remove everything after the ., including the dot from LOCALE
sed -i -r "s/#(${TLANG}.*UTF-8)/\1/g" ${DESTDIR}/etc/locale.gen
# add also American English as safe default
sed -i -r "s/#(en_US.*UTF-8)/\1/g" ${DESTDIR}/etc/locale.gen
}
printk()
{
case ${1} in
"on") echo 4 >/proc/sys/kernel/printk ;;
"off") echo 0 >/proc/sys/kernel/printk ;;
esac
}