#!/bin/bash ## Script to download language, locale and man files ## for your chosen language. This script is called from ## the Porteus Settings Centre ## Author: Fanthom ## Adapted to gtkdialog by Brokenman ## Date: 01 July 2013 ## Email: set -x LSTSCRIPT="$(cd "${0%/*}" 2>/dev/null; echo "$PWD"/"${0##*/}")" [ ! $DISPLAY ] && echo "$LSTSCRIPT requires an xsession" && exit . /usr/lib/librokenman trap clean_and_bail SIGHUP SIGINT SIGTERM exec 2>/dev/null ## Variables porteus_desktops="kde mate lxqt xfce" porteus_browsers="opera chrome" if [ `uname -m` = x86_64 ]; then export arch=x86_64 export lib=lib64 export build=1ftm else export arch=i486 export lib=lib export build=1ftm fi export wrk=/tmp/lst_wrk log=/var/log/lst.log dir=$wrk/build repo=http://dl.porteus.org lst=$repo/i486/current/packages/Language-Selection-Tool icons=/usr/share/pixmaps/porteus dump=$wrk/.dump ## Touch log file date > $log && touch $log ## Functions silent_check_url(){ if (wget -q --spider --force-html --inet4-only "$1"); then url=1; fi } check_mloop(){ if [ -d /mnt/loop ]; then [ `ls -1 /mnt/loop|wc -l` -lt 1 ] && badloop=1 else badloop=1 fi [ "$badloop" == "1" ] && { gtk_message "There was a problem with the remote connection. Exiting." 450 gtk-dialog-error; clean_and_bail; } } clean_and_bail(){ umount /mnt/loop >/dev/null umount $wrk/bundle [ -d $wrk ] && rm -r $wrk [ -f /tmp/.cdload ] && rm /tmp/.cdload [ -f /tmp/.message ] && rm /tmp/.message exit } logit(){ echo "$1" >> $log } others_screen(){ export OTHERS_DIALOG=' 48 '$icons'/language.png Select a language nonkde '$wrk'/others ' gtkdialog -p OTHERS_DIALOG > $wrk/nonkde };export -f others_screen desktops_screen(){ export DESKTOPS_DIALOG=' 48 '$icons'/computer-128.png '`chkbox false kde "KDE Desktop"`' '`chkbox false mate "MATE Desktop"`' '`chkbox false lxqt "LXQT Desktop"`' '`chkbox false xfce "XFCE Desktop"`' '`chkbox false firefox "Firefox"`' '`chkbox false opera "Opera"`' '`chkbox false chrome "Chrome"`' '`chkbox false print "Printing locales"`' '`chkbox false devel "Development locales"`' ' gtkdialog -p DESKTOPS_DIALOG > $wrk/desktops if [ `egrep "Cancel|abort" $wrk/desktops` ]; then rm $wrk/desktops; fi };export -f desktops_screen kde_screen(){ export KDE_DIALOG=' 48 '$icons'/kde.svg Select a language lang '$wrk'/.kde ' gtkdialog -p KDE_DIALOG >$wrk/.kde4 }; export -f kde_screen main_screen(){ export MAIN_DIALOG=' 48 '$icons'/language.png Select a language enc ls /mnt/loop/usr/$lib/locale | grep utf8 | cut -d. -f1 libre false desktops false kbd false nonlatin false scim false ' }; export -f main_screen nonlatin_screen(){ export NONLATIN_DIALOG=' 48 '$icons'/language.png freefont IPAfont KhmerOS Myanmar3 odosung PakType sazanami sinhala_lklug tibmachuni ttf_indic unifont wqy_zenhei ' gtkdialog -p NONLATIN_DIALOG >$wrk/nonlatin }; export -f nonlatin_screen ffox_screen(){ export FIREFOX_DIALOG=' 48 '$icons'/language.png Select a language fflang '$wrk'/ffox-lang ' gtkdialog -p FIREFOX_DIALOG > $wrk/ffox };export -f ffox_screen ## Prepare working dir if [ -d $wrk ]; then [ `ls -1 $wrk/bundle|wc -l` -gt 0 ] && umount $wrk/bundle rm -r $wrk fi if [ -d /mnt/loop ]; then [ `ls -1 /mnt/loop|wc -l` -gt 0 ] && umount /mnt/loop else mkdir /mnt/loop fi mkdir -p $wrk/bundle [ ! -d $dir ] && mkdir -p $dir/usr/share/locale ## Requires internet export STATE=DOWNLOAD manual_progress "Checking and processing remote files ..." echo "Downloading glibc now" >/tmp/.cdload if [ ! -e /tmp/glibc-i18n-$arch-$build.xzm ]; then echo "$lst/glibc-i18n-$arch-$build.xzm" > /tmp/out silent_check_url $lst if [ $url -eq 1 ]; then wget --output-file=/tmp/.message $lst/glibc-i18n-$arch-$build.xzm -P $wrk/bundle >> $log 2>&1 mount -o loop $wrk/bundle/glibc-i18n-$arch-$build.xzm /mnt/loop && logit "glibc mounted at /mnt/loop" sleep 1 kill_manual_progress else kill_manual_progress sleep 1 gtk_message "An internet connection is required!" 400 gtk-dialog-error clean_and_bail fi else cp /tmp/glibc-i18n-$arch-$build.xzm $wrk/bundle mount -o loop $wrk/bundle/glibc-i18n-$arch-$build.xzm /mnt/loop && logit "glibc mounted at /mnt/loop" sleep 1 kill_manual_progress fi ## Get porteus directory and set target path pdir=`grep -A1 "ata found in:" /var/log/porteus-livedbg|tail -n1|sed 's^//^/^g'` [ -w $pdir ] && pth=${pdir}/modules || { pth=/tmp/language-files; mkdir -p $pth; } yellow "Final module will be placed at $pth" main_screen gtkdialog -p MAIN_DIALOG >$dump ## User cancelled [ `egrep -o "Cancel|abort" $dump` ] && yellow "User aborted" && clean_and_bail ########################### Start work here ## Sanitize answer file sed -i 's^"^^g' $dump ## Double check httpfs connection is still good and then start copying required glib and core locales check_mloop enc=`grep "enc=" $dump|awk -F'=' '{print$NF}'` && logit "Chosen enc:$enc" ## libreoffice language lolang=${enc:0:2} && logit "Short enc:$lolang" export STATE=MANUAL manual_progress "Preparing files from glibc. Please wait ..." echo "Copying $enc.utf8" >/tmp/.message cd /mnt/loop cp -a --parents usr/$lib/locale/$enc.utf8 $dir && sleep 1 && logit "Copied $enc.utf8" echo "Copying $enc directory" >/tmp/.message cp -a --parents usr/share/i18n/charmaps usr/share/i18n/locales/POSIX usr/share/i18n/locales/$enc $dir && sleep 1 cd - echo "Finished copying ..." >/tmp/.message && sleep 1 umount /mnt/loop && logit "Unmounted loop" || logit "error: nothing mounted at /mnt/loop" #umount -f $wrk/bundle && logit "Unmounted glib over httpfs2" || logit "error: no glib mounted" kill_manual_progress cd /tmp if [ ! -e 001-core_locales.xzm ]; then download Locales 001-core_locales.xzm $lst/001-core_locales.xzm dummy fi sleep 1 export STATE=MANUAL manual_progress "Copying core locales. Please wait ..." #mloop 001-core_locales.xzm && logit "Mounted 001-core_locales.xzm" || logit "error: Cant mount 001-core_locales.xzm" mount -o loop 001-core_locales.xzm /mnt/loop && logit "Mounted 001-core_locales.xzm" || logit "error: Cant mount 001-core_locales.xzm" mkdir -p $dir/usr/share/locale $dir/usr/man && logit "Created $dir/usr/share/locale" cp -a /mnt/loop/locale/$lolang* $dir/usr/share/locale/ cp -a /mnt/loop/man/$lolang* $dir/usr/man umount /mnt/loop && logit "unmounted core locales from /mnt/loop" || logit "error unmounting core locales from /mnt/loop" rm /tmp/001-core_locales.xzm && logit "Removed /tmp/001-core_locales.xzm" kill_manual_progress echo "Setting up lang.sh" > /tmp/.message mkdir -p $dir/etc/profile.d cat >> $dir/etc/profile.d/lang.sh << EOF #!/bin/bash # File generated by Porteus Language-Selection tool #export LC_ALL=$enc.utf8 export LANG=$enc.utf8 export LC_COLLATE=C EOF chmod +x $dir/etc/profile.d/lang.sh sleep 1 kill_manual_progress ## Start keyboard setup if user chose to if [ `grep -o "kbd=true" $dump` ]; then /opt/porteus-scripts/gtk-xkb-select logit "Keyboard setup chosen" kmap=`setxkbmap -print | grep xkb_symbols | cut -d'+' -f2` if [ $kmap != us ]; then # KDE4 if [ `ls /mnt/live/memory/images | grep -o kde.xzm` ]; then cd /mnt/live/memory/images/*-kde.xzm >/dev/null; cp -a --parents home/guest/.kde4/share/config/kxkbrc root/.kde4/share/config/kxkbrc $dir; cd - sed -i -r 's/LayoutList=.*$/LayoutList='$kmap',us/' $dir/home/guest/.kde4/share/config/kxkbrc sed -i -r 's/LayoutList=.*$/LayoutList='$kmap',us/' $dir/root/.kde4/share/config/kxkbrc fi # LXQT if [ `ls /mnt/live/memory/images | grep -o lxqt.xzm` ]; then cd /mnt/live/memory/images/*-razor.xzm >/dev/null; cp -a --parents home/guest/.config/qxkb.cfg root/.config/qxkb.cfg $dir; cd - sed -i -r 's/layout=.*$/layout="'$kmap',us"/' $dir/home/guest/.config/qxkb.cfg sed -i -r 's/layout=.*$/layout="'$kmap',us"/' $dir/root/.config/qxkb.cfg fi # XFCE if [ `ls /mnt/live/memory/images | grep -o xfce.xzm` ]; then cd /mnt/live/memory/images/*-xfce.xzm >/dev/null; cp -a --parents home/guest/.config/xfce4/panel/xkb-plugin-16.rc root/.config/xfce4/panel/xkb-plugin-16.rc $dir; cd - sed -i -r 's/layouts=.*$/layouts='$kmap',us/' $dir/home/guest/.config/xfce4/panel/xkb-plugin-16.rc sed -i -r 's/layouts=.*$/layouts='$kmap',us/' $dir/root/.config/xfce4/panel/xkb-plugin-16.rc fi # Fix perms just in case chown -R 1000:1000 $dir/home/guest 2>/dev/null fi fi ## Copy Libre Office files if requested cd /tmp [ "`uname -m`" = "x86_64" ] && SUFFIX=64 || SUFFIX="" if [ `grep -o "libre=true" $dump` ]; then echo "$lorepo" > /tmp/locale-link.txt #lorepo=http://www.slackel.gr/repo/$arch/current/slackel/locale lorepo=http://www.slackware.com/~alien/slackbuilds/libreoffice/pkg${SUFFIX}/current/ echo "Getting language info" >/tmp/.message wget $lorepo -P $wrk export lofile=`grep "libreoffice-l10n-$lolang" $wrk/locale|grep txz|cut -d'"' -f2` lolink=$lorepo/$lofile logit "LO locales chosen" logit "$lolink" rm $wrk/local export STATE=DOWNLOAD manual_progress "Downloading LO file now" echo ${lolink##*/} > /tmp/.cdload wget --output-file=/tmp/.message $lolink -P $wrk && logit "LO locales downloaded" || logit "error downloading LO files" locallibre=`find $wrk -name "libreoffice-l10n-$lolang*"` kill_manual_progress installpkg -root $dir $locallibre && logit "Installed $locallibre to $dir" || logit "error installing $locallibre" fi ## Show desktops screen if chosen if [ `grep -o "desktops=true" $dump` ]; then desktops_screen if [ -f $wrk/desktops ]; then grep true $wrk/desktops|awk -F= '{print$1}' > $wrk/chosen.tmp rm $wrk/desktops fi ## Download browser locales (full modules) for a in $porteus_browsers; do if [ `grep -o $a $wrk/chosen.tmp` ]; then download Locales 04-$a\_locales.xzm $lst/04-$a\_locales.xzm dummy && logit "Downloaded 04-$a\_locales.xzm" sleep 1 export STATE=MANUAL echo "Extracting locales from 04-$a" > /tmp/.message xzm2dir 04-$a\_locales.xzm $dir > /tmp/.message && logit "Extracted 04-$a\_locales.xzm" sleep 1 kill_manual_progress rm /tmp/04-$a\_locales.xzm fi done ## Get firefox localizations if [ `grep -o irefox $wrk/chosen.tmp` ]; then [ `uname -m` = x86_64 ] && lib=lib64 || lib=lib ffver=`ls /var/log/packages/ | grep mozilla-firefox- | rev | cut -d- -f3 | rev` fflink="http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/$ffver/win32/xpi/" pkg=`wget -q -O - $fflink | fgrep '.xpi' | cut -d'=' -f5 | cut -d'"' -f2` echo $pkg | tr " " "\n" | cut -d'.' -f1 > $wrk/ffox-lang ffox_screen choice=`grep fflang $wrk/ffox|awk -F'"' '{print$2}'` if ! grep -q Cancel $wrk/ffox; then ## Download the lang pack: ffver=`echo $ffver | sed s/esr//` wrkdir=${dir} mkdir -p $wrkdir/usr/$lib/firefox-$ffver/browser/extensions/ export STATE=MANUAL echo "Downloading firefox locale ... please wait" > /tmp/.message wget -q $fflink/$choice.xpi -O $wrkdir/usr/$lib/firefox-$ffver/browser/extensions/langpack-$choice@firefox.mozilla.org.xpi kill_manual_progress ## Enable requested localization: mkdir -p $wrkdir/usr/$lib/firefox-$ffver/defaults/pref cat > $wrkdir/usr/$lib/firefox-$ffver/defaults/pref/langpacks.js << EOF // This forces Firefox language to switch to locale of machine // if available. pref("intl.locale.matchOS", true); EOF chown 0:0 -R $wrkdir/usr ## I dont like this part but we must use existing extensions.sqlite with our lang pack added otherwise 'always fresh' users will be prompted for installation every time: gtk_message "Please close all firefox windows (if open) and press the ok button." 450 gtk-dialog-warning killall firefox cp $wrkdir/usr/$lib/firefox-$ffver/browser/extensions/langpack-$choice@firefox.mozilla.org.xpi /usr/$lib/firefox-$ffver/browser/extensions/langpack-$choice@firefox.mozilla.org.xpi gtk_message "Please open firefox and accept the installation of langpack-$choice@firefox.mozilla.org.xpi. Press OK on this screen when done." 500 gtk-dialog-warning cp -a --parents /home/guest/.mozilla/firefox/c3pp43bg.default/extensions.sqlite /root/.mozilla/firefox/c3pp43bg.default/extensions.sqlite $wrkdir ## A separate ff-localization.xzm module is created at end of script below. fi fi ## Download desktop modules and get locales for a in $porteus_desktops; do if [ `grep -o $a $wrk/chosen.tmp` ]; then if [ ! -e 003-$a\_locales.xzm ]; then download Locales 003-$a\_locales.xzm $lst/003-$a\_locales.xzm dummy && logit "Downloaded 003-$a\_locales.xzm" fi sleep 1 fi done manual_progress "Copying desktop locales now" for a in $porteus_desktops; do if [ `grep -o $a $wrk/chosen.tmp` ]; then export STATE=MANUAL echo "Mounting 003-$a ... please wait" > /tmp/.message #mloop 003-$a\_locales.xzm && logit "Mounted 003-$a\_locales.xzm at /mnt/loop" || logit "error: Cant mount 003-$a\_locales.xzm" mount -o loop 003-$a\_locales.xzm /mnt/loop && logit "Mounted 003-$a\_locales.xzm at /mnt/loop" || logit "error: Cant mount 003-$a\_locales.xzm" echo "Copying locales for $a ... please wait" > /tmp/.message [ ! -d $dir/usr/share/locale ] && mkdir -p $dir/usr/share/locale echo "Copying /usr/share/locale" > /tmp/.message sleep 2 cp -a /mnt/loop/locale/$lolang* $dir/usr/share/locale/ && logit "Copied locales from 003-$a\_locales.xzm" echo "Copying /usr folder" > /tmp/.message sleep 2 [ -f /mnt/loop/usr ] && cp -a /mnt/loop/usr $dir [ -f /mnt/loop/opt ] && cp -a /mnt/loop/opt $dir umount /mnt/loop && logit "Unmounted 003-$a\_locales.xzm" || logit "error: Cant unmount 003-$a\_locales.xzm from /mnt/loop" rm /tmp/003-$a\_locales.xzm fi done kill_manual_progress ## Get printing locales if required if [ `grep -o print $wrk/chosen.tmp` ]; then download Printing 07-printing_locales.xzm $lst/07-printing_locales.xzm dummy && logit "Downloaded 07-printing_locales.xzm" sleep 1 [ ! -d $dir/usr/share/locale ] && mkdir -p $dir/usr/share/locale mloop 07-printing_locales.xzm && cp -a /mnt/loop/locale/$lolang* $dir/usr/share/locale && umount /mnt/loop rm 07-printing_locales.xzm fi ## Get devel locales if required if [ `grep -o devel $wrk/chosen.tmp` ]; then download Devel 05-devel_locales.xzm $lst/05-devel_locales.xzm dummy && logit "Downloaded 05-devel_locales.xzm" sleep 1 [ ! -d $dir/usr/share/locale ] && mkdir -p $dir/usr/share/locale mloop 05-devel_locales.xzm && cp -a /mnt/loop/locale/$lolang* $dir/usr/share/locale && umount /mnt/loop rm 05-devel_locales.xzm fi fi ## Copy KDE4 files if requested if [ `grep -o "kde" $wrk/chosen.tmp` ]; then wget -qO- $lst | grep kde-l10n | cut -d- -f3 > $wrk/.kde kde_screen echo "KDE: $lang chosen" >> $log rm $wrk/.kde grep "Exit=" $dump|egrep "Cancel|abort" && clean_and_bail lang=`grep "lang" $wrk/.kde4|cut -d'"' -f2` ## Give progress window export STATE=MANUAL echo "Mounting remote KDE4 file ..." > /tmp/.message manual_progress "Copying remote files. Please wait ..." kde4=`wget -qO- $lst | grep kde-l10n-$lang- | cut -d'"' -f2` [ -d /mnt/httpfs ] && { umount /mnt/httpfs; rm -r /mnt/httpfs; } mkdir /mnt/httpfs httpfs2 $lst/$kde4 /mnt/httpfs >> $log 2>&1 && { uloop; mount -o loop /mnt/httpfs/$kde4 /mnt/loop >/dev/null; } echo "Copying remote KDE4 files ..." > /tmp/.message cp -a /mnt/loop/* $dir && logit "Copied locales from $kde4" uloop >/dev/null; umount /mnt/httpfs sleep 1 kill_manual_progress fi if [ `grep "nonlatin=true" $dump` ]; then ## Get scim version lynx -dump -nonumbers -listonly $lst|grep font > $wrk/fontlinks nonlatin_screen sed -i 's^_^-^g' $wrk/nonlatin sed -i 's^sinhala-lklug^sinhala_lklug^g' $wrk/nonlatin export STATE=DOWNLOAD manual_progress "Downloading ..." for nonlat in `grep "true" $wrk/nonlatin|awk -F'=' '{print$1}'`; do flink=`grep $nonlat $wrk/fontlinks` fname=${flink##*/} echo "$fname" > /tmp/.cdload wget -o /tmp/.message $flink -P $pth done sleep 1 kill_manual_progress fi if [ `grep "scim=true" $dump` ]; then scimlink=`lynx -dump -nonumbers -listonly $lst|grep scim|grep "\-$arch\-"` export STATE=DOWNLOAD nam=${scimlink##*/} echo $nam > /tmp/.cdload manual_progress "Downloading ..." wget -o /tmp/.message $scimlink -P $pth sleep 1 kill_manual_progress fi ## Create final module export STATE=BUILDMODULE manual_progress "Building modules" dir2xzm $dir $pth/locales-$enc.utf8-$arch-1prt.xzm >/tmp/.message sleep 1 kill_manual_progress ## Notify of finished modules gtk_message "Your language module are now at: $pth" 500 gtk-yes clean_and_bail exit