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