Merge git://repo.or.cz/git-gui

* git://repo.or.cz/git-gui:
  git-gui: Automatically spell check commit messages as the user types
  git-gui: support Git Gui.app under OS X 10.5
  git-gui: Update German translation.
  git-gui: (i18n) Fix a bunch of still untranslated strings.
This commit is contained in:
Junio C Hamano 2008-02-13 11:04:58 -08:00
commit 41e2edf41a
12 changed files with 621 additions and 87 deletions

View File

@ -13,6 +13,7 @@ GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
SCRIPT_SH = git-gui.sh SCRIPT_SH = git-gui.sh
GITGUI_MAIN := git-gui GITGUI_MAIN := git-gui
@ -93,7 +94,14 @@ endif
TCL_PATH ?= tclsh TCL_PATH ?= tclsh
TCLTK_PATH ?= wish TCLTK_PATH ?= wish
TKFRAMEWORK = /Library/Frameworks/Tk.framework/Resources/Wish.app
ifeq ($(uname_S),Darwin)
TKFRAMEWORK = /Library/Frameworks/Tk.framework/Resources/Wish.app
ifeq ($(shell expr "$(uname_R)" : '9\.'),2)
TKFRAMEWORK = /System/Library/Frameworks/Tk.framework/Resources/Wish\ Shell.app
endif
TKEXECUTABLE = $(shell basename "$(TKFRAMEWORK)" .app)
endif
ifeq ($(findstring $(MAKEFLAGS),s),s) ifeq ($(findstring $(MAKEFLAGS),s),s)
QUIET_GEN = QUIET_GEN =
@ -147,7 +155,7 @@ git-gui: GIT-VERSION-FILE GIT-GUI-VARS
echo then >>$@+ && \ echo then >>$@+ && \
echo ' 'echo \'git-gui version '$(GITGUI_VERSION)'\' >>$@+ && \ echo ' 'echo \'git-gui version '$(GITGUI_VERSION)'\' >>$@+ && \
echo else >>$@+ && \ echo else >>$@+ && \
echo ' 'exec \''$(libdir_SQ)/Git Gui.app/Contents/MacOS/Wish'\' \ echo ' 'exec \''$(libdir_SQ)/Git Gui.app/Contents/MacOS/$(subst \,,$(TKEXECUTABLE))'\' \
'"$$0" "$$@"' >>$@+ && \ '"$$0" "$$@"' >>$@+ && \
echo fi >>$@+ && \ echo fi >>$@+ && \
chmod +x $@+ && \ chmod +x $@+ && \
@ -157,14 +165,15 @@ Git\ Gui.app: GIT-VERSION-FILE GIT-GUI-VARS \
macosx/Info.plist \ macosx/Info.plist \
macosx/git-gui.icns \ macosx/git-gui.icns \
macosx/AppMain.tcl \ macosx/AppMain.tcl \
$(TKFRAMEWORK)/Contents/MacOS/Wish $(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE)
$(QUIET_GEN)rm -rf '$@' '$@'+ && \ $(QUIET_GEN)rm -rf '$@' '$@'+ && \
mkdir -p '$@'+/Contents/MacOS && \ mkdir -p '$@'+/Contents/MacOS && \
mkdir -p '$@'+/Contents/Resources/Scripts && \ mkdir -p '$@'+/Contents/Resources/Scripts && \
cp '$(subst ','\'',$(TKFRAMEWORK))/Contents/MacOS/Wish' \ cp '$(subst ','\'',$(subst \,,$(TKFRAMEWORK)/Contents/MacOS/$(TKEXECUTABLE)))' \
'$@'+/Contents/MacOS && \ '$@'+/Contents/MacOS && \
cp macosx/git-gui.icns '$@'+/Contents/Resources && \ cp macosx/git-gui.icns '$@'+/Contents/Resources && \
sed -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \ sed -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
-e 's/@@GITGUI_TKEXECUTABLE@@/$(TKEXECUTABLE)/g' \
macosx/Info.plist \ macosx/Info.plist \
>'$@'+/Contents/Info.plist && \ >'$@'+/Contents/Info.plist && \
sed -e 's|@@gitexecdir@@|$(gitexecdir_SQ)|' \ sed -e 's|@@gitexecdir@@|$(gitexecdir_SQ)|' \

View File

@ -612,6 +612,7 @@ set default_config(gui.pruneduringfetch) false
set default_config(gui.trustmtime) false set default_config(gui.trustmtime) false
set default_config(gui.diffcontext) 5 set default_config(gui.diffcontext) 5
set default_config(gui.newbranchtemplate) {} set default_config(gui.newbranchtemplate) {}
set default_config(gui.spellingdictionary) {}
set default_config(gui.fontui) [font configure font_ui] set default_config(gui.fontui) [font configure font_ui]
set default_config(gui.fontdiff) [font configure font_diff] set default_config(gui.fontdiff) [font configure font_diff]
set font_descs { set font_descs {
@ -1683,6 +1684,7 @@ set is_quitting 0
proc do_quit {} { proc do_quit {} {
global ui_comm is_quitting repo_config commit_type global ui_comm is_quitting repo_config commit_type
global GITGUI_BCK_exists GITGUI_BCK_i global GITGUI_BCK_exists GITGUI_BCK_i
global ui_comm_spell
if {$is_quitting} return if {$is_quitting} return
set is_quitting 1 set is_quitting 1
@ -1710,6 +1712,12 @@ proc do_quit {} {
} }
} }
# -- Cancel our spellchecker if its running.
#
if {[info exists ui_comm_spell]} {
$ui_comm_spell stop
}
# -- Remove our editor backup, its not needed. # -- Remove our editor backup, its not needed.
# #
after cancel $GITGUI_BCK_i after cancel $GITGUI_BCK_i
@ -2454,7 +2462,7 @@ $ctxm add separator
$ctxm add command \ $ctxm add command \
-label [mc "Sign Off"] \ -label [mc "Sign Off"] \
-command do_signoff -command do_signoff
bind_button3 $ui_comm "tk_popup $ctxm %X %Y" set ui_comm_ctxm $ctxm
# -- Diff Header # -- Diff Header
# #
@ -2857,6 +2865,30 @@ if {[winfo exists $ui_comm]} {
} }
backup_commit_buffer backup_commit_buffer
# -- If the user has aspell available we can drive it
# in pipe mode to spellcheck the commit message.
#
set spell_cmd [list |]
set spell_dict [get_config gui.spellingdictionary]
lappend spell_cmd aspell
if {$spell_dict ne {}} {
lappend spell_cmd --master=$spell_dict
}
lappend spell_cmd --mode=none
lappend spell_cmd --encoding=utf-8
lappend spell_cmd pipe
if {$spell_dict eq {none}
|| [catch {set spell_fd [open $spell_cmd r+]} spell_err]} {
bind_button3 $ui_comm [list tk_popup $ui_comm_ctxm %X %Y]
} else {
set ui_comm_spell [spellcheck::init \
$spell_fd \
$ui_comm \
$ui_comm_ctxm \
]
}
unset -nocomplain spell_cmd spell_fd spell_err spell_dict
} }
lock_index begin-read lock_index begin-read

View File

@ -4,6 +4,7 @@
proc do_about {} { proc do_about {} {
global appvers copyright oguilib global appvers copyright oguilib
global tcl_patchLevel tk_patchLevel global tcl_patchLevel tk_patchLevel
global ui_comm_spell
set w .about_dialog set w .about_dialog
toplevel $w toplevel $w
@ -40,6 +41,10 @@ proc do_about {} {
append v "Tcl version $tcl_patchLevel" append v "Tcl version $tcl_patchLevel"
append v ", Tk version $tk_patchLevel" append v ", Tk version $tk_patchLevel"
} }
if {[info exists ui_comm_spell]} {
append v "\n"
append v [$ui_comm_spell version]
}
set d {} set d {}
append d "git wrapper: $::_git\n" append d "git wrapper: $::_git\n"

View File

@ -280,7 +280,7 @@ The rescan will be automatically started now.
} elseif {[is_config_true gui.trustmtime]} { } elseif {[is_config_true gui.trustmtime]} {
_readtree $this _readtree $this
} else { } else {
ui_status {Refreshing file status...} ui_status [mc "Refreshing file status..."]
set fd [git_read update-index \ set fd [git_read update-index \
-q \ -q \
--unmerged \ --unmerged \
@ -320,7 +320,7 @@ method _readtree {} {
set readtree_d {} set readtree_d {}
$::main_status start \ $::main_status start \
[mc "Updating working directory to '%s'..." [_name $this]] \ [mc "Updating working directory to '%s'..." [_name $this]] \
{files checked out} [mc "files checked out"]
set fd [git_read --stderr read-tree \ set fd [git_read --stderr read-tree \
-m \ -m \
@ -447,7 +447,7 @@ If you wanted to be on a branch, create one now starting from 'This Detached Che
} else { } else {
repository_state commit_type HEAD MERGE_HEAD repository_state commit_type HEAD MERGE_HEAD
set PARENT $HEAD set PARENT $HEAD
ui_status "Checked out '$name'." ui_status [mc "Checked out '%s'." $name]
} }
delete_this delete_this
} }

View File

@ -218,7 +218,7 @@ A good commit message has the following format:
return return
} }
ui_status {Calling pre-commit hook...} ui_status [mc "Calling pre-commit hook..."]
set pch_error {} set pch_error {}
fconfigure $fd_ph -blocking 0 -translation binary -eofchar {} fconfigure $fd_ph -blocking 0 -translation binary -eofchar {}
fileevent $fd_ph readable \ fileevent $fd_ph readable \
@ -233,7 +233,7 @@ proc commit_prehook_wait {fd_ph curHEAD msg_p} {
if {[eof $fd_ph]} { if {[eof $fd_ph]} {
if {[catch {close $fd_ph}]} { if {[catch {close $fd_ph}]} {
catch {file delete $msg_p} catch {file delete $msg_p}
ui_status {Commit declined by pre-commit hook.} ui_status [mc "Commit declined by pre-commit hook."]
hook_failed_popup pre-commit $pch_error hook_failed_popup pre-commit $pch_error
unlock_index unlock_index
} else { } else {
@ -256,7 +256,7 @@ proc commit_commitmsg {curHEAD msg_p} {
return return
} }
ui_status {Calling commit-msg hook...} ui_status [mc "Calling commit-msg hook..."]
set pch_error {} set pch_error {}
fconfigure $fd_ph -blocking 0 -translation binary -eofchar {} fconfigure $fd_ph -blocking 0 -translation binary -eofchar {}
fileevent $fd_ph readable \ fileevent $fd_ph readable \
@ -271,7 +271,7 @@ proc commit_commitmsg_wait {fd_ph curHEAD msg_p} {
if {[eof $fd_ph]} { if {[eof $fd_ph]} {
if {[catch {close $fd_ph}]} { if {[catch {close $fd_ph}]} {
catch {file delete $msg_p} catch {file delete $msg_p}
ui_status {Commit declined by commit-msg hook.} ui_status [mc "Commit declined by commit-msg hook."]
hook_failed_popup commit-msg $pch_error hook_failed_popup commit-msg $pch_error
unlock_index unlock_index
} else { } else {
@ -284,7 +284,7 @@ proc commit_commitmsg_wait {fd_ph curHEAD msg_p} {
} }
proc commit_writetree {curHEAD msg_p} { proc commit_writetree {curHEAD msg_p} {
ui_status {Committing changes...} ui_status [mc "Committing changes..."]
set fd_wt [git_read write-tree] set fd_wt [git_read write-tree]
fileevent $fd_wt readable \ fileevent $fd_wt readable \
[list commit_committree $fd_wt $curHEAD $msg_p] [list commit_committree $fd_wt $curHEAD $msg_p]
@ -301,7 +301,7 @@ proc commit_committree {fd_wt curHEAD msg_p} {
if {[catch {close $fd_wt} err]} { if {[catch {close $fd_wt} err]} {
catch {file delete $msg_p} catch {file delete $msg_p}
error_popup [strcat [mc "write-tree failed:"] "\n\n$err"] error_popup [strcat [mc "write-tree failed:"] "\n\n$err"]
ui_status {Commit failed.} ui_status [mc "Commit failed."]
unlock_index unlock_index
return return
} }
@ -345,7 +345,7 @@ A rescan will be automatically started now.
if {[catch {set cmt_id [eval git $cmd]} err]} { if {[catch {set cmt_id [eval git $cmd]} err]} {
catch {file delete $msg_p} catch {file delete $msg_p}
error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"] error_popup [strcat [mc "commit-tree failed:"] "\n\n$err"]
ui_status {Commit failed.} ui_status [mc "Commit failed."]
unlock_index unlock_index
return return
} }
@ -365,7 +365,7 @@ A rescan will be automatically started now.
} err]} { } err]} {
catch {file delete $msg_p} catch {file delete $msg_p}
error_popup [strcat [mc "update-ref failed:"] "\n\n$err"] error_popup [strcat [mc "update-ref failed:"] "\n\n$err"]
ui_status {Commit failed.} ui_status [mc "Commit failed."]
unlock_index unlock_index
return return
} }

View File

@ -310,7 +310,7 @@ proc add_helper {txt paths} {
update_index \ update_index \
$txt \ $txt \
$pathList \ $pathList \
[concat $after {ui_status {Ready to commit.}}] [concat $after {ui_status [mc "Ready to commit."]}]
} }
} }

View File

@ -116,8 +116,7 @@ method _start {} {
lappend cmd HEAD lappend cmd HEAD
lappend cmd $name lappend cmd $name
set msg [mc "Merging %s and %s" $current_branch $stitle] ui_status [mc "Merging %s and %s..." $current_branch $stitle]
ui_status "$msg..."
set cons [console::new [mc "Merge"] "merge $stitle"] set cons [console::new [mc "Merge"] "merge $stitle"]
console::exec $cons $cmd [cb _finish $cons] console::exec $cons $cmd [cb _finish $cons]
@ -236,7 +235,7 @@ Continue with resetting the current changes?"]
set fd [git_read --stderr read-tree --reset -u -v HEAD] set fd [git_read --stderr read-tree --reset -u -v HEAD]
fconfigure $fd -blocking 0 -translation binary fconfigure $fd -blocking 0 -translation binary
fileevent $fd readable [namespace code [list _reset_wait $fd]] fileevent $fd readable [namespace code [list _reset_wait $fd]]
$::main_status start [mc "Aborting"] {files reset} $::main_status start [mc "Aborting"] [mc "files reset"]
} else { } else {
unlock_index unlock_index
} }

View File

@ -5,6 +5,7 @@ proc save_config {} {
global default_config font_descs global default_config font_descs
global repo_config global_config global repo_config global_config
global repo_config_new global_config_new global repo_config_new global_config_new
global ui_comm_spell
foreach option $font_descs { foreach option $font_descs {
set name [lindex $option 0] set name [lindex $option 0]
@ -52,11 +53,23 @@ proc save_config {} {
set repo_config($name) $value set repo_config($name) $value
} }
} }
if {[info exists repo_config(gui.spellingdictionary)]} {
set value $repo_config(gui.spellingdictionary)
if {$value eq {none}} {
if {[info exists ui_comm_spell]} {
$ui_comm_spell stop
}
} elseif {[info exists ui_comm_spell]} {
$ui_comm_spell lang $value
}
}
} }
proc do_options {} { proc do_options {} {
global repo_config global_config font_descs global repo_config global_config font_descs
global repo_config_new global_config_new global repo_config_new global_config_new
global ui_comm_spell
array unset repo_config_new array unset repo_config_new
array unset global_config_new array unset global_config_new
@ -159,6 +172,34 @@ proc do_options {} {
} }
} }
set all_dicts [linsert \
[spellcheck::available_langs] \
0 \
none]
incr optid
foreach f {repo global} {
if {![info exists ${f}_config_new(gui.spellingdictionary)]} {
if {[info exists ui_comm_spell]} {
set value [$ui_comm_spell lang]
} else {
set value none
}
set ${f}_config_new(gui.spellingdictionary) $value
}
frame $w.$f.$optid
label $w.$f.$optid.l -text [mc "Spelling Dictionary:"]
eval tk_optionMenu $w.$f.$optid.v \
${f}_config_new(gui.spellingdictionary) \
$all_dicts
pack $w.$f.$optid.l -side left -anchor w -fill x
pack $w.$f.$optid.v -side left -anchor w \
-fill x -expand 1 \
-padx 5
pack $w.$f.$optid -side top -anchor w -fill x
}
unset all_dicts
set all_fonts [lsort [font families]] set all_fonts [lsort [font families]]
foreach option $font_descs { foreach option $font_descs {
set name [lindex $option 0] set name [lindex $option 0]

363
git-gui/lib/spellcheck.tcl Normal file
View File

@ -0,0 +1,363 @@
# git-gui spellchecking support through aspell
# Copyright (C) 2008 Shawn Pearce
class spellcheck {
field s_fd {} ; # pipe to aspell
field s_version ; # aspell version string
field s_lang ; # current language code
field w_text ; # text widget we are spelling
field w_menu ; # context menu for the widget
field s_menuidx 0 ; # last index of insertion into $w_menu
field s_i ; # timer registration for _run callbacks
field s_clear 0 ; # did we erase mispelled tags yet?
field s_seen [list] ; # lines last seen from $w_text in _run
field s_checked [list] ; # lines already checked
field s_pending [list] ; # [$line $data] sent to aspell
field s_suggest ; # array, list of suggestions, keyed by misspelling
constructor init {pipe_fd ui_text ui_menu} {
set w_text $ui_text
set w_menu $ui_menu
_connect $this $pipe_fd
return $this
}
method _connect {pipe_fd} {
fconfigure $pipe_fd \
-encoding utf-8 \
-eofchar {} \
-translation lf
if {[gets $pipe_fd s_version] <= 0} {
close $pipe_fd
error [mc "Not connected to aspell"]
}
if {{@(#) } ne [string range $s_version 0 4]} {
close $pipe_fd
error [strcat [mc "Unrecognized aspell version"] ": $s_version"]
}
set s_version [string range $s_version 5 end]
puts $pipe_fd ! ; # enable terse mode
puts $pipe_fd {$$cr master} ; # fetch the language
flush $pipe_fd
gets $pipe_fd s_lang
regexp {[/\\]([^/\\]+)\.[^\.]+$} $s_lang _ s_lang
if {$::default_config(gui.spellingdictionary) eq {}
&& [get_config gui.spellingdictionary] eq {}} {
set ::default_config(gui.spellingdictionary) $s_lang
}
if {$s_fd ne {}} {
catch {close $s_fd}
}
set s_fd $pipe_fd
fconfigure $s_fd -blocking 0
fileevent $s_fd readable [cb _read]
$w_text tag conf misspelled \
-foreground red \
-underline 1
bind_button3 $w_text [cb _popup_suggest %X %Y @%x,%y]
array unset s_suggest
set s_seen [list]
set s_checked [list]
set s_pending [list]
_run $this
}
method lang {{n {}}} {
if {$n ne {} && $s_lang ne $n} {
set spell_cmd [list |]
lappend spell_cmd aspell
lappend spell_cmd --master=$n
lappend spell_cmd --mode=none
lappend spell_cmd --encoding=UTF-8
lappend spell_cmd pipe
_connect $this [open $spell_cmd r+]
}
return $s_lang
}
method version {} {
return "$s_version, $s_lang"
}
method stop {} {
while {$s_menuidx > 0} {
$w_menu delete 0
incr s_menuidx -1
}
$w_text tag delete misspelled
catch {close $s_fd}
catch {after cancel $s_i}
set s_fd {}
set s_i {}
set s_lang {}
}
method _popup_suggest {X Y pos} {
while {$s_menuidx > 0} {
$w_menu delete 0
incr s_menuidx -1
}
set b_loc [$w_text index "$pos wordstart"]
set e_loc [_wordend $this $b_loc]
set orig [$w_text get $b_loc $e_loc]
set tags [$w_text tag names $b_loc]
if {[lsearch -exact $tags misspelled] >= 0} {
if {[info exists s_suggest($orig)]} {
set cnt 0
foreach s $s_suggest($orig) {
if {$cnt < 5} {
$w_menu insert $s_menuidx command \
-label $s \
-command [cb _replace $b_loc $e_loc $s]
incr s_menuidx
incr cnt
} else {
break
}
}
} else {
$w_menu insert $s_menuidx command \
-label [mc "No Suggestions"] \
-state disabled
incr s_menuidx
}
$w_menu insert $s_menuidx separator
incr s_menuidx
}
$w_text mark set saved-insert insert
tk_popup $w_menu $X $Y
}
method _replace {b_loc e_loc word} {
$w_text configure -autoseparators 0
$w_text edit separator
$w_text delete $b_loc $e_loc
$w_text insert $b_loc $word
$w_text edit separator
$w_text configure -autoseparators 1
$w_text mark set insert saved-insert
}
method _restart_timer {} {
set s_i [after 300 [cb _run]]
}
proc _match_length {max_line arr_name} {
upvar $arr_name a
if {[llength $a] > $max_line} {
set a [lrange $a 0 $max_line]
}
while {[llength $a] <= $max_line} {
lappend a {}
}
}
method _wordend {pos} {
set pos [$w_text index "$pos wordend"]
set tags [$w_text tag names $pos]
while {[lsearch -exact $tags misspelled] >= 0} {
set pos [$w_text index "$pos +1c"]
set tags [$w_text tag names $pos]
}
return $pos
}
method _run {} {
set cur_pos [$w_text index {insert -1c}]
set cur_line [lindex [split $cur_pos .] 0]
set max_line [lindex [split [$w_text index end] .] 0]
_match_length $max_line s_seen
_match_length $max_line s_checked
# Nothing in the message buffer? Nothing to spellcheck.
#
if {$cur_line == 1
&& $max_line == 2
&& [$w_text get 1.0 end] eq "\n"} {
array unset s_suggest
_restart_timer $this
return
}
set active 0
for {set n 1} {$n <= $max_line} {incr n} {
set s [$w_text get "$n.0" "$n.end"]
# Don't spellcheck the current line unless we are at
# a word boundary. The user might be typing on it.
#
if {$n == $cur_line
&& ![regexp {^\W$} [$w_text get $cur_pos insert]]} {
# If the current word is mispelled remove the tag
# but force a spellcheck later.
#
set tags [$w_text tag names $cur_pos]
if {[lsearch -exact $tags misspelled] >= 0} {
$w_text tag remove misspelled \
"$cur_pos wordstart" \
[_wordend $this $cur_pos]
lset s_seen $n $s
lset s_checked $n {}
}
continue
}
if {[lindex $s_seen $n] eq $s
&& [lindex $s_checked $n] ne $s} {
# Don't send empty lines to Aspell it doesn't check them.
#
if {$s eq {}} {
lset s_checked $n $s
continue
}
# Don't send typical s-b-o lines as the emails are
# almost always misspelled according to Aspell.
#
if {[regexp -nocase {^[a-z-]+-by:.*<.*@.*>$} $s]} {
$w_text tag remove misspelled "$n.0" "$n.end"
lset s_checked $n $s
continue
}
puts $s_fd ^$s
lappend s_pending [list $n $s]
set active 1
} else {
# Delay until another idle loop to make sure we don't
# spellcheck lines the user is actively changing.
#
lset s_seen $n $s
}
}
if {$active} {
set s_clear 1
flush $s_fd
} else {
_restart_timer $this
}
}
method _read {} {
while {[gets $s_fd line] >= 0} {
set lineno [lindex $s_pending 0 0]
if {$s_clear} {
$w_text tag remove misspelled "$lineno.0" "$lineno.end"
set s_clear 0
}
if {$line eq {}} {
lset s_checked $lineno [lindex $s_pending 0 1]
set s_pending [lrange $s_pending 1 end]
set s_clear 1
continue
}
set sugg [list]
switch -- [string range $line 0 1] {
{& } {
set line [split [string range $line 2 end] :]
set info [split [lindex $line 0] { }]
set orig [lindex $info 0]
set offs [lindex $info 2]
foreach s [split [lindex $line 1] ,] {
lappend sugg [string range $s 1 end]
}
}
{# } {
set info [split [string range $line 2 end] { }]
set orig [lindex $info 0]
set offs [lindex $info 1]
}
default {
puts stderr "<spell> $line"
continue
}
}
incr offs -1
set b_loc "$lineno.$offs"
set e_loc [$w_text index "$lineno.$offs wordend"]
set curr [$w_text get $b_loc $e_loc]
# At least for English curr = "bob", orig = "bob's"
# so Tk didn't include the 's but Aspell did. We
# try to round out the word.
#
while {$curr ne $orig
&& [string equal -length [llength $curr] $curr $orig]} {
set n_loc [$w_text index "$e_loc +1c"]
set n_curr [$w_text get $b_loc $n_loc]
if {$n_curr eq $curr} {
break
}
set curr $n_curr
set e_loc $n_loc
}
if {$curr eq $orig} {
$w_text tag add misspelled $b_loc $e_loc
if {[llength $sugg] > 0} {
set s_suggest($orig) $sugg
} else {
unset -nocomplain s_suggest($orig)
}
} else {
unset -nocomplain s_suggest($orig)
}
}
fconfigure $s_fd -block 1
if {[eof $s_fd]} {
if {![catch {close $s_fd} err]} {
set err [mc "unexpected eof from aspell"]
}
catch {after cancel $s_i}
$w_text tag remove misspelled 1.0 end
error_popup [strcat "Spell Checker Failed" "\n\n" $err]
return
}
fconfigure $s_fd -block 0
if {[llength $s_pending] == 0} {
_restart_timer $this
}
}
proc available_langs {} {
set langs [list]
catch {
set fd [open [list | aspell dump dicts] r]
while {[gets $fd line] >= 0} {
if {$line eq {}} continue
lappend langs $line
}
close $fd
}
return $langs
}
}

View File

@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>English</string> <string>English</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>Wish</string> <string>@@GITGUI_TKEXECUTABLE@@</string>
<key>CFBundleGetInfoString</key> <key>CFBundleGetInfoString</key>
<string>Git Gui @@GITGUI_VERSION@@ © 2006-2007 Shawn Pearce, et. al.</string> <string>Git Gui @@GITGUI_VERSION@@ © 2006-2007 Shawn Pearce, et. al.</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: git-gui\n" "Project-Id-Version: git-gui\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-11-24 10:36+0100\n" "POT-Creation-Date: 2008-02-02 10:14+0100\n"
"PO-Revision-Date: 2008-01-15 20:33+0100\n" "PO-Revision-Date: 2008-02-02 10:18+0100\n"
"Last-Translator: Christian Stimming <stimming@tuhh.de>\n" "Last-Translator: Christian Stimming <stimming@tuhh.de>\n"
"Language-Team: German\n" "Language-Team: German\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -343,7 +343,9 @@ msgstr "Online-Dokumentation"
#: git-gui.sh:2201 #: git-gui.sh:2201
#, tcl-format #, tcl-format
msgid "fatal: cannot stat path %s: No such file or directory" msgid "fatal: cannot stat path %s: No such file or directory"
msgstr "Fehler: Verzeichnis »%s« kann nicht gelesen werden: Datei oder Verzeichnis nicht gefunden" msgstr ""
"Fehler: Verzeichnis »%s« kann nicht gelesen werden: Datei oder Verzeichnis "
"nicht gefunden"
#: git-gui.sh:2234 #: git-gui.sh:2234
msgid "Current Branch:" msgid "Current Branch:"
@ -371,19 +373,19 @@ msgstr "Erste Versionsbeschreibung:"
#: git-gui.sh:2370 #: git-gui.sh:2370
msgid "Amended Commit Message:" msgid "Amended Commit Message:"
msgstr "Nachgebesserte Versionsbeschreibung:" msgstr "Nachgebesserte Beschreibung:"
#: git-gui.sh:2371 #: git-gui.sh:2371
msgid "Amended Initial Commit Message:" msgid "Amended Initial Commit Message:"
msgstr "Nachgebesserte erste Versionsbeschreibung:" msgstr "Nachgebesserte erste Beschreibung:"
#: git-gui.sh:2372 #: git-gui.sh:2372
msgid "Amended Merge Commit Message:" msgid "Amended Merge Commit Message:"
msgstr "Nachgebesserte Zusammenführungs-Versionsbeschreibung:" msgstr "Nachgebesserte Zusammenführungs-Beschreibung:"
#: git-gui.sh:2373 #: git-gui.sh:2373
msgid "Merge Commit Message:" msgid "Merge Commit Message:"
msgstr "Zusammenführungs-Versionsbeschreibung:" msgstr "Zusammenführungs-Beschreibung:"
#: git-gui.sh:2374 #: git-gui.sh:2374
msgid "Commit Message:" msgid "Commit Message:"
@ -397,31 +399,31 @@ msgstr "Alle kopieren"
msgid "File:" msgid "File:"
msgstr "Datei:" msgstr "Datei:"
#: git-gui.sh:2545 #: git-gui.sh:2573
msgid "Refresh"
msgstr "Aktualisieren"
#: git-gui.sh:2566
msgid "Apply/Reverse Hunk" msgid "Apply/Reverse Hunk"
msgstr "Kontext anwenden/umkehren" msgstr "Kontext anwenden/umkehren"
#: git-gui.sh:2572 #: git-gui.sh:2579
msgid "Decrease Font Size"
msgstr "Schriftgröße verkleinern"
#: git-gui.sh:2576
msgid "Increase Font Size"
msgstr "Schriftgröße vergrößern"
#: git-gui.sh:2581
msgid "Show Less Context" msgid "Show Less Context"
msgstr "Weniger Zeilen anzeigen" msgstr "Weniger Zeilen anzeigen"
#: git-gui.sh:2588 #: git-gui.sh:2586
msgid "Show More Context" msgid "Show More Context"
msgstr "Mehr Zeilen anzeigen" msgstr "Mehr Zeilen anzeigen"
#: git-gui.sh:2602 #: git-gui.sh:2594
msgid "Refresh"
msgstr "Aktualisieren"
#: git-gui.sh:2615
msgid "Decrease Font Size"
msgstr "Schriftgröße verkleinern"
#: git-gui.sh:2619
msgid "Increase Font Size"
msgstr "Schriftgröße vergrößern"
#: git-gui.sh:2630
msgid "Unstage Hunk From Commit" msgid "Unstage Hunk From Commit"
msgstr "Kontext aus Bereitstellung herausnehmen" msgstr "Kontext aus Bereitstellung herausnehmen"
@ -542,7 +544,7 @@ msgstr "Kopiert oder verschoben durch:"
#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 #: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19
msgid "Checkout Branch" msgid "Checkout Branch"
msgstr "Zweig umstellen" msgstr "Auf Zweig umstellen"
#: lib/branch_checkout.tcl:23 #: lib/branch_checkout.tcl:23
msgid "Checkout" msgid "Checkout"
@ -805,11 +807,15 @@ msgstr ""
msgid "Updating working directory to '%s'..." msgid "Updating working directory to '%s'..."
msgstr "Arbeitskopie umstellen auf »%s«..." msgstr "Arbeitskopie umstellen auf »%s«..."
#: lib/checkout_op.tcl:323
msgid "files checked out"
msgstr "Dateien aktualisiert"
#: lib/checkout_op.tcl:353 #: lib/checkout_op.tcl:353
#, tcl-format #, tcl-format
msgid "Aborted checkout of '%s' (file level merging is required)." msgid "Aborted checkout of '%s' (file level merging is required)."
msgstr "" msgstr ""
"Zweig umstellen von »%s« abgebrochen (Zusammenführen der Dateien ist " "Auf Zweig »%s« umstellen abgebrochen (Zusammenführen der Dateien ist "
"notwendig)." "notwendig)."
#: lib/checkout_op.tcl:354 #: lib/checkout_op.tcl:354
@ -1069,15 +1075,21 @@ msgstr "Für Objekt konnte kein Hardlink erstellt werden: %s"
#: lib/choose_repository.tcl:847 #: lib/choose_repository.tcl:847
msgid "Cannot fetch branches and objects. See console output for details." msgid "Cannot fetch branches and objects. See console output for details."
msgstr "Zweige und Objekte konnten nicht angefordert werden. Kontrollieren Sie die Ausgaben auf der Konsole für weitere Angaben." msgstr ""
"Zweige und Objekte konnten nicht angefordert werden. Kontrollieren Sie die "
"Ausgaben auf der Konsole für weitere Angaben."
#: lib/choose_repository.tcl:858 #: lib/choose_repository.tcl:858
msgid "Cannot fetch tags. See console output for details." msgid "Cannot fetch tags. See console output for details."
msgstr "Markierungen konnten nicht angefordert werden. Kontrollieren Sie die Ausgaben auf der Konsole für weitere Angaben." msgstr ""
"Markierungen konnten nicht angefordert werden. Kontrollieren Sie die "
"Ausgaben auf der Konsole für weitere Angaben."
#: lib/choose_repository.tcl:882 #: lib/choose_repository.tcl:882
msgid "Cannot determine HEAD. See console output for details." msgid "Cannot determine HEAD. See console output for details."
msgstr "Die Zweigspitze (HEAD) konnte nicht gefunden werden. Kontrollieren Sie die Ausgaben auf der Konsole für weitere Angaben." msgstr ""
"Die Zweigspitze (HEAD) konnte nicht gefunden werden. Kontrollieren Sie die "
"Ausgaben auf der Konsole für weitere Angaben."
#: lib/choose_repository.tcl:891 #: lib/choose_repository.tcl:891
#, tcl-format #, tcl-format
@ -1273,11 +1285,40 @@ msgstr ""
"\n" "\n"
"- Rest: Eine ausführliche Beschreibung, warum diese Änderung hilfreich ist.\n" "- Rest: Eine ausführliche Beschreibung, warum diese Änderung hilfreich ist.\n"
#: lib/commit.tcl:257 #: lib/commit.tcl:207
#, tcl-format
msgid "warning: Tcl does not support encoding '%s'."
msgstr "Warning: Tcl/Tk unterstützt die Zeichencodierung »%s« nicht."
#: lib/commit.tcl:221
msgid "Calling pre-commit hook..."
msgstr ""
#: lib/commit.tcl:236
msgid "Commit declined by pre-commit hook."
msgstr ""
#: lib/commit.tcl:259
msgid "Calling commit-msg hook..."
msgstr ""
#: lib/commit.tcl:274
msgid "Commit declined by commit-msg hook."
msgstr ""
#: lib/commit.tcl:287
msgid "Committing changes..."
msgstr "Änderungen eintragen..."
#: lib/commit.tcl:303
msgid "write-tree failed:" msgid "write-tree failed:"
msgstr "write-tree fehlgeschlagen:" msgstr "write-tree fehlgeschlagen:"
#: lib/commit.tcl:275 #: lib/commit.tcl:304 lib/commit.tcl:348 lib/commit.tcl:368
msgid "Commit failed."
msgstr "Eintragen fehlgeschlagen."
#: lib/commit.tcl:321
#, tcl-format #, tcl-format
msgid "Commit %s appears to be corrupt" msgid "Commit %s appears to be corrupt"
msgstr "Version »%s« scheint beschädigt zu sein" msgstr "Version »%s« scheint beschädigt zu sein"
@ -1301,12 +1342,7 @@ msgstr ""
msgid "No changes to commit." msgid "No changes to commit."
msgstr "Keine Änderungen, die eingetragen werden können." msgstr "Keine Änderungen, die eingetragen werden können."
#: lib/commit.tcl:303 #: lib/commit.tcl:347
#, tcl-format
msgid "warning: Tcl does not support encoding '%s'."
msgstr "Warning: Tcl/Tk unterstützt die Zeichencodierung »%s« nicht."
#: lib/commit.tcl:317
msgid "commit-tree failed:" msgid "commit-tree failed:"
msgstr "commit-tree fehlgeschlagen:" msgstr "commit-tree fehlgeschlagen:"
@ -1440,7 +1476,8 @@ msgstr "Fehler beim Laden des Vergleichs:"
#: lib/diff.tcl:302 #: lib/diff.tcl:302
msgid "Failed to unstage selected hunk." msgid "Failed to unstage selected hunk."
msgstr "Fehler beim Herausnehmen des gewählten Kontexts aus der Bereitstellung." msgstr ""
"Fehler beim Herausnehmen des gewählten Kontexts aus der Bereitstellung."
#: lib/diff.tcl:309 #: lib/diff.tcl:309
msgid "Failed to stage selected hunk." msgid "Failed to stage selected hunk."
@ -1471,7 +1508,10 @@ msgstr "Fehler in Bereitstellung"
msgid "" msgid ""
"Updating the Git index failed. A rescan will be automatically started to " "Updating the Git index failed. A rescan will be automatically started to "
"resynchronize git-gui." "resynchronize git-gui."
msgstr "Das Aktualisieren der Git-Bereitstellung ist fehlgeschlagen. Eine allgemeine Git-Aktualisierung wird jetzt gestartet, um git-gui wieder mit git zu synchronisieren." msgstr ""
"Das Aktualisieren der Git-Bereitstellung ist fehlgeschlagen. Eine allgemeine "
"Git-Aktualisierung wird jetzt gestartet, um git-gui wieder mit git zu "
"synchronisieren."
#: lib/index.tcl:27 #: lib/index.tcl:27
msgid "Continue" msgid "Continue"
@ -1486,6 +1526,10 @@ msgstr "Bereitstellung freigeben"
msgid "Unstaging %s from commit" msgid "Unstaging %s from commit"
msgstr "Datei »%s« aus der Bereitstellung herausnehmen" msgstr "Datei »%s« aus der Bereitstellung herausnehmen"
#: lib/index.tcl:313
msgid "Ready to commit."
msgstr "Bereit zum Eintragen."
#: lib/index.tcl:326 #: lib/index.tcl:326
#, tcl-format #, tcl-format
msgid "Adding %s" msgid "Adding %s"
@ -1503,7 +1547,8 @@ msgstr "Änderungen in den gewählten %i Dateien verwerfen?"
#: lib/index.tcl:389 #: lib/index.tcl:389
msgid "Any unstaged changes will be permanently lost by the revert." msgid "Any unstaged changes will be permanently lost by the revert."
msgstr "Alle nicht bereitgestellten Änderungen werden beim Verwerfen verloren gehen." msgstr ""
"Alle nicht bereitgestellten Änderungen werden beim Verwerfen verloren gehen."
#: lib/index.tcl:392 #: lib/index.tcl:392
msgid "Do Nothing" msgid "Do Nothing"
@ -1641,7 +1686,11 @@ msgstr ""
msgid "Aborting" msgid "Aborting"
msgstr "Abbruch" msgstr "Abbruch"
#: lib/merge.tcl:266 #: lib/merge.tcl:238
msgid "files reset"
msgstr "Dateien zurückgesetzt"
#: lib/merge.tcl:265
msgid "Abort failed." msgid "Abort failed."
msgstr "Abbruch fehlgeschlagen." msgstr "Abbruch fehlgeschlagen."

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-11-24 10:36+0100\n" "POT-Creation-Date: 2008-02-02 10:14+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -386,31 +386,31 @@ msgstr ""
msgid "File:" msgid "File:"
msgstr "" msgstr ""
#: git-gui.sh:2545 #: git-gui.sh:2573
msgid "Refresh"
msgstr ""
#: git-gui.sh:2566
msgid "Apply/Reverse Hunk" msgid "Apply/Reverse Hunk"
msgstr "" msgstr ""
#: git-gui.sh:2572 #: git-gui.sh:2579
msgid "Decrease Font Size"
msgstr ""
#: git-gui.sh:2576
msgid "Increase Font Size"
msgstr ""
#: git-gui.sh:2581
msgid "Show Less Context" msgid "Show Less Context"
msgstr "" msgstr ""
#: git-gui.sh:2588 #: git-gui.sh:2586
msgid "Show More Context" msgid "Show More Context"
msgstr "" msgstr ""
#: git-gui.sh:2602 #: git-gui.sh:2594
msgid "Refresh"
msgstr ""
#: git-gui.sh:2615
msgid "Decrease Font Size"
msgstr ""
#: git-gui.sh:2619
msgid "Increase Font Size"
msgstr ""
#: git-gui.sh:2630
msgid "Unstage Hunk From Commit" msgid "Unstage Hunk From Commit"
msgstr "" msgstr ""
@ -766,6 +766,10 @@ msgstr ""
msgid "Updating working directory to '%s'..." msgid "Updating working directory to '%s'..."
msgstr "" msgstr ""
#: lib/checkout_op.tcl:323
msgid "files checked out"
msgstr ""
#: lib/checkout_op.tcl:353 #: lib/checkout_op.tcl:353
#, tcl-format #, tcl-format
msgid "Aborted checkout of '%s' (file level merging is required)." msgid "Aborted checkout of '%s' (file level merging is required)."
@ -1182,11 +1186,40 @@ msgid ""
"- Remaining lines: Describe why this change is good.\n" "- Remaining lines: Describe why this change is good.\n"
msgstr "" msgstr ""
#: lib/commit.tcl:257 #: lib/commit.tcl:207
#, tcl-format
msgid "warning: Tcl does not support encoding '%s'."
msgstr ""
#: lib/commit.tcl:221
msgid "Calling pre-commit hook..."
msgstr ""
#: lib/commit.tcl:236
msgid "Commit declined by pre-commit hook."
msgstr ""
#: lib/commit.tcl:259
msgid "Calling commit-msg hook..."
msgstr ""
#: lib/commit.tcl:274
msgid "Commit declined by commit-msg hook."
msgstr ""
#: lib/commit.tcl:287
msgid "Committing changes..."
msgstr ""
#: lib/commit.tcl:303
msgid "write-tree failed:" msgid "write-tree failed:"
msgstr "" msgstr ""
#: lib/commit.tcl:275 #: lib/commit.tcl:304 lib/commit.tcl:348 lib/commit.tcl:368
msgid "Commit failed."
msgstr ""
#: lib/commit.tcl:321
#, tcl-format #, tcl-format
msgid "Commit %s appears to be corrupt" msgid "Commit %s appears to be corrupt"
msgstr "" msgstr ""
@ -1204,12 +1237,7 @@ msgstr ""
msgid "No changes to commit." msgid "No changes to commit."
msgstr "" msgstr ""
#: lib/commit.tcl:303 #: lib/commit.tcl:347
#, tcl-format
msgid "warning: Tcl does not support encoding '%s'."
msgstr ""
#: lib/commit.tcl:317
msgid "commit-tree failed:" msgid "commit-tree failed:"
msgstr "" msgstr ""
@ -1373,6 +1401,10 @@ msgstr ""
msgid "Unstaging %s from commit" msgid "Unstaging %s from commit"
msgstr "" msgstr ""
#: lib/index.tcl:313
msgid "Ready to commit."
msgstr ""
#: lib/index.tcl:326 #: lib/index.tcl:326
#, tcl-format #, tcl-format
msgid "Adding %s" msgid "Adding %s"
@ -1491,7 +1523,11 @@ msgstr ""
msgid "Aborting" msgid "Aborting"
msgstr "" msgstr ""
#: lib/merge.tcl:266 #: lib/merge.tcl:238
msgid "files reset"
msgstr ""
#: lib/merge.tcl:265
msgid "Abort failed." msgid "Abort failed."
msgstr "" msgstr ""