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.
- data/COPYING +23 -0
- data/XDCC-Fetch.rbw +54 -0
- data/doc/ark.png +0 -0
- data/doc/connect_established.png +0 -0
- data/doc/index.html +300 -0
- data/doc/mega_ark.png +0 -0
- data/doc/package.png +0 -0
- data/doc/package_unknown.png +0 -0
- data/doc/shot1.png +0 -0
- data/doc/shot1_mini.png +0 -0
- data/doc/shot2.png +0 -0
- data/doc/shot2_mini.png +0 -0
- data/doc/xdccfetch.css +155 -0
- data/icons/ark.png +0 -0
- data/icons/ark_big.png +0 -0
- data/icons/camera_test.png +0 -0
- data/icons/cancel.png +0 -0
- data/icons/connect_creating.png +0 -0
- data/icons/connect_established.png +0 -0
- data/icons/connect_failed.png +0 -0
- data/icons/connect_no.png +0 -0
- data/icons/edit_add.png +0 -0
- data/icons/edit_remove.png +0 -0
- data/icons/exit.png +0 -0
- data/icons/fileclose.png +0 -0
- data/icons/folder_inbox.png +0 -0
- data/icons/idea.png +0 -0
- data/icons/mega_ark.png +0 -0
- data/icons/messagebox_critical.png +0 -0
- data/icons/messagebox_info.png +0 -0
- data/icons/messagebox_warning.png +0 -0
- data/icons/messagebox_warning_small.png +0 -0
- data/icons/package.png +0 -0
- data/icons/package_favourite.png +0 -0
- data/icons/package_unknown.png +0 -0
- data/src/Console/Console_Parser.rb +71 -0
- data/src/Console/XDCC_Pack_Match_Template.rb +29 -0
- data/src/Console/xdcc-fetch.rb +123 -0
- data/src/GUI/About_Dialog.rb +50 -0
- data/src/GUI/Application_Builder.rb +280 -0
- data/src/GUI/Context_Menu.rb +81 -0
- data/src/GUI/Custom_Tabs.rb +60 -0
- data/src/GUI/Dialog_Box.rb +116 -0
- data/src/GUI/Download_Finished_Box.rb +41 -0
- data/src/GUI/Empty_Text_Field_Handler.rb +86 -0
- data/src/GUI/Gui_Logic.rb +629 -0
- data/src/GUI/Icon_Loader.rb +58 -0
- data/src/GUI/Main_Window.rb +227 -0
- data/src/GUI/Packet_Item.rb +171 -0
- data/src/GUI/Packet_List.rb +145 -0
- data/src/GUI/Speed_Widget.rb +101 -0
- data/src/GUI/Talk_Back.rb +118 -0
- data/src/GUI/Toggle_Button.rb +56 -0
- data/src/Network/CTCP_Handler.rb +61 -0
- data/src/Network/DCC_File.rb +323 -0
- data/src/Network/DCC_Parser.rb +71 -0
- data/src/Network/IPAddr_Ext.rb +76 -0
- data/src/Network/IRC_Message.rb +161 -0
- data/src/Network/IRC_Server.rb +273 -0
- data/src/Network/IRC_Server_Respond_Map.rb +223 -0
- data/src/Network/IRC_User.rb +58 -0
- data/src/Network/TCP_Connection.rb +168 -0
- data/src/Network/XDCC_Announcement.rb +120 -0
- data/src/Network/XDCC_Announcement_Storage.rb +167 -0
- data/src/Network/XDCC_Download_Handler.rb +412 -0
- data/src/Network/XDCC_Pack.rb +58 -0
- data/src/Network/XDCC_Parser.rb +253 -0
- data/src/Translations/README +61 -0
- data/src/Translations/check_translations +83 -0
- data/src/Translations/de.rb +140 -0
- data/src/Translations/en.rb +145 -0
- data/src/Utilities/Configuration.rb +91 -0
- data/src/Utilities/Events.rb +87 -0
- data/src/Utilities/Globals.rb +138 -0
- data/src/Utilities/PrettyException.rb +1091 -0
- data/src/Utilities/Recursive_Open_Struct.rb +159 -0
- data/src/Utilities/Timer.rb +71 -0
- 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"
|