Git fork
at reftables-rust 133 lines 2.7 kB view raw
1#!/bin/sh 2# Tcl ignores the next line -*- tcl -*- \ 3exec tclsh "$0" -- "$@" 4 5# This is a really stupid program, which serves as an alternative to 6# msgfmt. It _only_ translates to Tcl mode, does _not_ validate the 7# input, and does _not_ output any statistics. 8 9proc u2a {s} { 10 set res "" 11 foreach i [split $s ""] { 12 scan $i %c c 13 if {$c<128} { 14 # escape '[', '\' and ']' 15 if {$c == 0x5b || $c == 0x5d} { 16 append res "\\" 17 } 18 append res $i 19 } else { 20 append res \\u[format %04.4x $c] 21 } 22 } 23 return $res 24} 25 26set output_directory "." 27set lang "dummy" 28set files [list] 29set show_statistics 0 30 31# parse options 32for {set i 0} {$i < $argc} {incr i} { 33 set arg [lindex $argv $i] 34 if {$arg == "--statistics"} { 35 incr show_statistics 36 continue 37 } 38 if {$arg == "--tcl"} { 39 # we know 40 continue 41 } 42 if {$arg == "-l"} { 43 incr i 44 set lang [lindex $argv $i] 45 continue 46 } 47 if {$arg == "-d"} { 48 incr i 49 set tmp [lindex $argv $i] 50 regsub "\[^/\]$" $tmp "&/" output_directory 51 continue 52 } 53 lappend files $arg 54} 55 56proc flush_msg {} { 57 global msgid msgstr mode lang out fuzzy 58 global translated_count fuzzy_count not_translated_count 59 60 if {![info exists msgid] || $mode == ""} { 61 return 62 } 63 set mode "" 64 if {$fuzzy == 1} { 65 incr fuzzy_count 66 set fuzzy 0 67 return 68 } 69 70 if {$msgid == ""} { 71 set prefix "set ::msgcat::header" 72 } else { 73 if {$msgstr == ""} { 74 incr not_translated_count 75 return 76 } 77 set prefix "::msgcat::mcset $lang \"[u2a $msgid]\"" 78 incr translated_count 79 } 80 81 puts $out "$prefix \"[u2a $msgstr]\"" 82} 83 84set fuzzy 0 85set translated_count 0 86set fuzzy_count 0 87set not_translated_count 0 88foreach file $files { 89 regsub "^.*/\(\[^/\]*\)\.po$" $file "$output_directory\\1.msg" outfile 90 set in [open $file "r"] 91 fconfigure $in -encoding utf-8 92 set out [open $outfile "w"] 93 94 set mode "" 95 while {[gets $in line] >= 0} { 96 if {[regexp "^#" $line]} { 97 if {[regexp ", fuzzy" $line]} { 98 set fuzzy 1 99 } else { 100 flush_msg 101 } 102 continue 103 } elseif {[regexp "^msgid \"(.*)\"$" $line dummy match]} { 104 flush_msg 105 set msgid $match 106 set mode "msgid" 107 } elseif {[regexp "^msgstr \"(.*)\"$" $line dummy match]} { 108 set msgstr $match 109 set mode "msgstr" 110 } elseif {$line == ""} { 111 flush_msg 112 } elseif {[regexp "^\"(.*)\"$" $line dummy match]} { 113 if {$mode == "msgid"} { 114 append msgid $match 115 } elseif {$mode == "msgstr"} { 116 append msgstr $match 117 } else { 118 puts stderr "I do not know what to do: $match" 119 } 120 } else { 121 puts stderr "Cannot handle $line" 122 } 123 } 124 flush_msg 125 close $in 126 close $out 127} 128 129if {$show_statistics} { 130 puts [concat "$translated_count translated messages, " \ 131 "$fuzzy_count fuzzy ones, " \ 132 "$not_translated_count untranslated ones."] 133}