{"thread":{"id":"9184","subject":"Re: [PATCH] Mark many more strings for i18n.","startedAt":"2007-07-23T21:10:46Z","lastAt":"2007-07-24T15:20:28Z","messageCount":5,"participants":["Brett Schwarz","Christian Stimming","Shawn O. Pearce"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"48358","messageId":"1282.25717.qm@web38901.mail.mud.yahoo.com","threadId":"9184","inReplyTo":null,"subject":"Re: [PATCH] Mark many more strings for i18n.","fromName":"Brett Schwarz","fromEmail":"brett_schwarz@yahoo.com","sentAt":"2007-07-23T21:10:46Z","receivedAt":"2007-07-23T21:10:46Z","isPatch":true,"sender":{"key":"brett_schwarz@yahoo.com","avatar":null},"body":"I not sure if it's worth changing, but you don't necessarily need those [append]'s in there. For example:\n\n    error_popup [append [mc \"Cannot parse Git version string:\"] \"\\n\\n$_git_version\"]\n\nis the same as:\n\n    error_popup \"[mc \"Cannot parse Git version string:\"]\\n\\n$_git_version\"\n\n\nAgain, not sure if it's worth changing the patch, but maybe for future reference.\n\n     --brett\n\n\n----- Original Message ----\nFrom: Christian Stimming <stimming@tuhh.de>\nTo: Brett Schwarz <brett_schwarz@yahoo.com>; git@vger.kernel.org; Paul Mackerras <paulus@samba.org>; Shawn O. Pearce <spearce@spearce.org>\nCc: Junio C Hamano <gitster@pobox.com>\nSent: Monday, July 23, 2007 12:37:47 PM\nSubject: [PATCH] Mark many more strings for i18n.\n\n\nSigned-off-by: Christian Stimming <stimming@tuhh.de>\n---\nHas already been applied to the \"mob\" branch of git-gui-i18n.git. Now we \nsurpass the 250 messages - the translation is actually getting interesting \nby now.\n\nNote that many strings with variables in them had to be rewritten because\nthe variable evaluation has to come after the passing through [mc], not before.\n\nAlso, the structure of most of the error message is \n\"Some verbose text: \\n\\n git's error message\" and the only i18n'able part of this is the \npart before the colon. In this patch I propose to translate the first part *including* \nthe colon. Alternatively, the structure could be changed into \n[append [mc \"Some verbose text.\"] \" \" [mc \"Git error message was:\"] \"\\n\\n$err\"]\nand only the very first part is changed but the rest is unchanged for all error messages.\n\n git-gui.sh                   |   28 +++++++++---------\n lib/blame.tcl                |   10 +++---\n lib/branch_checkout.tcl      |   14 ++++----\n lib/branch_create.tcl        |   36 ++++++++++++------------\n lib/branch_delete.tcl        |   20 ++++++-------\n lib/branch_rename.tcl        |   22 +++++++-------\n lib/browser.tcl              |   20 ++++++------\n lib/checkout_op.tcl          |   46 +++++++++++++++---------------\n lib/choose_rev.tcl           |   16 +++++-----\n lib/commit.tcl               |   52 +++++++++++++++++-----------------\n lib/console.tcl              |   14 ++++----\n lib/database.tcl             |   26 ++++++++--------\n lib/diff.tcl                 |   12 ++++----\n lib/error.tcl                |    8 ++--\n lib/index.tcl                |    8 ++--\n lib/merge.tcl                |   64 ++++++++++++++++++++++-------------------\n lib/option.tcl               |   46 +++++++++++++++---------------\n lib/remote.tcl               |    4 +-\n lib/remote_branch_delete.tcl |   42 +++++++++++++--------------\n lib/shortcut.tcl             |   12 ++++----\n lib/status_bar.tcl           |    2 +-\n lib/transport.tcl            |   30 ++++++++++----------\n 22 files changed, 266 insertions(+), 266 deletions(-)\n\ndiff --git a/git-gui.sh b/git-gui.sh\nindex 52170ee..fa510b9 100755\n--- a/git-gui.sh\n+++ b/git-gui.sh\n@@ -528,7 +528,7 @@ proc tk_optionMenu {w varName args} {\n set _git  [_which git]\n if {$_git eq {}} {\n     catch {wm withdraw .}\n-    error_popup \"Cannot find git in PATH.\"\n+    error_popup [mc \"Cannot find git in PATH.\"]\n     exit 1\n }\n \n@@ -547,7 +547,7 @@ $err\n }\n if {![regsub {^git version } $_git_version {} _git_version]} {\n     catch {wm withdraw .}\n-    error_popup \"Cannot parse Git version string:\\n\\n$_git_version\"\n+    error_popup [append [mc \"Cannot parse Git version string:\"] \"\\n\\n$_git_version\"]\n     exit 1\n }\n \n@@ -686,7 +686,7 @@ if {[catch {\n         set _prefix [git rev-parse --show-prefix]\n     } err]} {\n     catch {wm withdraw .}\n-    error_popup \"Cannot find the git directory:\\n\\n$err\"\n+    error_popup [append [mc \"Cannot find the git directory:\"] \"\\n\\n$err\"]\n     exit 1\n }\n if {![file isdirectory $_gitdir] && [is_Cygwin]} {\n@@ -694,18 +694,18 @@ if {![file isdirectory $_gitdir] && [is_Cygwin]} {\n }\n if {![file isdirectory $_gitdir]} {\n     catch {wm withdraw .}\n-    error_popup \"Git directory not found:\\n\\n$_gitdir\"\n+    error_popup [append [mc \"Git directory not found:\"] \"\\n\\n$_gitdir\"]\n     exit 1\n }\n if {![is_enabled bare]} {\n     if {[lindex [file split $_gitdir] end] ne {.git}} {\n         catch {wm withdraw .}\n-        error_popup \"Cannot use funny .git directory:\\n\\n$_gitdir\"\n+        error_popup [append [mc \"Cannot use funny .git directory:\"] \"\\n\\n$_gitdir\"]\n         exit 1\n     }\n     if {[catch {cd [file dirname $_gitdir]} err]} {\n         catch {wm withdraw .}\n-        error_popup \"No working directory [file dirname $_gitdir]:\\n\\n$err\"\n+        error_popup [append [mc \"No working directory\"] \" [file dirname $_gitdir]:\\n\\n$err\"]\n         exit 1\n     }\n }\n@@ -850,7 +850,7 @@ proc rescan {after {honor_trustmtime 1}} {\n         rescan_stage2 {} $after\n     } else {\n         set rescan_active 1\n-        ui_status {Refreshing file status...}\n+        ui_status [mc \"Refreshing file status...\"]\n         set fd_rf [git_read update-index \\\n             -q \\\n             --unmerged \\\n@@ -883,7 +883,7 @@ proc rescan_stage2 {fd after} {\n     set buf_rlo {}\n \n     set rescan_active 3\n-    ui_status {Scanning for modified files ...}\n+    ui_status [mc \"Scanning for modified files ...\"]\n     set fd_di [git_read diff-index --cached -z [PARENT]]\n     set fd_df [git_read diff-files -z]\n     set fd_lo [eval git_read ls-files --others -z $ls_others]\n@@ -1049,7 +1049,7 @@ proc ui_status {msg} {\n }\n \n proc ui_ready {{test {}}} {\n-    $::main_status show {Ready.} $test\n+    $::main_status show [mc \"Ready.\"] $test\n }\n \n proc escape_path {path} {\n@@ -1400,7 +1400,7 @@ proc incr_font_size {font {amt 1}} {\n ##\n ## ui commands\n \n-set starting_gitk_msg {Starting gitk... please wait...}\n+set starting_gitk_msg [mc \"Starting gitk... please wait...\"]\n \n proc do_gitk {revs} {\n     # -- Always start gitk through whatever we were loaded with.  This\n@@ -1409,7 +1409,7 @@ proc do_gitk {revs} {\n     set exe [file join [file dirname $::_git] gitk]\n     set cmd [list [info nameofexecutable] $exe]\n     if {! [file exists $exe]} {\n-        error_popup \"Unable to start gitk:\\n\\n$exe does not exist\"\n+        error_popup [mc \"Unable to start gitk:\\n\\n%s does not exist\" $exe]\n     } else {\n         eval exec $cmd $revs &\n         ui_status $::starting_gitk_msg\n@@ -1626,7 +1626,7 @@ proc apply_config {} {\n                 font configure $font $cn $cv\n             }\n             } err]} {\n-            error_popup \"Invalid font specified in gui.$name:\\n\\n$err\"\n+            error_popup [mc \"Invalid font specified in gui.%s:\\n\\n%s\" $name $err]\n         }\n         foreach {cn cv} [font configure $font] {\n             font configure ${font}bold $cn $cv\n@@ -1913,7 +1913,7 @@ if {[is_MacOSX]} {\n         set miga_fd [open \"|$cmd\" r]\n         fconfigure $miga_fd -blocking 0\n         fileevent $miga_fd readable [list miga_done $miga_fd]\n-        ui_status {Running miga...}\n+        ui_status [mc \"Running miga...\"]\n     }\n     proc miga_done {fd} {\n         read $fd 512\n@@ -2469,7 +2469,7 @@ unset ui_diff_applyhunk\n #\n set main_status [::status_bar::new .status]\n pack .status -anchor w -side bottom -fill x\n-$main_status show {Initializing...}\n+$main_status show [mc \"Initializing...\"]\n \n # -- Load geometry\n #\ndiff --git a/lib/blame.tcl b/lib/blame.tcl\nindex 9607284..b5fdad5 100644\n--- a/lib/blame.tcl\n+++ b/lib/blame.tcl\n@@ -74,11 +74,11 @@ constructor new {i_commit i_path} {\n     set path   $i_path\n \n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): File Viewer\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"File Viewer\"]]\n \n     frame $w.header -background gold\n     label $w.header.commit_l \\\n-        -text {Commit:} \\\n+        -text [mc \"Commit:\"] \\\n         -background gold \\\n         -anchor w \\\n         -justify left\n@@ -101,7 +101,7 @@ constructor new {i_commit i_path} {\n         -anchor w \\\n         -justify left\n     label $w.header.path_l \\\n-        -text {File:} \\\n+        -text [mc \"File:\"] \\\n         -background gold \\\n         -anchor w \\\n         -justify left\n@@ -246,7 +246,7 @@ constructor new {i_commit i_path} {\n \n     menu $w.ctxm -tearoff 0\n     $w.ctxm add command \\\n-        -label \"Copy Commit\" \\\n+        -label [mc \"Copy Commit\"] \\\n         -command [cb _copycommit]\n \n     foreach i $w_columns {\n@@ -366,7 +366,7 @@ method _load {jump} {\n     set amov_data [list [list]]\n     set asim_data [list [list]]\n \n-    $status show \"Reading $commit:[escape_path $path]...\"\n+    $status show [mc \"Reading %s...\" \"$commit:[escape_path $path]\"]\n     $w_path conf -text [escape_path $path]\n     if {$commit eq {}} {\n         set fd [open $path r]\ndiff --git a/lib/branch_checkout.tcl b/lib/branch_checkout.tcl\nindex 72c45b4..c727437 100644\n--- a/lib/branch_checkout.tcl\n+++ b/lib/branch_checkout.tcl\n@@ -11,20 +11,20 @@ field opt_detach    0; # force a detached head case?\n \n constructor dialog {} {\n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): Checkout Branch\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"Checkout Branch\"]]\n     if {$top ne {.}} {\n         wm geometry $top \"+[winfo rootx .]+[winfo rooty .]\"\n     }\n \n-    label $w.header -text {Checkout Branch} -font font_uibold\n+    label $w.header -text [mc \"Checkout Branch\"] -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n-    button $w.buttons.create -text Checkout \\\n+    button $w.buttons.create -text [mc Checkout] \\\n         -default active \\\n         -command [cb _checkout]\n     pack $w.buttons.create -side right\n-    button $w.buttons.cancel -text {Cancel} \\\n+    button $w.buttons.cancel -text [mc Cancel] \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n@@ -33,15 +33,15 @@ constructor dialog {} {\n     $w_rev bind_listbox <Double-Button-1> [cb _checkout]\n     pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5\n \n-    labelframe $w.options -text {Options}\n+    labelframe $w.options -text [mc Options]\n \n     checkbutton $w.options.fetch \\\n-        -text {Fetch Tracking Branch} \\\n+        -text [mc \"Fetch Tracking Branch\"] \\\n         -variable @opt_fetch\n     pack $w.options.fetch -anchor nw\n \n     checkbutton $w.options.detach \\\n-        -text {Detach From Local Branch} \\\n+        -text [mc \"Detach From Local Branch\"] \\\n         -variable @opt_detach\n     pack $w.options.detach -anchor nw\n \ndiff --git a/lib/branch_create.tcl b/lib/branch_create.tcl\nindex def615d..acfe411 100644\n--- a/lib/branch_create.tcl\n+++ b/lib/branch_create.tcl\n@@ -19,28 +19,28 @@ constructor dialog {} {\n     global repo_config\n \n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): Create Branch\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"Create Branch\"]]\n     if {$top ne {.}} {\n         wm geometry $top \"+[winfo rootx .]+[winfo rooty .]\"\n     }\n \n-    label $w.header -text {Create New Branch} -font font_uibold\n+    label $w.header -text [mc \"Create New Branch\"] -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n-    button $w.buttons.create -text Create \\\n+    button $w.buttons.create -text [mc Create] \\\n         -default active \\\n         -command [cb _create]\n     pack $w.buttons.create -side right\n-    button $w.buttons.cancel -text {Cancel} \\\n+    button $w.buttons.cancel -text [mc Cancel] \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n \n-    labelframe $w.desc -text {Branch Name}\n+    labelframe $w.desc -text [mc \"Branch Name\"]\n     radiobutton $w.desc.name_r \\\n         -anchor w \\\n-        -text {Name:} \\\n+        -text [mc \"Name:\"] \\\n         -value user \\\n         -variable @name_type\n     set w_name $w.desc.name_t\n@@ -55,7 +55,7 @@ constructor dialog {} {\n \n     radiobutton $w.desc.match_r \\\n         -anchor w \\\n-        -text {Match Tracking Branch Name} \\\n+        -text [mc \"Match Tracking Branch Name\"] \\\n         -value match \\\n         -variable @name_type\n     grid $w.desc.match_r -sticky we -padx {0 5} -columnspan 2\n@@ -66,35 +66,35 @@ constructor dialog {} {\n     set w_rev [::choose_rev::new $w.rev {Starting Revision}]\n     pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5\n \n-    labelframe $w.options -text {Options}\n+    labelframe $w.options -text [mc Options]\n \n     frame $w.options.merge\n-    label $w.options.merge.l -text {Update Existing Branch:}\n+    label $w.options.merge.l -text [mc \"Update Existing Branch:\"]\n     pack $w.options.merge.l -side left\n     radiobutton $w.options.merge.no \\\n-        -text No \\\n+        -text [mc No] \\\n         -value none \\\n         -variable @opt_merge\n     pack $w.options.merge.no -side left\n     radiobutton $w.options.merge.ff \\\n-        -text {Fast Forward Only} \\\n+        -text [mc \"Fast Forward Only\"] \\\n         -value ff \\\n         -variable @opt_merge\n     pack $w.options.merge.ff -side left\n     radiobutton $w.options.merge.reset \\\n-        -text {Reset} \\\n+        -text [mc Reset] \\\n         -value reset \\\n         -variable @opt_merge\n     pack $w.options.merge.reset -side left\n     pack $w.options.merge -anchor nw\n \n     checkbutton $w.options.fetch \\\n-        -text {Fetch Tracking Branch} \\\n+        -text [mc \"Fetch Tracking Branch\"] \\\n         -variable @opt_fetch\n     pack $w.options.fetch -anchor nw\n \n     checkbutton $w.options.checkout \\\n-        -text {Checkout After Creation} \\\n+        -text [mc \"Checkout After Creation\"] \\\n         -variable @opt_checkout\n     pack $w.options.checkout -anchor nw\n     pack $w.options -anchor nw -fill x -pady 5 -padx 5\n@@ -128,7 +128,7 @@ method _create {} {\n                 -type ok \\\n                 -title [wm title $w] \\\n                 -parent $w \\\n-                -message \"Please select a tracking branch.\"\n+                -message [mc \"Please select a tracking branch.\"]\n             return\n         }\n         if {![regsub ^refs/heads/ [lindex $spec 2] {} newbranch]} {\n@@ -137,7 +137,7 @@ method _create {} {\n                 -type ok \\\n                 -title [wm title $w] \\\n                 -parent $w \\\n-                -message \"Tracking branch [$w get] is not a branch in the remote repository.\"\n+                -message [mc \"Tracking branch %s is not a branch in the remote repository.\" [$w get]]\n             return\n         }\n     }\n@@ -150,7 +150,7 @@ method _create {} {\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"Please supply a branch name.\"\n+            -message [mc \"Please supply a branch name.\"]\n         focus $w_name\n         return\n     }\n@@ -161,7 +161,7 @@ method _create {} {\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"'$newbranch' is not an acceptable branch name.\"\n+            -message [mc \"'%s' is not an acceptable branch name.\" $newbranch]\n         focus $w_name\n         return\n     }\ndiff --git a/lib/branch_delete.tcl b/lib/branch_delete.tcl\nindex c7573c6..7ac5f8a 100644\n--- a/lib/branch_delete.tcl\n+++ b/lib/branch_delete.tcl\n@@ -12,29 +12,29 @@ constructor dialog {} {\n     global current_branch\n \n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): Delete Branch\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"Delete Branch\"]]\n     if {$top ne {.}} {\n         wm geometry $top \"+[winfo rootx .]+[winfo rooty .]\"\n     }\n \n-    label $w.header -text {Delete Local Branch} -font font_uibold\n+    label $w.header -text [mc \"Delete Local Branch\"] -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n     set w_delete $w.buttons.delete\n     button $w_delete \\\n-        -text Delete \\\n+        -text [mc Delete] \\\n         -default active \\\n         -state disabled \\\n         -command [cb _delete]\n     pack $w_delete -side right\n     button $w.buttons.cancel \\\n-        -text {Cancel} \\\n+        -text [mc Cancel] \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n \n-    labelframe $w.list -text {Local Branches}\n+    labelframe $w.list -text [mc \"Local Branches\"]\n     set w_heads $w.list.l\n     listbox $w_heads \\\n         -height 10 \\\n@@ -49,9 +49,9 @@ constructor dialog {} {\n \n     set w_check [choose_rev::new \\\n         $w.check \\\n-        {Delete Only If Merged Into} \\\n+        [mc \"Delete Only If Merged Into\"] \\\n         ]\n-    $w_check none {Always (Do not perform merge test.)}\n+    $w_check none [mc \"Always (Do not perform merge test.)\"]\n     pack $w.check -anchor nw -fill x -pady 5 -padx 5\n \n     foreach h [load_all_heads] {\n@@ -112,9 +112,7 @@ method _delete {} {\n     }\n     if {$to_delete eq {}} return\n     if {$check_cmt eq {}} {\n-        set msg {Recovering deleted branches is difficult.\n-\n-Delete the selected branches?}\n+        set msg [mc \"Recovering deleted branches is difficult. \\n\\n Delete the selected branches?\"]\n         if {[tk_messageBox \\\n             -icon warning \\\n             -type yesno \\\n@@ -140,7 +138,7 @@ Delete the selected branches?}\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"Failed to delete branches:\\n$failed\"\n+            -message [mc \"Failed to delete branches:\\n%s\" $failed]\n     }\n \n     destroy $w\ndiff --git a/lib/branch_rename.tcl b/lib/branch_rename.tcl\nindex 1cadc31..e8592af 100644\n--- a/lib/branch_rename.tcl\n+++ b/lib/branch_rename.tcl\n@@ -11,7 +11,7 @@ constructor dialog {} {\n     global current_branch\n \n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): Rename Branch\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"Rename Branch\"]]\n     if {$top ne {.}} {\n         wm geometry $top \"+[winfo rootx .]+[winfo rooty .]\"\n     }\n@@ -19,24 +19,24 @@ constructor dialog {} {\n     set oldname $current_branch\n     set newname [get_config gui.newbranchtemplate]\n \n-    label $w.header -text {Rename Branch} -font font_uibold\n+    label $w.header -text [mc \"Rename Branch\"] -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n-    button $w.buttons.rename -text Rename \\\n+    button $w.buttons.rename -text [mc Rename] \\\n         -default active \\\n         -command [cb _rename]\n     pack $w.buttons.rename -side right\n-    button $w.buttons.cancel -text {Cancel} \\\n+    button $w.buttons.cancel -text [mc Cancel] \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n \n     frame $w.rename\n-    label $w.rename.oldname_l -text {Branch:}\n+    label $w.rename.oldname_l -text [mc \"Branch:\"]\n     eval tk_optionMenu $w.rename.oldname_m @oldname [load_all_heads]\n \n-    label $w.rename.newname_l -text {New Name:}\n+    label $w.rename.newname_l -text [mc \"New Name:\"]\n     entry $w.rename.newname_t \\\n         -borderwidth 1 \\\n         -relief sunken \\\n@@ -72,7 +72,7 @@ method _rename {} {\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"Please select a branch to rename.\"\n+            -message [mc \"Please select a branch to rename.\"]\n         focus $w.rename.oldname_m\n         return\n     }\n@@ -83,7 +83,7 @@ method _rename {} {\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"Please supply a branch name.\"\n+            -message [mc \"Please supply a branch name.\"]\n         focus $w.rename.newname_t\n         return\n     }\n@@ -93,7 +93,7 @@ method _rename {} {\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"Branch '$newname' already exists.\"\n+            -message [mc \"Branch '%s' already exists.\" $newname]\n         focus $w.rename.newname_t\n         return\n     }\n@@ -103,7 +103,7 @@ method _rename {} {\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"We do not like '$newname' as a branch name.\"\n+            -message [mc \"We do not like '%s' as a branch name.\" $newname]\n         focus $w.rename.newname_t\n         return\n     }\n@@ -114,7 +114,7 @@ method _rename {} {\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"Failed to rename '$oldname'.\\n\\n$err\"\n+            -message [mc \"Failed to rename '%s'.\\n\\n%s\" $oldname $err]\n         return\n     }\n \ndiff --git a/lib/browser.tcl b/lib/browser.tcl\nindex b684c67..9435e67 100644\n--- a/lib/browser.tcl\n+++ b/lib/browser.tcl\n@@ -7,7 +7,7 @@ field w\n field browser_commit\n field browser_path\n field browser_files  {}\n-field browser_status {Starting...}\n+field browser_status [mc \"Starting...\"]\n field browser_stack  {}\n field browser_busy   1\n \n@@ -16,7 +16,7 @@ field ls_buf     {}; # Buffered record output from ls-tree\n constructor new {commit {path {}}} {\n     global cursor_ptr M1B\n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): File Browser\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"File Browser\"]]\n \n     set browser_commit $commit\n     set browser_path $browser_commit:$path\n@@ -117,7 +117,7 @@ method _parent {} {\n         } else {\n             regsub {/[^/]+$} $browser_path {} browser_path\n         }\n-        set browser_status \"Loading $browser_path...\"\n+        set browser_status [mc \"Loading %s...\" $browser_path]\n         _ls $this [lindex $parent 0] [lindex $parent 1]\n     }\n }\n@@ -134,7 +134,7 @@ method _enter {} {\n         tree {\n             set name [lindex $info 2]\n             set escn [escape_path $name]\n-            set browser_status \"Loading $escn...\"\n+            set browser_status [mc \"Loading %s...\" $escn]\n             append browser_path $escn\n             _ls $this [lindex $info 1] $name\n         }\n@@ -178,7 +178,7 @@ method _ls {tree_id {name {}}} {\n             -align center -padx 5 -pady 1 \\\n             -name icon0 \\\n             -image file_uplevel\n-        $w insert end {[Up To Parent]}\n+        $w insert end [mc \"[Up To Parent]\"]\n         lappend browser_files parent\n     }\n     lappend browser_stack [list $tree_id $name]\n@@ -230,7 +230,7 @@ method _read {fd} {\n \n     if {[eof $fd]} {\n         close $fd\n-        set browser_status Ready.\n+        set browser_status [mc \"Ready.\"]\n         set browser_busy 0\n         set ls_buf {}\n         if {$n > 0} {\n@@ -251,22 +251,22 @@ field w_rev          ; # mega-widget to pick the initial revision\n \n constructor dialog {} {\n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): Browse Branch Files\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"Browse Branch Files\"]]\n     if {$top ne {.}} {\n         wm geometry $top \"+[winfo rootx .]+[winfo rooty .]\"\n     }\n \n     label $w.header \\\n-        -text {Browse Branch Files} \\\n+        -text [mc \"Browse Branch Files\"] \\\n         -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n-    button $w.buttons.browse -text Browse \\\n+    button $w.buttons.browse -text [mc Browse] \\\n         -default active \\\n         -command [cb _open]\n     pack $w.buttons.browse -side right\n-    button $w.buttons.cancel -text {Cancel} \\\n+    button $w.buttons.cancel -text [mc Cancel] \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\ndiff --git a/lib/checkout_op.tcl b/lib/checkout_op.tcl\nindex 0571115..4b29634 100644\n--- a/lib/checkout_op.tcl\n+++ b/lib/checkout_op.tcl\n@@ -137,7 +137,7 @@ method _finish_fetch {ok} {\n         destroy $w\n         set w {}\n     } else {\n-        button $w.close -text Close -command [list destroy $w]\n+        button $w.close -text [mc Close] -command [list destroy $w]\n         pack $w.close -side bottom -anchor e -padx 10 -pady 10\n     }\n \n@@ -166,7 +166,7 @@ method _update_ref {} {\n         # Assume it does not exist, and that is what the error was.\n         #\n         if {!$create} {\n-            _error $this \"Branch '$newbranch' does not exist.\"\n+            _error $this [mc \"Branch '%s' does not exist.\" $newbranch]\n             return 0\n         }\n \n@@ -176,7 +176,7 @@ method _update_ref {} {\n         # We were told to create it, but not do a merge.\n         # Bad.  Name shouldn't have existed.\n         #\n-        _error $this \"Branch '$newbranch' already exists.\"\n+        _error $this [mc \"Branch '%s' already exists.\" $newbranch]\n         return 0\n     } elseif {!$create && $merge_type eq {none}} {\n         # We aren't creating, it exists and we don't merge.\n@@ -202,7 +202,7 @@ method _update_ref {} {\n                     #\n                     set new $cur\n                 } else {\n-                    _error $this \"Branch '$newbranch' already exists.\\n\\nIt cannot fast-forward to $new_expr.\\nA merge is required.\"\n+                    _error $this [mc \"Branch '%s' already exists.\\n\\nIt cannot fast-forward to %s.\\nA merge is required.\" $newbranch $new_expr]\n                     return 0\n                 }\n             }\n@@ -216,7 +216,7 @@ method _update_ref {} {\n                 }\n             }\n             default {\n-                _error $this \"Merge strategy '$merge_type' not supported.\"\n+                _error $this [mc \"Merge strategy '%s' not supported.\" $merge_type]\n                 return 0\n             }\n             }\n@@ -235,7 +235,7 @@ method _update_ref {} {\n         if {[catch {\n                 git update-ref -m $reflog_msg $ref $new $cur\n             } err]} {\n-            _error $this \"Failed to update '$newbranch'.\\n\\n$err\"\n+            _error $this [mc \"Failed to update '%s'.\\n\\n%s\" $newbranch $err]\n             return 0\n         }\n     }\n@@ -247,7 +247,7 @@ method _checkout {} {\n     if {[lock_index checkout_op]} {\n         after idle [cb _start_checkout]\n     } else {\n-        _error $this \"Index is already locked.\"\n+        _error $this [mc \"Index is already locked.\"]\n         delete_this\n     }\n }\n@@ -262,12 +262,12 @@ method _start_checkout {} {\n         && $curType eq {normal}\n         && $curHEAD eq $HEAD} {\n     } elseif {$commit_type ne $curType || $HEAD ne $curHEAD} {\n-        info_popup {Last scanned state does not match repository state.\n+        info_popup [mc \"Last scanned state does not match repository state.\n \n Another Git program has modified this repository since the last scan.  A rescan must be performed before the current branch can be changed.\n \n The rescan will be automatically started now.\n-}\n+\"]\n         unlock_index\n         rescan ui_ready\n         delete_this\n@@ -349,12 +349,12 @@ method _readtree_wait {fd} {\n     if {[catch {close $fd}]} {\n         set err $readtree_d\n         regsub {^fatal: } $err {} err\n-        $::main_status stop \"Aborted checkout of '[_name $this]' (file level merging is required).\"\n-        warn_popup \"File level merge required.\n+        $::main_status stop [mc \"Aborted checkout of '%s' (file level merging is required).\" [_name $this]]\n+        warn_popup [append [mc \"File level merge required.\"] \"\n \n $err\n \n-Staying on branch '$current_branch'.\"\n+\" [mc \"Staying on branch '%s'.\" $current_branch]]\n         unlock_index\n         delete_this\n         return\n@@ -423,9 +423,9 @@ method _after_readtree {} {\n     }\n \n     if {$is_detached} {\n-        info_popup \"You are no longer on a local branch.\n+        info_popup [mc \"You are no longer on a local branch.\n \n-If you wanted to be on a branch, create one now starting from 'This Detached Checkout'.\"\n+If you wanted to be on a branch, create one now starting from 'This Detached Checkout'.\"]\n     }\n \n     # -- Update our repository state.  If we were previously in\n@@ -472,7 +472,7 @@ method _confirm_reset {cur} {\n     pack [label $w.msg1 \\\n         -anchor w \\\n         -justify left \\\n-        -text \"Resetting '$name' to $new_expr will lose the following commits:\" \\\n+        -text [mc \"Resetting '%s' to '%s' will lose the following commits:\" $name $new_expr]\\\n         ] -anchor w\n \n     set list $w.list.l\n@@ -494,21 +494,21 @@ method _confirm_reset {cur} {\n     pack [label $w.msg2 \\\n         -anchor w \\\n         -justify left \\\n-        -text {Recovering lost commits may not be easy.} \\\n+        -text [mc \"Recovering lost commits may not be easy.\"] \\\n         ]\n     pack [label $w.msg3 \\\n         -anchor w \\\n         -justify left \\\n-        -text \"Reset '$name'?\" \\\n+        -text [mc \"Reset '%s'?\" $name] \\\n         ]\n \n     frame $w.buttons\n     button $w.buttons.visualize \\\n-        -text Visualize \\\n+        -text [mc Visualize] \\\n         -command $gitk\n     pack $w.buttons.visualize -side left\n     button $w.buttons.reset \\\n-        -text Reset \\\n+        -text [mc Reset] \\\n         -command \"\n             set @reset_ok 1\n             destroy $w\n@@ -516,7 +516,7 @@ method _confirm_reset {cur} {\n     pack $w.buttons.reset -side right\n     button $w.buttons.cancel \\\n         -default active \\\n-        -text Cancel \\\n+        -text [mc Cancel] \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n@@ -572,13 +572,13 @@ method _toplevel {title} {\n }\n \n method _fatal {err} {\n-    error_popup \"Failed to set current branch.\n+    error_popup [append [mc \"Failed to set current branch.\n \n This working directory is only partially switched.  We successfully updated your files, but failed to update an internal Git file.\n \n-This should not have occurred.  [appname] will now close and give up.\n+This should not have occurred.  %s will now close and give up.\" [appname]] \"\n \n-$err\"\n+$err\"]\n     exit 1\n }\n \ndiff --git a/lib/choose_rev.tcl b/lib/choose_rev.tcl\nindex 6c4c318..1e82990 100644\n--- a/lib/choose_rev.tcl\n+++ b/lib/choose_rev.tcl\n@@ -32,14 +32,14 @@ constructor new {path {title {}}} {\n     if {$is_detached} {\n         radiobutton $w.detachedhead_r \\\n             -anchor w \\\n-            -text {This Detached Checkout} \\\n+            -text [mc \"This Detached Checkout\"] \\\n             -value HEAD \\\n             -variable @revtype\n         grid $w.detachedhead_r -sticky we -padx {0 5} -columnspan 2\n     }\n \n     radiobutton $w.expr_r \\\n-        -text {Revision Expression:} \\\n+        -text [mc \"Revision Expression:\"] \\\n         -value expr \\\n         -variable @revtype\n     entry $w.expr_t \\\n@@ -53,17 +53,17 @@ constructor new {path {title {}}} {\n \n     frame $w.types\n     radiobutton $w.types.head_r \\\n-        -text {Local Branch} \\\n+        -text [mc \"Local Branch\"] \\\n         -value head \\\n         -variable @revtype\n     pack $w.types.head_r -side left\n     radiobutton $w.types.trck_r \\\n-        -text {Tracking Branch} \\\n+        -text [mc \"Tracking Branch\"] \\\n         -value trck \\\n         -variable @revtype\n     pack $w.types.trck_r -side left\n     radiobutton $w.types.tag_r \\\n-        -text {Tag} \\\n+        -text [mc \"Tag\"] \\\n         -value tag \\\n         -variable @revtype\n     pack $w.types.tag_r -side left\n@@ -224,7 +224,7 @@ method commit_or_die {} {\n         }\n \n         set top [winfo toplevel $w]\n-        set msg \"Invalid revision: [get $this]\\n\\n$err\"\n+        set msg [mc \"Invalid revision: %s\\n\\n%s\" [get $this] $err]\n         tk_messageBox \\\n             -icon error \\\n             -type ok \\\n@@ -245,7 +245,7 @@ method _expr {} {\n         if {$i ne {}} {\n             return [lindex $cur_specs $i 1]\n         } else {\n-            error \"No revision selected.\"\n+            error [mc \"No revision selected.\"]\n         }\n     }\n \n@@ -253,7 +253,7 @@ method _expr {} {\n         if {$c_expr ne {}} {\n             return $c_expr\n         } else {\n-            error \"Revision expression is empty.\"\n+            error [mc \"Revision expression is empty.\"]\n         }\n     }\n     HEAD { return HEAD                     }\ndiff --git a/lib/commit.tcl b/lib/commit.tcl\nindex 6b86f98..f60b11e 100644\n--- a/lib/commit.tcl\n+++ b/lib/commit.tcl\n@@ -6,19 +6,19 @@ proc load_last_commit {} {\n     global repo_config\n \n     if {[llength $PARENT] == 0} {\n-        error_popup {There is nothing to amend.\n+        error_popup [mc \"There is nothing to amend.\n \n You are about to create the initial commit.  There is no commit before this to amend.\n-}\n+\"]\n         return\n     }\n \n     repository_state curType curHEAD curMERGE_HEAD\n     if {$curType eq {merge}} {\n-        error_popup {Cannot amend while merging.\n+        error_popup [mc \"Cannot amend while merging.\n \n You are currently in the middle of a merge that has not been fully completed.  You cannot amend the prior commit unless you first abort the current merge activity.\n-}\n+\"]\n         return\n     }\n \n@@ -46,7 +46,7 @@ You are currently in the middle of a merge that has not been fully completed.  Y\n             }\n             set msg [string trim $msg]\n         } err]} {\n-        error_popup \"Error loading commit data for amend:\\n\\n$err\"\n+         error_popup [append [mc \"Error loading commit data for amend:\"] \"\\n\\n$err\"]\n         return\n     }\n \n@@ -73,12 +73,12 @@ proc committer_ident {} {\n \n     if {$GIT_COMMITTER_IDENT eq {}} {\n         if {[catch {set me [git var GIT_COMMITTER_IDENT]} err]} {\n-            error_popup \"Unable to obtain your identity:\\n\\n$err\"\n+            error_popup [append [mc \"Unable to obtain your identity:\"] \"\\n\\n$err\"]\n             return {}\n         }\n         if {![regexp {^(.*) [0-9]+ [-+0-9]+$} \\\n             $me me GIT_COMMITTER_IDENT]} {\n-            error_popup \"Invalid GIT_COMMITTER_IDENT:\\n\\n$me\"\n+            error_popup [append [mc \"Invalid GIT_COMMITTER_IDENT:\"] \"\\n\\n$me\"]\n             return {}\n         }\n     }\n@@ -130,12 +130,12 @@ proc commit_tree {} {\n         && $curType eq {normal}\n         && $curHEAD eq $HEAD} {\n     } elseif {$commit_type ne $curType || $HEAD ne $curHEAD} {\n-        info_popup {Last scanned state does not match repository state.\n+        info_popup [mc \"Last scanned state does not match repository state.\n \n Another Git program has modified this repository since the last scan.  A rescan must be performed before another commit can be created.\n \n The rescan will be automatically started now.\n-}\n+\"]\n         unlock_index\n         rescan ui_ready\n         return\n@@ -151,26 +151,26 @@ The rescan will be automatically started now.\n         D? -\n         M? {set files_ready 1}\n         U? {\n-            error_popup \"Unmerged files cannot be committed.\n+            error_popup [mc \"Unmerged files cannot be committed.\n \n-File [short_path $path] has merge conflicts.  You must resolve them and add the file before committing.\n-\"\n+File %s has merge conflicts.  You must resolve them and add the file before committing.\n+\" [short_path $path]]\n             unlock_index\n             return\n         }\n         default {\n-            error_popup \"Unknown file state [lindex $s 0] detected.\n+            error_popup [mc \"Unknown file state %s detected.\n \n-File [short_path $path] cannot be committed by this program.\n-\"\n+File %s cannot be committed by this program.\n+\" [lindex $s 0] [short_path $path]]\n         }\n         }\n     }\n     if {!$files_ready && ![string match *merge $curType]} {\n-        info_popup {No changes to commit.\n+        info_popup [mc \"No changes to commit.\n \n You must add at least 1 file before you can commit.\n-}\n+\"]\n         unlock_index\n         return\n     }\n@@ -180,14 +180,14 @@ You must add at least 1 file before you can commit.\n     set msg [string trim [$ui_comm get 1.0 end]]\n     regsub -all -line {[ \\t\\r]+$} $msg {} msg\n     if {$msg eq {}} {\n-        error_popup {Please supply a commit message.\n+        error_popup [mc \"Please supply a commit message.\n \n A good commit message has the following format:\n \n - First line: Describe in one sentance what you did.\n - Second line: Blank\n - Remaining lines: Describe why this change is good.\n-}\n+\"]\n         unlock_index\n         return\n     }\n@@ -254,7 +254,7 @@ proc commit_committree {fd_wt curHEAD msg} {\n \n     gets $fd_wt tree_id\n     if {$tree_id eq {} || [catch {close $fd_wt} err]} {\n-        error_popup \"write-tree failed:\\n\\n$err\"\n+        error_popup [append [mc \"write-tree failed:\"] \"\\n\\n$err\"]\n         ui_status {Commit failed.}\n         unlock_index\n         return\n@@ -276,14 +276,14 @@ proc commit_committree {fd_wt curHEAD msg} {\n         }\n \n         if {$tree_id eq $old_tree} {\n-            info_popup {No changes to commit.\n+            info_popup [mc \"No changes to commit.\n \n No files were modified by this commit and it was not a merge commit.\n \n A rescan will be automatically started now.\n-}\n+\"]\n             unlock_index\n-            rescan {ui_status {No changes to commit.}}\n+            rescan {ui_status [mc \"No changes to commit.\"]}\n             return\n         }\n     }\n@@ -314,7 +314,7 @@ A rescan will be automatically started now.\n     }\n     lappend cmd <$msg_p\n     if {[catch {set cmt_id [eval git $cmd]} err]} {\n-        error_popup \"commit-tree failed:\\n\\n$err\"\n+        error_popup [append [mc \"commit-tree failed:\"] \"\\n\\n$err\"]\n         ui_status {Commit failed.}\n         unlock_index\n         return\n@@ -336,7 +336,7 @@ A rescan will be automatically started now.\n     if {[catch {\n             git update-ref -m $reflogm HEAD $cmt_id $curHEAD\n         } err]} {\n-        error_popup \"update-ref failed:\\n\\n$err\"\n+        error_popup [append [mc \"update-ref failed:\"] \"\\n\\n$err\"]\n         ui_status {Commit failed.}\n         unlock_index\n         return\n@@ -427,5 +427,5 @@ A rescan will be automatically started now.\n     display_all_files\n     unlock_index\n     reshow_diff\n-    ui_status \"Created commit [string range $cmt_id 0 7]: $subject\"\n+    ui_status [mc \"Created commit %s: %s\" [string range $cmt_id 0 7] $subject]\n }\ndiff --git a/lib/console.tcl b/lib/console.tcl\nindex 6f718fb..e5f9ba4 100644\n--- a/lib/console.tcl\n+++ b/lib/console.tcl\n@@ -52,7 +52,7 @@ method _init {} {\n         -state disabled \\\n         -xscrollcommand [list $w.m.sbx set] \\\n         -yscrollcommand [list $w.m.sby set]\n-    label $w.m.s -text {Working... please wait...} \\\n+    label $w.m.s -text [mc \"Working... please wait...\"] \\\n         -anchor w \\\n         -justify left \\\n         -font font_uibold\n@@ -66,11 +66,11 @@ method _init {} {\n     pack $w.m -side top -fill both -expand 1 -padx 5 -pady 10\n \n     menu $w.ctxm -tearoff 0\n-    $w.ctxm add command -label \"Copy\" \\\n+    $w.ctxm add command -label [mc \"Copy\"] \\\n         -command \"tk_textCopy $w.m.t\"\n-    $w.ctxm add command -label \"Select All\" \\\n+    $w.ctxm add command -label [mc \"Select All\"] \\\n         -command \"focus $w.m.t;$w.m.t tag add sel 0.0 end\"\n-    $w.ctxm add command -label \"Copy All\" \\\n+    $w.ctxm add command -label [mc \"Copy All\"] \\\n         -command \"\n             $w.m.t tag add sel 0.0 end\n             tk_textCopy $w.m.t\n@@ -78,7 +78,7 @@ method _init {} {\n         \"\n \n     if {$is_toplevel} {\n-        button $w.ok -text {Close} \\\n+        button $w.ok -text [mc \"Close\"] \\\n             -state disabled \\\n             -command [list destroy $w]\n         pack $w.ok -side bottom -anchor e -pady 10 -padx 10\n@@ -181,7 +181,7 @@ method insert {txt} {\n method done {ok} {\n     if {$ok} {\n         if {[winfo exists $w.m.s]} {\n-            $w.m.s conf -background green -text {Success}\n+            $w.m.s conf -background green -text [mc \"Success\"]\n             if {$is_toplevel} {\n                 $w.ok conf -state normal\n                 focus $w.ok\n@@ -191,7 +191,7 @@ method done {ok} {\n         if {![winfo exists $w.m.s]} {\n             _init $this\n         }\n-        $w.m.s conf -background red -text {Error: Command Failed}\n+        $w.m.s conf -background red -text [mc \"Error: Command Failed\"]\n         if {$is_toplevel} {\n             $w.ok conf -state normal\n             focus $w.ok\ndiff --git a/lib/database.tcl b/lib/database.tcl\nindex 0657cc2..8dda9af 100644\n--- a/lib/database.tcl\n+++ b/lib/database.tcl\n@@ -24,14 +24,14 @@ proc do_stats {} {\n     toplevel $w\n     wm geometry $w \"+[winfo rootx .]+[winfo rooty .]\"\n \n-    label $w.header -text {Database Statistics}\n+    label $w.header -text [mc \"Database Statistics\"]\n     pack $w.header -side top -fill x\n \n     frame $w.buttons -border 1\n-    button $w.buttons.close -text Close \\\n+    button $w.buttons.close -text [mc Close] \\\n         -default active \\\n         -command [list destroy $w]\n-    button $w.buttons.gc -text {Compress Database} \\\n+    button $w.buttons.gc -text [mc \"Compress Database\"] \\\n         -default normal \\\n         -command \"destroy $w;do_gc\"\n     pack $w.buttons.close -side right\n@@ -40,13 +40,13 @@ proc do_stats {} {\n \n     frame $w.stat -borderwidth 1 -relief solid\n     foreach s {\n-        {count           {Number of loose objects}}\n-        {size            {Disk space used by loose objects} { KiB}}\n-        {in-pack         {Number of packed objects}}\n-        {packs           {Number of packs}}\n-        {size-pack       {Disk space used by packed objects} { KiB}}\n-        {prune-packable  {Packed objects waiting for pruning}}\n-        {garbage         {Garbage files}}\n+        {count           [mc \"Number of loose objects\"]}\n+        {size            [mc \"Disk space used by loose objects\"] { KiB}}\n+        {in-pack         [mc \"Number of packed objects\"]}\n+        {packs           [mc \"Number of packs\"]}\n+        {size-pack       [mc \"Disk space used by packed objects\"] { KiB}}\n+        {prune-packable  [mc \"Packed objects waiting for pruning\"]}\n+        {garbage         [mc \"Garbage files\"]}\n         } {\n         set name [lindex $s 0]\n         set label [lindex $s 1]\n@@ -64,12 +64,12 @@ proc do_stats {} {\n     bind $w <Visibility> \"grab $w; focus $w.buttons.close\"\n     bind $w <Key-Escape> [list destroy $w]\n     bind $w <Key-Return> [list destroy $w]\n-    wm title $w \"[appname] ([reponame]): Database Statistics\"\n+    wm title $w [append \"[appname] ([reponame]): \" [mc \"Database Statistics\"]]\n     tkwait window $w\n }\n \n proc do_gc {} {\n-    set w [console::new {gc} {Compressing the object database}]\n+    set w [console::new {gc} [mc \"Compressing the object database\"]]\n     console::chain $w {\n         {exec git pack-refs --prune}\n         {exec git reflog expire --all}\n@@ -80,7 +80,7 @@ proc do_gc {} {\n \n proc do_fsck_objects {} {\n     set w [console::new {fsck-objects} \\\n-        {Verifying the object database with fsck-objects}]\n+        [mc \"Verifying the object database with fsck-objects\"]]\n     set cmd [list git fsck-objects]\n     lappend cmd --full\n     lappend cmd --cache\ndiff --git a/lib/diff.tcl b/lib/diff.tcl\nindex e09e125..d937e46 100644\n--- a/lib/diff.tcl\n+++ b/lib/diff.tcl\n@@ -39,13 +39,13 @@ proc handle_empty_diff {} {\n     set s $file_states($path)\n     if {[lindex $s 0] ne {_M}} return\n \n-    info_popup \"No differences detected.\n+    info_popup [mc \"No differences detected.\n \n-[short_path $path] has no changes.\n+%s has no changes.\n \n The modification date of this file was updated by another application, but the content within the file was not changed.\n \n-A rescan will be automatically started to find other files which may have the same state.\"\n+A rescan will be automatically started to find other files which may have the same state.\" [short_path $path]]\n \n     clear_diff\n     display_file $path __\n@@ -94,7 +94,7 @@ proc show_diff {path w {lno {}}} {\n             set diff_active 0\n             unlock_index\n             ui_status \"Unable to display [escape_path $path]\"\n-            error_popup \"Error loading file:\\n\\n$err\"\n+             error_popup [append [mc \"Error loading file:\"] \"\\n\\n$err\"]\n             return\n         }\n         $ui_diff conf -state normal\n@@ -159,7 +159,7 @@ proc show_diff {path w {lno {}}} {\n         set diff_active 0\n         unlock_index\n         ui_status \"Unable to display [escape_path $path]\"\n-        error_popup \"Error loading diff:\\n\\n$err\"\n+        error_popup [append [mc \"Error loading diff:\"] \"\\n\\n$err\"]\n         return\n     }\n \n@@ -307,7 +307,7 @@ proc apply_hunk {x y} {\n         puts -nonewline $p $current_diff_header\n         puts -nonewline $p [$ui_diff get $s_lno $e_lno]\n         close $p} err]} {\n-        error_popup \"Failed to $mode selected hunk.\\n\\n$err\"\n+        error_popup [append [mc \"Failed to %s selected hunk.\" $mode] \"\\n\\n$err\"]\n         unlock_index\n         return\n     }\ndiff --git a/lib/error.tcl b/lib/error.tcl\nindex 16a2218..13565b7 100644\n--- a/lib/error.tcl\n+++ b/lib/error.tcl\n@@ -9,7 +9,7 @@ proc error_popup {msg} {\n     set cmd [list tk_messageBox \\\n         -icon error \\\n         -type ok \\\n-        -title \"$title: error\" \\\n+        -title [append \"$title: \" [mc \"error\"]] \\\n         -message $msg]\n     if {[winfo ismapped .]} {\n         lappend cmd -parent .\n@@ -25,7 +25,7 @@ proc warn_popup {msg} {\n     set cmd [list tk_messageBox \\\n         -icon warning \\\n         -type ok \\\n-        -title \"$title: warning\" \\\n+        -title [append \"$title: \" [mc \"warning\"]] \\\n         -message $msg]\n     if {[winfo ismapped .]} {\n         lappend cmd -parent .\n@@ -78,7 +78,7 @@ proc hook_failed_popup {hook msg} {\n         -font font_diff \\\n         -yscrollcommand [list $w.m.sby set]\n     label $w.m.l2 \\\n-        -text {You must correct the above errors before committing.} \\\n+        -text [mc \"You must correct the above errors before committing.\"] \\\n         -anchor w \\\n         -justify left \\\n         -font font_uibold\n@@ -99,6 +99,6 @@ proc hook_failed_popup {hook msg} {\n \n     bind $w <Visibility> \"grab $w; focus $w\"\n     bind $w <Key-Return> \"destroy $w\"\n-    wm title $w \"[appname] ([reponame]): error\"\n+    wm title $w [append \"[appname] ([reponame]): \" [mc \"error\"]]\n     tkwait window $w\n }\ndiff --git a/lib/index.tcl b/lib/index.tcl\nindex 3ea72e1..9080ac6 100644\n--- a/lib/index.tcl\n+++ b/lib/index.tcl\n@@ -358,13 +358,13 @@ proc revert_helper {txt paths} {\n     set reply [tk_dialog \\\n         .confirm_revert \\\n         \"[appname] ([reponame])\" \\\n-        \"Revert changes in $s?\n+        [mc \"Revert changes in %s?\n \n-Any unadded changes will be permanently lost by the revert.\" \\\n+Any unadded changes will be permanently lost by the revert.\" $s] \\\n         question \\\n         1 \\\n-        {Do Nothing} \\\n-        {Revert Changes} \\\n+        [mc \"Do Nothing\"] \\\n+        [mc \"Revert Changes\"] \\\n         ]\n     if {$reply == 1} {\n         checkout_index \\\ndiff --git a/lib/merge.tcl b/lib/merge.tcl\nindex e5a7525..40e82a9 100644\n--- a/lib/merge.tcl\n+++ b/lib/merge.tcl\n@@ -11,10 +11,10 @@ method _can_merge {} {\n     global HEAD commit_type file_states\n \n     if {[string match amend* $commit_type]} {\n-        info_popup {Cannot merge while amending.\n+        info_popup [mc \"Cannot merge while amending.\n \n You must finish amending this commit before starting any type of merge.\n-}\n+\"]\n         return 0\n     }\n \n@@ -25,12 +25,12 @@ You must finish amending this commit before starting any type of merge.\n     #\n     repository_state curType curHEAD curMERGE_HEAD\n     if {$commit_type ne $curType || $HEAD ne $curHEAD} {\n-        info_popup {Last scanned state does not match repository state.\n+        info_popup [mc \"Last scanned state does not match repository state.\n \n Another Git program has modified this repository since the last scan.  A rescan must be performed before a merge can be performed.\n \n The rescan will be automatically started now.\n-}\n+\"]\n         unlock_index\n         rescan ui_ready\n         return 0\n@@ -42,22 +42,22 @@ The rescan will be automatically started now.\n             continue; # and pray it works!\n         }\n         U? {\n-            error_popup \"You are in the middle of a conflicted merge.\n+            error_popup [mc \"You are in the middle of a conflicted merge.\n \n-File [short_path $path] has merge conflicts.\n+File %s has merge conflicts.\n \n You must resolve them, add the file, and commit to complete the current merge.  Only then can you begin another merge.\n-\"\n+\" [short_path $path]]\n             unlock_index\n             return 0\n         }\n         ?? {\n-            error_popup \"You are in the middle of a change.\n+            error_popup [mc \"You are in the middle of a change.\n \n-File [short_path $path] is modified.\n+File %s is modified.\n \n You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.\n-\"\n+\" [short_path $path]]\n             unlock_index\n             return 0\n         }\n@@ -91,9 +91,9 @@ method _start {} {\n     }\n \n     set cmd [list git merge $name]\n-    set msg \"Merging $current_branch and $name\"\n+    set msg [mc \"Merging %s and %s\" $current_branch $name]\n     ui_status \"$msg...\"\n-    set cons [console::new \"Merge\" $cmd]\n+    set cons [console::new [mc \"Merge\"] $cmd]\n     console::exec $cons $cmd [cb _finish $cons]\n \n     wm protocol $w WM_DELETE_WINDOW {}\n@@ -103,9 +103,9 @@ method _start {} {\n method _finish {cons ok} {\n     console::done $cons $ok\n     if {$ok} {\n-        set msg {Merge completed successfully.}\n+        set msg [mc \"Merge completed successfully.\"]\n     } else {\n-        set msg {Merge failed.  Conflict resolution is required.}\n+        set msg [mc \"Merge failed.  Conflict resolution is required.\"]\n     }\n     unlock_index\n     rescan [list ui_status $msg]\n@@ -154,7 +154,7 @@ constructor dialog {} {\n     set list [lsort -unique $list]\n \n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): Merge\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"Merge\"]]\n     if {$top ne {.}} {\n         wm geometry $top \"+[winfo rootx .]+[winfo rooty .]\"\n     }\n@@ -163,22 +163,22 @@ constructor dialog {} {\n     set _start [cb _start]\n \n     label $w.header \\\n-        -text \"Merge Into $current_branch\" \\\n+        -text [mc \"Merge Into %s\" $current_branch] \\\n         -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n-    button $w.buttons.visualize -text Visualize -command $_visualize\n+    button $w.buttons.visualize -text [mc Visualize] -command $_visualize\n     pack $w.buttons.visualize -side left\n-    button $w.buttons.create -text Merge -command $_start\n+    button $w.buttons.create -text [mc Merge] -command $_start\n     pack $w.buttons.create -side right\n     button $w.buttons.cancel \\\n-        -text {Cancel} \\\n+        -text [mc \"Cancel\"] \\\n         -command [cb _cancel]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n \n-    labelframe $w.source -text {Source Branches}\n+    labelframe $w.source -text [mc \"Source Branches\"]\n     set w_list $w.source.l\n     listbox $w_list \\\n         -height 10 \\\n@@ -237,30 +237,34 @@ proc reset_hard {} {\n     global HEAD commit_type file_states\n \n     if {[string match amend* $commit_type]} {\n-        info_popup {Cannot abort while amending.\n+        info_popup [mc \"Cannot abort while amending.\n \n You must finish amending this commit.\n-}\n+\"]\n         return\n     }\n \n     if {![lock_index abort]} return\n \n     if {[string match *merge* $commit_type]} {\n-        set op merge\n+        set op_question [mc \"Abort merge?\n+\n+Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n+\n+Continue with aborting the current merge?\"]\n     } else {\n-        set op commit\n-    }\n+        set op_question [mc \"Abort commit?\n \n-    if {[ask_popup \"Abort $op?\n+Aborting the current commit will cause *ALL* uncommitted changes to be lost.\n \n-Aborting the current $op will cause *ALL* uncommitted changes to be lost.\n+Continue with aborting the current commit?\"]\n+    }\n \n-Continue with aborting the current $op?\"] eq {yes}} {\n+    if {[ask_popup $op_question] eq {yes}} {\n         set fd [git_read read-tree --reset -u HEAD]\n         fconfigure $fd -blocking 0 -translation binary\n         fileevent $fd readable [namespace code [list _reset_wait $fd]]\n-        ui_status {Aborting... please wait...}\n+        ui_status [mc \"Aborting... please wait...\"]\n     } else {\n         unlock_index\n     }\n@@ -283,7 +287,7 @@ proc _reset_wait {fd} {\n         catch {file delete [gitdir MERGE_MSG]}\n         catch {file delete [gitdir GITGUI_MSG]}\n \n-        rescan {ui_status {Abort completed.  Ready.}}\n+        rescan {ui_status [mc \"Abort completed.  Ready.\"]}\n     }\n }\n \ndiff --git a/lib/option.tcl b/lib/option.tcl\nindex aa9f783..6c4d7ae 100644\n--- a/lib/option.tcl\n+++ b/lib/option.tcl\n@@ -62,7 +62,7 @@ proc do_about {} {\n     toplevel $w\n     wm geometry $w \"+[winfo rootx .]+[winfo rooty .]\"\n \n-    label $w.header -text \"About [appname]\" \\\n+    label $w.header -text [mc \"About %s\" [appname]] \\\n         -font font_uibold\n     pack $w.header -side top -fill x\n \n@@ -74,8 +74,8 @@ proc do_about {} {\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n \n     label $w.desc \\\n-        -text \"git-gui - a graphical user interface for Git.\n-$copyright\" \\\n+        -text [append [mc \"git-gui - a graphical user interface for Git.\"] \"\n+$copyright\"] \\\n         -padx 5 -pady 5 \\\n         -justify left \\\n         -anchor w \\\n@@ -157,44 +157,44 @@ proc do_options {} {\n     toplevel $w\n     wm geometry $w \"+[winfo rootx .]+[winfo rooty .]\"\n \n-    label $w.header -text \"Options\" \\\n+    label $w.header -text [mc \"Options\"] \\\n         -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n-    button $w.buttons.restore -text {Restore Defaults} \\\n+    button $w.buttons.restore -text [mc \"Restore Defaults\"] \\\n         -default normal \\\n         -command do_restore_defaults\n     pack $w.buttons.restore -side left\n-    button $w.buttons.save -text Save \\\n+    button $w.buttons.save -text [mc Save] \\\n         -default active \\\n         -command [list do_save_config $w]\n     pack $w.buttons.save -side right\n-    button $w.buttons.cancel -text {Cancel} \\\n+    button $w.buttons.cancel -text [mc \"Cancel\"] \\\n         -default normal \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n \n-    labelframe $w.repo -text \"[reponame] Repository\"\n-    labelframe $w.global -text {Global (All Repositories)}\n+    labelframe $w.repo -text [mc \"%s Repository\" [reponame]]\n+    labelframe $w.global -text [mc \"Global (All Repositories)\"]\n     pack $w.repo -side left -fill both -expand 1 -pady 5 -padx 5\n     pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5\n \n     set optid 0\n     foreach option {\n-        {t user.name {User Name}}\n-        {t user.email {Email Address}}\n-\n-        {b merge.summary {Summarize Merge Commits}}\n-        {i-1..5 merge.verbosity {Merge Verbosity}}\n-        {b merge.diffstat {Show Diffstat After Merge}}\n-\n-        {b gui.trustmtime  {Trust File Modification Timestamps}}\n-        {b gui.pruneduringfetch {Prune Tracking Branches During Fetch}}\n-        {b gui.matchtrackingbranch {Match Tracking Branches}}\n-        {i-0..99 gui.diffcontext {Number of Diff Context Lines}}\n-        {t gui.newbranchtemplate {New Branch Name Template}}\n+        {t user.name [mc \"User Name\"]}\n+        {t user.email [mc \"Email Address\"]}\n+\n+        {b merge.summary [mc \"Summarize Merge Commits\"]}\n+        {i-1..5 merge.verbosity [mc \"Merge Verbosity\"]}\n+        {b merge.diffstat [mc \"Show Diffstat After Merge\"]}\n+\n+        {b gui.trustmtime  [mc \"Trust File Modification Timestamps\"]}\n+        {b gui.pruneduringfetch [mc \"Prune Tracking Branches During Fetch\"]}\n+        {b gui.matchtrackingbranch [mc \"Match Tracking Branches\"]}\n+        {i-0..99 gui.diffcontext [mc \"Number of Diff Context Lines\"]}\n+        {t gui.newbranchtemplate [mc \"New Branch Name Template\"]}\n         } {\n         set type [lindex $option 0]\n         set name [lindex $option 1]\n@@ -272,7 +272,7 @@ proc do_options {} {\n     bind $w <Visibility> \"grab $w; focus $w.buttons.save\"\n     bind $w <Key-Escape> \"destroy $w\"\n     bind $w <Key-Return> [list do_save_config $w]\n-    wm title $w \"[appname] ([reponame]): Options\"\n+    wm title $w [append \"[appname] ([reponame]): \" [mc \"Options\"]]\n     tkwait window $w\n }\n \n@@ -303,7 +303,7 @@ proc do_restore_defaults {} {\n \n proc do_save_config {w} {\n     if {[catch {save_config} err]} {\n-        error_popup \"Failed to completely save options:\\n\\n$err\"\n+        error_popup [append [mc \"Failed to completely save options:\"] \"\\n\\n$err\"]\n     }\n     reshow_diff\n     destroy $w\ndiff --git a/lib/remote.tcl b/lib/remote.tcl\nindex e235ca8..c47ae50 100644\n--- a/lib/remote.tcl\n+++ b/lib/remote.tcl\n@@ -163,7 +163,7 @@ proc populate_fetch_menu {} {\n     }\n     foreach r $prune_list {\n         $m add command \\\n-            -label \"Prune from $r...\" \\\n+            -label [mc \"Prune from %s...\" $r] \\\n             -command [list prune_from $r]\n     }\n }\n@@ -197,7 +197,7 @@ proc populate_push_menu {} {\n                 $m add separator\n             }\n             $m add command \\\n-                -label \"Push to $r...\" \\\n+                -label [mc \"Push to %s...\" $r] \\\n                 -command [list push_to $r]\n             incr fast_count\n         }\ndiff --git a/lib/remote_branch_delete.tcl b/lib/remote_branch_delete.tcl\nindex c88a360..06b5eab 100644\n--- a/lib/remote_branch_delete.tcl\n+++ b/lib/remote_branch_delete.tcl\n@@ -26,28 +26,28 @@ constructor dialog {} {\n     global all_remotes M1B\n \n     make_toplevel top w\n-    wm title $top \"[appname] ([reponame]): Delete Remote Branch\"\n+    wm title $top [append \"[appname] ([reponame]): \" [mc \"Delete Remote Branch\"]]\n     if {$top ne {.}} {\n         wm geometry $top \"+[winfo rootx .]+[winfo rooty .]\"\n     }\n \n-    label $w.header -text {Delete Remote Branch} -font font_uibold\n+    label $w.header -text [mc \"Delete Remote Branch\"] -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n-    button $w.buttons.delete -text Delete \\\n+    button $w.buttons.delete -text [mc Delete] \\\n         -default active \\\n         -command [cb _delete]\n     pack $w.buttons.delete -side right\n-    button $w.buttons.cancel -text {Cancel} \\\n+    button $w.buttons.cancel -text [mc \"Cancel\"] \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n \n-    labelframe $w.dest -text {From Repository}\n+    labelframe $w.dest -text [mc \"From Repository\"]\n     if {$all_remotes ne {}} {\n         radiobutton $w.dest.remote_r \\\n-            -text {Remote:} \\\n+            -text [mc \"Remote:\"] \\\n             -value remote \\\n             -variable @urltype\n         eval tk_optionMenu $w.dest.remote_m @remote $all_remotes\n@@ -63,7 +63,7 @@ constructor dialog {} {\n         set urltype url\n     }\n     radiobutton $w.dest.url_r \\\n-        -text {Arbitrary URL:} \\\n+        -text [mc \"Arbitrary URL:\"] \\\n         -value url \\\n         -variable @urltype\n     entry $w.dest.url_t \\\n@@ -81,7 +81,7 @@ constructor dialog {} {\n     grid columnconfigure $w.dest 1 -weight 1\n     pack $w.dest -anchor nw -fill x -pady 5 -padx 5\n \n-    labelframe $w.heads -text {Branches}\n+    labelframe $w.heads -text [mc \"Branches\"]\n     listbox $w.heads.l \\\n         -height 10 \\\n         -width 70 \\\n@@ -96,7 +96,7 @@ constructor dialog {} {\n         -anchor w \\\n         -justify left\n     button $w.heads.footer.rescan \\\n-        -text {Rescan} \\\n+        -text [mc \"Rescan\"] \\\n         -command [cb _rescan]\n     pack $w.heads.footer.status -side left -fill x\n     pack $w.heads.footer.rescan -side right\n@@ -106,9 +106,9 @@ constructor dialog {} {\n     pack $w.heads.l -side left -fill both -expand 1\n     pack $w.heads -fill both -expand 1 -pady 5 -padx 5\n \n-    labelframe $w.validate -text {Delete Only If}\n+    labelframe $w.validate -text [mc \"Delete Only If\"]\n     radiobutton $w.validate.head_r \\\n-        -text {Merged Into:} \\\n+        -text [mc \"Merged Into:\"] \\\n         -value head \\\n         -variable @checktype\n     set head_m [tk_optionMenu $w.validate.head_m @check_head {}]\n@@ -116,7 +116,7 @@ constructor dialog {} {\n     trace add variable @check_head write [cb _write_check_head]\n     grid $w.validate.head_r $w.validate.head_m -sticky w\n     radiobutton $w.validate.always_r \\\n-        -text {Always (Do not perform merge checks)} \\\n+        -text [mc \"Always (Do not perform merge checks)\"] \\\n         -value always \\\n         -variable @checktype\n     grid $w.validate.always_r -columnspan 2 -sticky w\n@@ -149,7 +149,7 @@ method _delete {} {\n                 -type ok \\\n                 -title [wm title $w] \\\n                 -parent $w \\\n-                -message \"A branch is required for 'Merged Into'.\"\n+                -message [mc \"A branch is required for 'Merged Into'.\"]\n             return\n         }\n         set crev $full_cache(\"$cache\\nrefs/heads/$check_head\")\n@@ -186,9 +186,7 @@ method _delete {} {\n  - [join $not_merged \"\\n - \"]\"\n \n         if {$need_fetch} {\n-            append msg \"\n-\n-One or more of the merge tests failed because you have not fetched the necessary commits.  Try fetching from $uri first.\"\n+            append msg \"\\n\\n\" [mc \"One or more of the merge tests failed because you have not fetched the necessary commits.  Try fetching from %s first.\" $uri]\n         }\n \n         tk_messageBox \\\n@@ -206,7 +204,7 @@ One or more of the merge tests failed because you have not fetched the necessary\n             -type ok \\\n             -title [wm title $w] \\\n             -parent $w \\\n-            -message \"Please select one or more branches to delete.\"\n+            -message [mc \"Please select one or more branches to delete.\"]\n         return\n     }\n \n@@ -215,9 +213,9 @@ One or more of the merge tests failed because you have not fetched the necessary\n         -type yesno \\\n         -title [wm title $w] \\\n         -parent $w \\\n-        -message {Recovering deleted branches is difficult.\n+        -message [mc \"Recovering deleted branches is difficult.\n \n-Delete the selected branches?}] ne yes} {\n+Delete the selected branches?\"]] ne yes} {\n         return\n     }\n \n@@ -225,7 +223,7 @@ Delete the selected branches?}] ne yes} {\n \n     set cons [console::new \\\n         \"push $uri\" \\\n-        \"Deleting branches from $uri\"]\n+        [mc \"Deleting branches from %s\" $uri]]\n     console::exec $cons $push_cmd\n }\n \n@@ -285,12 +283,12 @@ method _load {cache uri} {\n         $w.heads.l conf -state disabled\n         set head_list [list]\n         set full_list [list]\n-        set status {No repository selected.}\n+        set status [mc \"No repository selected.\"]\n         return\n     }\n \n     if {[catch {set x $cached($cache)}]} {\n-        set status \"Scanning $uri...\"\n+        set status [mc \"Scanning %s...\" $uri]\n         $w.heads.l conf -state disabled\n         set head_list [list]\n         set full_list [list]\ndiff --git a/lib/shortcut.tcl b/lib/shortcut.tcl\nindex c36be2f..d0e63a3 100644\n--- a/lib/shortcut.tcl\n+++ b/lib/shortcut.tcl\n@@ -6,7 +6,7 @@ proc do_windows_shortcut {} {\n \n     set fn [tk_getSaveFile \\\n         -parent . \\\n-        -title \"[appname] ([reponame]): Create Desktop Icon\" \\\n+        -title [append \"[appname] ([reponame]): \" [mc \"Create Desktop Icon\"]] \\\n         -initialfile \"Git [reponame].bat\"]\n     if {$fn != {}} {\n         if {[file extension $fn] ne {.bat}} {\n@@ -23,7 +23,7 @@ proc do_windows_shortcut {} {\n                 puts $fd \" \\\"[file normalize $argv0]\\\"\"\n                 close $fd\n             } err]} {\n-            error_popup \"Cannot write script:\\n\\n$err\"\n+            error_popup [append [mc \"Cannot write script:\"] \"\\n\\n$err\"]\n         }\n     }\n }\n@@ -42,7 +42,7 @@ proc do_cygwin_shortcut {} {\n     }\n     set fn [tk_getSaveFile \\\n         -parent . \\\n-        -title \"[appname] ([reponame]): Create Desktop Icon\" \\\n+        -title [append \"[appname] ([reponame]): \" [mc \"Create Desktop Icon\"]] \\\n         -initialdir $desktop \\\n         -initialfile \"Git [reponame].bat\"]\n     if {$fn != {}} {\n@@ -71,7 +71,7 @@ proc do_cygwin_shortcut {} {\n                 puts $fd \" &\\\"\"\n                 close $fd\n             } err]} {\n-            error_popup \"Cannot write script:\\n\\n$err\"\n+            error_popup [append [mc \"Cannot write script:\"] \"\\n\\n$err\"]\n         }\n     }\n }\n@@ -81,7 +81,7 @@ proc do_macosx_app {} {\n \n     set fn [tk_getSaveFile \\\n         -parent . \\\n-        -title \"[appname] ([reponame]): Create Desktop Icon\" \\\n+        -title [append \"[appname] ([reponame]): \" [mc \"Create Desktop Icon\"]] \\\n         -initialdir [file join $env(HOME) Desktop] \\\n         -initialfile \"Git [reponame].app\"]\n     if {$fn != {}} {\n@@ -146,7 +146,7 @@ proc do_macosx_app {} {\n \n                 file attributes $exe -permissions u+x,g+x,o+x\n             } err]} {\n-            error_popup \"Cannot write icon:\\n\\n$err\"\n+            error_popup [append [mc \"Cannot write icon:\"] \"\\n\\n$err\"]\n         }\n     }\n }\ndiff --git a/lib/status_bar.tcl b/lib/status_bar.tcl\nindex 72a8fe1..769ef81 100644\n--- a/lib/status_bar.tcl\n+++ b/lib/status_bar.tcl\n@@ -55,7 +55,7 @@ method update {have total} {\n         set pdone [expr {100 * $have / $total}]\n     }\n \n-    set status [format \"%s ... %i of %i %s (%2i%%)\" \\\n+    set status [mc \"%s ... %i of %i %s (%2i%%)\" \\\n         $prefix $have $total $units $pdone]\n     $w_c coords bar 0 0 $pdone 20\n }\ndiff --git a/lib/transport.tcl b/lib/transport.tcl\nindex 3a22bd4..1c7baef 100644\n--- a/lib/transport.tcl\n+++ b/lib/transport.tcl\n@@ -4,7 +4,7 @@\n proc fetch_from {remote} {\n     set w [console::new \\\n         \"fetch $remote\" \\\n-        \"Fetching new changes from $remote\"]\n+        [mc \"Fetching new changes from %s\" $remote]]\n     set cmds [list]\n     lappend cmds [list exec git fetch $remote]\n     if {[is_config_true gui.pruneduringfetch]} {\n@@ -16,14 +16,14 @@ proc fetch_from {remote} {\n proc prune_from {remote} {\n     set w [console::new \\\n         \"remote prune $remote\" \\\n-        \"Pruning tracking branches deleted from $remote\"]\n+        [mc \"Pruning tracking branches deleted from %s\" $remote]]\n     console::exec $w [list git remote prune $remote]\n }\n \n proc push_to {remote} {\n     set w [console::new \\\n         \"push $remote\" \\\n-        \"Pushing changes to $remote\"]\n+        [mc \"Pushing changes to %s\" $remote]]\n     set cmd [list git push]\n     lappend cmd -v\n     lappend cmd $remote\n@@ -65,7 +65,7 @@ proc start_push_anywhere_action {w} {\n \n     set cons [console::new \\\n         \"push $r_url\" \\\n-        \"Pushing $cnt $unit to $r_url\"]\n+        [mc \"Pushing %s %s to %s\" $cnt $unit $r_url]]\n     console::exec $cons $cmd\n     destroy $w\n }\n@@ -81,21 +81,21 @@ proc do_push_anywhere {} {\n     toplevel $w\n     wm geometry $w \"+[winfo rootx .]+[winfo rooty .]\"\n \n-    label $w.header -text {Push Branches} -font font_uibold\n+    label $w.header -text [mc \"Push Branches\"] -font font_uibold\n     pack $w.header -side top -fill x\n \n     frame $w.buttons\n-    button $w.buttons.create -text Push \\\n+    button $w.buttons.create -text [mc Push] \\\n         -default active \\\n         -command [list start_push_anywhere_action $w]\n     pack $w.buttons.create -side right\n-    button $w.buttons.cancel -text {Cancel} \\\n+    button $w.buttons.cancel -text [mc \"Cancel\"] \\\n         -default normal \\\n         -command [list destroy $w]\n     pack $w.buttons.cancel -side right -padx 5\n     pack $w.buttons -side bottom -fill x -pady 10 -padx 10\n \n-    labelframe $w.source -text {Source Branches}\n+    labelframe $w.source -text [mc \"Source Branches\"]\n     listbox $w.source.l \\\n         -height 10 \\\n         -width 70 \\\n@@ -112,10 +112,10 @@ proc do_push_anywhere {} {\n     pack $w.source.l -side left -fill both -expand 1\n     pack $w.source -fill both -expand 1 -pady 5 -padx 5\n \n-    labelframe $w.dest -text {Destination Repository}\n+    labelframe $w.dest -text [mc \"Destination Repository\"]\n     if {$all_remotes ne {}} {\n         radiobutton $w.dest.remote_r \\\n-            -text {Remote:} \\\n+            -text [mc \"Remote:\"] \\\n             -value remote \\\n             -variable push_urltype\n         eval tk_optionMenu $w.dest.remote_m push_remote $all_remotes\n@@ -130,7 +130,7 @@ proc do_push_anywhere {} {\n         set push_urltype url\n     }\n     radiobutton $w.dest.url_r \\\n-        -text {Arbitrary URL:} \\\n+        -text [mc \"Arbitrary URL:\"] \\\n         -value url \\\n         -variable push_urltype\n     entry $w.dest.url_t \\\n@@ -150,13 +150,13 @@ proc do_push_anywhere {} {\n     grid columnconfigure $w.dest 1 -weight 1\n     pack $w.dest -anchor nw -fill x -pady 5 -padx 5\n \n-    labelframe $w.options -text {Transfer Options}\n+    labelframe $w.options -text [mc \"Transfer Options\"]\n     checkbutton $w.options.thin \\\n-        -text {Use thin pack (for slow network connections)} \\\n+        -text [mc \"Use thin pack (for slow network connections)\"] \\\n         -variable push_thin\n     grid $w.options.thin -columnspan 2 -sticky w\n     checkbutton $w.options.tags \\\n-        -text {Include tags} \\\n+        -text [mc \"Include tags\"] \\\n         -variable push_tags\n     grid $w.options.tags -columnspan 2 -sticky w\n     grid columnconfigure $w.options 1 -weight 1\n@@ -169,6 +169,6 @@ proc do_push_anywhere {} {\n     bind $w <Visibility> \"grab $w; focus $w.buttons.create\"\n     bind $w <Key-Escape> \"destroy $w\"\n     bind $w <Key-Return> [list start_push_anywhere_action $w]\n-    wm title $w \"[appname] ([reponame]): Push\"\n+    wm title $w [append \"[appname] ([reponame]): \" [mc \"Push\"]]\n     tkwait window $w\n }\n-- \n1.5.2.3\n\n\n\n\n\n\n       \n____________________________________________________________________________________\nBe a better Heartthrob. Get better relationship answers from someone who knows. Yahoo! Answers - Check it out. \nhttp://answers.yahoo.com/dir/?link=list&sid=396545433\n"},{"id":"48416","messageId":"20070724112701.ndpm5fxaocks804s@webmail.tu-harburg.de","threadId":"9184","inReplyTo":"1282.25717.qm@web38901.mail.mud.yahoo.com","subject":"[PATCH] Fix translation of strings in foreach lists.","fromName":"Christian Stimming","fromEmail":"stimming@tuhh.de","sentAt":"2007-07-24T09:27:01Z","receivedAt":"2007-07-24T09:27:01Z","isPatch":true,"sender":{"key":"stimming@tuhh.de","avatar":"https://avatars.githubusercontent.com/u/227778?v=4"},"body":"Fix translation of strings in foreach lists.\n\nSigned-off-by: Christian Stimming <stimming@tuhh.de>\n---\nQuoting Brett Schwarz <brett_schwarz@yahoo.com>:\n> I not sure if it's worth changing, but you don't necessarily need   \n> those [append]'s in there.\n\nThanks for the info. It is basically up to Shawn to decide which style  \nhe likes more.\n\nThis patch is already necessary because I accidentally messed up the  \nforeach argument lists. With this patch those will work again and will  \nadditionally be translated as well. (Unfortunately, I can't commit to  \ngit-gui-i18n ATM due to a http-only-firewall connection. Johannes...?  \nThanks.)\n\n  lib/database.tcl |   16 ++++++++--------\n  lib/option.tcl   |   26 +++++++++++++-------------\n  2 files changed, 21 insertions(+), 21 deletions(-)\n\ndiff --git a/lib/database.tcl b/lib/database.tcl\nindex 8dda9af..118b1b2 100644\n--- a/lib/database.tcl\n+++ b/lib/database.tcl\n@@ -40,16 +40,16 @@ proc do_stats {} {\n\n  \tframe $w.stat -borderwidth 1 -relief solid\n  \tforeach s {\n-\t\t{count           [mc \"Number of loose objects\"]}\n-\t\t{size            [mc \"Disk space used by loose objects\"] { KiB}}\n-\t\t{in-pack         [mc \"Number of packed objects\"]}\n-\t\t{packs           [mc \"Number of packs\"]}\n-\t\t{size-pack       [mc \"Disk space used by packed objects\"] { KiB}}\n-\t\t{prune-packable  [mc \"Packed objects waiting for pruning\"]}\n-\t\t{garbage         [mc \"Garbage files\"]}\n+\t\t{count           {mc \"Number of loose objects\"}}\n+\t\t{size            {mc \"Disk space used by loose objects\"} { KiB}}\n+\t\t{in-pack         {mc \"Number of packed objects\"}}\n+\t\t{packs           {mc \"Number of packs\"}}\n+\t\t{size-pack       {mc \"Disk space used by packed objects\"} { KiB}}\n+\t\t{prune-packable  {mc \"Packed objects waiting for pruning\"}}\n+\t\t{garbage         {mc \"Garbage files\"}}\n  \t\t} {\n  \t\tset name [lindex $s 0]\n-\t\tset label [lindex $s 1]\n+\t\tset label [eval [lindex $s 1]]\n  \t\tif {[catch {set value $stats($name)}]} continue\n  \t\tif {[llength $s] > 2} {\n  \t\t\tset value \"$value[lindex $s 2]\"\ndiff --git a/lib/option.tcl b/lib/option.tcl\nindex 6c4d7ae..8d9e09d 100644\n--- a/lib/option.tcl\n+++ b/lib/option.tcl\n@@ -183,22 +183,22 @@ proc do_options {} {\n\n  \tset optid 0\n  \tforeach option {\n-\t\t{t user.name [mc \"User Name\"]}\n-\t\t{t user.email [mc \"Email Address\"]}\n-\n-\t\t{b merge.summary [mc \"Summarize Merge Commits\"]}\n-\t\t{i-1..5 merge.verbosity [mc \"Merge Verbosity\"]}\n-\t\t{b merge.diffstat [mc \"Show Diffstat After Merge\"]}\n-\n-\t\t{b gui.trustmtime  [mc \"Trust File Modification Timestamps\"]}\n-\t\t{b gui.pruneduringfetch [mc \"Prune Tracking Branches During Fetch\"]}\n-\t\t{b gui.matchtrackingbranch [mc \"Match Tracking Branches\"]}\n-\t\t{i-0..99 gui.diffcontext [mc \"Number of Diff Context Lines\"]}\n-\t\t{t gui.newbranchtemplate [mc \"New Branch Name Template\"]}\n+\t\t{t user.name {mc \"User Name\"}}\n+\t\t{t user.email {mc \"Email Address\"}}\n+\n+\t\t{b merge.summary {mc \"Summarize Merge Commits\"}}\n+\t\t{i-1..5 merge.verbosity {mc \"Merge Verbosity\"}}\n+\t\t{b merge.diffstat {mc \"Show Diffstat After Merge\"}}\n+\n+\t\t{b gui.trustmtime  {mc \"Trust File Modification Timestamps\"}}\n+\t\t{b gui.pruneduringfetch {mc \"Prune Tracking Branches During Fetch\"}}\n+\t\t{b gui.matchtrackingbranch {mc \"Match Tracking Branches\"}}\n+\t\t{i-0..99 gui.diffcontext {mc \"Number of Diff Context Lines\"}}\n+\t\t{t gui.newbranchtemplate {mc \"New Branch Name Template\"}}\n  \t\t} {\n  \t\tset type [lindex $option 0]\n  \t\tset name [lindex $option 1]\n-\t\tset text [lindex $option 2]\n+\t\tset text [eval [lindex $option 2]]\n  \t\tincr optid\n  \t\tforeach f {repo global} {\n  \t\t\tswitch -glob -- $type {\n-- \n1.5.3.rc2.12.gbc280\n"},{"id":"48418","messageId":"20070724112922.6wiilqqdk4cwk4kc@webmail.tu-harburg.de","threadId":"9184","inReplyTo":"20070724112701.ndpm5fxaocks804s@webmail.tu-harburg.de","subject":"[PATCH] Mark more strings for i18n, including the status message list.","fromName":"Christian Stimming","fromEmail":"stimming@tuhh.de","sentAt":"2007-07-24T09:29:22Z","receivedAt":"2007-07-24T09:29:22Z","isPatch":true,"sender":{"key":"stimming@tuhh.de","avatar":"https://avatars.githubusercontent.com/u/227778?v=4"},"body":"Mark more strings for i18n, including the status message list.\n\nSigned-off-by: Christian Stimming <stimming@tuhh.de>\n---\n  git-gui.sh |   49 +++++++++++++++++++++++++------------------------\n  1 files changed, 25 insertions(+), 24 deletions(-)\n\ndiff --git a/git-gui.sh b/git-gui.sh\nindex fa510b9..6f5533b 100755\n--- a/git-gui.sh\n+++ b/git-gui.sh\n@@ -1340,31 +1340,32 @@ set all_icons(O$ui_workdir) file_plain\n\n  set max_status_desc 0\n  foreach i {\n-\t\t{__ \"Unmodified\"}\n-\n-\t\t{_M \"Modified, not staged\"}\n-\t\t{M_ \"Staged for commit\"}\n-\t\t{MM \"Portions staged for commit\"}\n-\t\t{MD \"Staged for commit, missing\"}\n-\n-\t\t{_O \"Untracked, not staged\"}\n-\t\t{A_ \"Staged for commit\"}\n-\t\t{AM \"Portions staged for commit\"}\n-\t\t{AD \"Staged for commit, missing\"}\n-\n-\t\t{_D \"Missing\"}\n-\t\t{D_ \"Staged for removal\"}\n-\t\t{DO \"Staged for removal, still present\"}\n-\n-\t\t{U_ \"Requires merge resolution\"}\n-\t\t{UU \"Requires merge resolution\"}\n-\t\t{UM \"Requires merge resolution\"}\n-\t\t{UD \"Requires merge resolution\"}\n+\t\t{__ {mc \"Unmodified\"}}\n+\n+\t\t{_M {mc \"Modified, not staged\"}}\n+\t\t{M_ {mc \"Staged for commit\"}}\n+\t\t{MM {mc \"Portions staged for commit\"}}\n+\t\t{MD {mc \"Staged for commit, missing\"}}\n+\n+\t\t{_O {mc \"Untracked, not staged\"}}\n+\t\t{A_ {mc \"Staged for commit\"}}\n+\t\t{AM {mc \"Portions staged for commit\"}}\n+\t\t{AD {mc \"Staged for commit, missing\"}}\n+\n+\t\t{_D {mc \"Missing\"}}\n+\t\t{D_ {mc \"Staged for removal\"}}\n+\t\t{DO {mc \"Staged for removal, still present\"}}\n+\n+\t\t{U_ {mc \"Requires merge resolution\"}}\n+\t\t{UU {mc \"Requires merge resolution\"}}\n+\t\t{UM {mc \"Requires merge resolution\"}}\n+\t\t{UD {mc \"Requires merge resolution\"}}\n  \t} {\n-\tif {$max_status_desc < [string length [lindex $i 1]]} {\n-\t\tset max_status_desc [string length [lindex $i 1]]\n+\tset text [eval [lindex $i 1]]\n+\tif {$max_status_desc < [string length $text]} {\n+\t\tset max_status_desc [string length $text]\n  \t}\n-\tset all_descs([lindex $i 0]) [lindex $i 1]\n+\tset all_descs([lindex $i 0]) $text\n  }\n  unset i\n\n@@ -2299,7 +2300,7 @@ proc trace_current_diff_path {varname args} {\n  \t} else {\n  \t\tset p $current_diff_path\n  \t\tset s [mapdesc [lindex $file_states($p) 0] $p]\n-\t\tset f {File:}\n+\t\tset f [mc \"File:\"]\n  \t\tset p [escape_path $p]\n  \t\tset o normal\n  \t}\n-- \n1.5.3.rc2.12.gbc280\n"},{"id":"48478","messageId":"20070724150136.GM32566@spearce.org","threadId":"9184","inReplyTo":"20070724112701.ndpm5fxaocks804s@webmail.tu-harburg.de","subject":"Re: [PATCH] Fix translation of strings in foreach lists.","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2007-07-24T15:01:36Z","receivedAt":"2007-07-24T15:01:36Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Christian Stimming <stimming@tuhh.de> wrote:\n> Fix translation of strings in foreach lists.\n> \n> Signed-off-by: Christian Stimming <stimming@tuhh.de>\n> ---\n> Quoting Brett Schwarz <brett_schwarz@yahoo.com>:\n> >I not sure if it's worth changing, but you don't necessarily need   \n> >those [append]'s in there.\n> \n> Thanks for the info. It is basically up to Shawn to decide which style  \n> he likes more.\n\n\"[mc Foo]\\n\\n$err\"\n\nis much shorter.  So I'd prefer that over [append [mc Foo] \"\\n\\n$err\"].\nIts not like you've saved a dq-eval either, as you still have to do one\nfor the \\n\\n.  But either way is valid Tcl, and works, and the append\nversion is not so bad that I'd reject a patch that used it.\n \n-- \nShawn.\n"},{"id":"48480","messageId":"20070724172028.mdfuj6fpeokw0800@webmail.tu-harburg.de","threadId":"9184","inReplyTo":"20070724150136.GM32566@spearce.org","subject":"Re: [PATCH] Fix translation of strings in foreach lists.","fromName":"Christian Stimming","fromEmail":"stimming@tuhh.de","sentAt":"2007-07-24T15:20:28Z","receivedAt":"2007-07-24T15:20:28Z","isPatch":true,"sender":{"key":"stimming@tuhh.de","avatar":"https://avatars.githubusercontent.com/u/227778?v=4"},"body":"Quoting \"Shawn O. Pearce\" <spearce@spearce.org>:\n>> >I not sure if it's worth changing, but you don't necessarily need\n>> >those [append]'s in there.\n>>\n>> Thanks for the info. It is basically up to Shawn to decide which style\n>> he likes more.\n>\n> \"[mc Foo]\\n\\n$err\"\n>\n> is much shorter.  So I'd prefer that over [append [mc Foo] \"\\n\\n$err\"].\n\nErr, but the usual case is that the argument to [mc] is more than one  \nword, and (additionally) that argument has to be quoted by  \ndouble-quotes (as opposed to braces) because otherwise xgettext  \ndoesn't extract the message correctly. Hence, the only possibility  \nhere were\n\n   \"[mc \"Some Text\"]\\n\\n$err\"\n\nIs this valid Tcl? Being a newcomer to this language I have to says  \nthe quotes here look rather strange :-)\n\n> Its not like you've saved a dq-eval either, as you still have to do one\n> for the \\n\\n.  But either way is valid Tcl, and works, and the append\n> version is not so bad that I'd reject a patch that used it.\n\nOk, thanks.\n\nChristian\n"}]}