XDCC-Fetch 1.386

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. data/COPYING +23 -0
  2. data/XDCC-Fetch.rbw +54 -0
  3. data/doc/ark.png +0 -0
  4. data/doc/connect_established.png +0 -0
  5. data/doc/index.html +300 -0
  6. data/doc/mega_ark.png +0 -0
  7. data/doc/package.png +0 -0
  8. data/doc/package_unknown.png +0 -0
  9. data/doc/shot1.png +0 -0
  10. data/doc/shot1_mini.png +0 -0
  11. data/doc/shot2.png +0 -0
  12. data/doc/shot2_mini.png +0 -0
  13. data/doc/xdccfetch.css +155 -0
  14. data/icons/ark.png +0 -0
  15. data/icons/ark_big.png +0 -0
  16. data/icons/camera_test.png +0 -0
  17. data/icons/cancel.png +0 -0
  18. data/icons/connect_creating.png +0 -0
  19. data/icons/connect_established.png +0 -0
  20. data/icons/connect_failed.png +0 -0
  21. data/icons/connect_no.png +0 -0
  22. data/icons/edit_add.png +0 -0
  23. data/icons/edit_remove.png +0 -0
  24. data/icons/exit.png +0 -0
  25. data/icons/fileclose.png +0 -0
  26. data/icons/folder_inbox.png +0 -0
  27. data/icons/idea.png +0 -0
  28. data/icons/mega_ark.png +0 -0
  29. data/icons/messagebox_critical.png +0 -0
  30. data/icons/messagebox_info.png +0 -0
  31. data/icons/messagebox_warning.png +0 -0
  32. data/icons/messagebox_warning_small.png +0 -0
  33. data/icons/package.png +0 -0
  34. data/icons/package_favourite.png +0 -0
  35. data/icons/package_unknown.png +0 -0
  36. data/src/Console/Console_Parser.rb +71 -0
  37. data/src/Console/XDCC_Pack_Match_Template.rb +29 -0
  38. data/src/Console/xdcc-fetch.rb +123 -0
  39. data/src/GUI/About_Dialog.rb +50 -0
  40. data/src/GUI/Application_Builder.rb +280 -0
  41. data/src/GUI/Context_Menu.rb +81 -0
  42. data/src/GUI/Custom_Tabs.rb +60 -0
  43. data/src/GUI/Dialog_Box.rb +116 -0
  44. data/src/GUI/Download_Finished_Box.rb +41 -0
  45. data/src/GUI/Empty_Text_Field_Handler.rb +86 -0
  46. data/src/GUI/Gui_Logic.rb +629 -0
  47. data/src/GUI/Icon_Loader.rb +58 -0
  48. data/src/GUI/Main_Window.rb +227 -0
  49. data/src/GUI/Packet_Item.rb +171 -0
  50. data/src/GUI/Packet_List.rb +145 -0
  51. data/src/GUI/Speed_Widget.rb +101 -0
  52. data/src/GUI/Talk_Back.rb +118 -0
  53. data/src/GUI/Toggle_Button.rb +56 -0
  54. data/src/Network/CTCP_Handler.rb +61 -0
  55. data/src/Network/DCC_File.rb +323 -0
  56. data/src/Network/DCC_Parser.rb +71 -0
  57. data/src/Network/IPAddr_Ext.rb +76 -0
  58. data/src/Network/IRC_Message.rb +161 -0
  59. data/src/Network/IRC_Server.rb +273 -0
  60. data/src/Network/IRC_Server_Respond_Map.rb +223 -0
  61. data/src/Network/IRC_User.rb +58 -0
  62. data/src/Network/TCP_Connection.rb +168 -0
  63. data/src/Network/XDCC_Announcement.rb +120 -0
  64. data/src/Network/XDCC_Announcement_Storage.rb +167 -0
  65. data/src/Network/XDCC_Download_Handler.rb +412 -0
  66. data/src/Network/XDCC_Pack.rb +58 -0
  67. data/src/Network/XDCC_Parser.rb +253 -0
  68. data/src/Translations/README +61 -0
  69. data/src/Translations/check_translations +83 -0
  70. data/src/Translations/de.rb +140 -0
  71. data/src/Translations/en.rb +145 -0
  72. data/src/Utilities/Configuration.rb +91 -0
  73. data/src/Utilities/Events.rb +87 -0
  74. data/src/Utilities/Globals.rb +138 -0
  75. data/src/Utilities/PrettyException.rb +1091 -0
  76. data/src/Utilities/Recursive_Open_Struct.rb +159 -0
  77. data/src/Utilities/Timer.rb +71 -0
  78. metadata +135 -0
@@ -0,0 +1,253 @@
1
+ # Copyright (c) 2004-2005, Christoph Heindl
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without modification,
5
+ # are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice, this list
8
+ # of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright notice, this list
10
+ # of conditions and the following disclaimer in the documentation and/or other materials
11
+ # provided with the distribution.
12
+ # * Neither the name of Christoph Heindl nor the names of its contributors may be used to
13
+ # endorse or promote products derived from this software without specific prior written
14
+ # permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
17
+ # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
19
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
23
+ # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+ require 'src/Utilities/Timer.rb'
26
+ require 'src/Network/XDCC_Announcement'
27
+ require 'src/Network/XDCC_Pack.rb'
28
+ require 'set'
29
+
30
+ # Used for parsing xdcc announcements. During parsing, special precautions have been set
31
+ # in order to prevent endless parsing of single announcement. Detects full announcements and
32
+ # broken/minimal announcements.
33
+ class XDCC_Parser
34
+ include Event_Publisher
35
+
36
+ @@timer = Timer.new(3)
37
+
38
+ # -- Connectable events
39
+
40
+ # Whenever a XDCC_Announcement completed. Args: XDCC_Announcement
41
+ ON_ANNOUNCEMENT = Event_Publisher.next_global_eventID
42
+
43
+ def initialize(proc_parse_ann, proc_parse_pack)
44
+ @unfinished_entities = Hash.new # All currently unfinished announcements
45
+ @finished_entities = Array.new
46
+ @irc_servers = Array.new # All irc_servers we are currently connected to
47
+ @parse_ann = proc_parse_ann # Parses the beginning of an annoucement
48
+ @parse_pack = proc_parse_pack # Parses a single offered pack
49
+ @mutex_unfinished = Mutex.new
50
+ @mutex_finished = Mutex.new
51
+ @max_idle_running = 5
52
+ self.init_events
53
+ @@timer.connect_to_events(Timer::ON_TIMER, self)
54
+ end
55
+
56
+ # Prepare for deletion
57
+ def shutdown
58
+ @irc_servers.each do |server|
59
+ self.detach_from_server(server)
60
+ end
61
+ @@timer.disconnect_from_events(Timer::ON_TIMER, self)
62
+ @mutex_unfinished.sychronize do
63
+ @unfinished_entities.clear
64
+ end
65
+ @mutex_finished.sychronize do
66
+ @finished_entities.clear
67
+ end
68
+ end
69
+
70
+ # Start tracking announcements on the given IRC_Server
71
+ def attach_to_server(irc_server)
72
+ if !@irc_servers.member?(irc_server)
73
+ @irc_servers << irc_server
74
+ irc_server.connect_to_events(IRC_Server::ON_USER_QUIT |
75
+ IRC_Server::ON_USER_MESSAGE|
76
+ IRC_Server::ON_SERVER_DISCONNECTED,
77
+ self)
78
+ end
79
+ end
80
+
81
+ # Stop tracking announcements on the specified IRC_Server
82
+ def detach_from_server(irc_server)
83
+ server = @irc_servers.delete(irc_server)
84
+ irc_server.disconnect_from_events(IRC_Server::ON_USER_QUIT |
85
+ IRC_Server::ON_USER_MESSAGE|
86
+ IRC_Server::ON_SERVER_DISCONNECTED,
87
+ self) if irc_server
88
+ end
89
+
90
+ # A user has quit irc. Delete its announcements
91
+ def user_quit(irc_user)
92
+ @mutex_unfinished.synchronize do
93
+ @unfinished_entities.delete(irc_user)
94
+ end
95
+ end
96
+
97
+ # A user sent a message. Parse message.
98
+ def user_message(irc_user, message, targets)
99
+ @mutex_unfinished.synchronize do
100
+ entity = @unfinished_entities[irc_user]
101
+ if entity
102
+ # An unfinished parsing entity was found
103
+ pack = @parse_pack.call(irc_user, message)
104
+ if pack
105
+ entity.ann.packs << pack
106
+ entity.last_update = Time.now
107
+ entity.idle_running_cnt = 0
108
+ elsif (ann = @parse_ann.call(irc_user, message, targets)) &&
109
+ (entity.ann.ann_type == XDCC_Announcement::ANN_MINIMAL)
110
+ # Unfinished minimal/broken XDCC_Announcements are replaced if
111
+ # a full announcement starts while still parsing the unfinished
112
+ # minimal/broken announcement.
113
+ @unfinished_entities.delete(irc_user)
114
+ entity = Parser_Entity.new
115
+ entity.ann = ann
116
+ entity.last_update = Time.now
117
+ entity.idle_running_cnt = 0
118
+ @unfinished_entities.store(irc_user, entity)
119
+ else
120
+ entity.idle_running_cnt += 1
121
+ if entity.idle_running_cnt > @max_idle_running
122
+ @unfinished_entities.delete(irc_user)
123
+ end
124
+ end
125
+ else
126
+ # No unfinished parsing entity.
127
+ ann = @parse_ann.call(irc_user, message, targets)
128
+ if ann
129
+ entity = Parser_Entity.new
130
+ entity.ann = ann
131
+ entity.last_update = Time.now
132
+ entity.idle_running_cnt = 0
133
+ @unfinished_entities.store(irc_user, entity)
134
+ elsif pack = @parse_pack.call(irc_user, message)
135
+ entity = Parser_Entity.new
136
+ entity.ann = XDCC_Announcement.new(irc_user, XDCC_Announcement::ANN_MINIMAL)
137
+ entity.ann.targets = targets
138
+ entity.ann.packs << pack
139
+ entity.last_update = Time.now
140
+ entity.idle_running_cnt = 0
141
+ @unfinished_entities.store(irc_user, entity)
142
+ end
143
+ end
144
+ if entity && entity.ann.completed?
145
+ # A full announcement has finished
146
+ @unfinished_entities.delete(irc_user)
147
+ @mutex_finished.synchronize do
148
+ @finished_entities << entity
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ def on_timer(timestamp)
155
+ # Broadcast finished packs
156
+ @mutex_finished.synchronize do
157
+ @finished_entities.each do |entity|
158
+ self.fire_event(ON_ANNOUNCEMENT, entity.ann)
159
+ end
160
+ @finished_entities.clear
161
+ end
162
+ # Kill broken announcements
163
+ @mutex_unfinished.synchronize do
164
+ @unfinished_entities.delete_if do |irc_user, entity|
165
+ ret = (timestamp - entity.last_update) > 30
166
+ if ret && entity.ann.ann_type == XDCC_Announcement::ANN_MINIMAL
167
+ # More then 30 seconds have passed since last bot message
168
+ # Treat broken announcement as completed
169
+ @mutex_finished.synchronize do
170
+ @finished_entities << entity
171
+ end
172
+ end
173
+ ret
174
+ end
175
+ end
176
+ end
177
+
178
+ def server_disconnect(irc_server)
179
+ @mutex_unfinished.synchronize do
180
+ @unfinished_entities.delete_if do |irc_user, entity|
181
+ irc_user.irc_server == irc_server
182
+ end
183
+ end
184
+ @mutex_finished.synchronize do
185
+ @finished_entities.delete_if do |entity|
186
+ entity.ann.irc_user_bot.irc_server == irc_server
187
+ end
188
+ end
189
+ end
190
+
191
+ def on_event(caller, eventtype, eventargs)
192
+ case eventtype
193
+ when IRC_Server::ON_USER_QUIT
194
+ self.user_quit(eventargs[0])
195
+
196
+ when IRC_Server::ON_USER_MESSAGE
197
+ self.user_message(eventargs[0], eventargs[1], eventargs[2])
198
+
199
+ when IRC_Server::ON_SERVER_DISCONNECTED
200
+ self.server_disconnect(caller)
201
+
202
+ when Timer::ON_TIMER
203
+ self.on_timer(eventargs[0])
204
+
205
+
206
+ end
207
+ end
208
+
209
+ def XDCC_Parser.iroffer_parser
210
+ # Parses the start of a full announcement
211
+ proc_ann = proc do |irc_user, message, targets|
212
+ if reg = $cfg.network.xdcc.offer_regexp.match(message)
213
+ ann = XDCC_Announcement.new(irc_user)
214
+ ann.pack_cnt = reg[1].to_i
215
+ ann.openslot_cnt = reg[2].to_i
216
+ ann.slot_cnt = reg[3].to_i
217
+ ann.targets = targets
218
+ # Try to fetch queue info
219
+ if queue_info = $cfg.network.xdcc.queue_regexp.match(message)
220
+ ann.openqueue_cnt = queue_info[1].to_i
221
+ ann.queue_cnt = queue_info[2].to_i
222
+ end
223
+ ann
224
+ else
225
+ nil
226
+ end
227
+ end
228
+
229
+ # Parses a single pack within a full announcement
230
+ proc_pack = proc do |irc_user, message|
231
+ # Example: \002#1 \002 0x [123K] iroffer1.3.b09.tgz
232
+ if reg = $cfg.network.xdcc.pack_regexp.match(message)
233
+ pack = XDCC_Pack.new(irc_user)
234
+ pack.pack_nr = reg[1].to_i;
235
+ pack.download_cnt = reg[2].to_i;
236
+ pack.size = reg[3];
237
+ # Delete all style and/or color codes in pack name and leading/trailing spaces afterwards
238
+ pack.name = IRC_Message.delete_spaces(IRC_Message.delete_control_codes(reg[4]))
239
+ pack
240
+ else
241
+ nil
242
+ end
243
+ end
244
+ XDCC_Parser.new(proc_ann, proc_pack)
245
+ end
246
+ end
247
+
248
+ # Structure used while parsing an announcement
249
+ class Parser_Entity
250
+ attr_accessor :ann
251
+ attr_accessor :last_update
252
+ attr_accessor :idle_running_cnt
253
+ end
@@ -0,0 +1,61 @@
1
+ = XDCC-Fetch Translation HOW-TO
2
+
3
+ Creating a new translation is very simple, just follow the next steps.
4
+
5
+ 1. Download the latest version of XDCC-Fetch, extract it, and move to
6
+ the directory "src/Translations".
7
+
8
+ 1. Copy the file "en.rb" to a filename that matches your language. (E.g.
9
+ "de.rb" if you want to translate into German)
10
+
11
+ 1. Open the newly created file with your favourite texteditor, and find
12
+ the following section:
13
+
14
+ lang = $cfg.text.en
15
+ lang.language_name = "English"
16
+
17
+ 1. Now change the first line to contain the language shortcut (e.g.
18
+ "de", do not use whitespace or any other special character), and
19
+ the second line to contain the name:
20
+
21
+ lang = $cfg.text.de
22
+ lang.language_name = "Deutsch"
23
+
24
+ 1. That's all you need to set up, now just translate all the english texts
25
+ into your language. Take care not to forget any of the tabulators
26
+ ('\t'), they are important.
27
+
28
+ 1. After translating, run the script 'check_translations' to check if
29
+ your translation is ok:
30
+
31
+ ./check_translations de.rb
32
+
33
+ This prints everything that might be a problem, for example:
34
+
35
+ missing translation items: none :-)
36
+
37
+ untranslated: 12 items :-(
38
+ $cfg.text.de.bot (in English: "Bot")
39
+ $cfg.text.de.channel (in English: "Channel")
40
+ $cfg.text.de.channel_name (in English: "Channel Name")
41
+ $cfg.text.de.name (in English: "Name")
42
+ $cfg.text.de.of (in English: "/")
43
+ $cfg.text.de.packs (in English: "")
44
+ $cfg.text.de.port (in English: "Port")
45
+ $cfg.text.de.revision (in English: "Revision")
46
+ $cfg.text.de.server (in English: "Server")
47
+ $cfg.text.de.status (in English: "Status")
48
+ $cfg.text.de.submit (in English: "&Submit")
49
+ $cfg.text.de.version (in English: "Version")
50
+
51
+ translations that can be removed: none :-)
52
+
53
+ If there are any missing translations, you may have accidently removed
54
+ something, this should definitely be fixed.
55
+
56
+ As you can see, untranslated items might not be a problem, sometimes
57
+ terms are the same in several languages.
58
+
59
+ Translations that can be removed are translations that exist in your
60
+ translation, but not in the english reference language.
61
+
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+ if __FILE__ == $0
3
+ class Translation_Checker
4
+ def initialize(languages)
5
+ require '../Utilities/Recursive_Open_Struct'
6
+ $cfg = Recursive_Open_Struct.new
7
+ require 'en'
8
+
9
+ @missing = [ ]
10
+ @untranslated = [ ]
11
+ @unrequired = [ ]
12
+
13
+ if languages.empty?
14
+ # load all languages
15
+ Dir['*.rb'].each do |file|
16
+ require file
17
+ end
18
+ else
19
+ languages.each do |lang_file|
20
+ require lang_file
21
+ end
22
+ end
23
+ # english is the reference language
24
+ @reference_language = $cfg.text.en
25
+ end
26
+
27
+ def self.usage
28
+ puts "usage: #{__FILE__} [language.rb...]"
29
+ end
30
+
31
+ def print_status(ary, str)
32
+ if ary.empty?
33
+ puts "#{str} none :-)"
34
+ else
35
+ puts "#{str} #{ary.size} items :-("
36
+ ary.each do |item|
37
+ puts "\t" + item
38
+ end
39
+ end
40
+ puts "\n"
41
+ end
42
+
43
+ def check
44
+ $cfg.text.attrs.each do |lang_name|
45
+ next if $cfg.text[lang_name] == @reference_language
46
+ @attr_stack = [ "$cfg.text", lang_name]
47
+ check_attrs(@reference_language, $cfg.text[lang_name])
48
+ end
49
+ # print status
50
+ print_status(@missing, "missing translation items:")
51
+ print_status(@untranslated, "untranslated:")
52
+ print_status(@unrequired, "translations that can be removed:")
53
+ end
54
+
55
+ # checks a language against a reference language
56
+ def check_attrs(reference, lang)
57
+ reference.attrs.each do |attr|
58
+ @attr_stack.push attr
59
+ if reference[attr].class == Recursive_Open_Struct && lang[attr].class == Recursive_Open_Struct
60
+ check_attrs(reference[attr], lang[attr])
61
+ else
62
+ if lang.class != Recursive_Open_Struct || !lang.attrs.include?(attr)
63
+ @missing.push(@attr_stack.join(".") + " (in English: \"#{reference[attr]}\")")
64
+ elsif lang[attr] == reference[attr]
65
+ @untranslated.push(@attr_stack.join(".") + " (in English: \"#{reference[attr]}\")")
66
+ end
67
+ end
68
+ @attr_stack.pop
69
+ end
70
+ (lang.attrs - reference.attrs).each do |attr|
71
+ @unrequired.push((@attr_stack+[attr]).join("."))
72
+ end
73
+ end
74
+ end
75
+
76
+ # execute it
77
+ if ARGV.include?("-h") || ARGV.include?("-help") || ARGV.include?("--help") || ARGV.include?("/?")
78
+ Translation_Checker.usage
79
+ else
80
+ t = Translation_Checker.new(ARGV)
81
+ t.check
82
+ end
83
+ end
@@ -0,0 +1,140 @@
1
+ # Copyright (c) 2004, 2005 Christoph Heindl and Martin Ankerl
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without modification,
5
+ # are permitted provided that the following conditions are met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright notice, this list
8
+ # of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above copyright notice, this list
10
+ # of conditions and the following disclaimer in the documentation and/or other materials
11
+ # provided with the distribution.
12
+ # * Neither the name of Christoph Heindl and Martin Ankerl nor the names of its contributors
13
+ # may be used to endorse or promote products derived from this software without specific
14
+ # prior written permission.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
17
+ # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
19
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22
+ # IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
23
+ # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+
25
+ # Language definition #################################
26
+
27
+ lang = $cfg.text.de
28
+ lang.language_name = "German"
29
+
30
+ lang.about = "&�ber\t\tZeigt �ber-Dialog"
31
+ lang.help = "&Hilfe"
32
+ lang.add_server = "&Server Hinzuf�gen\tCtrl-A\tF�gt einen IRC Server hinzu und verbindet sich"
33
+ lang.remove_server = "Entfernen\t\tBeendet Verbindung mit IRC Server und entfernt ihn"
34
+ lang.add_channel = "&Channel Hinzuf�gen\t\tF�gt einen Channel hinzu (join)"
35
+ lang.add_channel_dialog = "Channel Hinzuf�gen"
36
+ lang.remove_channel = "Entfernen\t\tEntfernt einen Channel (part)"
37
+ lang.specify_server = "Server Daten"
38
+
39
+ lang.server = "Server"
40
+ lang.port = "Port"
41
+ lang.nickname = "Spitzname"
42
+ lang.password = "Passwort"
43
+ lang.channel = "Channel"
44
+
45
+ lang.file = "&Datei"
46
+ lang.quit = "&Beenden\tCtrl-X\tSchlie�t die Applikation und beendet alle aktiven Verbindungen"
47
+
48
+ lang.speed_widget_init = "0.0 kb\tZeigt Gesamtdownloadgeschwindigkeit in Kilobyte\tZeigt Gesamtdownloadgeschwindigkeit in Kilobyte"
49
+
50
+ lang.enter_ip_or_domain = "IP-Adresse oder Domain-Name"
51
+ lang.the_servers_port = "Port des Servers"
52
+
53
+ lang.channel_name = "Channel Name"
54
+ lang.connections = "Verbindungen\tRechte Maustaste im unteren Fenster dr�cken\num einen IRC Server und Channel hinzuzuf�gen\tRechte Maustaste im unteren Fenster dr�cken um einen IRC Server und Channel hinzuzuf�gen"
55
+ lang.search = "Suche\tSuchanfragen in die Box eingeben\tSuchanfragen in die Box eingeben"
56
+
57
+ lang.free_slots = "\tZeige/Verstecke Pakete deren Bot freie Slots hat\tZeige/Verstecke Pakete deren Bot freie Slots hat"
58
+ lang.slots_unknown = "\tZeige/Verstecke Pakete deren Bot's Slot-status unbekannt ist\tZeige/Verstecke Pakete deren Bot's Slot-status unbekannt ist"
59
+ lang.no_free_slots = "\tZeige/Verstecke Pakete deren Bot keine freien Slots hat\tZeige/Verstecke Pakete deren Bot keine freien Slots hat"
60
+
61
+ lang.what_do_you_want_to_fetch_today = "Was darf's heute sein?"
62
+
63
+ lang.bot = "Bot"
64
+ lang.name = "Name"
65
+ lang.size = "Gr��e"
66
+
67
+ lang.active = "Aktiv\tZeigt aktive Downloads\tZeigt aktive Downloads"
68
+ lang.completed = "Fertig\tZeigt fertige Downloads\tZeigt fertige Downloads"
69
+ lang.error = "Abgebrochen\tZeigt abgebrochene Downloads\tZeigt abgebrochene Downloads"
70
+
71
+ lang.download = "&Herunterladen\t\tLade dieses Pack herunter"
72
+ lang.status = "Status"
73
+ lang.target_directory = "Zielverzeichnis"
74
+ lang.clear_list = "&L�sche Liste"
75
+
76
+ lang.download_waiting = "Warte"
77
+ lang.download_requesting = "Anfordern"
78
+ lang.download_timeout = "Zeit�berschreitung"
79
+ lang.download_cancelling = "Breche ab"
80
+ lang.download_started = "Lade herunter"
81
+ lang.download_finished = "Fertig"
82
+ lang.download_failed = "Fehler"
83
+ lang.queue_remote = "Bot Warteschlange: "
84
+ lang.queue_local = "Lokale Warteschlange: "
85
+ lang.speed = "Geschwindigkeit"
86
+
87
+ lang.version = "Version"
88
+ lang.revision = "Revision"
89
+ lang.credits = "Entwickler"
90
+ lang.thanks = "Besonderer Dank an"
91
+
92
+
93
+ # "x of x packs"
94
+ lang.of = "/"
95
+ lang.packs = ""
96
+ lang.status_label_tooltip = "\tZeigt Anzahl der sichtbaren\nPakete / Gesamtanzahl der Pakete\tZeigt Anzahl der sichtbaren Pakete / Gesamtanzahl der Pakete"
97
+
98
+ lang.cancel = "&Abbrechen\t\tBricht das Herunterladen ab"
99
+ lang.submit = "&Submit"
100
+
101
+ lang.md5.disabled = "unbekannt"
102
+ lang.md5.unavailable = "unbekannt"
103
+ lang.md5.ok = "Ok"
104
+ lang.md5.failed = "Falsch"
105
+
106
+ lang.checksum = "Pr�fsumme"
107
+
108
+ lang.speed = "Geschwindigkeit"
109
+
110
+ lang.download_finished_box = "Fertig Heruntergeladen"
111
+
112
+ lang.show_warning = "&Fehler Zeigen"
113
+
114
+
115
+ # Network messages
116
+ lang.network.ip.err_notroutable_ip = "IP Adresse nicht kann nicht gerouted werden"
117
+ lang.network.tcp.err_invalid_address = "Ung�ltige Zielhost Angabe"
118
+ lang.network.tcp.err_con_closed = "Verbindung ist geschlossen"
119
+ lang.network.tcp.err_con_active = "Verbindung ist gerade aktiv"
120
+ lang.network.tcp.err_con_timeout = "Zeit�berschreitung beim Verbinden"
121
+ lang.network.tcp.err_con_no_remote = "Keine Adresse oder Port angegeben"
122
+ lang.network.dcc.err_dir_notexist = "Zielverzeichnis existiert nicht"
123
+ lang.network.dcc.err_file_permission = "Kann Datei nicht schreiben"
124
+ lang.network.dcc.err_filesize_differ = "Dateigr��e unterschiedlich"
125
+ lang.network.dcc.err_verification = "Dateiverifikation fehlgeschlagen"
126
+ lang.network.xdcc.err_punish_slowness = "Downloadgeschwindigkeit zu gering f�r Bot"
127
+ lang.network.xdcc.err_pack_already_requested = "Paket bereits angefordert"
128
+ lang.network.xdcc.err_max_packs_requested = "Maximale Anzahl von Paketen vom Bot angefordert"
129
+ lang.network.xdcc.err_bot_left = "Bot vom IRC Server ausgestiegen"
130
+ lang.network.xdcc.err_server_disconnect = "Verbindung zum IRC Server verloren"
131
+ lang.network.xdcc.err_con_closed = "Verbindung wurde beendet"
132
+ lang.network.xdcc.err_no_answer = "Keine XDCC Antwort"
133
+ lang.network.xdcc.err_ip_address_conversion = "IP Adresse kann nicht festgestellt werden"
134
+ lang.network.xdcc.cancel_download_default = "Abbruch durch Benutzer"
135
+
136
+
137
+ lang.message.connection_error_title = "Verbindungsfehler"
138
+ lang.message.connection_error = "Verbindung zu IRC-Server abgebrochen"
139
+ lang.connect = "&Verbinden"
140
+ lang.disconnect = "&Trennen"