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