1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
#!/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 || $c == 0x24} {
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} {
set str ""
append str "$translated_count translated message"
if {$translated_count != 1} {
append str s
}
if {$fuzzy_count > 1} {
append str ", $fuzzy_count fuzzy translation"
if {$fuzzy_count != 1} {
append str s
}
}
if {$not_translated_count > 0} {
append str ", $not_translated_count untranslated message"
if {$not_translated_count != 1} {
append str s
}
}
append str .
puts $str
}
|