XDCC-Fetch 1.386

Sign up to get free protection for your applications and to get access to all the features.
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"