Author: alexander
Date: 2005-12-07 21:01:51 -0700 (Wed, 07 Dec 2005)
New Revision: 1257
Modified:
trunk/packages/lfs-bootscripts/langconf
Log:
Updated the language configurator
Modified: trunk/packages/lfs-bootscripts/langconf
===================================================================
--- trunk/packages/lfs-bootscripts/langconf 2005-12-08 03:02:19 UTC (rev
1256)
+++ trunk/packages/lfs-bootscripts/langconf 2005-12-08 04:01:51 UTC (rev
1257)
@@ -1,53 +1,190 @@
#!/bin/sh
+########################################################################
+# Begin $rc_base/init.d/langconf
+#
+# Description : Language and Keymap Configuration Script for the Live CD
+#
+# Authors : Alexander E. Patrakov
+#
+# Version : 00.00
+#
+# Notes :
+#
+########################################################################
-# Get a well-defined sort order
-LC_ALL=C
-export LC_ALL
+SELECTED=
-if [ ! -z "$LANG" ] ; then
- # Assume that the locale is already configured, and the
- # keymap is satisfactory
- exit 0
-fi
+DATABASE=/etc/langconf/lang.dat
+FONTDB=/etc/langconf/font.dat
+ERRDB=/etc/langconf/font-errors.dat
-LOCALES=`cat /boot/isolinux/locales*.msg | grep _ | \
- sed 's, ,\n,g' | grep -v '^$' | sort`
+F_ERROR=0
-ARGS="C Default "
-for L in $LOCALES ; do
- ARGS="$ARGS $L \"`LC_ALL=$L locale language`\" "
-done
+same_locale() {
+ for term in language territory charmap
+ do
+ [ "`LC_ALL=$1 locale $term`" = "`LC_ALL=$2 locale $term`" ] ||
return 1
+ done
+ return 0
+}
-DLG_COMMAND="dialog --title \"Locale configuration\" --default-item C \
- --timeout 20 --menu \"Select your locale from the list below\" 0 0 0 \
- $ARGS"
+guess_selection() {
+ while read F_DESCRIPTION F_LANG F_KEYMAP F_LEGACYCHARSET F_XKEYMAP
+ do
+ if [ -z "$F_DESCRIPTION" ] || [ "$F_DESCRIPTION" = "#" ]
+ then
+ continue
+ fi
+ F_KEYMAP="${F_KEYMAP//\"/}"
+ F_LEGACYCHARSET="${F_LEGACYCHARSET//\"/}"
+ F_XKEYMAP="${F_XKEYMAP//\"/}"
+ same_locale "$F_LANG" "$LANG" && SELECTED="$F_DESCRIPTION" &&
return 0
+ done <$DATABASE
+ F_LANG="$LANG"
+ F_KEYMAP=defkeymap
+ F_LEGACYCHARSET=""
+ F_XKEYMAP="en_US"
+ return 1
+}
-LANG_SELECTED=`eval $DLG_COMMAND 3>&2 2>&1 1>&3`
+get_selection_dlg() {
+ ARGS=""
+ while read F_DESCRIPTION F_JUNK
+ do
+ if [ -z "$F_DESCRIPTION" ] || [ "$F_DESCRIPTION" = "#" ]
+ then
+ continue
+ fi
+ DESCRIPTION=`echo $F_DESCRIPTION | tr _ ' '`
+ ARGS="$ARGS \"$DESCRIPTION\" \"\""
+ done <$DATABASE
+ DLG_COMMAND="dialog --title \"Regional settings\" --timeout 20 \
+ --default-item \"Default/Other\" \
+ --menu \"Choose your locale\" -1 0 0 $ARGS"
+ SELECTED=`eval $DLG_COMMAND 3>&2 2>&1 1>&3`
-if [ $? -ne 0 ] ; then
- exit 0
+ if [ $? -ne 0 ] ; then
+ exit 0
+ fi
+}
+
+guess_font() {
+ # Select font that has all characters in the language
+ # Base the selection on the language's non-UTF-8 locale charmap
+ F_CHARMAP=`LC_ALL=${F_LANG%.UTF-8} locale charmap`
+ while IFS=" " read CHARMAP FONT ERROR
+ do
+ if [ "$F_CHARMAP" = "$CHARMAP" ]
+ then
+ F_FONT="$FONT"
+ F_ERROR="$ERROR"
+ if [ "$F_ERROR" != "0" ]
+ then
+ echo -e `sed -n "${F_ERROR}p" $ERRDB`
+ sleep 5
+ fi
+ fi
+ done <$FONTDB
+
+ # If UTF-8 locale is used, drop any "-m" flag
+ case "$F_LANG" in
+ *.UTF-8)
+ F_FONT=${F_FONT% -m*}
+ ;;
+ esac
+}
+
+confirm() {
+ # TODO: simplify life for Dvorak users. They have to edit
+ # this using (awkward) qwerty keymap!
+
+ DLG_COMMAND="dialog --title \"Confirm/edit settings\" \
+ --no-cancel \
+ --form \"Please review and, if necessary, edit the settings below.
+\n\nKeymap autoconversion is used only together with UTF-8 locales.
+If you don't need to convert your keymap to UTF-8 (e.g. because it
+is already in UTF-8, or because you don't want UTF-8), don't fill in
+that field.
+\n\nIn order to enhance Unicode coverage of the Linux console at the
+cost of unavailable bright colors, use the LatArCyrHeb-16 font.\" 0 0 5 \
+ \"Locale:\" 1 1 \"$F_LANG\" 1 30 40 0 \
+ \"Console keymap:\" 2 1 \"$F_KEYMAP\" 2 30 40 0 \
+ \" autoconverted from charset:\" 3 1 \"$F_LEGACYCHARSET\" 3 30 40 0 \
+ \"Console font:\" 4 1 \"$F_FONT\" 4 30 40 0 \
+ \"X keymap:\" 5 1 \"$F_XKEYMAP\" 5 30 40 0"
+ SELECTION=`eval $DLG_COMMAND 3>&2 2>&1 1>&3`
+ STATUS=$?
+ [ "$STATUS" != 0 ] && exit 1
+ eval "`echo "$SELECTION" | \
+ sed -e '1s,^,F_LANG=",' \
+ -e '2s,^,F_KEYMAP=",' \
+ -e '3s,^,F_LEGACYCHARSET=",' \
+ -e '4s,^,F_FONT=",' \
+ -e '5s,^,F_XKEYMAP=",' | sed -e 's,$,",'`"
+ return 0
+}
+
+interactive_config() {
+ get_selection_dlg
+ F_SELECTED=`echo $SELECTED | tr ' ' _`
+ LINE=`grep "^$F_SELECTED" $DATABASE | sed 's,[[:space:]]\+,\n,g'`
+ eval "`echo "$LINE" | sed -e 's,+, ,g' -e 's,",,g' | \
+ sed -e '1d' \
+ -e '2s,^,F_LANG=",' \
+ -e '3s,^,F_KEYMAP=",' \
+ -e '4s,^,F_LEGACYCHARSET=",' \
+ -e '5s,^,F_XKEYMAP=",' | sed -e 's,$,",'`"
+ [ -z "$F_KEYMAP" ] && F_KEYMAP=defkeymap
+ guess_font
+ [ -z "$F_XKEYMAP" ] && F_XKEYMAP=us
+ confirm
+}
+
+noninteractive_config() {
+ guess_selection
+ F_LANG="$LANG"
+ guess_font
+ # Accept overrides to our guesses if given on the command line
+ [ -z "$F_KEYMAP" ] && F_KEYMAP=defkeymap
+ [ -z "$F_XKEYMAP" ] && F_XKEYMAP=us
+ [ -n "$KEYMAP" ] && F_KEYMAP=${KEYMAP//+/ }
+ [ -n "$FONT" ] && F_FONT=${FONT//+/ }
+ [ -n "$LEGACY_CHARSET" ] && F_LEGACYCHARSET=$LEGACY_CHARSET
+ [ -n "$XKEYMAP" ] && F_XKEYMAP=$XKEYMAP
+}
+
+# Assume that noninteractive configuration is wanted if LANG is set
+if [ -n "$LANG" ]
+then
+ noninteractive_config
+else
+ interactive_config
fi
-echo "LANG=$LANG_SELECTED" >>/etc/environment
-echo "LANG=$LANG_SELECTED ; export LANG" >>/etc/sysconfig/rc
-echo "LANG=$LANG_SELECTED ; export LANG" >>/etc/profile
+# Write the settings out to configuration files
+echo "LANG=\"$F_LANG\" ; export LANG" >>/etc/profile
-KEYMAPS=`cat /boot/isolinux/keymaps.msg | grep -v ':' | grep -v '\[' | sort`
-ARGS="Default \"\" "
-for K in $KEYMAPS ; do
- ARGS="$ARGS $K \"\" "
-done
-DLG_COMMAND="dialog --title \"Keyboard configuration\" --default-item Default \
- --menu \"Select your keyboard layout from the list below\" 0 0 0 \
- $ARGS"
-KEYMAP_SELECTED=`eval $DLG_COMMAND 3>&2 2>&1 1>&3`
+echo "KEYMAP=\"$F_KEYMAP\"" >/etc/sysconfig/console
-if [ $? -ne 0 ] ; then
- exit 0
+if [ "`LC_ALL="$F_LANG" locale charmap`" = "UTF-8" ]
+then
+ echo "UNICODE=1" >>/etc/sysconfig/console
+ echo "BROKEN_COMPOSE=0" >>/etc/sysconfig/console
+ if [ -n "$F_LEGACYCHARSET" ]
+ then
+ echo "FONT=\"$F_FONT -m ${F_LEGACYCHARSET#iso-}\""
>>/etc/sysconfig/console
+ echo "LEGACY_CHARSET=\"$F_LEGACYCHARSET\""
>>/etc/sysconfig/console
+ else
+ echo "FONT=\"$F_FONT\"" >>/etc/sysconfig/console
+ fi
+else
+ echo "FONT=\"$F_FONT\"" >>/etc/sysconfig/console
fi
-if [ "$KEYMAP_SELECTED" = "Default" ] ; then
- exit 0
+sed -i "s/\"en_US\"/\"$F_XKEYMAP\"/" /etc/X11/xorg.conf
+
+if [ "$F_ERROR" = "3" ]
+then
+ echo '[ "$TERM" = "linux" ] && LC_ALL=C' >>/etc/profile
+ echo 'export LC_ALL' >>/etc/profile
fi
-
-echo "KEYMAP=$KEYMAP_SELECTED" >>/etc/sysconfig/console
--
http://linuxfromscratch.org/mailman/listinfo/livecd
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page