slitaz-tools view tinyutils/tazlocale @ rev 961

tazlocale: accept only existing locales, show locale description; translations: un-fuzzy already translated messages
author Aleksej Bobylev <al.bobylev@gmail.com>
date Wed Nov 25 23:50:30 2015 +0200 (2015-11-25)
parents 3be081525506
children bb7be0ca546f
line source
1 #!/bin/sh
2 #
3 # Tazlocale: SliTaz GNU/Linux locale setting using dialog boxes.
4 # Configuration file is: /etc/locale.conf
5 #
6 # Copyright (C) 2008-2015 SliTaz GNU/Linux - BSD License
7 #
8 # Author: Christophe Lincoln <pankso@slitaz.org>
9 #
11 . /lib/libtaz.sh
12 export TEXTDOMAIN='slitaz-tools' #i18n
15 usage() {
16 newline
17 _ 'SliTaz GNU/Linux locale setting using dialog boxes.'
19 newline; boldify "$(_ 'Usage:')"
20 echo " tazlocale [$(_ 'option')]"
22 newline; boldify "$(_ 'Options:')"
23 optlist "\
24 info $(_ 'Show info about config file and current locale.')
25 list $(_ 'Show list of available locales.')"
27 newline
28 _ 'Any other option treated as locale - set locale (root).'
29 _ 'Display locale selecting dialog if no option given (root).'
30 newline
31 }
34 # Make symlink to file, substitute "%%" to "ll_CC", "ll" or "en" according to
35 # current language settings and file existence
36 # (where "ll_CC" - full locale format (lang and country, and maybe, modifier).
38 make_i18n_link() {
39 if [ -d $(dirname ${1/.%%/}) ]; then
40 cd $(dirname ${1/.%%/})
42 if [ -e ${1/%%/$LANG} ]; then
43 ln -fs $(basename ${1/%%/$LANG}) ${1/.%%/}
44 else
45 if [ -e ${1/%%/$LANGUAGE} ]; then
46 ln -fs $(basename ${1/%%/$LANGUAGE}) ${1/.%%/}
47 else
48 ln -fs $(basename ${1/%%/en}) ${1/.%%/}
49 fi
50 fi
51 fi
52 }
55 # Create symlink to translated files provided by SliTaz language pack,
56 # doc and config files.
58 link_language_files() {
59 . /etc/locale.conf
60 LANGUAGE=${LANG%_*}
61 [ "$LANG" == 'POSIX' ] && LANGUAGE='en'
63 # Openbox menu
64 make_i18n_link /etc/xdg/openbox/menu.%%.xml
66 # Documentation
67 make_i18n_link /usr/share/doc/slitaz/index.%%.html
69 # SliTaz Software Manuals
70 for soft in tazpkg tazlito tazusb tazwok tazweb cookutils; do
71 make_i18n_link /usr/share/doc/$soft/$soft.%%.html
72 done
74 # SliTaz TazWeb "My Web Home"
75 make_i18n_link /usr/share/tazweb/home.%%.html
77 # SliTaz WebHome
78 make_i18n_link /usr/share/webhome/index.%%.html
80 # TazPanel Doc under www
81 make_i18n_link /var/www/tazpanel/doc/tazpanel.%%.html
83 # SliTaz Tools Manuals
84 for soft in burnbox tazinst; do
85 make_i18n_link /usr/share/doc/slitaz-tools/$soft.%%.html
86 done
87 }
90 # Locale name displayed.
92 get_locale_name() {
93 for i in $(ls -1 /usr/share/i18n/locales | grep [a-z]_[A-Z]); do
94 echo -n "$i "
95 desc=$(grep ^title /usr/share/i18n/locales/$i | cut -d '"' -f 2)
96 if [ -n "$desc" ]; then
97 echo "$desc" | tr -c '[A-Za-z0-9\n]' '_'
98 else
99 echo "Locale"
100 fi
101 done
102 }
105 # We have no locale files in /usr/lib/locale by default.
106 # Run localedef in background to have a faster boot.
108 gen_utf8_locale() {
109 if [ ! -d "/usr/lib/locale/$locale.UTF-8" ]; then
110 localedef -i "$locale" -c -f 'UTF-8' "/usr/lib/locale/$locale.UTF-8" &
111 fi
112 }
115 # Config /etc/locale.conf
117 system_config() {
118 # If locale not defined: show error and exit
119 ls "/usr/share/i18n/locales/$locale" >/dev/null || return
120 export LC_ALL="$locale.UTF-8"
121 action 'Setting system locale to: %s' "$locale.UTF-8"
122 echo -e "LANG=$locale.UTF-8\nLC_ALL=$locale.UTF-8" > /etc/locale.conf
123 status
124 gen_utf8_locale
125 link_language_files
126 # Clean TazPanel cached headers in old language
127 [ -n "$(which tazpanel)" ] && tazpanel cc
128 }
131 # Dialog menu.
133 dialog_menu() {
134 exec 3>&1
135 locale=$($DIALOG --clear \
136 --title "{ $(_n 'SliTaz language setting') }" \
137 --menu "" 20 72 14 \
138 "en" "English" \
139 $(get_locale_name) \
140 2>&1 1>&3)
141 retval=$?
142 exec 3>&-
143 case $retval in
144 0) continue ;;
145 1|255) exit 0 ;;
146 esac
148 # Default: POSIX => English
149 [ "$locale" = 'en' ] && locale='en_US'
150 [ -s /etc/locale.conf ] && RECONFIG='yes'
152 # If it's a reconfiguration give an info message.
153 if [ -n "$RECONFIG" ]; then
154 export LC_ALL=$locale
155 msg=$(_n "\
156 Please logout of your current session and login again to use new locale.")
157 $DIALOG --clear --title " $(_n 'Information') " --msgbox "$msg" 16 70
158 fi
159 system_config
160 }
162 case "$1" in
163 --help|-h)
164 usage ;;
165 info)
166 . /etc/locale.conf
167 _ 'Config file: %s' '/etc/locale.conf'
168 _ 'Current locale: %s' "$LANG"
169 ;;
170 list)
171 list=
172 for i in $(ls -1 /usr/share/i18n/locales | grep '[a-z]_[A-Z]'); do
173 desc=$(fgrep -m1 title /usr/share/i18n/locales/$i | cut -d'"' -f2)
174 list="$list
175 $i $desc"
176 done
177 optlist "$list" ;;
178 "")
179 # No args: display Ncurses dialog.
180 : ${DIALOG=dialog --timeout 60}
181 check_root $@
182 dialog_menu ;;
183 *)
184 # Usage: tazlocale LANG_COUNTRY
185 locale=$1
186 check_root $@
187 system_config ;;
188 esac
190 exit 0