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

Reply via email to