git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] gitk: Import msgcat for translation support
@ 2007-07-27 14:53 Christian Stimming
  2007-07-27 15:03 ` [PATCH 2/2] gitk: Markup many strings for translation Christian Stimming
  2007-07-27 23:53 ` [PATCH 1/2] gitk: Import msgcat for translation support Paul Mackerras
  0 siblings, 2 replies; 9+ messages in thread
From: Christian Stimming @ 2007-07-27 14:53 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: git

Import tcl's msgcat package to have the [mc...] procedure for  
translation available.

However, in the current form gitk doesn't load any data a data  
directory or from anywhere; if it should load any translation  
catalogs, of course it needs to load them from a designated data  
directory. For testing, it uses the ./msgs/ subdirectory (marked as  
FIXME), but eventually a full-blown data directory needs to be added  
there instead.

Signed-off-by: Christian Stimming <stimming@tuhh.de>
---
Actual translation markup will follow.

  gitk |    7 +++++++
  1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/gitk b/gitk
index 39e452a..c01acfb 100755
--- a/gitk
+++ b/gitk
@@ -7463,6 +7463,13 @@ set fgcolor black
  set diffcolors {red "#00a000" blue}
  set selectbgcolor gray85

+## Internationalization (i18n) through msgcat and gettext. See
+## http://www.gnu.org/software/gettext/manual/html_node/Tcl.html
+package require msgcat
+namespace import ::msgcat::mc
+## FIXME: Need to define a suitable msgs/ directory here.
+::msgcat::mcload [file join . msgs]
+
  catch {source ~/.gitk}

  font create optionfont -family sans-serif -size -12
-- 
1.5.3.rc2.12.gbc280

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/2] gitk: Markup many strings for translation.
  2007-07-27 14:53 [PATCH 1/2] gitk: Import msgcat for translation support Christian Stimming
@ 2007-07-27 15:03 ` Christian Stimming
  2007-07-28  2:39   ` Paul Mackerras
  2007-07-27 23:53 ` [PATCH 1/2] gitk: Import msgcat for translation support Paul Mackerras
  1 sibling, 1 reply; 9+ messages in thread
From: Christian Stimming @ 2007-07-27 15:03 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: git

Similar to the discussion in git-gui, all user-visible strings are  
passed through the [mc ...] procedure to have them translated by msgcat.

Signed-off-by: Christian Stimming <stimming@tuhh.de>
---
@Paul: Are you interested in applying this? If yes, I'd happily  
provide the Makefile rules for string extraction and translation  
catalog updates, but I'd like to hear a proposal or decision on where  
to place them. Should the po files for translation go into the po/  
subdirectory? And then a proposal/decision of where to install the  
compiled .msg catalogs will be necessary.

In case anyone comes up with the idea of using a single translation  
catalog for both gitk and git-gui: This is very well possible and  
potentially makes the translator's workflow easier. Only in terms of  
message saving there will be almost no benefit: Gitk has approx. 130  
messages, git-gui approx. 260, and exactly 8 (in words: eight) of them  
are identical between both programs.

  gitk |  358  
+++++++++++++++++++++++++++++++++---------------------------------
  1 files changed, 179 insertions(+), 179 deletions(-)

diff --git a/gitk b/gitk
index c01acfb..de131a6 100755
--- a/gitk
+++ b/gitk
@@ -128,7 +128,7 @@ proc getcommits {} {
      set phase getcommits
      initlayout
      start_rev_list $curview
-    show_status "Reading commits..."
+    show_status [mc "Reading commits..."]
  }

  proc getcommitlines {fd view}  {
@@ -273,7 +273,7 @@ proc chewcommits {view} {
  		#set ms [expr {[clock clicks -milliseconds] - $startmsecs}]
  		#puts "overall $ms ms for $numcommits commits"
  	    } else {
-		show_status "No commits selected"
+		show_status [mc "No commits selected"]
  	    }
  	    notbusy layout
  	    set phase {}
@@ -378,7 +378,7 @@ proc getcommit {id} {
      } else {
  	readcommit $id
  	if {![info exists commitinfo($id)]} {
-	    set commitinfo($id) {"No commit information available"}
+	    set commitinfo($id) {[mc "No commit information available"]}
  	}
      }
      return 1
@@ -464,7 +464,7 @@ proc removehead {id name} {
  proc show_error {w top msg} {
      message $w.m -text $msg -justify center -aspect 400
      pack $w.m -side top -fill x -padx 20 -pady 20
-    button $w.ok -text OK -command "destroy $top"
+    button $w.ok -text [mc OK] -command "destroy $top"
      pack $w.ok -side bottom -fill x
      bind $top <Visibility> "grab $top; focus $top"
      bind $top <Key-Return> "destroy $top"
@@ -486,9 +486,9 @@ proc confirm_popup msg {
      wm transient $w .
      message $w.m -text $msg -justify center -aspect 400
      pack $w.m -side top -fill x -padx 20 -pady 20
-    button $w.ok -text OK -command "set confirm_ok 1; destroy $w"
+    button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w"
      pack $w.ok -side left -fill x
-    button $w.cancel -text Cancel -command "destroy $w"
+    button $w.cancel -text [mc Cancel] -command "destroy $w"
      pack $w.cancel -side right -fill x
      bind $w <Visibility> "grab $w; focus $w"
      tkwait window $w
@@ -508,32 +508,32 @@ proc makewindow {} {
      global headctxmenu

      menu .bar
-    .bar add cascade -label "File" -menu .bar.file
+    .bar add cascade -label [mc "File"] -menu .bar.file
      .bar configure -font $uifont
      menu .bar.file
-    .bar.file add command -label "Update" -command updatecommits
-    .bar.file add command -label "Reread references" -command rereadrefs
-    .bar.file add command -label "Quit" -command doquit
+    .bar.file add command -label [mc "Update"] -command updatecommits
+    .bar.file add command -label [mc "Reread references"] -command rereadrefs
+    .bar.file add command -label [mc "Quit"] -command doquit
      .bar.file configure -font $uifont
      menu .bar.edit
-    .bar add cascade -label "Edit" -menu .bar.edit
-    .bar.edit add command -label "Preferences" -command doprefs
+    .bar add cascade -label [mc "Edit"] -menu .bar.edit
+    .bar.edit add command -label [mc "Preferences"] -command doprefs
      .bar.edit configure -font $uifont

      menu .bar.view -font $uifont
-    .bar add cascade -label "View" -menu .bar.view
-    .bar.view add command -label "New view..." -command {newview 0}
-    .bar.view add command -label "Edit view..." -command editview \
+    .bar add cascade -label [mc "View"] -menu .bar.view
+    .bar.view add command -label [mc "New view..."] -command {newview 0}
+    .bar.view add command -label [mc "Edit view..."] -command editview \
  	-state disabled
-    .bar.view add command -label "Delete view" -command delview  
-state disabled
+    .bar.view add command -label [mc "Delete view"] -command delview  
-state disabled
      .bar.view add separator
-    .bar.view add radiobutton -label "All files" -command {showview 0} \
+    .bar.view add radiobutton -label [mc "All files"] -command {showview 0} \
  	-variable selectedview -value 0

      menu .bar.help
-    .bar add cascade -label "Help" -menu .bar.help
-    .bar.help add command -label "About gitk" -command about
-    .bar.help add command -label "Key bindings" -command keys
+    .bar add cascade -label [mc "Help"] -menu .bar.help
+    .bar.help add command -label [mc "About gitk"] -command about
+    .bar.help add command -label [mc "Key bindings"] -command keys
      .bar.help configure -font $uifont
      . configure -menu .bar

@@ -590,7 +590,7 @@ proc makewindow {} {
      set sha1entry .tf.bar.sha1
      set entries $sha1entry
      set sha1but .tf.bar.sha1label
-    button $sha1but -text "SHA1 ID: " -state disabled -relief flat \
+    button $sha1but -text [mc "SHA1 ID: "] -state disabled -relief flat \
  	-command gotocommit -width 8 -font $uifont
      $sha1but conf -disabledforeground [$sha1but cget -foreground]
      pack .tf.bar.sha1label -side left
@@ -621,7 +621,7 @@ proc makewindow {} {
  	-state disabled -width 26
      pack .tf.bar.rightbut -side left -fill y

-    button .tf.bar.findbut -text "Find" -command dofind -font $uifont
+    button .tf.bar.findbut -text [mc "Find"] -command dofind -font $uifont
      pack .tf.bar.findbut -side left
      set findstring {}
      set fstring .tf.bar.findstring
@@ -631,13 +631,13 @@ proc makewindow {} {
      pack $fstring -side left -expand 1 -fill x -in .tf.bar
      set findtype Exact
      set findtypemenu [tk_optionMenu .tf.bar.findtype \
-		      findtype Exact IgnCase Regexp]
+			  findtype [mc Exact] [mc IgnCase] [mc Regexp]]
      trace add variable findtype write find_change
      .tf.bar.findtype configure -font $uifont
      .tf.bar.findtype.menu configure -font $uifont
-    set findloc "All fields"
-    tk_optionMenu .tf.bar.findloc findloc "All fields" Headline \
-	Comments Author Committer
+    set findloc [mc "All fields"]
+    tk_optionMenu .tf.bar.findloc findloc [mc "All fields"] [mc Headline] \
+	[mc Comments] [mc Author] [mc Committer]
      trace add variable findloc write find_change
      .tf.bar.findloc configure -font $uifont
      .tf.bar.findloc.menu configure -font $uifont
@@ -645,12 +645,12 @@ proc makewindow {} {
      pack .tf.bar.findtype -side right

      # build up the bottom bar of upper window
-    label .tf.lbar.flabel -text "Highlight:  Commits " \
+    label .tf.lbar.flabel -text [mc "Highlight:  Commits "] \
      -font $uifont
      pack .tf.lbar.flabel -side left -fill y
-    set gdttype "touching paths:"
-    set gm [tk_optionMenu .tf.lbar.gdttype gdttype "touching paths:" \
-	"adding/removing string:"]
+    set gdttype [mc "touching paths:"]
+    set gm [tk_optionMenu .tf.lbar.gdttype gdttype [mc "touching paths:"] \
+	[mc "adding/removing string:"]]
      trace add variable gdttype write hfiles_change
      $gm conf -font $uifont
      .tf.lbar.gdttype conf -font $uifont
@@ -660,19 +660,19 @@ proc makewindow {} {
      trace add variable highlight_files write hfiles_change
      lappend entries .tf.lbar.fent
      pack .tf.lbar.fent -side left -fill x -expand 1
-    label .tf.lbar.vlabel -text " OR in view" -font $uifont
+    label .tf.lbar.vlabel -text [mc " OR in view"] -font $uifont
      pack .tf.lbar.vlabel -side left -fill y
      global viewhlmenu selectedhlview
-    set viewhlmenu [tk_optionMenu .tf.lbar.vhl selectedhlview None]
+    set viewhlmenu [tk_optionMenu .tf.lbar.vhl selectedhlview [mc None]]
      $viewhlmenu entryconf None -command delvhighlight
      $viewhlmenu conf -font $uifont
      .tf.lbar.vhl conf -font $uifont
      pack .tf.lbar.vhl -side left -fill y
-    label .tf.lbar.rlabel -text " OR " -font $uifont
+    label .tf.lbar.rlabel -text [mc " OR "] -font $uifont
      pack .tf.lbar.rlabel -side left -fill y
      global highlight_related
-    set m [tk_optionMenu .tf.lbar.relm highlight_related None \
-	"Descendent" "Not descendent" "Ancestor" "Not ancestor"]
+    set m [tk_optionMenu .tf.lbar.relm highlight_related [mc None] \
+	[mc "Descendent"] [mc "Not descendent"] [mc "Ancestor"] [mc "Not ancestor"]]
      $m conf -font $uifont
      .tf.lbar.relm conf -font $uifont
      trace add variable highlight_related write vrel_change
@@ -700,7 +700,7 @@ proc makewindow {} {
      frame .bleft.top
      frame .bleft.mid

-    button .bleft.top.search -text "Search" -command dosearch \
+    button .bleft.top.search -text [mc "Search"] -command dosearch \
  	-font $uifont
      pack .bleft.top.search -side left -padx 5
      set sstring .bleft.top.sstring
@@ -708,11 +708,11 @@ proc makewindow {} {
      lappend entries $sstring
      trace add variable searchstring write incrsearch
      pack $sstring -side left -expand 1 -fill x
-    radiobutton .bleft.mid.diff -text "Diff" \
+    radiobutton .bleft.mid.diff -text [mc "Diff"] \
  	-command changediffdisp -variable diffelide -value {0 0}
-    radiobutton .bleft.mid.old -text "Old version" \
+    radiobutton .bleft.mid.old -text [mc "Old version"] \
  	-command changediffdisp -variable diffelide -value {0 1}
-    radiobutton .bleft.mid.new -text "New version" \
+    radiobutton .bleft.mid.new -text [mc "New version"] \
  	-command changediffdisp -variable diffelide -value {1 0}
      pack .bleft.mid.diff .bleft.mid.old .bleft.mid.new -side left
      set ctext .bleft.ctext
@@ -761,10 +761,10 @@ proc makewindow {} {
      # lower right
      frame .bright
      frame .bright.mode
-    radiobutton .bright.mode.patch -text "Patch" \
+    radiobutton .bright.mode.patch -text [mc "Patch"] \
  	-command reselectline -variable cmitmode -value "patch"
      .bright.mode.patch configure -font $uifont
-    radiobutton .bright.mode.tree -text "Tree" \
+    radiobutton .bright.mode.tree -text [mc "Tree"] \
  	-command reselectline -variable cmitmode -value "tree"
      .bright.mode.tree configure -font $uifont
      grid .bright.mode.patch .bright.mode.tree -sticky ew
@@ -863,35 +863,35 @@ proc makewindow {} {

      set rowctxmenu .rowctxmenu
      menu $rowctxmenu -tearoff 0
-    $rowctxmenu add command -label "Diff this -> selected" \
+    $rowctxmenu add command -label [mc "Diff this -> selected"] \
  	-command {diffvssel 0}
-    $rowctxmenu add command -label "Diff selected -> this" \
+    $rowctxmenu add command -label [mc "Diff selected -> this"] \
  	-command {diffvssel 1}
-    $rowctxmenu add command -label "Make patch" -command mkpatch
-    $rowctxmenu add command -label "Create tag" -command mktag
-    $rowctxmenu add command -label "Write commit to file" -command  
writecommit
-    $rowctxmenu add command -label "Create new branch" -command mkbranch
-    $rowctxmenu add command -label "Cherry-pick this commit" \
+    $rowctxmenu add command -label [mc "Make patch"] -command mkpatch
+    $rowctxmenu add command -label [mc "Create tag"] -command mktag
+    $rowctxmenu add command -label [mc "Write commit to file"]  
-command writecommit
+    $rowctxmenu add command -label [mc "Create new branch"] -command mkbranch
+    $rowctxmenu add command -label [mc "Cherry-pick this commit"] \
  	-command cherrypick
-    $rowctxmenu add command -label "Reset HEAD branch to here" \
+    $rowctxmenu add command -label [mc "Reset HEAD branch to here"] \
  	-command resethead

      set fakerowmenu .fakerowmenu
      menu $fakerowmenu -tearoff 0
-    $fakerowmenu add command -label "Diff this -> selected" \
+    $fakerowmenu add command -label [mc "Diff this -> selected"] \
  	-command {diffvssel 0}
-    $fakerowmenu add command -label "Diff selected -> this" \
+    $fakerowmenu add command -label [mc "Diff selected -> this"] \
  	-command {diffvssel 1}
-    $fakerowmenu add command -label "Make patch" -command mkpatch
-#    $fakerowmenu add command -label "Commit" -command {mkcommit 0}
-#    $fakerowmenu add command -label "Commit all" -command {mkcommit 1}
-#    $fakerowmenu add command -label "Revert local changes" -command  
revertlocal
+    $fakerowmenu add command -label [mc "Make patch"] -command mkpatch
+#    $fakerowmenu add command -label [mc "Commit"] -command {mkcommit 0}
+#    $fakerowmenu add command -label [mc "Commit all"] -command {mkcommit 1}
+#    $fakerowmenu add command -label [mc "Revert local changes"]  
-command revertlocal

      set headctxmenu .headctxmenu
      menu $headctxmenu -tearoff 0
-    $headctxmenu add command -label "Check out this branch" \
+    $headctxmenu add command -label [mc "Check out this branch"] \
  	-command cobranch
-    $headctxmenu add command -label "Remove this branch" \
+    $headctxmenu add command -label [mc "Remove this branch"] \
  	-command rmbranch
  }

@@ -1063,17 +1063,17 @@ proc about {} {
  	return
      }
      toplevel $w
-    wm title $w "About gitk"
-    message $w.m -text {
+    wm title $w [mc "About gitk"]
+    message $w.m -text [mc "
  Gitk - a commit viewer for git

  Copyright © 2005-2006 Paul Mackerras

-Use and redistribute under the terms of the GNU General Public License} \
+Use and redistribute under the terms of the GNU General Public License"] \
  	    -justify center -aspect 400 -border 2 -bg white -relief groove
      pack $w.m -side top -fill x -padx 2 -pady 2
      $w.m configure -font $uifont
-    button $w.ok -text Close -command "destroy $w" -default active
+    button $w.ok -text [mc Close] -command "destroy $w" -default active
      pack $w.ok -side bottom
      $w.ok configure -font $uifont
      bind $w <Visibility> "focus $w.ok"
@@ -1089,8 +1089,8 @@ proc keys {} {
  	return
      }
      toplevel $w
-    wm title $w "Gitk key bindings"
-    message $w.m -text {
+    wm title $w [mc "Gitk key bindings"]
+    message $w.m -text [mc "
  Gitk key bindings:

  <Ctrl-Q>		Quit
@@ -1128,11 +1128,11 @@ f		Scroll diff view to next file
  <Ctrl-KP->	Decrease font size
  <Ctrl-minus>	Decrease font size
  <F5>		Update
-} \
+] \
  	    -justify left -bg white -border 2 -relief groove
      pack $w.m -side top -fill both -padx 2 -pady 2
      $w.m configure -font $uifont
-    button $w.ok -text Close -command "destroy $w" -default active
+    button $w.ok -text [mc Close] -command "destroy $w" -default active
      pack $w.ok -side bottom
      $w.ok configure -font $uifont
      bind $w <Visibility> "focus $w.ok"
@@ -1580,7 +1580,7 @@ proc newview {ishighlight} {
      set newviewname($nextviewnum) "View $nextviewnum"
      set newviewperm($nextviewnum) 0
      set newviewargs($nextviewnum) [shellarglist $revtreeargs]
-    vieweditor $top $nextviewnum "Gitk view definition"
+    vieweditor $top $nextviewnum [mc "Gitk view definition"]
  }

  proc editview {} {
@@ -1605,20 +1605,20 @@ proc vieweditor {top n title} {

      toplevel $top
      wm title $top $title
-    label $top.nl -text "Name" -font $uifont
+    label $top.nl -text [mc "Name"] -font $uifont
      entry $top.name -width 20 -textvariable newviewname($n) -font $uifont
      grid $top.nl $top.name -sticky w -pady 5
-    checkbutton $top.perm -text "Remember this view" -variable  
newviewperm($n) \
+    checkbutton $top.perm -text [mc "Remember this view"] -variable  
newviewperm($n) \
  	-font $uifont
      grid $top.perm - -pady 5 -sticky w
      message $top.al -aspect 1000 -font $uifont \
-	-text "Commits to include (arguments to git rev-list):"
+	-text [mc "Commits to include (arguments to git rev-list):"]
      grid $top.al - -sticky w -pady 5
      entry $top.args -width 50 -textvariable newviewargs($n) \
  	-background white -font $uifont
      grid $top.args - -sticky ew -padx 5
      message $top.l -aspect 1000 -font $uifont \
-	-text "Enter files and directories to include, one per line:"
+	-text [mc "Enter files and directories to include, one per line:"]
      grid $top.l - -sticky w
      text $top.t -width 40 -height 10 -background white -font $uifont
      if {[info exists viewfiles($n)]} {
@@ -1631,9 +1631,9 @@ proc vieweditor {top n title} {
      }
      grid $top.t - -sticky ew -padx 5
      frame $top.buts
-    button $top.buts.ok -text "OK" -command [list newviewok $top $n] \
+    button $top.buts.ok -text [mc "OK"] -command [list newviewok $top $n] \
  	-font $uifont
-    button $top.buts.can -text "Cancel" -command [list destroy $top] \
+    button $top.buts.can -text [mc "Cancel"] -command [list destroy $top] \
  	-font $uifont
      grid $top.buts.ok $top.buts.can
      grid columnconfigure $top.buts 0 -weight 1 -uniform a
@@ -1880,11 +1880,11 @@ proc showview {n} {
      }
      if {$phase ne {}} {
  	if {$phase eq "getcommits"} {
-	    show_status "Reading commits..."
+	    show_status [mc "Reading commits..."]
  	}
  	run chewcommits $n
      } elseif {$numcommits == 0} {
-	show_status "No commits selected"
+	show_status [mc "No commits selected"]
      }
  }

@@ -2176,9 +2176,9 @@ proc askfindhighlight {row id} {
      set isbold 0
      set fldtypes {Headline Author Date Committer CDate Comments}
      foreach f $info ty $fldtypes {
-	if {($findloc eq "All fields" || $findloc eq $ty) &&
+	if {($findloc eq [mc "All fields"] || $findloc eq $ty) &&
  	    [doesmatch $f]} {
-	    if {$ty eq "Author"} {
+	    if {$ty eq [mc "Author"]} {
  		set isbold 2
  		break
  	    }
@@ -2221,7 +2221,7 @@ proc vrel_change {name ix op} {
      global highlight_related

      rhighlight_none
-    if {$highlight_related ne "None"} {
+    if {$highlight_related ne [mc "None"]} {
  	run drawvisible
      }
  }
@@ -2235,7 +2235,7 @@ proc rhighlight_sel {a} {
      set desc_todo [list $a]
      catch {unset ancestor}
      set anc_todo [list $a]
-    if {$highlight_related ne "None"} {
+    if {$highlight_related ne [mc "None"]} {
  	rhighlight_none
  	run drawvisible
      }
@@ -2318,20 +2318,20 @@ proc askrelhighlight {row id} {

      if {![info exists selectedline]} return
      set isbold 0
-    if {$highlight_related eq "Descendent" ||
-	$highlight_related eq "Not descendent"} {
+    if {$highlight_related eq [mc "Descendent"] ||
+	$highlight_related eq [mc "Not descendent"]} {
  	if {![info exists descendent($id)]} {
  	    is_descendent $id
  	}
-	if {$descendent($id) == ($highlight_related eq "Descendent")} {
+	if {$descendent($id) == ($highlight_related eq [mc "Descendent"])} {
  	    set isbold 1
  	}
-    } elseif {$highlight_related eq "Ancestor" ||
-	      $highlight_related eq "Not ancestor"} {
+    } elseif {$highlight_related eq [mc "Ancestor"] ||
+	      $highlight_related eq [mc "Not ancestor"]} {
  	if {![info exists ancestor($id)]} {
  	    is_ancestor $id
  	}
-	if {$ancestor($id) == ($highlight_related eq "Ancestor")} {
+	if {$ancestor($id) == ($highlight_related eq [mc "Ancestor"])} {
  	    set isbold 1
  	}
      }
@@ -2369,7 +2369,7 @@ proc next_hlcont {} {
  	    }
  	    if {$nhighlights($row) > 0} break
  	}
-	if {$highlight_related ne "None"} {
+	if {$highlight_related ne [mc "None"]} {
  	    if {![info exists rhighlights($row)]} {
  		askrelhighlight $row $id
  	    }
@@ -2406,7 +2406,7 @@ proc next_highlight {dirn} {

      if {![info exists selectedline]} return
      if {!([info exists hlview] || $findstring ne {} ||
-	  $highlight_related ne "None" || [info exists filehighlight])} return
+	  $highlight_related ne [mc "None"] || [info exists filehighlight])} return
      set fhl_row [expr {$selectedline + $dirn}]
      set fhl_dirn $dirn
      next_hlcont
@@ -2738,7 +2738,7 @@ proc readdiffindex {fd serial} {
      if {$serial == $lserial && $localrow == -1} {
  	# add the line for the local diff to the graph
  	set localrow $commitrow($curview,$mainheadid)
-	set hl "Local uncommitted changes"
+	set hl [mc "Local uncommitted changes"]
  	set commitinfo($nullid) [list  $hl {} {} {} {} "    $hl\n"]
  	set commitdata($nullid) "\n    $hl\n"
  	insertrow $localrow $nullid
@@ -2867,7 +2867,7 @@ proc addextraid {id row} {
      set commitrow($curview,$id) $row
      readcommit $id
      if {![info exists commitinfo($id)]} {
-	set commitinfo($id) {"No commit information available"}
+	set commitinfo($id) {[mc "No commit information available"]}
      }
      if {![info exists children($curview,$id)]} {
  	set children($curview,$id) {}
@@ -3441,7 +3441,7 @@ proc drawcmitrow {row} {
      if {$findstring ne {} && ![info exists nhighlights($row)]} {
  	askfindhighlight $row $id
      }
-    if {$highlight_related ne "None" && ![info exists rhighlights($row)]} {
+    if {$highlight_related ne [mc "None"] && ![info exists  
rhighlights($row)]} {
  	askrelhighlight $row $id
      }
      if {[info exists iddrawn($id)]} return
@@ -3937,11 +3937,11 @@ proc notbusy {what} {

  proc findmatches {f} {
      global findtype findstring
-    if {$findtype == "Regexp"} {
+    if {$findtype == [mc "Regexp"]} {
  	set matches [regexp -indices -all -inline $findstring $f]
      } else {
  	set fs $findstring
-	if {$findtype == "IgnCase"} {
+	if {$findtype == [mc "IgnCase"]} {
  	    set f [string tolower $f]
  	    set fs [string tolower $fs]
  	}
@@ -4032,7 +4032,7 @@ proc findmore {} {
  	}
  	set info $commitinfo($id)
  	foreach f $info ty $fldtypes {
-	    if {($findloc eq "All fields" || $findloc eq $ty) &&
+	    if {($findloc eq [mc "All fields"] || $findloc eq $ty) &&
  		[doesmatch $f]} {
  		set markingmatches 1
  		findselectline $l
@@ -4078,7 +4078,7 @@ proc findmorerev {} {
  	}
  	set info $commitinfo($id)
  	foreach f $info ty $fldtypes {
-	    if {($findloc eq "All fields" || $findloc eq $ty) &&
+	    if {($findloc eq [mc "All fields"] || $findloc eq $ty) &&
  		[doesmatch $f]} {
  		set markingmatches 1
  		findselectline $l
@@ -4100,7 +4100,7 @@ proc findmorerev {} {
  proc findselectline {l} {
      global findloc commentend ctext
      selectline $l 1
-    if {$findloc == "All fields" || $findloc == "Comments"} {
+    if {$findloc == [mc "All fields"] || $findloc == [mc "Comments"]} {
  	# highlight the matches in the comments
  	set f [$ctext get 1.0 $commentend]
  	set matches [findmatches $f]
@@ -4388,11 +4388,11 @@ proc selectline {l isnew} {
      set linknum 0
      set info $commitinfo($id)
      set date [formatdate [lindex $info 2]]
-    $ctext insert end "Author: [lindex $info 1]  $date\n"
+    $ctext insert end "[mc "Author:"] [lindex $info 1]  $date\n"
      set date [formatdate [lindex $info 4]]
-    $ctext insert end "Committer: [lindex $info 3]  $date\n"
+    $ctext insert end "[mc "Committer:"] [lindex $info 3]  $date\n"
      if {[info exists idtags($id)]} {
-	$ctext insert end "Tags:"
+	$ctext insert end [mc "Tags:"]
  	foreach tag $idtags($id) {
  	    $ctext insert end " $tag"
  	}
@@ -4409,18 +4409,18 @@ proc selectline {l isnew} {
  	    } else {
  		set tag m$np
  	    }
-	    $ctext insert end "Parent: " $tag
+	    $ctext insert end "[mc "Parent:"] " $tag
  	    appendwithlinks [commit_descriptor $p] {}
  	    incr np
  	}
      } else {
  	foreach p $olds {
-	    append headers "Parent: [commit_descriptor $p]"
+	    append headers "[mc "Parent:"] [commit_descriptor $p]"
  	}
      }

      foreach c $children($curview,$id) {
-	append headers "Child:  [commit_descriptor $c]"
+	append headers "[mc "Child:"]  [commit_descriptor $c]"
      }

      # make anything that looks like a SHA1 ID be a clickable link
@@ -4429,13 +4429,13 @@ proc selectline {l isnew} {
  	if {![info exists allcommits]} {
  	    getallcommits
  	}
-	$ctext insert end "Branch: "
+	$ctext insert end "[mc "Branch:"] "
  	$ctext mark set branch "end -1c"
  	$ctext mark gravity branch left
-	$ctext insert end "\nFollows: "
+	$ctext insert end "\n[mc "Follows:"] "
  	$ctext mark set follows "end -1c"
  	$ctext mark gravity follows left
-	$ctext insert end "\nPrecedes: "
+	$ctext insert end "\n[mc "Precedes:"] "
  	$ctext mark set precedes "end -1c"
  	$ctext mark gravity precedes left
  	$ctext insert end "\n"
@@ -4452,7 +4452,7 @@ proc selectline {l isnew} {
      $ctext conf -state disabled
      set commentend [$ctext index "end - 1c"]

-    init_flist "Comments"
+    init_flist [mc "Comments"]
      if {$cmitmode eq "tree"} {
  	gettree $id
      } elseif {[llength $olds] <= 1} {
@@ -5238,9 +5238,9 @@ proc sha1change {n1 n2 op} {
      }
      if {[$sha1but cget -state] == $state} return
      if {$state == "normal"} {
-	$sha1but conf -state normal -relief raised -text "Goto: "
+	$sha1but conf -state normal -relief raised -text "[mc "Goto:"] "
      } else {
-	$sha1but conf -state disabled -relief flat -text "SHA1 ID: "
+	$sha1but conf -state disabled -relief flat -text "[mc "SHA1 ID:"] "
      }
  }

@@ -5265,7 +5265,7 @@ proc gotocommit {} {
  	    }
  	    if {$matches ne {}} {
  		if {[llength $matches] > 1} {
-		    error_popup "Short SHA1 id $id is ambiguous"
+		    error_popup [mc "Short SHA1 id %s is ambiguous" $id]
  		    return
  		}
  		set id [lindex $matches 0]
@@ -5413,17 +5413,17 @@ proc lineclick {x y id isnew} {
      $ctext tag conf link -foreground blue -underline 1
      $ctext tag bind link <Enter> { %W configure -cursor hand2 }
      $ctext tag bind link <Leave> { %W configure -cursor $curtextcursor }
-    $ctext insert end "Parent:\t"
+    $ctext insert end "[mc "Parent:"]\t"
      $ctext insert end $id [list link link0]
      $ctext tag bind link0 <1> [list selbyid $id]
      set info $commitinfo($id)
      $ctext insert end "\n\t[lindex $info 0]\n"
-    $ctext insert end "\tAuthor:\t[lindex $info 1]\n"
+    $ctext insert end "\t[mc "Author:"]\t[lindex $info 1]\n"
      set date [formatdate [lindex $info 2]]
-    $ctext insert end "\tDate:\t$date\n"
+    $ctext insert end "\t[mc "Date:"]\t$date\n"
      set kids $children($curview,$id)
      if {$kids ne {}} {
-	$ctext insert end "\nChildren:"
+	$ctext insert end "\n[mc "Children:"]"
  	set i 0
  	foreach child $kids {
  	    incr i
@@ -5433,9 +5433,9 @@ proc lineclick {x y id isnew} {
  	    $ctext insert end $child [list link link$i]
  	    $ctext tag bind link$i <1> [list selbyid $child]
  	    $ctext insert end "\n\t[lindex $info 0]"
-	    $ctext insert end "\n\tAuthor:\t[lindex $info 1]"
+	    $ctext insert end "\n\t[mc "Author:"]\t[lindex $info 1]"
  	    set date [formatdate [lindex $info 2]]
-	    $ctext insert end "\n\tDate:\t$date\n"
+	    $ctext insert end "\n\t[mc "Date:"]\t$date\n"
  	}
      }
      $ctext conf -state disabled
@@ -5479,13 +5479,13 @@ proc rowmenu {x y id} {
      }
      if {$id ne $nullid} {
  	set menu $rowctxmenu
-	$menu entryconfigure 7 -label "Reset $mainhead branch to here"
+	$menu entryconfigure 7 -label [mc "Reset %s branch to here" $mainhead]
      } else {
  	set menu $fakerowmenu
      }
-    $menu entryconfigure "Diff this*" -state $state
-    $menu entryconfigure "Diff selected*" -state $state
-    $menu entryconfigure "Make patch" -state $state
+    $menu entryconfigure [mc "Diff this*"] -state $state
+    $menu entryconfigure [mc "Diff selected*"] -state $state
+    $menu entryconfigure [mc "Make patch"] -state $state
      tk_popup $menu $x $y
  }

@@ -5510,8 +5510,8 @@ proc doseldiff {oldid newid} {

      $ctext conf -state normal
      clear_ctext
-    init_flist "Top"
-    $ctext insert end "From "
+    init_flist [mc "Top"]
+    $ctext insert end [mc "From "]
      $ctext tag conf link -foreground blue -underline 1
      $ctext tag bind link <Enter> { %W configure -cursor hand2 }
      $ctext tag bind link <Leave> { %W configure -cursor $curtextcursor }
@@ -5519,7 +5519,7 @@ proc doseldiff {oldid newid} {
      $ctext insert end $oldid [list link link0]
      $ctext insert end "\n     "
      $ctext insert end [lindex $commitinfo($oldid) 0]
-    $ctext insert end "\n\nTo   "
+    $ctext insert end "\n\n[mc "To"]   "
      $ctext tag bind link1 <1> [list selbyid $newid]
      $ctext insert end $newid [list link link1]
      $ctext insert end "\n     "
@@ -5542,9 +5542,9 @@ proc mkpatch {} {
      set patchtop $top
      catch {destroy $top}
      toplevel $top
-    label $top.title -text "Generate patch"
+    label $top.title -text [mc "Generate patch"]
      grid $top.title - -pady 10
-    label $top.from -text "From:"
+    label $top.from -text [mc "From:"]
      entry $top.fromsha1 -width 40 -relief flat
      $top.fromsha1 insert 0 $oldid
      $top.fromsha1 conf -state readonly
@@ -5553,7 +5553,7 @@ proc mkpatch {} {
      $top.fromhead insert 0 $oldhead
      $top.fromhead conf -state readonly
      grid x $top.fromhead -sticky w
-    label $top.to -text "To:"
+    label $top.to -text [mc "To:"]
      entry $top.tosha1 -width 40 -relief flat
      $top.tosha1 insert 0 $newid
      $top.tosha1 conf -state readonly
@@ -5562,16 +5562,16 @@ proc mkpatch {} {
      $top.tohead insert 0 $newhead
      $top.tohead conf -state readonly
      grid x $top.tohead -sticky w
-    button $top.rev -text "Reverse" -command mkpatchrev -padx 5
+    button $top.rev -text [mc "Reverse"] -command mkpatchrev -padx 5
      grid $top.rev x -pady 10
-    label $top.flab -text "Output file:"
+    label $top.flab -text [mc "Output file:"]
      entry $top.fname -width 60
      $top.fname insert 0 [file normalize "patch$patchnum.patch"]
      incr patchnum
      grid $top.flab $top.fname -sticky w
      frame $top.buts
-    button $top.buts.gen -text "Generate" -command mkpatchgo
-    button $top.buts.can -text "Cancel" -command mkpatchcan
+    button $top.buts.gen -text [mc "Generate"] -command mkpatchgo
+    button $top.buts.can -text [mc "Cancel"] -command mkpatchcan
      grid $top.buts.gen $top.buts.can
      grid columnconfigure $top.buts 0 -weight 1 -uniform a
      grid columnconfigure $top.buts 1 -weight 1 -uniform a
@@ -5630,9 +5630,9 @@ proc mktag {} {
      set mktagtop $top
      catch {destroy $top}
      toplevel $top
-    label $top.title -text "Create tag"
+    label $top.title -text [mc "Create tag"]
      grid $top.title - -pady 10
-    label $top.id -text "ID:"
+    label $top.id -text [mc "ID:"]
      entry $top.sha1 -width 40 -relief flat
      $top.sha1 insert 0 $rowmenuid
      $top.sha1 conf -state readonly
@@ -5641,12 +5641,12 @@ proc mktag {} {
      $top.head insert 0 [lindex $commitinfo($rowmenuid) 0]
      $top.head conf -state readonly
      grid x $top.head -sticky w
-    label $top.tlab -text "Tag name:"
+    label $top.tlab -text [mc "Tag name:"]
      entry $top.tag -width 60
      grid $top.tlab $top.tag -sticky w
      frame $top.buts
-    button $top.buts.gen -text "Create" -command mktaggo
-    button $top.buts.can -text "Cancel" -command mktagcan
+    button $top.buts.gen -text [mc "Create"] -command mktaggo
+    button $top.buts.can -text [mc "Cancel"] -command mktagcan
      grid $top.buts.gen $top.buts.can
      grid columnconfigure $top.buts 0 -weight 1 -uniform a
      grid columnconfigure $top.buts 1 -weight 1 -uniform a
@@ -5660,11 +5660,11 @@ proc domktag {} {
      set id [$mktagtop.sha1 get]
      set tag [$mktagtop.tag get]
      if {$tag == {}} {
-	error_popup "No tag name specified"
+	error_popup [mc "No tag name specified"]
  	return
      }
      if {[info exists tagids($tag)]} {
-	error_popup "Tag \"$tag\" already exists"
+	error_popup [mc "Tag \"%s\" already exists" $tag]
  	return
      }
      if {[catch {
@@ -5725,9 +5725,9 @@ proc writecommit {} {
      set wrcomtop $top
      catch {destroy $top}
      toplevel $top
-    label $top.title -text "Write commit to file"
+    label $top.title -text [mc "Write commit to file"]
      grid $top.title - -pady 10
-    label $top.id -text "ID:"
+    label $top.id -text [mc "ID:"]
      entry $top.sha1 -width 40 -relief flat
      $top.sha1 insert 0 $rowmenuid
      $top.sha1 conf -state readonly
@@ -5736,16 +5736,16 @@ proc writecommit {} {
      $top.head insert 0 [lindex $commitinfo($rowmenuid) 0]
      $top.head conf -state readonly
      grid x $top.head -sticky w
-    label $top.clab -text "Command:"
+    label $top.clab -text [mc "Command:"]
      entry $top.cmd -width 60 -textvariable wrcomcmd
      grid $top.clab $top.cmd -sticky w -pady 10
-    label $top.flab -text "Output file:"
+    label $top.flab -text [mc "Output file:"]
      entry $top.fname -width 60
      $top.fname insert 0 [file normalize "commit-[string range  
$rowmenuid 0 6]"]
      grid $top.flab $top.fname -sticky w
      frame $top.buts
-    button $top.buts.gen -text "Write" -command wrcomgo
-    button $top.buts.can -text "Cancel" -command wrcomcan
+    button $top.buts.gen -text [mc "Write"] -command wrcomgo
+    button $top.buts.can -text [mc "Cancel"] -command wrcomcan
      grid $top.buts.gen $top.buts.can
      grid columnconfigure $top.buts 0 -weight 1 -uniform a
      grid columnconfigure $top.buts 1 -weight 1 -uniform a
@@ -5779,19 +5779,19 @@ proc mkbranch {} {
      set top .makebranch
      catch {destroy $top}
      toplevel $top
-    label $top.title -text "Create new branch"
+    label $top.title -text [mc "Create new branch"]
      grid $top.title - -pady 10
-    label $top.id -text "ID:"
+    label $top.id -text [mc "ID:"]
      entry $top.sha1 -width 40 -relief flat
      $top.sha1 insert 0 $rowmenuid
      $top.sha1 conf -state readonly
      grid $top.id $top.sha1 -sticky w
-    label $top.nlab -text "Name:"
+    label $top.nlab -text [mc "Name:"]
      entry $top.name -width 40
      grid $top.nlab $top.name -sticky w
      frame $top.buts
-    button $top.buts.go -text "Create" -command [list mkbrgo $top]
-    button $top.buts.can -text "Cancel" -command "catch {destroy $top}"
+    button $top.buts.go -text [mc "Create"] -command [list mkbrgo $top]
+    button $top.buts.can -text [mc "Cancel"] -command "catch {destroy $top}"
      grid $top.buts.go $top.buts.can
      grid columnconfigure $top.buts 0 -weight 1 -uniform a
      grid columnconfigure $top.buts 1 -weight 1 -uniform a
@@ -5805,7 +5805,7 @@ proc mkbrgo {top} {
      set name [$top.name get]
      set id [$top.sha1 get]
      if {$name eq {}} {
-	error_popup "Please specify a name for the new branch"
+	error_popup [mc "Please specify a name for the new branch"]
  	return
      }
      catch {destroy $top}
@@ -5849,7 +5849,7 @@ proc cherrypick {} {
      set newhead [exec git rev-parse HEAD]
      if {$newhead eq $oldhead} {
  	notbusy cherrypick
-	error_popup "No changes committed"
+	error_popup [mc "No changes committed"]
  	return
      }
      addnewchild $newhead $oldhead
@@ -5873,28 +5873,28 @@ proc resethead {} {
      set w ".confirmreset"
      toplevel $w
      wm transient $w .
-    wm title $w "Confirm reset"
+    wm title $w [mc "Confirm reset"]
      message $w.m -text \
-	"Reset branch $mainhead to [string range $rowmenuid 0 7]?" \
+	[mc "Reset branch %s to %s?" $mainhead [string range $rowmenuid 0 7]] \
  	-justify center -aspect 1000
      pack $w.m -side top -fill x -padx 20 -pady 20
      frame $w.f -relief sunken -border 2
-    message $w.f.rt -text "Reset type:" -aspect 1000
+    message $w.f.rt -text [mc "Reset type:"] -aspect 1000
      grid $w.f.rt -sticky w
      set resettype mixed
      radiobutton $w.f.soft -value soft -variable resettype -justify left \
-	-text "Soft: Leave working tree and index untouched"
+	-text [mc "Soft: Leave working tree and index untouched"]
      grid $w.f.soft -sticky w
      radiobutton $w.f.mixed -value mixed -variable resettype -justify left \
-	-text "Mixed: Leave working tree untouched, reset index"
+	-text [mc "Mixed: Leave working tree untouched, reset index"]
      grid $w.f.mixed -sticky w
      radiobutton $w.f.hard -value hard -variable resettype -justify left \
-	-text "Hard: Reset working tree and index\n(discard ALL local changes)"
+	-text [mc "Hard: Reset working tree and index\n(discard ALL local changes)"]
      grid $w.f.hard -sticky w
      pack $w.f -side top -fill x
-    button $w.ok -text OK -command "set confirm_ok 1; destroy $w"
+    button $w.ok -text [mc OK] -command "set confirm_ok 1; destroy $w"
      pack $w.ok -side left -fill x -padx 20 -pady 20
-    button $w.cancel -text Cancel -command "destroy $w"
+    button $w.cancel -text [mc Cancel] -command "destroy $w"
      pack $w.cancel -side right -fill x -padx 20 -pady 20
      bind $w <Visibility> "grab $w; focus $w"
      tkwait window $w
@@ -5908,8 +5908,8 @@ proc resethead {} {
  	filerun $fd [list readresetstat $fd $w]
  	toplevel $w
  	wm transient $w
-	wm title $w "Reset progress"
-	message $w.m -text "Reset in progress, please wait..." \
+	wm title $w [mc "Reset progress"]
+	message $w.m -text [mc "Reset in progress, please wait..."] \
  	    -justify center -aspect 1000
  	pack $w.m -side top -fill x -padx 20 -pady 5
  	canvas $w.c -width 150 -height 20 -bg white
@@ -6000,7 +6000,7 @@ proc rmbranch {} {
      set id $headmenuid
      # this check shouldn't be needed any more...
      if {$head eq $mainhead} {
-	error_popup "Cannot delete the currently checked-out branch"
+	error_popup [mc "Cannot delete the currently checked-out branch"]
  	return
      }
      set dheads [descheads $id]
@@ -6959,7 +6959,7 @@ proc showtag {tag isnew} {
      if {[info exists tagcontents($tag)]} {
  	set text $tagcontents($tag)
      } else {
-	set text "Tag: $tag\nId:  $tagids($tag)"
+	set text "[mc "Tag:"] $tag\n[mc "Id:"]  $tagids($tag)"
      }
      appendwithlinks $text {}
      $ctext conf -state disabled
@@ -6989,77 +6989,77 @@ proc doprefs {} {
  	set oldprefs($v) [set $v]
      }
      toplevel $top
-    wm title $top "Gitk preferences"
-    label $top.ldisp -text "Commit list display options"
+    wm title $top [mc "Gitk preferences"]
+    label $top.ldisp -text [mc "Commit list display options"]
      $top.ldisp configure -font $uifont
      grid $top.ldisp - -sticky w -pady 10
      label $top.spacer -text " "
-    label $top.maxwidthl -text "Maximum graph width (lines)" \
+    label $top.maxwidthl -text [mc "Maximum graph width (lines)"] \
  	-font optionfont
      spinbox $top.maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth
      grid $top.spacer $top.maxwidthl $top.maxwidth -sticky w
-    label $top.maxpctl -text "Maximum graph width (% of pane)" \
+    label $top.maxpctl -text [mc "Maximum graph width (% of pane)"] \
  	-font optionfont
      spinbox $top.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct
      grid x $top.maxpctl $top.maxpct -sticky w
      frame $top.showlocal
-    label $top.showlocal.l -text "Show local changes" -font optionfont
+    label $top.showlocal.l -text [mc "Show local changes"] -font optionfont
      checkbutton $top.showlocal.b -variable showlocalchanges
      pack $top.showlocal.b $top.showlocal.l -side left
      grid x $top.showlocal -sticky w

-    label $top.ddisp -text "Diff display options"
+    label $top.ddisp -text [mc "Diff display options"]
      $top.ddisp configure -font $uifont
      grid $top.ddisp - -sticky w -pady 10
-    label $top.diffoptl -text "Options for diff program" \
+    label $top.diffoptl -text [mc "Options for diff program"] \
  	-font optionfont
      entry $top.diffopt -width 20 -textvariable diffopts
      grid x $top.diffoptl $top.diffopt -sticky w
      frame $top.ntag
-    label $top.ntag.l -text "Display nearby tags" -font optionfont
+    label $top.ntag.l -text [mc "Display nearby tags"] -font optionfont
      checkbutton $top.ntag.b -variable showneartags
      pack $top.ntag.b $top.ntag.l -side left
      grid x $top.ntag -sticky w
-    label $top.tabstopl -text "tabstop" -font optionfont
+    label $top.tabstopl -text [mc "tabstop"] -font optionfont
      spinbox $top.tabstop -from 1 -to 20 -width 4 -textvariable tabstop
      grid x $top.tabstopl $top.tabstop -sticky w

-    label $top.cdisp -text "Colors: press to choose"
+    label $top.cdisp -text [mc "Colors: press to choose"]
      $top.cdisp configure -font $uifont
      grid $top.cdisp - -sticky w -pady 10
      label $top.bg -padx 40 -relief sunk -background $bgcolor
-    button $top.bgbut -text "Background" -font optionfont \
+    button $top.bgbut -text [mc "Background"] -font optionfont \
  	-command [list choosecolor bgcolor 0 $top.bg background setbg]
      grid x $top.bgbut $top.bg -sticky w
      label $top.fg -padx 40 -relief sunk -background $fgcolor
-    button $top.fgbut -text "Foreground" -font optionfont \
+    button $top.fgbut -text [mc "Foreground"] -font optionfont \
  	-command [list choosecolor fgcolor 0 $top.fg foreground setfg]
      grid x $top.fgbut $top.fg -sticky w
      label $top.diffold -padx 40 -relief sunk -background [lindex  
$diffcolors 0]
-    button $top.diffoldbut -text "Diff: old lines" -font optionfont \
+    button $top.diffoldbut -text [mc "Diff: old lines"] -font optionfont \
  	-command [list choosecolor diffcolors 0 $top.diffold "diff old lines" \
  		      [list $ctext tag conf d0 -foreground]]
      grid x $top.diffoldbut $top.diffold -sticky w
      label $top.diffnew -padx 40 -relief sunk -background [lindex  
$diffcolors 1]
-    button $top.diffnewbut -text "Diff: new lines" -font optionfont \
+    button $top.diffnewbut -text [mc "Diff: new lines"] -font optionfont \
  	-command [list choosecolor diffcolors 1 $top.diffnew "diff new lines" \
  		      [list $ctext tag conf d1 -foreground]]
      grid x $top.diffnewbut $top.diffnew -sticky w
      label $top.hunksep -padx 40 -relief sunk -background [lindex  
$diffcolors 2]
-    button $top.hunksepbut -text "Diff: hunk header" -font optionfont \
+    button $top.hunksepbut -text [mc "Diff: hunk header"] -font optionfont \
  	-command [list choosecolor diffcolors 2 $top.hunksep \
  		      "diff hunk header" \
  		      [list $ctext tag conf hunksep -foreground]]
      grid x $top.hunksepbut $top.hunksep -sticky w
      label $top.selbgsep -padx 40 -relief sunk -background $selectbgcolor
-    button $top.selbgbut -text "Select bg" -font optionfont \
+    button $top.selbgbut -text [mc "Select bg"] -font optionfont \
  	-command [list choosecolor selectbgcolor 0 $top.selbgsep background  
setselbg]
      grid x $top.selbgbut $top.selbgsep -sticky w

      frame $top.buts
-    button $top.buts.ok -text "OK" -command prefsok -default active
+    button $top.buts.ok -text [mc "OK"] -command prefsok -default active
      $top.buts.ok configure -font $uifont
-    button $top.buts.can -text "Cancel" -command prefscan -default normal
+    button $top.buts.can -text [mc "Cancel"] -command prefscan  
-default normal
      $top.buts.can configure -font $uifont
      grid $top.buts.ok $top.buts.can
      grid columnconfigure $top.buts 0 -weight 1 -uniform a
@@ -7072,7 +7072,7 @@ proc choosecolor {v vi w x cmd} {
      global $v

      set c [tk_chooseColor -initialcolor [lindex [set $v] $vi] \
-	       -title "Gitk: choose color for $x"]
+	       -title [mc "Gitk: choose color for %s" $x]]
      if {$c eq {}} return
      $w conf -background $c
      lset $v $vi $c
@@ -7569,7 +7569,7 @@ if {$cmdline_files ne {} || $revtreeargs ne {}} {
      set curview 1
      set selectedview 1
      set nextviewnum 2
-    set viewname(1) "Command line"
+    set viewname(1) [mc "Command line"]
      set viewfiles(1) $cmdline_files
      set viewargs(1) $revtreeargs
      set viewperm(1) 0
-- 
1.5.3.rc2.12.gbc280

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] gitk: Import msgcat for translation support
  2007-07-27 14:53 [PATCH 1/2] gitk: Import msgcat for translation support Christian Stimming
  2007-07-27 15:03 ` [PATCH 2/2] gitk: Markup many strings for translation Christian Stimming
@ 2007-07-27 23:53 ` Paul Mackerras
  1 sibling, 0 replies; 9+ messages in thread
From: Paul Mackerras @ 2007-07-27 23:53 UTC (permalink / raw)
  To: Christian Stimming; +Cc: git

Christian Stimming writes:

> Import tcl's msgcat package to have the [mc...] procedure for  
> translation available.

I would prefer

if {[catch {
    package require msgcat
    # rest of your new stuff
}]} {
    proc mc {str} {
	return $str
    }
}

so that everything still works if msgcat isn't available.  In other
words I don't want to introduce a possible regression by increasing
gitk's requirements.

Paul.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] gitk: Markup many strings for translation.
  2007-07-27 15:03 ` [PATCH 2/2] gitk: Markup many strings for translation Christian Stimming
@ 2007-07-28  2:39   ` Paul Mackerras
  2007-07-28  4:54     ` Junio C Hamano
  2007-10-21 12:54     ` gitk still interested in translations? Christian Stimming
  0 siblings, 2 replies; 9+ messages in thread
From: Paul Mackerras @ 2007-07-28  2:39 UTC (permalink / raw)
  To: Christian Stimming; +Cc: git

Christian Stimming writes:

> Similar to the discussion in git-gui, all user-visible strings are  
> passed through the [mc ...] procedure to have them translated by msgcat.
> 
> Signed-off-by: Christian Stimming <stimming@tuhh.de>
> ---
> @Paul: Are you interested in applying this? If yes, I'd happily  

Yes, it doesn't look too bad.  The patch seemed to be line-wrapped and
whitespace-damaged, though.

> provide the Makefile rules for string extraction and translation  
> catalog updates, but I'd like to hear a proposal or decision on where  
> to place them. Should the po files for translation go into the po/  
> subdirectory? And then a proposal/decision of where to install the  
> compiled .msg catalogs will be necessary.

Yes indeed.  Junio?

Is it possible to include the translations, or at least the more
common translations, in the Tcl code itself?  So far I have managed to
have gitk be self-contained, in that it doesn't need any external data
files, which simplifies installation and is a useful attribute in some
situations.

Also I would want to be sure that gitk wouldn't crash or fail to
function if it can't find its message catalogs.

Paul.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] gitk: Markup many strings for translation.
  2007-07-28  2:39   ` Paul Mackerras
@ 2007-07-28  4:54     ` Junio C Hamano
  2007-07-28  6:21       ` Paul Mackerras
  2007-10-21 12:54     ` gitk still interested in translations? Christian Stimming
  1 sibling, 1 reply; 9+ messages in thread
From: Junio C Hamano @ 2007-07-28  4:54 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: Christian Stimming, git

Paul Mackerras <paulus@samba.org> writes:

> Christian Stimming writes:
>
>> Similar to the discussion in git-gui, all user-visible strings are  
>> passed through the [mc ...] procedure to have them translated by msgcat.
>> 
>> Signed-off-by: Christian Stimming <stimming@tuhh.de>
>> ---
>> @Paul: Are you interested in applying this? If yes, I'd happily  
>
> Yes, it doesn't look too bad.  The patch seemed to be line-wrapped and
> whitespace-damaged, though.
>
>> provide the Makefile rules for string extraction and translation  
>> catalog updates, but I'd like to hear a proposal or decision on where  
>> to place them. Should the po files for translation go into the po/  
>> subdirectory? And then a proposal/decision of where to install the  
>> compiled .msg catalogs will be necessary.
>
> Yes indeed.  Junio?

Before talking about installation location, let me worry a bit
about integration.

This is a bit tricky because of the way gitk.git project was
absorbed in git.git repository.  Historically we have assumed
that gitk would always stay a single file project, but with
po/*.{po,msg} and gettext toolchain we would also need a
Makefile target or two for maintaining i18n infrastructure for
gitk.

I think we could do one of three things.

 1. In git.git, move the location gitk.git is absorbed one level
    down, to gitk/ subdirectory.  This can have two variants.

 1.a Your gitk.git repository could match this move; from being
     a single file project, it would become a single directory,
     gitk/, initially with a single file under it
     (i.e. gitk/gitk), and then i18n coordinator (Christian?)
     and i18n group would provide you with gitk/Makefile and
     gitk/po/*.po files.  I could just merge the result of such
     move without any trick if this happens;

 1.b Your gitk.git repository can stay in the current shape of
     having a single file gitk in it, with Makefile and po/*.po
     files supplied by the i18n group.  I would have to merge
     such a repository with subtree strategy just like I handle
     the absorption of git-gui.git project.

 2. Your gitk.git could stay without the actual i18n except the
    [mc ...] changes, and po/*.po and gettext toolchain calls
    can be directly be in git.git project.  In git.git, gitk
    would continue to be merged from you at the toplevel.

My preference is 1.b, as the longer term plan (when everybody
has git 1.5.2 or newer) is to eject git-gui.git project from
git.git proper, and use the subproject feature to have
git-gui.git in git.git; it would be good if gitk.git can be
handled the same way, and the layout 1.b would make it the
easiest, as it matches how we treat git-gui.git project now.

About the installation location, I would say we can mimick what
git-gui i18n team does and use $(sharedir)/gitk/lib/msgs to
install the message files.

> Is it possible to include the translations, or at least the more
> common translations, in the Tcl code itself?  So far I have managed to
> have gitk be self-contained, in that it doesn't need any external data
> files, which simplifies installation and is a useful attribute in some
> situations.

Anything is possible, but I think that is cumbersome to arrange
and probably wasteful at runtime.  You will end up carrying
lines of form:

	::msgcat::mcset xx "Origial" "Translation in language xx"

for all languages in the same gitk script.  Worse, these mcset
lines are not something translators directly work on; rather,
they are output of msgfmt program.

> Also I would want to be sure that gitk wouldn't crash or fail to
> function if it can't find its message catalogs.

You also expressed in a separate message about "catching package
require msgcat to avoid breakage".  I think msgcat package is
part of the standard Tcl distribution since 8.1; how old a
tcl/tk do you support?

In any case, I would very much appreciate if any of these will
*NOT* happen before 1.5.3.  git-gui 0.8.0 which is scheduled to
be in 1.5.3 will not have i18n.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] gitk: Markup many strings for translation.
  2007-07-28  4:54     ` Junio C Hamano
@ 2007-07-28  6:21       ` Paul Mackerras
  2007-07-28  7:01         ` Junio C Hamano
  0 siblings, 1 reply; 9+ messages in thread
From: Paul Mackerras @ 2007-07-28  6:21 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Christian Stimming, git

Junio C Hamano writes:

> My preference is 1.b, as the longer term plan (when everybody
> has git 1.5.2 or newer) is to eject git-gui.git project from
> git.git proper, and use the subproject feature to have
> git-gui.git in git.git; it would be good if gitk.git can be
> handled the same way, and the layout 1.b would make it the
> easiest, as it matches how we treat git-gui.git project now.

1.b sounds fine to me too.

> You also expressed in a separate message about "catching package
> require msgcat to avoid breakage".  I think msgcat package is
> part of the standard Tcl distribution since 8.1; how old a
> tcl/tk do you support?

Gitk requires 8.4, so that sounds OK then.  I didn't realize it had
been part of the standard distribution for so long.

> In any case, I would very much appreciate if any of these will
> *NOT* happen before 1.5.3.  git-gui 0.8.0 which is scheduled to
> be in 1.5.3 will not have i18n.

No problem. :)

By the way, could you do a pull from gitk.git?  There are some
bug-fixes plus the change to show the index and working directory as
separate fake commits, as requested by Linus.

Paul.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] gitk: Markup many strings for translation.
  2007-07-28  6:21       ` Paul Mackerras
@ 2007-07-28  7:01         ` Junio C Hamano
  0 siblings, 0 replies; 9+ messages in thread
From: Junio C Hamano @ 2007-07-28  7:01 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: Christian Stimming, git

Paul Mackerras <paulus@samba.org> writes:

> By the way, could you do a pull from gitk.git?  There are some
> bug-fixes plus the change to show the index and working directory as
> separate fake commits, as requested by Linus.

My pleasure.  I should have polled people earlier.
Thanks.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* gitk still interested in translations?
  2007-07-28  2:39   ` Paul Mackerras
  2007-07-28  4:54     ` Junio C Hamano
@ 2007-10-21 12:54     ` Christian Stimming
  2007-10-23 10:17       ` Paul Mackerras
  1 sibling, 1 reply; 9+ messages in thread
From: Christian Stimming @ 2007-10-21 12:54 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: git, Junio C Hamano

Hi Paul,

in July I submitted patches to add the necessary framework for UI 
translations/i18n to the gitk tool [1] [2], and I'd also volunteer to provide 
a full German translation. As you pointed out [3], this would require some 
decisions on integration and installation places, which according to Junios 
reply [4] didn't seem too difficult.

What is the progress on your i18n plans in gitk? None of the patches had been 
applied to gitk, have they? If you say you *are* interested, I'd be happy to 
provide an up-to-date patch against gitk.git @ kernel.org for #1 Makefile 
rules, #2 msgcat integration, and most importantly #3 message markup.

Christian

[1] http://marc.info/?l=git&m=118554802809395&w=2
[2] http://marc.info/?l=git&m=118554865029767&w=2
[3] http://marc.info/?l=git&m=118559040716553&w=2
[4] http://marc.info/?l=git&m=118559853016496&w=2

Am Samstag, 28. Juli 2007 04:39 schrieb Paul Mackerras:
> Christian Stimming writes:
> > Similar to the discussion in git-gui, all user-visible strings are
> > passed through the [mc ...] procedure to have them translated by msgcat.
> >
> > Signed-off-by: Christian Stimming <stimming@tuhh.de>
> > ---
> > @Paul: Are you interested in applying this? If yes, I'd happily
>
> Yes, it doesn't look too bad.  The patch seemed to be line-wrapped and
> whitespace-damaged, though.
>
> > provide the Makefile rules for string extraction and translation
> > catalog updates, but I'd like to hear a proposal or decision on where
> > to place them. Should the po files for translation go into the po/
> > subdirectory? And then a proposal/decision of where to install the
> > compiled .msg catalogs will be necessary.
>
> Yes indeed.  Junio?
>
> Is it possible to include the translations, or at least the more
> common translations, in the Tcl code itself?  So far I have managed to
> have gitk be self-contained, in that it doesn't need any external data
> files, which simplifies installation and is a useful attribute in some
> situations.
>
> Also I would want to be sure that gitk wouldn't crash or fail to
> function if it can't find its message catalogs.
>
> Paul.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: gitk still interested in translations?
  2007-10-21 12:54     ` gitk still interested in translations? Christian Stimming
@ 2007-10-23 10:17       ` Paul Mackerras
  0 siblings, 0 replies; 9+ messages in thread
From: Paul Mackerras @ 2007-10-23 10:17 UTC (permalink / raw)
  To: Christian Stimming; +Cc: git, Junio C Hamano

Christian Stimming writes:

> What is the progress on your i18n plans in gitk? None of the patches had been 
> applied to gitk, have they? If you say you *are* interested, I'd be happy to 
> provide an up-to-date patch against gitk.git @ kernel.org for #1 Makefile 
> rules, #2 msgcat integration, and most importantly #3 message markup.

No, I haven't put in any of the i18n stuff.  I would certainly be
interested in seeing the patches, and I will probably apply them.

What was the resolution about where to install the mesesage catalogs?

Regards,
Paul.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2007-10-23 10:28 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-27 14:53 [PATCH 1/2] gitk: Import msgcat for translation support Christian Stimming
2007-07-27 15:03 ` [PATCH 2/2] gitk: Markup many strings for translation Christian Stimming
2007-07-28  2:39   ` Paul Mackerras
2007-07-28  4:54     ` Junio C Hamano
2007-07-28  6:21       ` Paul Mackerras
2007-07-28  7:01         ` Junio C Hamano
2007-10-21 12:54     ` gitk still interested in translations? Christian Stimming
2007-10-23 10:17       ` Paul Mackerras
2007-07-27 23:53 ` [PATCH 1/2] gitk: Import msgcat for translation support Paul Mackerras

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).