| #!/bin/sh | 
 | # Tcl ignores the next line -*- tcl -*- \ | 
 | exec tclsh "$0" -- "$@" | 
 |  | 
 | # This is a really stupid program, which serves as an alternative to | 
 | # msgfmt.  It _only_ translates to Tcl mode, does _not_ validate the | 
 | # input, and does _not_ output any statistics. | 
 |  | 
 | proc u2a {s} { | 
 | 	set res "" | 
 | 	foreach i [split $s ""] { | 
 | 		scan $i %c c | 
 | 		if {$c<128} { | 
 | 			# escape '[', '\' and ']' | 
 | 			if {$c == 0x5b || $c == 0x5d} { | 
 | 				append res "\\" | 
 | 			} | 
 | 			append res $i | 
 | 		} else { | 
 | 			append res \\u[format %04.4x $c] | 
 | 		} | 
 | 	} | 
 | 	return $res | 
 | } | 
 |  | 
 | set output_directory "." | 
 | set lang "dummy" | 
 | set files [list] | 
 | set show_statistics 0 | 
 |  | 
 | # parse options | 
 | for {set i 0} {$i < $argc} {incr i} { | 
 | 	set arg [lindex $argv $i] | 
 | 	if {$arg == "--statistics"} { | 
 | 		incr show_statistics | 
 | 		continue | 
 | 	} | 
 | 	if {$arg == "--tcl"} { | 
 | 		# we know | 
 | 		continue | 
 | 	} | 
 | 	if {$arg == "-l"} { | 
 | 		incr i | 
 | 		set lang [lindex $argv $i] | 
 | 		continue | 
 | 	} | 
 | 	if {$arg == "-d"} { | 
 | 		incr i | 
 | 		set tmp [lindex $argv $i] | 
 | 		regsub "\[^/\]$" $tmp "&/" output_directory | 
 | 		continue | 
 | 	} | 
 | 	lappend files $arg | 
 | } | 
 |  | 
 | proc flush_msg {} { | 
 | 	global msgid msgstr mode lang out fuzzy | 
 | 	global translated_count fuzzy_count not_translated_count | 
 |  | 
 | 	if {![info exists msgid] || $mode == ""} { | 
 | 		return | 
 | 	} | 
 | 	set mode "" | 
 | 	if {$fuzzy == 1} { | 
 | 		incr fuzzy_count | 
 | 		set fuzzy 0 | 
 | 		return | 
 | 	} | 
 |  | 
 | 	if {$msgid == ""} { | 
 | 		set prefix "set ::msgcat::header" | 
 | 	} else { | 
 | 		if {$msgstr == ""} { | 
 | 			incr not_translated_count | 
 | 			return | 
 | 		} | 
 | 		set prefix "::msgcat::mcset $lang \"[u2a $msgid]\"" | 
 | 		incr translated_count | 
 | 	} | 
 |  | 
 | 	puts $out "$prefix \"[u2a $msgstr]\"" | 
 | } | 
 |  | 
 | set fuzzy 0 | 
 | set translated_count 0 | 
 | set fuzzy_count 0 | 
 | set not_translated_count 0 | 
 | foreach file $files { | 
 | 	regsub "^.*/\(\[^/\]*\)\.po$" $file "$output_directory\\1.msg" outfile | 
 | 	set in [open $file "r"] | 
 | 	fconfigure $in -encoding utf-8 | 
 | 	set out [open $outfile "w"] | 
 |  | 
 | 	set mode "" | 
 | 	while {[gets $in line] >= 0} { | 
 | 		if {[regexp "^#" $line]} { | 
 | 			if {[regexp ", fuzzy" $line]} { | 
 | 				set fuzzy 1 | 
 | 			} else { | 
 | 				flush_msg | 
 | 			} | 
 | 			continue | 
 | 		} elseif {[regexp "^msgid \"(.*)\"$" $line dummy match]} { | 
 | 			flush_msg | 
 | 			set msgid $match | 
 | 			set mode "msgid" | 
 | 		} elseif {[regexp "^msgstr \"(.*)\"$" $line dummy match]} { | 
 | 			set msgstr $match | 
 | 			set mode "msgstr" | 
 | 		} elseif {$line == ""} { | 
 | 			flush_msg | 
 | 		} elseif {[regexp "^\"(.*)\"$" $line dummy match]} { | 
 | 			if {$mode == "msgid"} { | 
 | 				append msgid $match | 
 | 			} elseif {$mode == "msgstr"} { | 
 | 				append msgstr $match | 
 | 			} else { | 
 | 				puts stderr "I do not know what to do: $match" | 
 | 			} | 
 | 		} else { | 
 | 			puts stderr "Cannot handle $line" | 
 | 		} | 
 | 	} | 
 | 	flush_msg | 
 | 	close $in | 
 | 	close $out | 
 | } | 
 |  | 
 | if {$show_statistics} { | 
 | 	puts [concat "$translated_count translated messages, " \ | 
 | 		"$fuzzy_count fuzzy ones, " \ | 
 | 		"$not_translated_count untranslated ones."] | 
 | } |