gitk-git / po / po2msg.shon commit Merge branch 'js/rerere-forget-protect-against-NUL' (5beeefe)
   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}