Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 15 | PointedEar | 1 | #!/bin/bash  | 
        
| 2 | |||
| 3 | APPNAME="EazyTranslator"  | 
        ||
| 4 | APPVER="0.97a"  | 
        ||
| 5 | APPFILENAME=`basename $0`  | 
        ||
| 6 | APPFILEDIR=`echo $0 | sed 's/'$APPFILENAME$'//'`  | 
        ||
| 7 | |||
| 8 | # dictionary file  | 
        ||
| 9 | DICT="$TRANSLATE_DIR"  | 
        ||
| 10 | if [ -z "$DICT" ]; then DICT=$APPFILEDIR ; fi  | 
        ||
| 11 | |||
| 12 | # delimiter name (for help page only) and character (string) for separating original expression  | 
        ||
| 13 | # and translation in dictionary file  | 
        ||
| 14 | DELIMITER_NAME="colon"  | 
        ||
| 15 | DELIMITER=":"  | 
        ||
| 16 | |||
| 17 | # all help on a single page  | 
        ||
| 18 | SINGLE_PAGE=0  | 
        ||
| 19 | |||
| 20 | # bell character  | 
        ||
| 21 | CH_SOUND=""  | 
        ||
| 22 | CH_SOUND_ON=$'\a'  | 
        ||
| 23 | |||
| 24 | RESULT=""  | 
        ||
| 25 | |||
| 26 | function title { | 
        ||
| 27 | if [ $SINGLE_PAGE -eq 0 ]; then clear ; fi  | 
        ||
| 28 | echo  | 
        ||
| 29 | echo $APPNAME" "$APPVER" - Stream editor to use and to manage dictionary files"  | 
        ||
| 30 | echo "Requires 'basename', 'grep' and 'sed', optionally 'sort' and 'mktemp' in PATH"  | 
        ||
| 31 | echo  | 
        ||
| 32 | }  | 
        ||
| 33 | |||
| 34 | function copyright { | 
        ||
| 35 | echo "Copyright (C) 2001 Thomas Lahn (webmaster@PointedEars.de)"  | 
        ||
| 36 | echo "Be sure to have 'easyTrans' or similar in mail subject line for fast response."  | 
        ||
| 37 | echo  | 
        ||
| 38 | }  | 
        ||
| 39 | |||
| 40 | function pause { | 
        ||
| 41 | if [ "$1" == "c" ]; then  | 
        ||
| 42 | echo "Hit RETURN to continue..."  | 
        ||
| 43 | else  | 
        ||
| 44 | echo "Hit RETURN for the next page"  | 
        ||
| 45 | fi  | 
        ||
| 46 | read  | 
        ||
| 47 | }  | 
        ||
| 48 | |||
| 49 | function copying { | 
        ||
| 50 | title  | 
        ||
| 51 | copyright  | 
        ||
| 52 | echo "This program is free software; you can redistribute it and/or modify"  | 
        ||
| 53 | echo "it under the terms of the GNU General Public License as published by"  | 
        ||
| 54 | echo "the Free Software Foundation; either version 2 of the License, or"  | 
        ||
| 55 | echo "(at your option) any later version."  | 
        ||
| 56 | echo  | 
        ||
| 57 | echo "This program is distributed in the hope that it will be useful,"  | 
        ||
| 58 | echo "but WITHOUT ANY WARRANTY; without even the implied warranty of"  | 
        ||
| 59 | echo "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"  | 
        ||
| 60 | echo "GNU General Public License for more details."  | 
        ||
| 61 | echo  | 
        ||
| 62 | echo "You should have received a copy of the GNU General Public License"  | 
        ||
| 63 | echo "along with this program (COPYING file); if not, write to the"  | 
        ||
| 64 | echo "Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."  | 
        ||
| 65 | echo  | 
        ||
| 66 | }  | 
        ||
| 67 | |||
| 68 | function cmdHelp { | 
        ||
| 69 | title  | 
        ||
| 70 | echo $APPFILENAME" EXPRESSION DICTIONARY [OPTIONS]"  | 
        ||
| 71 | echo  | 
        ||
| 72 | echo "Tries to translate EXPRESSION looking up DICTIONARY and writes the result"  | 
        ||
| 73 | echo "to standard output (stdout) in a single line followed by a newline (\n)."  | 
        ||
| 74 | echo  | 
        ||
| 75 | echo "Environment:"  | 
        ||
| 76 | echo  | 
        ||
| 77 | echo "TRANSLATE_DIR Dictionary folder root (absolute path '/')"  | 
        ||
| 78 | if [ -n "$TRANSLATE_DIR" ]; then  | 
        ||
| 79 | local INVALID_PATH=" -- INVALID PATH!"  | 
        ||
| 80 | local INVALID_FORMAT=" -- INVALID FORMAT!"  | 
        ||
| 81 | # : AutoCorrect performed!  | 
        ||
| 82 | local INVALID_MSG=""  | 
        ||
| 83 | if [ ! -e $TRANSLATE_DIR ]; then  | 
        ||
| 84 | INVALID_MSG=$INVALID_PATH  | 
        ||
| 85 | else  | 
        ||
| 86 | local GREPRES=`echo $TRANSLATE_DIR | grep -e "\/$"`  | 
        ||
| 87 | if [ -z "$GREPRES" ]; then INVALID_MSG=$INVALID_FORMAT ; fi  | 
        ||
| 88 | fi  | 
        ||
| 89 | echo " (currently '"$TRANSLATE_DIR"'"$INVALID_MSG")"  | 
        ||
| 90 | #if [ "$INVALID_MSG" == "$INVALID_FORMAT" ]; then  | 
        ||
| 91 | #export TRANSLATE_DIR=$TRANSLATE_DIR"/"  | 
        ||
| 92 | #set -a  | 
        ||
| 93 | #fi  | 
        ||
| 94 | fi  | 
        ||
| 95 | echo " If undefined, this is the program directory"  | 
        ||
| 96 | echo " (currently '"$APPFILEDIR"')."  | 
        ||
| 97 | echo "TRANSLATE_OPTIONS Default options to overwrite command-line options"  | 
        ||
| 98 | if [ -n "$TRANSLATE_OPTIONS" ]; then  | 
        ||
| 99 | echo " (currently '"$TRANSLATE_OPTIONS"')"  | 
        ||
| 100 | fi  | 
        ||
| 101 | echo  | 
        ||
| 102 | echo "Arguments:"  | 
        ||
| 103 | echo  | 
        ||
| 104 | echo "EXPRESSION Word or (double-quoted) phrase to be translated"  | 
        ||
| 105 | echo "DICTIONARY Path of dictionary file relative to TRANSLATE_DIR"  | 
        ||
| 106 | echo  | 
        ||
| 107 | if [ $SINGLE_PAGE -eq 0 ]; then pause "c" ; fi  | 
        ||
| 108 | echo "Translation OPTIONS:"  | 
        ||
| 109 | echo " -b, --brackets If not in DICTIONARY, writes given WORD or EXPRESSION"  | 
        ||
| 110 | echo " as [WORD] or [EXPRESSION]."  | 
        ||
| 111 | echo " -m, --messages Return error messages instead of null-strings."  | 
        ||
| 112 | echo " -p, --phrase Translate EXPRESSION as entire phrase. If not given,"  | 
        ||
| 113 | echo " each WORD of EXPRESSION is translated seperately."  | 
        ||
| 114 | echo " -r, --reverse Perform reverse translation. Recommended only if"  | 
        ||
| 115 | echo " no appropriate dictionary file for vice-versa translation is"  | 
        ||
| 116 | echo " available and -p is also used."  | 
        ||
| 117 | echo " -s, --sound Beep on fatal errors."  | 
        ||
| 118 | echo " -v, --verbose Display flow of operation. Includes -m behavior."  | 
        ||
| 119 | echo " -z, --zero Return not translatable tokens as null-strings."  | 
        ||
| 120 | echo " Overwrites -b."  | 
        ||
| 121 | echo  | 
        ||
| 122 | if [ $SINGLE_PAGE -eq 0 ]; then pause "c" ; fi  | 
        ||
| 123 | echo $APPFILENAME" EXPRESSION DICTIONARY COMMAND TRANSLATION [INFO] [OPTIONS]"  | 
        ||
| 124 | echo $APPFILENAME" COMMAND DICTIONARY [INFO] [OPTIONS]"  | 
        ||
| 125 | echo  | 
        ||
| 126 | echo "Dictionary file COMMANDs:"  | 
        ||
| 127 | echo " -a, --add If not in DICTIONARY, add EXPRESSION with TRANSLATION"  | 
        ||
| 128 | echo " to DICTIONARY and write TRANSLATION."  | 
        ||
| 129 | echo " If DICTIONARY not exists, create the file with INFO"  | 
        ||
| 130 | echo " and add the entry; if INFO is a null-string,"  | 
        ||
| 131 | echo " default INFO is added, containing program version,"  | 
        ||
| 132 | echo " user name and timestamp. Requires 'sort'."  | 
        ||
| 133 | echo " -ai, --addinfo Add information data INFO to DICTIONARY."  | 
        ||
| 134 | echo " Must be used as first argument."  | 
        ||
| 135 | echo " -c, --create Create new DICTIONARY with INFO (see -a)."  | 
        ||
| 136 | echo " Existing files are replaced. Must be used as first argument."  | 
        ||
| 137 | echo " -d, --delete If used with EXPRESSION and DICTIONARY, remove EXPRESSION"  | 
        ||
| 138 | echo " from DICTIONARY instead of translating."  | 
        ||
| 139 | echo " If used as first argument, delete DICTIONARY."  | 
        ||
| 140 | echo " -i, --info Display information about DICTIONARY."  | 
        ||
| 141 | echo " Must be used as first argument."  | 
        ||
| 142 | echo  | 
        ||
| 143 | if [ $SINGLE_PAGE -eq 0 ]; then pause "c" ; fi  | 
        ||
| 144 | echo " -o, --overwrite Like -a but overwrite a contained translation of"  | 
        ||
| 145 | echo " EXPRESSION with TRANSLATION without question."  | 
        ||
| 146 | echo " Additionally requires 'mktemp'."  | 
        ||
| 147 | echo " -R, --repair Repair DICTIONARY instead of translating. Requires 'mktemp'."  | 
        ||
| 148 | echo " Info data is be kept but invalid entries are removed."  | 
        ||
| 149 | echo " USE WITH CAUTION!"  | 
        ||
| 150 | echo " -s, --sort Sort DICTIONARY instead of translating. Requires 'sort'."  | 
        ||
| 151 | echo " Includes --sound when used with -v."  | 
        ||
| 152 | echo " Must be used as first argument."  | 
        ||
| 153 | echo  | 
        ||
| 154 | if [ $SINGLE_PAGE -eq 0 ]; then pause "c" ; fi  | 
        ||
| 155 | echo $APPFILENAME" OPTION [OPTION]"  | 
        ||
| 156 | echo  | 
        ||
| 157 | echo "Help page OPTIONs:"  | 
        ||
| 158 | echo " --1 Display help on one page (without 'clear' and user input)."  | 
        ||
| 159 | echo " Useful with redirection "  | 
        ||
| 160 | echo " (try '"$APPFILENAME" --1 --? > translate.doc.txt')."  | 
        ||
| 161 | echo " Must be given before all other help page options."  | 
        ||
| 162 | echo " --a, --about Display information about the program."  | 
        ||
| 163 | echo " --c, --cmd Display this help page."  | 
        ||
| 164 | echo " --d, --dict Display help about dictionary files."  | 
        ||
| 165 | echo " --dev, --emp Display special information for developers and employers."  | 
        ||
| 166 | echo " --x, --example Display example."  | 
        ||
| 167 | echo " --?, --help Display all help pages."  | 
        ||
| 168 | echo  | 
        ||
| 169 | }  | 
        ||
| 170 | |||
| 171 | function example { | 
        ||
| 172 | title  | 
        ||
| 173 | echo "EXAMPLE: If you would like to translate the English words 'a few' into German,"  | 
        ||
| 174 | echo  | 
        ||
| 175 | echo " "$APPFILENAME" ''a few'' en-de"  | 
        ||
| 176 | echo  | 
        ||
| 177 | echo "should write the German words"  | 
        ||
| 178 | echo  | 
        ||
| 179 | echo " ein(e) wenig(e)\n"  | 
        ||
| 180 | echo  | 
        ||
| 181 | echo "(without indent) to stdout if the echo dictionary file 'en-de' contains"  | 
        ||
| 182 | echo "a correct entry for it (see next page). You may also translate it as"  | 
        ||
| 183 | echo "entire phrase (which seems to make more sense here):"  | 
        ||
| 184 | echo  | 
        ||
| 185 | echo " "$APPFILENAME" ''a few'' en-de -p"  | 
        ||
| 186 | echo  | 
        ||
| 187 | echo "should instead write the German word 'einige\n'"  | 
        ||
| 188 | echo "(replace '' in input with the double-quote character)."  | 
        ||
| 189 | echo  | 
        ||
| 190 | }  | 
        ||
| 191 | |||
| 192 | function dictHelp { | 
        ||
| 193 | title  | 
        ||
| 194 | echo "DICTIONARY FILES:"  | 
        ||
| 195 | echo "You may create/improve dictionary files to be used with "$APPNAME  | 
        ||
| 196 | echo "of your own. Translation data must match the following expression:"  | 
        ||
| 197 | echo  | 
        ||
| 198 | echo "#"$DELIMITER"File description displayed when option -i is used\n[#"$DELIMITER"File description\n]"  | 
        ||
| 199 | echo "[Expression"$DELIMITER"translation\n[Next expression"$DELIMITER"next translation\n]]"  | 
        ||
| 200 | echo "Last expression"$DELIMITER"last translation\z"  | 
        ||
| 201 | echo  | 
        ||
| 202 |   echo "Parts enclosed in rectangle brackets are optional. The "$DELIMITER_NAME" ("$DELIMITER") is to be used" | 
        ||
| 203 | echo "as delimiter character between original and translated expression only."  | 
        ||
| 204 | echo "Dictionary file names should contain common language identifiers separated"  | 
        ||
| 205 | echo "by a dash (such as 'en-de.dic' for an English-German dictionary file)."  | 
        ||
| 206 | echo  | 
        ||
| 207 | echo "Program updates and dictionaries can be obtained from"  | 
        ||
| 208 | echo "'http://pointedears.de/dev/unix/translate/'."  | 
        ||
| 209 | echo "Thank you for using a program by PointedEars."  | 
        ||
| 210 | echo  | 
        ||
| 211 | }  | 
        ||
| 212 | |||
| 213 | function devInfo { | 
        ||
| 214 | title  | 
        ||
| 215 | copyright  | 
        ||
| 216 | echo "INFORMATION FOR DEVELOPERS (KNOWN ISSUES)..."  | 
        ||
| 217 | echo  | 
        ||
| 218 | echo "- Sorting the dictionary unfortunately also sorts its info data by now."  | 
        ||
| 219 | echo  | 
        ||
| 220 | echo "...AND FOR EMPLOYERS:"  | 
        ||
| 221 | echo  | 
        ||
| 222 | echo "BTW, if you have an idea for improving EasyTranslator or for another (field of)"  | 
        ||
| 223 | echo "application you want me to develop for you (BASIC, DOS batch, Windows INF,"  | 
        ||
| 224 | echo "Visual Basic, bash, Pascal, Delphi, C, HTML/JavaScript, and I am still learning"  | 
        ||
| 225 | echo "other languages) feel free to mail me, too. THNX! -- PointedEars, 2001-03-28"  | 
        ||
| 226 | echo  | 
        ||
| 227 | }  | 
        ||
| 228 | |||
| 229 | function help { | 
        ||
| 230 | copying  | 
        ||
| 231 | if [ $SINGLE_PAGE -eq 0 ]; then pause ; fi  | 
        ||
| 232 | cmdHelp  | 
        ||
| 233 | if [ $SINGLE_PAGE -eq 0 ]; then pause ; fi  | 
        ||
| 234 | example  | 
        ||
| 235 | if [ $SINGLE_PAGE -eq 0 ]; then pause ; fi  | 
        ||
| 236 | dictHelp  | 
        ||
| 237 | if [ $SINGLE_PAGE -eq 0 ]; then pause ; fi  | 
        ||
| 238 | devInfo  | 
        ||
| 239 | }  | 
        ||
| 240 | |||
| 241 | function translateReverse { | 
        ||
| 242 | local EXPR="$1"  | 
        ||
| 243 | if [ $VERBOSE -eq 1 ]; then echo "Executing: grep -i -e '"$DELIMITER$EXPR"$' '"$DICT"'" ; fi  | 
        ||
| 244 | RESULT=`grep -i -e "$DELIMITER$EXPR$" "$DICT"`  | 
        ||
| 245 | if [ $VERBOSE -eq 1 ]; then echo "grep returned: '"$RESULT"'" ; fi  | 
        ||
| 246 | if [ -n "$RESULT" ]; then  | 
        ||
| 247 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 248 | echo "Reading expression from recordset (with sed requires only 1 step! :o)" ;  | 
        ||
| 249 | echo "Executing: echo $RESULT | sed 's/$DELIMITER[ ]*[^$DELIMITER]*//'"  | 
        ||
| 250 | fi  | 
        ||
| 251 | RESULT=`echo $RESULT | sed 's/'$DELIMITER'[ ]*[^'$DELIMITER']*//'`  | 
        ||
| 252 | if [ $VERBOSE -eq 1 ]; then echo "sed returned: '"$RESULT"'" ; fi  | 
        ||
| 253 | fi  | 
        ||
| 254 | |||
| 255 | # Should return only characters before the delimiter until BOL (expression)  | 
        ||
| 256 | }  | 
        ||
| 257 | |||
| 258 | function translate { | 
        ||
| 259 | local EXPR="$1"  | 
        ||
| 260 | if [ $REVERSE -eq 1 ]; then translateReverse "$1" ; return ; fi  | 
        ||
| 261 | if [ $VERBOSE -eq 1 ]; then echo "Executing: grep -i -e '^"$EXPR$DELIMITER"' '"$DICT"'" ; fi  | 
        ||
| 262 | RESULT=`grep -i -e "^$EXPR$DELIMITER" "$DICT"`  | 
        ||
| 263 | if [ $VERBOSE -eq 1 ]; then echo "grep returned: '"$RESULT"'" ; fi  | 
        ||
| 264 | if [ -n "$RESULT" ]; then  | 
        ||
| 265 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 266 | echo "Reading translation from recordset (with sed requires only 1 step! :o)" ;  | 
        ||
| 267 | echo "Executing: echo $RESULT | sed 's/[^$DELIMITER]*$DELIMITER[ ]*//'"  | 
        ||
| 268 | fi  | 
        ||
| 269 | RESULT=`echo $RESULT | sed 's/[^'$DELIMITER']*'$DELIMITER'[ ]*//'`  | 
        ||
| 270 | if [ $VERBOSE -eq 1 ]; then echo "sed returned: '"$RESULT"'" ; fi  | 
        ||
| 271 | fi  | 
        ||
| 272 | |||
| 273 | # Should return only characters after the separation character until EOL  | 
        ||
| 274 | # (translation)  | 
        ||
| 275 | }  | 
        ||
| 276 | |||
| 277 | # exit codes  | 
        ||
| 278 | ESUCCESS=0  | 
        ||
| 279 | ENO_DICT=1  | 
        ||
| 280 | EDICT_DIR_NOT_FOUND=2  | 
        ||
| 281 | EDICT_NOT_FOUND=3  | 
        ||
| 282 | EDICT_WRONG_FORMAT=4  | 
        ||
| 283 | EDICT_EXPR_CONTAINED=5  | 
        ||
| 284 | EDICT_TEMP_ERROR=6  | 
        ||
| 285 | EDICT_CREATE_ERROR=7  | 
        ||
| 286 | EDICT_DELETE_EXPR_NOT_FOUND=8  | 
        ||
| 287 | EDICT_REMOVE=9  | 
        ||
| 288 | |||
| 289 | # argument flags  | 
        ||
| 290 | DICTIONARY=0 # if 1, -d refers to the dictionary file instead of an entry  | 
        ||
| 291 | |||
| 292 | # option flags - may be replaced by declare -i FLAG  | 
        ||
| 293 | ADD=0  | 
        ||
| 294 | ADDINFO=0  | 
        ||
| 295 | BRACKETS=0  | 
        ||
| 296 | CREATE=0  | 
        ||
| 297 | DELETE=0  | 
        ||
| 298 | INFO=0  | 
        ||
| 299 | MESSAGES=0  | 
        ||
| 300 | OVERWRITE=0  | 
        ||
| 301 | PHRASE=0  | 
        ||
| 302 | REPAIR=0  | 
        ||
| 303 | REVERSE=0  | 
        ||
| 304 | SORT=0  | 
        ||
| 305 | SOUND=0  | 
        ||
| 306 | VERBOSE=0  | 
        ||
| 307 | ZERO=0  | 
        ||
| 308 | |||
| 309 | if [ -n "$1" ]; then  | 
        ||
| 310 | # retrieve arguments and use default settings from environment variable  | 
        ||
| 311 | ARGUMENTS=$* ; if [ -n "$TRANSLATE_OPTIONS" ]; then ARGUMENTS=$ARGUMENTS" "$TRANSLATE_OPTIONS ; fi  | 
        ||
| 312 | # check options  | 
        ||
| 313 | for argument in $ARGUMENTS; do  | 
        ||
| 314 | case "$argument" in  | 
        ||
| 315 | "-b" | "--brackets") BRACKETS=1;;  | 
        ||
| 316 | "-m" | "--messages") MESSAGES=1;;  | 
        ||
| 317 | "-p" | "--phrase") PHRASE=1;;  | 
        ||
| 318 | "-r" | "--reverse") REVERSE=1;;  | 
        ||
| 319 | "-s" | "--sound") SOUND=1;;  | 
        ||
| 320 | "-v" | "--verbose") VERBOSE=1 ; title ; copyright;;  | 
        ||
| 321 | "-z" | "--zero") ZERO=1;;  | 
        ||
| 322 | "--a" | "--about") copying ; exit $ESUCCESS;;  | 
        ||
| 323 | "--c" | "--cmd") cmdHelp ; exit $ESUCCESS;;  | 
        ||
| 324 | "--d" | "--dict") dictHelp ; exit $ESUCCESS;;  | 
        ||
| 325 | "--dev" | "--emp") devInfo ; exit $ESUCCESS;;  | 
        ||
| 326 | "--1") SINGLE_PAGE=1;;  | 
        ||
| 327 | "--x" | "--example") example ; exit $ESUCCESS;;  | 
        ||
| 328 | "--?" | "--help") help ; exit $ESUCCESS;;  | 
        ||
| 329 | esac  | 
        ||
| 330 | done  | 
        ||
| 331 | if [ $SOUND -eq 1 ]; then CH_SOUND=$CH_SOUND_ON ; fi  | 
        ||
| 332 | if [ -n "$2" ]; then  | 
        ||
| 333 | # concatenate dictionary root and given dictionary file  | 
        ||
| 334 | DICT="$DICT$2"  | 
        ||
| 335 | # check for dictionary commands  | 
        ||
| 336 | case "$1" in  | 
        ||
| 337 | "-d" | "--delete") DELETE=1 ; DICTIONARY=1 ;;  | 
        ||
| 338 | "-c" | "--create") CREATE=1;;  | 
        ||
| 339 | "-i" | "--info") INFO=1;;  | 
        ||
| 340 | "-s" | "--sort") SORT=1;;  | 
        ||
| 341 | "-R" | "--repair") REPAIR=1;;  | 
        ||
| 342 | esac  | 
        ||
| 343 | case "$3" in  | 
        ||
| 344 | "-a" | "--add") ADD=1;;  | 
        ||
| 345 | "-ai" | "--addinfo") ADDINFO=1;;  | 
        ||
| 346 | "-d" | "--delete") DELETE=1;;  | 
        ||
| 347 | "-o" | "--overwrite") OVERWRITE=1;;  | 
        ||
| 348 | esac  | 
        ||
| 349 | |||
| 350 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 351 | if [ -z "$TRANSLATE_DIR" ]; then  | 
        ||
| 352 | echo "Dictionary root (program directory): '"$APPFILEDIR"'"  | 
        ||
| 353 | else  | 
        ||
| 354 | echo "Dictionary root (TRANSLATE_DIR): '"$TRANSLATE_DIR"'"  | 
        ||
| 355 | fi  | 
        ||
| 356 | echo "Dictionary file: '"$2"'"  | 
        ||
| 357 | echo "Dictionary file path: '"$DICT"'"  | 
        ||
| 358 | fi  | 
        ||
| 359 | |||
| 360 | DEFAULT_INFO=$APPNAME" "$APPVER" dictionary file created by '"`whoami`"' on "`date`  | 
        ||
| 361 | |||
| 362 | if [ $CREATE -eq 1 ]; then  | 
        ||
| 363 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 364 | echo $DICT": Creating dictionary"  | 
        ||
| 365 | fi  | 
        ||
| 366 | if [ -z "$3" ]; then  | 
        ||
| 367 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Adding information: '"$DEFAULT_INFO ; fi  | 
        ||
| 368 | echo "#"$DELIMITER$EFAULT_INFO &>$DICT  | 
        ||
| 369 | else  | 
        ||
| 370 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Adding information: '"$3"'" ; fi  | 
        ||
| 371 | echo "#"$DELIMITER$3 &>$DICT  | 
        ||
| 372 | fi  | 
        ||
| 373 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 374 | exit $?  | 
        ||
| 375 | fi  | 
        ||
| 376 | |||
| 377 | if [ -e "$DICT" ]; then # if dictionary file exists  | 
        ||
| 378 | # check if dictionary file (contains at least '#$DELIMITER')  | 
        ||
| 379 | if [ $VERBOSE -eq 1 ]; then echo "Executing: grep -e '."$DELIMITER".' '"$DICT"'" ; fi  | 
        ||
| 380 | RESULT=`grep -e "#$DELIMITER." "$DICT"`  | 
        ||
| 381 | if [ -z "$RESULT" ]; then  | 
        ||
| 382 | if [ $VERBOSE -eq 1 ]; then echo "grep returned: ''" ; fi  | 
        ||
| 383 | echo $DICT": Not a (valid) dictionary file (type '"$APPFILENAME" --d' for details)."  | 
        ||
| 384 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 385 | exit $EDICT_WRONG_FORMAT  | 
        ||
| 386 | else  | 
        ||
| 387 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 388 | echo "grep returned not a null-string: '$DICT' seems to be a dictionary file"  | 
        ||
| 389 | fi  | 
        ||
| 390 | fi  | 
        ||
| 391 | RESULT=""  | 
        ||
| 392 | |||
| 393 | if [ $ADDINFO -eq 1 ]; then  | 
        ||
| 394 | if [ -z "$3" ]; then  | 
        ||
| 395 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Adding information: '"$DEFAULT_INFO"'" ; fi  | 
        ||
| 396 | echo "#"$DELIMITER$DEFAULT_INFO >>$DICT  | 
        ||
| 397 | else  | 
        ||
| 398 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Adding information: '"$3"'" ; fi  | 
        ||
| 399 | echo "#"$DELIMITER$3 >>$DICT  | 
        ||
| 400 | fi  | 
        ||
| 401 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 402 | exit $?  | 
        ||
| 403 | fi  | 
        ||
| 404 | |||
| 405 | if [ $INFO -eq 1 ]; then  | 
        ||
| 406 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 407 | echo "Obtaining information..."  | 
        ||
| 408 | echo  | 
        ||
| 409 | fi  | 
        ||
| 410 | grep "^#$DELIMITER" "$DICT" | sed 's/^#'$DELIMITER'//'  | 
        ||
| 411 | RESULT=`grep -e "^#$DELIMITER" "$DICT"`  | 
        ||
| 412 | if [ -z "$RESULT" ]; then echo $CH_SOUND$DICT": No information available" ; fi  | 
        ||
| 413 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 414 | exit $ESUCCESS  | 
        ||
| 415 | fi  | 
        ||
| 416 | |||
| 417 | if [ $ADD -eq 1 ]; then  | 
        ||
| 418 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 419 | RESULT=`grep -i -e "^$1$DELIMITER" "$DICT"`  | 
        ||
| 420 | if [ -z "$RESULT" ]; then  | 
        ||
| 421 | echo $DICT": Adding expression: '"$1"'"  | 
        ||
| 422 | echo $DICT": Adding translation: '"$4"'"  | 
        ||
| 423 | if [ -n "$4" ]; then  | 
        ||
| 424 | echo $1$DELIMITER$4 >>$DICT  | 
        ||
| 425 | else  | 
        ||
| 426 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then echo $CH_SOUND$APPFILENAME": No translation given for '"$1"'" ; fi  | 
        ||
| 427 | fi  | 
        ||
| 428 | SORT=1  | 
        ||
| 429 | else  | 
        ||
| 430 | translate "$1"  | 
        ||
| 431 | echo $CH_SOUND$DICT": Expression already contained: '"$1"':"$RESULT  | 
        ||
| 432 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 433 | exit $EDICT_EXPR_CONTAINED  | 
        ||
| 434 | fi  | 
        ||
| 435 | fi  | 
        ||
| 436 | |||
| 437 | if [ $OVERWRITE -eq 1 ]; then  | 
        ||
| 438 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 439 | echo $DICT": Replacing expression: '"$1"'"  | 
        ||
| 440 | echo $DICT": Replacing translation: '"$4"'"  | 
        ||
| 441 | TMPFILE=`mktemp -q /tmp/$APPFILENAME.XXXXXX`  | 
        ||
| 442 | if [ $? -ne 0 ]; then  | 
        ||
| 443 | if [ $VERBOSE -eq 1 ]; then echo $APPFILENAME": Can't create temp file, exiting..." ; fi  | 
        ||
| 444 | exit EDICT_TEMP_ERROR  | 
        ||
| 445 | else  | 
        ||
| 446 | if [ -n "$4" ]; then  | 
        ||
| 447 | grep -iv -e "^$1$DELIMITER" "$DICT" &>$TMPFILE  | 
        ||
| 448 | if [ $? -eq 0 ]; then echo $1$DELIMITER$4 >>$TMPFILE ; fi  | 
        ||
| 449 | if [ $? -eq 0 ]; then mv $TMPFILE $DICT &>/dev/null ; fi  | 
        ||
| 450 | if [ $? -ne 0 ]; then  | 
        ||
| 451 | if [ $VERBOSE -eq 1 ]; then echo $APPFILENAME": Unable to replace dictionary file: '"$DICT"'" ; fi  | 
        ||
| 452 | exit EDICT_REPLACE_ERROR  | 
        ||
| 453 | else  | 
        ||
| 454 | SORT=1  | 
        ||
| 455 | fi  | 
        ||
| 456 | else  | 
        ||
| 457 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then echo $CH_SOUND$APPFILENAME": No translation given for '"$1"'" ; fi  | 
        ||
| 458 | fi  | 
        ||
| 459 | fi  | 
        ||
| 460 | fi  | 
        ||
| 461 | |||
| 462 | if [ $DELETE -eq 1 ]; then  | 
        ||
| 463 | if [ $DICTIONARY -eq 0 ]; then  | 
        ||
| 464 | # delete entry  | 
        ||
| 465 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Removing expression: "$1 ; fi  | 
        ||
| 466 | RESULT=`grep -i -e "^$1$DELIMITER" "$DICT"`  | 
        ||
| 467 | if [ -z "$RESULT" ]; then  | 
        ||
| 468 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then echo $DICT": Expression not contained in dictionary: '"$1"'" ; fi  | 
        ||
| 469 | exit $EDICT_DELETE_EXPR_NOT_FOUND  | 
        ||
| 470 | fi  | 
        ||
| 471 | TMPFILE=`mktemp -q /tmp/$APPFILENAME.XXXXXX`  | 
        ||
| 472 | if [ $? -ne 0 ]; then  | 
        ||
| 473 | if [ $VERBOSE -eq 1 ]; then echo $APPFILENAME": Can't create temp file, exiting..." ; fi  | 
        ||
| 474 | exit EDICT_TEMP_ERROR  | 
        ||
| 475 | else  | 
        ||
| 476 | grep -iv -e "$1$DELIMITER" "$DICT" &>$TMPFILE  | 
        ||
| 477 | if [ $? -eq 0 ]; then mv $TMPFILE $DICT &>/dev/null ; fi  | 
        ||
| 478 | if [ $? -ne 0 ]; then  | 
        ||
| 479 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Unable to modify dictionary (cannot replace file)" ; fi  | 
        ||
| 480 | exit EDICT_REPLACE_ERROR  | 
        ||
| 481 | else  | 
        ||
| 482 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Modification successful" ; fi  | 
        ||
| 483 | exit $ESUCCESS  | 
        ||
| 484 | fi  | 
        ||
| 485 | fi  | 
        ||
| 486 | else  | 
        ||
| 487 | # delete dictionary  | 
        ||
| 488 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 489 | echo $APPFILENAME": Deleting dictionary: '"$DICT"'"  | 
        ||
| 490 | echo $APPFILENAME": Executing: rm '"$DICT"' &>/dev/null"  | 
        ||
| 491 | fi  | 
        ||
| 492 | rm $DICT &>/dev/null  | 
        ||
| 493 | if [ $? -ne 0 ]; then  | 
        ||
| 494 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then echo $DICT": Unable to remove dictionary" ; fi  | 
        ||
| 495 | exit $EDICT_REMOVE  | 
        ||
| 496 | else  | 
        ||
| 497 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 498 | echo $DICT": Dictionary successfully removed"  | 
        ||
| 499 | echo  | 
        ||
| 500 | fi  | 
        ||
| 501 | exit $ESUCCESS  | 
        ||
| 502 | fi  | 
        ||
| 503 | fi  | 
        ||
| 504 | fi  | 
        ||
| 505 | |||
| 506 | if [ $SORT -eq 1 ]; then  | 
        ||
| 507 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 508 | echo "Sorting vocabulary: '"$DICT"'"  | 
        ||
| 509 | echo "Executing: sort -d -f -o "$DICT" -t "$DELIMITER" "$DICT  | 
        ||
| 510 | fi  | 
        ||
| 511 | RESULT=`sort -d -f -o "$DICT" -t $DELIMITER "$DICT"`  | 
        ||
| 512 | SORT_EXIT=$?  | 
        ||
| 513 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 514 | echo "sort returned exit code "$SORT_EXIT  | 
        ||
| 515 | if [ $SORT_EXIT -eq 0 ]; then  | 
        ||
| 516 | echo "Sorting successful: '"$DICT"'"  | 
        ||
| 517 | else  | 
        ||
| 518 | echo "Sorting failed: '"$DICT"'"  | 
        ||
| 519 | fi  | 
        ||
| 520 | echo  | 
        ||
| 521 | fi  | 
        ||
| 522 | exit $SORT_EXIT  | 
        ||
| 523 | fi  | 
        ||
| 524 | |||
| 525 | if [ $REPAIR -eq 1 ]; then  | 
        ||
| 526 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Repairing dictionary" ; fi  | 
        ||
| 527 | TMPFILE=`mktemp -q /tmp/$APPFILENAME.XXXXXX`  | 
        ||
| 528 | if [ $? -ne 0 ]; then  | 
        ||
| 529 | if [ $VERBOSE -eq 1 ]; then echo $APPFILENAME": Can't create temp file, exiting..." ; fi  | 
        ||
| 530 | exit EDICT_TEMP_ERROR  | 
        ||
| 531 | else  | 
        ||
| 532 | grep -e "^#$DELIMITER" "$DICT" &>$TMPFILE  | 
        ||
| 533 | grep -e ".$DELIMITER." "$DICT" >>$TMPFILE  | 
        ||
| 534 | if [ $? -eq 0 ]; then mv $TMPFILE $DICT &>/dev/null ; fi  | 
        ||
| 535 | if [ $? -ne 0 ]; then  | 
        ||
| 536 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Unable to repair dictionary (cannot replace file)" ; fi  | 
        ||
| 537 | exit EDICT_REPLACE_ERROR  | 
        ||
| 538 | else  | 
        ||
| 539 | $DICT": Repair successful"  | 
        ||
| 540 | fi  | 
        ||
| 541 | fi  | 
        ||
| 542 | fi  | 
        ||
| 543 | |||
| 544 | TRANSL=""  | 
        ||
| 545 | REVERSE_TRANSL=""  | 
        ||
| 546 | REVERSE_TRANSL_CAPT="T"  | 
        ||
| 547 | REVERSE_TRANSL_ON=" (reverse)"  | 
        ||
| 548 | REVERSE_TRANSL_CAPT_ON="Reverse t"  | 
        ||
| 549 | if [ $REVERSE -eq 1 ]; then  | 
        ||
| 550 | REVERSE_TRANSL=$REVERSE_TRANSL_ON  | 
        ||
| 551 | REVERSE_TRANSL_CAPT=$REVERSE_TRANSL_CAPT_ON  | 
        ||
| 552 | fi  | 
        ||
| 553 | if [ $PHRASE -eq 1 ] ; then  | 
        ||
| 554 | if [ $VERBOSE -eq 1 ]; then echo "Looking up phrase"$REVERSE_TRANSL": '"$1"'" ; fi  | 
        ||
| 555 | if [ $ZERO -eq 0 ]; then  | 
        ||
| 556 | TRANSL="$1" ; if [ $BRACKETS -eq 1 ]; then TRANSL="["$TRANSL"]" ; fi  | 
        ||
| 557 | fi  | 
        ||
| 558 | translate "$1"  | 
        ||
| 559 | if [ -n "$RESULT" ]; then  | 
        ||
| 560 | TRANSL=$RESULT  | 
        ||
| 561 | if [ $VERBOSE -eq 1 ]; then echo $REVERSE_TRANSL_CAPT"ranslation: '"$TRANSL"'" ; fi  | 
        ||
| 562 | else  | 
        ||
| 563 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 564 | if [ $ZERO -eq 1 ]; then  | 
        ||
| 565 | echo $REVERSE_TRANSL_CAPT"ranslation failed (return not translatable tokens as null-string): '"$1"'"  | 
        ||
| 566 | else  | 
        ||
| 567 | if [ $BRACKETS -eq 1 ]; then  | 
        ||
| 568 | echo $CH_SOUND$REVERSE_TRANSL_CAPT"ranslation failed (enclosing phrase in brackets): '"$1"'"  | 
        ||
| 569 | else  | 
        ||
| 570 | echo $CH_SOUND$REVERSE_TRANSL_CAPT"ranslation failed (leave 'as is'): '"$1"'"  | 
        ||
| 571 | fi  | 
        ||
| 572 | fi  | 
        ||
| 573 | fi  | 
        ||
| 574 | fi  | 
        ||
| 575 | else  | 
        ||
| 576 | for word in $1; do  | 
        ||
| 577 | if [ $ZERO -eq 0 ]; then TRANSLWORD="$word" ; else TRANSLWORD="" ; fi  | 
        ||
| 578 | if [ $VERBOSE -eq 1 ]; then echo "Looking up word"$REVERSE_TRANSL": "$word ; fi  | 
        ||
| 579 | translate "$word"  | 
        ||
| 580 | if [ -n "$RESULT" ]; then  | 
        ||
| 581 | TRANSLWORD=$RESULT  | 
        ||
| 582 | if [ -n "$RESULT" ] && [ $VERBOSE -eq 1 ]; then echo $REVERSE_TRANSL_CAPT"ranslation: '"$TRANSLWORD"'" ; fi  | 
        ||
| 583 | else  | 
        ||
| 584 | if [ $ZERO -eq 0 ] && [ $BRACKETS -eq 1 ]; then TRANSLWORD="["$TRANSLWORD"]" ; fi  | 
        ||
| 585 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 586 | if [ $ZERO -eq 1 ]; then  | 
        ||
| 587 | echo $REVERSE_TRANSL_CAPT"ranslation failed (return not translatable tokens as null-string): "$word  | 
        ||
| 588 | else  | 
        ||
| 589 | if [ $BRACKETS -eq 1 ]; then  | 
        ||
| 590 | echo $REVERSE_TRANSL_CAPT"ranslation failed (enclosing word in brackets): "$word  | 
        ||
| 591 | else  | 
        ||
| 592 | echo $REVERSE_TRANSL_CAPT"ranslation failed (leave 'as is'): "$word  | 
        ||
| 593 | fi  | 
        ||
| 594 | fi  | 
        ||
| 595 | fi  | 
        ||
| 596 | fi  | 
        ||
| 597 | TRANSL=$TRANSL" "$TRANSLWORD  | 
        ||
| 598 | done  | 
        ||
| 599 | fi  | 
        ||
| 600 | if [ $VERBOSE -eq 1 ]; then echo "Overall translation:" ; fi  | 
        ||
| 601 | if [ -n "$TRANSL" ]; then echo $TRANSL ; fi  | 
        ||
| 602 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 603 | else  | 
        ||
| 604 | # send errmsg to stderr  | 
        ||
| 605 | if [ -n "$TRANSLATE_DIR" ] && [ ! -e "$TRANSLATE_DIR" ]; then  | 
        ||
| 606 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then echo $CH_SOUND"$APPFILENAME: Unable to locate dictionary root: '"$TRANSLATE_DIR"'" 1>&2 ; fi  | 
        ||
| 607 | else  | 
        ||
| 608 | if [ $INFO -eq 0 ] && [ $ADD -eq 1 ] || [ $OVERWRITE -eq 1 ]; then  | 
        ||
| 609 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 610 | echo  | 
        ||
| 611 | echo $DICT": Creating dictionary"  | 
        ||
| 612 | fi  | 
        ||
| 613 | if [ -n "$4" ]; then  | 
        ||
| 614 | if [ -z "$5" ]; then  | 
        ||
| 615 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Adding information: '"$APPNAME" "$APPVER" dictionary file created by '"`whoami`"' on "`date`"'" ; fi  | 
        ||
| 616 | echo "#"$DELIMITER$APPNAME" "$APPVER" dictionary file created by '"`whoami`"' on "`date` &>$DICT  | 
        ||
| 617 | else  | 
        ||
| 618 | if [ $VERBOSE -eq 1 ]; then echo $DICT": Adding information: '"$5"'" ; fi  | 
        ||
| 619 | echo "#"$DELIMITER$5 &>$DICT  | 
        ||
| 620 | fi  | 
        ||
| 621 | if [ $? -eq 0 ]; then  | 
        ||
| 622 | if [ $VERBOSE -eq 1 ]; then  | 
        ||
| 623 | echo $DICT": Adding expression: '"$1"'"  | 
        ||
| 624 | echo $DICT": Adding translation: '"$4"'"  | 
        ||
| 625 | fi  | 
        ||
| 626 | echo $1$DELIMITER$4 >>$DICT  | 
        ||
| 627 | else  | 
        ||
| 628 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then echo $CH_SOUND$APPFILENAME": Unable to create dictionary file: '"$DICT"'" ; fi  | 
        ||
| 629 | exit EDICT_CREATE_ERROR  | 
        ||
| 630 | fi  | 
        ||
| 631 | else  | 
        ||
| 632 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then echo $CH_SOUND$APPFILENAME": No translation given for '"$1"'" ; fi  | 
        ||
| 633 | fi  | 
        ||
| 634 | else  | 
        ||
| 635 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then echo $CH_SOUND$APPFILENAME": Unable to locate dictionary file: '"$DICT"' (please double-quote phrases)" 1>&2 ; fi  | 
        ||
| 636 | fi  | 
        ||
| 637 | fi  | 
        ||
| 638 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 639 | if [ -n "$TRANSLATE_DIR" ] && [ ! -e "$TRANSLATE_DIR" ]; then  | 
        ||
| 640 | exit $EDICT_DIR_NOT_FOUND  | 
        ||
| 641 | else  | 
        ||
| 642 | exit $EDICT_NOT_FOUND  | 
        ||
| 643 | fi  | 
        ||
| 644 | fi  | 
        ||
| 645 | else  | 
        ||
| 646 | if [ $MESSAGES -eq 1 ] || [ $VERBOSE -eq 1 ]; then  | 
        ||
| 647 | # send errmsg to stderr  | 
        ||
| 648 | echo $CH_SOUND$APPFILENAME": No dictionary file given" 1>&2  | 
        ||
| 649 | fi  | 
        ||
| 650 | if [ $VERBOSE -eq 1 ]; then echo ; fi  | 
        ||
| 651 | exit $ENO_DICT  | 
        ||
| 652 | fi  | 
        ||
| 653 | else  | 
        ||
| 654 | help  | 
        ||
| 655 | fi  |