Lokalizáció/Helyesírás

Az alapvető helyesírási hibák kiszűrésére Bíró Árpád készített egy szkriptet, amely a Hunspell-lel ellenőrzi a SUSE PO-fájljait.

#!/bin/bash
# download and check SUSE localization files

function processtgzfile
{
#$1: tgz filename
#$2: prefix for output filenames
FILELIST=`gzip -d -c "$1" | tar --list 2>/dev/null | grep "\.po$"`
echo "$FILELIST" | while read FILENAME; do echo; echo "$FILENAME";
BASENAME=`basename "$FILENAME"`;
gzip -d -c "$1" | tar -x -O "$FILENAME" 2>/dev/null |\
sed 's/^#.*$//' | sed -e ':a;s/^msgid .*\nmsgstr //;/^msgid /N;//ba' |\
sed -e '/./,$!d;1,/^$/d;s/\&//g' | iconv -c -f UTF-8 -t Latin2 |\
hunspell -d hu_HU -l | sort | uniq > "$2_$BASENAME".problems; done
}

wget --no-check-certificate -c "https://forgesvn1.novell.com/viewsvn/suse-i18n/trunk/lcn/hu/po.tar.gz?view=tar" -O lcn_po.tar.gz
wget --no-check-certificate -c "https://forgesvn1.novell.com/viewsvn/suse-i18n/trunk/yast/hu/po.tar.gz?view=tar" -O yast_po.tar.gz

processtgzfile ./lcn_po.tar.gz lcn
processtgzfile ./yast_po.tar.gz yast


A szkript az aktuális könyvtárba letölt 2 tar.gz-fájlt a SUSE SVN-jéből (lcn és yast - ezeken kívüli fájlok ellenőrzéséhez ki kell egészíteni a szkriptet), majd végignézi azokat a Hunspell-lel és szintén az aktuális könyvtárba teszi a problémalistákat. Nyilvánvalóan sok a hamis riasztás, de ugyanakkor sok hibát megfog.

szükséges hozzá a hunspell, amely letöltés után egyszerűen telepíthető:

./configure; make; make install


Egy másik parancsfájl hasonló felépítésű, de bővebb funkcionalitású.

 #!/bin/bash
 
 function processpofile
 {
 	BASENAME=`basename "$1"`;
 	cat $1 |\
 	sed 's/^#.*$//' |\
 	sed -e ':a;s/^msgid .*\nmsgstr //;/^msgid /N;//ba' |\
 	sed -e '/./,$!d;1,/^$/d;s/\&//g;s/_//g' |\
 	iconv -c -f UTF-8 -t Latin2 |\
 	hunspell -d $DICTIONARY -l |\
 	iconv -c -t UTF-8 -f Latin2 |\
 	sort |\
 	uniq >> "$BASENAME".problems;
 	
 }
 
 function processtgzfile
 {
 	FILELIST=`gzip -d -c "$1" | tar --list 2>/dev/null | grep "\.po$"` 
 
 	echo "$FILELIST" | while read FILENAME; do
               echo;
               echo "$FILENAME";
               BASENAME=`basename "$FILENAME"`;
 
               gzip -d -c "$1" |\
               tar -x -O "$FILENAME" 2>/dev/null |\
               sed 's/^#.*$//' |\
               sed -e ':a;s/^msgid .*\nmsgstr //;/^msgid /N;//ba' |\
               sed -e '/./,$!d;1,/^$/d;s/\&//g;s/_//g' |\
               iconv -c -f UTF-8 -t Latin2 |\
               hunspell -d $DICTIONARY -l |\
               iconv -c -t UTF-8 -f Latin2 |\
               sort |\
               uniq >> "$BASENAME".problems;
       done
 }
 
 function processdirectory
 {
    FILELIST=`find $i -name "*.po" -print`;
    echo "$FILELIST" | while read FILENAME; do
               echo;
               echo "$FILENAME";
 		BASENAME=`basename "$FILENAME"`; 
 
 		cat $FILENAME |\
 		sed 's/^#.*$//' |\
 		sed -e ':a;s/^msgid .*\nmsgstr //;/^msgid /N;//ba' |\
 		sed -e '/./,$!d;1,/^$/d;s/\&//g;s/_//g' |\
 		iconv -c -f UTF-8 -t Latin2 |\
 		hunspell -d $DICTIONARY -l |\
 		iconv -c -t UTF-8 -f Latin2 |\
 		sort |\
 		uniq >> "$BASENAME".problems;
       done
 }
 
 function usage
 {
   echo "usage: $0 [-d dictionary] <pofile|directory|tgzfile>"
 }
 
   USAGE=0;
   TARGET="";
   TARGET_SUBJECT=$1;
   DICTIONARY=hu_HU
   
   if [[ $# -ne 1 && $# -ne 3 ]]; then
     usage;
     exit 1;
   fi
 
 while getopts d: OPTS; do
   case "$OPTS" in
 	d)	DICTIONARY=$OPTARG;
 		TARGET_SUBJECT=$3;;
 	[?])	usage;
 		exit 1;
 		;;
     esac
 done
 
 echo Using dictionary: $DICTIONARY
 
 if [ -d $TARGET_SUBJECT ]; then
     TARGET="dir";
     echo Processing directory;
 elif [ `file "$TARGET_SUBJECT" | grep gzip | wc -l` -eq 1 ]; then
     #must be a gzipped tar
     echo Processing gzipped archive;
     TARGET="tgz";
 else
     #nem tomoritett, nem konyvtar, csak po lehet. ugye?
     echo Processing individual po file;
     TARGET="po";
 fi
 
 case $TARGET in
     "po")
 	processpofile $TARGET_SUBJECT
 	;;
     "dir")
 	processdirectory $TARGET_SUBJECT
 	;;
     "tgz")
 	processtgzfile $TARGET_SUBJECT
 	;;
     *)
 	usage;
 	exit 1;
 	;;
 esac