Merge branch 'master' into sasl

Conflicts:
	include/znc/Client.h
	src/Client.cpp
	src/Modules.cpp
	test/integration/tests/modules.cpp
This commit is contained in:
Alexey Sokolov
2025-02-13 20:37:32 +00:00
381 changed files with 12248 additions and 4121 deletions
+3 -8
View File
@@ -1,5 +1,5 @@
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -37,11 +37,7 @@ function(add_cxx_module mod modpath)
if(moddepend_${mod})
add_dependencies("module_${mod}" ${moddepend_${mod}})
endif()
# ${znclib_LIB_DEPENDS} is to overcome OSX's need for -undefined suppress
# when accessing symbols exported by dependencies of znclib (e.g.
# openssl), but not used in znclib itself
target_link_libraries("module_${mod}" PRIVATE ZNC ${modlink_${mod}}
${znclib_LIB_DEPENDS})
target_link_libraries("module_${mod}" PRIVATE ZNC ${modlink_${mod}})
set_target_properties("module_${mod}" PROPERTIES "" "" ${modprop_${mod}})
install(TARGETS "module_${mod}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/znc")
@@ -54,8 +50,7 @@ function(add_python_module mod modpath)
endfunction()
if(CYRUS_FOUND)
set(modcompile_cyrusauth PRIVATE ${CYRUS_CFLAGS})
set(modlink_cyrusauth ${CYRUS_LDFLAGS})
set(modlink_cyrusauth PkgConfig::CYRUS)
else()
set(moddisable_cyrusauth true)
endif()
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
* Copyright (C) 2008 Michael "Svedrin" Ziegler diese-addy@funzt-halt.net
*
* Licensed under the Apache License, Version 2.0 (the "License");
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
* Author: imaginos <imaginos@imaginos.net>
*
* Licensed under the Apache License, Version 2.0 (the "License");
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
* Copyright (C) 2008 by Stefan Rado
* based on admin.cpp by Sebastian Ramacher
* based on admin.cpp in crox branch
+75
View File
@@ -0,0 +1,75 @@
/*
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <znc/Client.h>
#include <znc/IRCNetwork.h>
#include <znc/IRCSock.h>
#include <znc/Modules.h>
#include <memory>
class CCoreCaps : public CModule {
// Note: for historical reasons CClient and CIRCSock have such fields, but
// really they should not.
// TODO: move these fields and their handling from core to this module.
class AwayNotify : public CCapability {
void OnServerChangedSupport(CIRCNetwork* pNetwork,
bool bState) override {
pNetwork->GetIRCSock()->m_bAwayNotify = bState;
}
void OnClientChangedSupport(CClient* pClient, bool bState) override {
pClient->m_bAwayNotify = bState;
}
};
class AccountNotify : public CCapability {
void OnServerChangedSupport(CIRCNetwork* pNetwork,
bool bState) override {
pNetwork->GetIRCSock()->m_bAccountNotify = bState;
}
void OnClientChangedSupport(CClient* pClient, bool bState) override {
pClient->m_bAccountNotify = bState;
}
};
class AccountTag : public CCapability {
void OnClientChangedSupport(CClient* pClient, bool bState) override {
pClient->SetTagSupport("account", bState);
}
};
class ExtendedJoin : public CCapability {
void OnServerChangedSupport(CIRCNetwork* pNetwork,
bool bState) override {
pNetwork->GetIRCSock()->m_bExtendedJoin = bState;
}
void OnClientChangedSupport(CClient* pClient, bool bState) override {
pClient->m_bExtendedJoin = bState;
}
};
public:
MODCONSTRUCTOR(CCoreCaps) {
AddServerDependentCapability("away-notify", std::make_unique<AwayNotify>());
AddServerDependentCapability("account-notify", std::make_unique<AccountNotify>());
AddServerDependentCapability("account-tag", std::make_unique<AccountTag>());
AddServerDependentCapability("extended-join", std::make_unique<ExtendedJoin>());
}
};
GLOBALMODULEDEFS(
CCoreCaps,
t_s("Adds support for several IRC capabilities, extracted from ZNC core."))
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
* Copyright (C) 2008 Heiko Hund <heiko@ist.eigentlich.net>
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,13 +27,13 @@
</div>
<div class="subsection">
<div class="inputlabel"><label for="buffersize"><? FORMAT "Buffer Size:" ?></label></div>
<div class="inputlabel"><label for="buffersize"><? FORMAT "Buffer size:" ?></label></div>
<input id="buffersize" type="number" name="buffersize" value="<? VAR BufferSize ?>" size="10" min="0"
title="<? FORMAT "The buffer count." ?>"/>
</div>
<div class="subsection">
<div class="inputlabel"><label for="defmodes"><? FORMAT "Default Modes:" ?></label></div>
<div class="inputlabel"><label for="defmodes"><? FORMAT "Default modes:" ?></label></div>
<input id="defmodes" type="text" name="defmodes" value="<? VAR DefModes ?>" size="10"
title="<? FORMAT "The default modes of the channel." ?>"/>
</div>
@@ -66,7 +66,7 @@
<? ENDIF ?>
<div class="subsection">
<div class="inputlabel"><label for="quitmsg"><? FORMAT "Quit Message:" ?></label></div>
<div class="inputlabel"><label for="quitmsg"><? FORMAT "Quit message:" ?></label></div>
<input id="quitmsg" type="text" name="quitmsg" value="<? VAR QuitMsg ?>" class="full" maxlength="256"
title="<? FORMAT "You may define a Message shown, when you quit IRC." ?>"
<? IF !QuitMsgEdit ?>disabled<? ENDIF ?> />
+12 -12
View File
@@ -45,7 +45,7 @@
title="<? FORMAT "Please re-type the above password." ?>"/>
</div>
<div class="subsection">
<div class="inputlabel"><label for="authonlyviamodule"><? FORMAT "Auth Only Via Module:" ?></label></div>
<div class="inputlabel"><label for="authonlyviamodule"><? FORMAT "Auth only via module:" ?></label></div>
<input id="authonlyviamodule" type="checkbox" name="authonlyviamodule"
title="<? FORMAT "Allow user authentication by external modules only, disabling built-in password authentication." ?>"
<? IF AuthOnlyViaModule ?>checked="checked" <? ENDIF ?><? IF !ImAdmin ?>disabled="disabled" <? ENDIF ?>/>
@@ -87,7 +87,7 @@
<? IF !IdentEdit ?>disabled<? ENDIF ?> />
</div>
<div class="subsection">
<div class="inputlabel"><label for="statusprefix"><? FORMAT "Status Prefix:" ?></label></div>
<div class="inputlabel"><label for="statusprefix"><? FORMAT "Status prefix:" ?></label></div>
<input id="statusprefix" type="text" name="statusprefix" value="<? VAR StatusPrefix ?>" class="half" maxlength="5"
title="<? FORMAT "The prefix for the status and module queries." ?>"/>
</div>
@@ -114,7 +114,7 @@
<? ENDIF ?>
<div class="subsection">
<div class="inputlabel"><label for="quitmsg"><? FORMAT "Quit Message:" ?></label></div>
<div class="inputlabel"><label for="quitmsg"><? FORMAT "Quit message:" ?></label></div>
<input type="text" name="quitmsg" value="<? VAR QuitMsg ?>" class="full" maxlength="256"
title="<? FORMAT "You may define a Message shown, when you quit IRC." ?>"
<? IF !QuitMsgEdit ?>disabled<? ENDIF ?> />
@@ -249,13 +249,13 @@
<div class="sectionbg">
<div class="sectionbody">
<div class="subsection third">
<div class="inputlabel"><label for="chanmodes"><? FORMAT "Default Modes:" ?></label></div>
<div class="inputlabel"><label for="chanmodes"><? FORMAT "Default modes:" ?></label></div>
<input id="chanmodes" type="text" name="chanmodes" value="<? VAR DefaultChanModes ?>" maxlength="32"
title="<? FORMAT "These are the default modes ZNC will set when you join an empty channel." ?>"/>
<br /><span class="info"><? FORMAT "Empty = use standard value" ?></span>
</div>
<div class="subsection third">
<div class="inputlabel"><label for="chanbufsize"><? FORMAT "Buffer Size:" ?></label></div>
<div class="inputlabel"><label for="chanbufsize"><? FORMAT "Buffer size:" ?></label></div>
<input id="chanbufsize" type="number" name="chanbufsize" value="<? VAR ChanBufferSize ?>" min="0"
title="<? FORMAT "This is the amount of lines that the playback buffer will store for channels before dropping off the oldest line. The buffers are stored in the memory by default." ?>"/>
<br /><span class="info"><? FORMAT "Empty = use standard value" ?></span>
@@ -269,12 +269,12 @@
<div class="sectionbg">
<div class="sectionbody">
<div class="subsection third">
<div class="inputlabel"><label for="maxquerybuffers"><? FORMAT "Max Buffers:" ?></label></div>
<div class="inputlabel"><label for="maxquerybuffers"><? FORMAT "Max buffers:" ?></label></div>
<input id="maxquerybuffers" type="number" name="maxquerybuffers" value="<? VAR MaxQueryBuffers ?>" class="third" min="0"
title="<? FORMAT "Maximum number of query buffers. 0 is unlimited." ?>"/>
</div>
<div class="subsection third">
<div class="inputlabel"><label for="querybufsize"><? FORMAT "Buffer Size:" ?></label></div>
<div class="inputlabel"><label for="querybufsize"><? FORMAT "Buffer size:" ?></label></div>
<input id="querybufsize" type="number" name="querybufsize" value="<? VAR QueryBufferSize ?>" min="0"
title="<? FORMAT "This is the amount of lines that the playback buffer will store for queries before dropping off the oldest line. The buffers are stored in the memory by default." ?>"/>
<br /><span class="info"><? FORMAT "Empty = use standard value" ?></span>
@@ -304,7 +304,7 @@
<div class="sectionbg">
<div class="sectionbody">
<div class="subsection">
<div class="inputlabel"><label for="timestampformat"><? FORMAT "Timestamp Format:" ?></label></div>
<div class="inputlabel"><label for="timestampformat"><? FORMAT "Timestamp format:" ?></label></div>
<input id="timestampformat" type="text" name="timestampformat" value="<? VAR TimestampFormat ?>" class="full"
title="<? FORMAT "The format for the timestamps used in buffers, for example [%H:%M:%S]. This setting is ignored in new IRC clients, which use server-time. If your client supports server-time, change timestamp format in client settings instead." ?>"/>
</div>
@@ -326,7 +326,7 @@
</div>
<div style="clear:both;"></div>
<div class="subsection">
<div class="inputlabel"><label for="jointries"><? FORMAT "Join Tries:" ?></label></div>
<div class="inputlabel"><label for="jointries"><? FORMAT "Join tries:" ?></label></div>
<input id="jointries" type="number" name="jointries" value="<? VAR JoinTries ?>" class="third" min="0"
title="<? FORMAT "This defines how many times ZNC tries to join a channel, if the first join failed, e.g. due to channel mode +i/+k or if you are banned." ?>"/>
</div>
@@ -341,14 +341,14 @@
title="<? FORMAT "How much time ZNC waits (in seconds) until it receives something from network or declares the connection timeout. This happens after attempts to ping the peer." ?>"/>
</div>
<div class="subsection">
<div class="inputlabel"><label for="maxnetworks"><? FORMAT "Max IRC Networks Number:" ?></label></div>
<div class="inputlabel"><label for="maxnetworks"><? FORMAT "Max IRC networks number:" ?></label></div>
<input type="number" name="maxnetworks" value="<? VAR MaxNetworks ?>" class="third" min="0"
title="<? FORMAT "Maximum number of IRC networks allowed for this user." ?>" <? IF !ImAdmin ?>disabled="disabled"<? ENDIF ?> />
</div>
<? SETBLOCK Substitutions_Link ?><a href="https://wiki.znc.in/ExpandString" target="_blank" class="external"><? FORMAT "Substitutions" ?></a><? ENDSETBLOCK ?>
<div class="subsection half" id="ctcpreplies_plain">
<div class="inputlabel"><label for="ctcpreplies_text"><? FORMAT "CTCP Replies:" ?></label></div>
<div class="inputlabel"><label for="ctcpreplies_text"><? FORMAT "CTCP replies:" ?></label></div>
<div><textarea name="ctcpreplies" cols="70" rows="3" id="ctcpreplies_text" <? IF !CTCPEdit ?>disabled<? ENDIF ?>><? LOOP CTCPLoop ?><? VAR CTCP ?>
<? ENDLOOP ?>
</textarea></div>
@@ -356,7 +356,7 @@
<br /><span class="info"><? FORMAT "{1} are available" "Substitutions_Link ESC=" ?></span>
</div>
<div class="subsection" id="ctcpreplies_js" style="display:none" data-placeholder="<? FORMAT "Empty value means this CTCP request will be ignored" ?>">
<div class="inputlabel"><? FORMAT "CTCP Replies:" ?></div>
<div class="inputlabel"><? FORMAT "CTCP replies:" ?></div>
<div>
<table style="width:100%">
<thead>
+8 -8
View File
@@ -99,7 +99,7 @@
<div class="subsection third">
<div class="inputlabel"><label for="statusprefix"><? FORMAT "Status Prefix:" ?></label></div>
<div class="inputlabel"><label for="statusprefix"><? FORMAT "Status prefix:" ?></label></div>
<input id="statusprefix" type="text" name="statusprefix" value="<? VAR StatusPrefix ?>"
title="<? FORMAT "The prefix for the status and module queries." ?>"/>
<br /><span class="info"><? FORMAT "Default for new users only." ?></span>
@@ -107,48 +107,48 @@
<div class="subsection half">
<div class="inputlabel"><label for="maxbufsize"><? FORMAT "Maximum Buffer Size:" ?></label></div>
<div class="inputlabel"><label for="maxbufsize"><? FORMAT "Maximum buffer size:" ?></label></div>
<input id="maxbufsize" type="number" name="maxbufsize" value="<? VAR MaxBufferSize ?>"
title="<? FORMAT "Sets the global Max Buffer Size a user can have." ?>"/>
</div>
<div class="subsection half">
<div class="inputlabel"><label for="connectdelay"><? FORMAT "Connect Delay:" ?></label></div>
<div class="inputlabel"><label for="connectdelay"><? FORMAT "Connect delay:" ?></label></div>
<input id="connectdelay" type="number" name="connectdelay" value="<? VAR ConnectDelay ?>"
title="<? FORMAT "The time between connection attempts to IRC servers, in seconds. This affects the connection between ZNC and the IRC server; not the connection between your IRC client and ZNC." ?>"/>
</div>
<div class="subsection half">
<div class="inputlabel"><label for="serverthrottle"><? FORMAT "Server Throttle:" ?></label></div>
<div class="inputlabel"><label for="serverthrottle"><? FORMAT "Server throttle:" ?></label></div>
<input id="serverthrottle" type="number" name="serverthrottle" value="<? VAR ServerThrottle ?>"
title="<? FORMAT "The minimal time between two connect attempts to the same hostname, in seconds. Some servers refuse your connection if you reconnect too fast." ?>"/>
</div>
<div class="subsection half">
<div class="inputlabel"><label for="anoniplimit"><? FORMAT "Anonymous Connection Limit per IP:" ?></label></div>
<div class="inputlabel"><label for="anoniplimit"><? FORMAT "Anonymous connection limit per IP:" ?></label></div>
<input id="anoniplimit" type="number" name="anoniplimit" value="<? VAR AnonIPLimit ?>"
title="<? FORMAT "Limits the number of unidentified connections per IP." ?>"/>
</div>
<div class="subsection">
<div class="inputlabel"><? FORMAT "Protect Web Sessions:" ?></div>
<div class="inputlabel"><? FORMAT "Protect web sessions:" ?></div>
<div class="checkbox"><input type="checkbox" name="protectwebsessions" id="protectwebsessions_checkbox"<? IF ProtectWebSessions ?> checked="checked"<? ENDIF ?> />
<label for="protectwebsessions_checkbox"><? FORMAT "Disallow IP changing during each web session" ?></label></div>
</div>
<div class="subsection">
<div class="inputlabel"><? FORMAT "Hide ZNC Version:" ?></div>
<div class="inputlabel"><? FORMAT "Hide ZNC version:" ?></div>
<div class="checkbox"><input type="checkbox" name="hideversion" id="hideversion_checkbox"<? IF HideVersion ?> checked="checked"<? ENDIF ?> />
<label for="hideversion_checkbox"><? FORMAT "Hide version number from non-ZNC users" ?></label></div>
</div>
<div class="subsection">
<div class="inputlabel"><? FORMAT "Auth Only Via Module:" ?></div>
<div class="inputlabel"><? FORMAT "Auth only via module:" ?></div>
<div class="checkbox"><input type="checkbox" name="authonlyviamodule" id="authonlyviamodule_checkbox"<? IF AuthOnlyViaModule ?> checked="checked"<? ENDIF ?> />
<label for="authonlyviamodule_checkbox"><? FORMAT "Allow user authentication by external modules only" ?></label></div>
</div>
+6 -6
View File
@@ -15,23 +15,23 @@
</tr>
<? IF IsAdmin ?>
<tr class="evenrow">
<th><? FORMAT "Total Users" ?></th>
<th><? FORMAT "Total users" ?></th>
<td><? VAR TotalUsers ?></td>
</tr>
<tr class="oddrow">
<th><? FORMAT "Total Networks" ?></th>
<th><? FORMAT "Total networks" ?></th>
<td><? VAR TotalNetworks ?></td>
</tr>
<tr class="evenrow">
<th><? FORMAT "Attached Networks" ?></th>
<th><? FORMAT "Attached networks" ?></th>
<td><? VAR AttachedNetworks ?></td>
</tr>
<tr class="oddrow">
<th><? FORMAT "Total Client Connections" ?></th>
<th><? FORMAT "Total client connections" ?></th>
<td><? VAR TotalCConnections ?></td>
</tr>
<tr class="evenrow">
<th><? FORMAT "Total IRC Connections" ?></th>
<th><? FORMAT "Total IRC connections" ?></th>
<td><? VAR TotalIRCConnections ?></td>
</tr>
<? ELSE ?>
@@ -40,7 +40,7 @@
<td><? VAR TotalNetworks ?></td>
</tr>
<tr class="oddrow">
<th><? FORMAT "Attached Networks" ?></th>
<th><? FORMAT "Attached networks" ?></th>
<td><? VAR AttachedNetworks ?></td>
</tr>
<tr class="evenrow">
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
* This was originally written by cycomate.
*
* Licensed under the Apache License, Version 2.0 (the "License");
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
* Copyright (C) 2006-2007, CNU <bshalm@broadpark.no>
*(http://cnu.dieplz.net/znc)
*
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+36 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -374,6 +374,41 @@ CPerlSocket::~CPerlSocket() {
}
}
CPerlCapability::~CPerlCapability() {
SvREFCNT_dec(m_serverCb);
SvREFCNT_dec(m_clientCb);
}
void CPerlCapability::OnServerChangedSupport(CIRCNetwork* pNetwork, bool bState) {
PSTART;
PUSH_PTR(CIRCNetwork*, pNetwork);
mXPUSHi(bState);
PUTBACK;
ret = call_sv(m_serverCb, G_EVAL | G_ARRAY);
SPAGAIN;
SP -= ret;
ax = (SP - PL_stack_base) + 1;
if (SvTRUE(ERRSV)) {
DEBUG("Perl hook OnServerChangedSupport died with: " + PString(ERRSV));
}
PEND;
}
void CPerlCapability::OnClientChangedSupport(CClient* pClient, bool bState) {
PSTART;
PUSH_PTR(CClient*, pClient);
mXPUSHi(bState);
PUTBACK;
ret = call_sv(m_clientCb, G_EVAL | G_ARRAY);
SPAGAIN;
SP -= ret;
ax = (SP - PL_stack_base) + 1;
if (SvTRUE(ERRSV)) {
DEBUG("Perl hook OnServerChangedSupport died with: " + PString(ERRSV));
}
PEND;
}
template <>
void TModInfo<CModPerl>(CModInfo& Info) {
Info.SetWikiPage("modperl");
+2 -2
View File
@@ -1,5 +1,5 @@
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -82,7 +82,7 @@ target_include_directories(modperl_lib PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/.."
"${CMAKE_CURRENT_SOURCE_DIR}/.."
${PERL_INCLUDE_DIRS})
target_link_libraries(modperl_lib ${znc_link})
target_link_libraries(modperl_lib ZNC)
set_target_properties(modperl_lib PROPERTIES
PREFIX ""
SUFFIX ".${perl_ext}"
+2 -2
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env perl
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@ open my $out, ">", $ARGV[1] or die;
print $out <<'EOF';
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+3
View File
@@ -61,7 +61,10 @@ EModRet OnPrivNotice(CNick& Nick, CString& sMessage)
EModRet OnChanNotice(CNick& Nick, CChan& Channel, CString& sMessage)
EModRet OnTopic(CNick& Nick, CChan& Channel, CString& sTopic)
bool OnServerCapAvailable(const CString& sCap)
bool OnServerCap302Available(const CString& sCap, const CString& sValue)
void OnServerCapResult(const CString& sCap, bool bSuccess)
void OnClientAttached()
void OnClientDetached()
EModRet OnTimerAutoJoin(CChan& Channel)
bool OnEmbeddedWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl)
EModRet OnAddNetwork(CIRCNetwork& Network, CString& sErrorRet)
+5 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -189,6 +189,10 @@ class MCString : public std::map<CString, CString> {};
bool ExistsNV(const CString& sName) {
return $self->EndNV() != $self->FindNV(sName);
}
void AddServerDependentCapability(const CString& sName, SV* serverCb,
SV* clientCb) {
$self->AddServerDependentCapability(sName, std::make_unique<CPerlCapability>(serverCb, clientCb));
}
}
%extend CModules {
+18 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -116,7 +116,10 @@ class ZNC_EXPORT_LIB_EXPORT CPerlModule : public CModule {
CString& sMessage) override;
EModRet OnTopic(CNick& Nick, CChan& Channel, CString& sTopic) override;
bool OnServerCapAvailable(const CString& sCap) override;
bool OnServerCap302Available(const CString& sCap, const CString& sValue) override;
void OnServerCapResult(const CString& sCap, bool bSuccess) override;
void OnClientAttached() override;
void OnClientDetached() override;
EModRet OnTimerAutoJoin(CChan& Channel) override;
bool OnEmbeddedWebRequest(CWebSock&, const CString&, CTemplate&) override;
EModRet OnAddNetwork(CIRCNetwork& Network, CString& sErrorRet) override;
@@ -213,6 +216,20 @@ inline CPerlSocket* CreatePerlSocket(CPerlModule* pModule, SV* perlObj) {
return new CPerlSocket(pModule, perlObj);
}
class ZNC_EXPORT_LIB_EXPORT CPerlCapability : public CCapability {
public:
CPerlCapability(SV* serverCb, SV* clientCb)
: m_serverCb(newSVsv(serverCb)), m_clientCb(newSVsv(clientCb)) {}
~CPerlCapability();
void OnServerChangedSupport(CIRCNetwork* pNetwork, bool bState) override;
void OnClientChangedSupport(CClient* pClient, bool bState) override;
private:
SV* m_serverCb;
SV* m_clientCb;
};
inline bool HaveIPv6() {
#ifdef HAVE_IPV6
return true;
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+49 -51
View File
@@ -1,5 +1,5 @@
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -34,17 +34,17 @@ BEGIN {
}
use IO::File;
use feature 'switch', 'say';
use feature 'say';
package ZNC::String;
use overload '""' => sub {
my $self = shift;
my @caller = caller;
# When called from internal SWIG subroutines, return default stringification (e.g. 'ZNC::String=SCALAR(0x6210002fe090)') instead of the stored string.
# Otherwise, ZNC crashes with use-after-free.
# SWIG uses it as key for a hash, so without the number in the returned string, different strings which happen to represent the same value, collide.
return $self if $caller[0] eq 'ZNC::String';
return $self->GetPerlStr;
my $self = shift;
my @caller = caller;
# When called from internal SWIG subroutines, return default stringification (e.g. 'ZNC::String=SCALAR(0x6210002fe090)') instead of the stored string.
# Otherwise, ZNC crashes with use-after-free.
# SWIG uses it as key for a hash, so without the number in the returned string, different strings which happen to represent the same value, collide.
return $self if $caller[0] eq 'ZNC::String';
return $self->GetPerlStr;
};
package ZNC::CMessage;
@@ -71,16 +71,15 @@ sub UnloadModule {
my $cmod = $pmod->{_cmod};
my $modpath = $cmod->GetModPath;
my $modname = $cmod->GetModName;
given ($cmod->GetType()) {
when ($ZNC::CModInfo::NetworkModule) {
$cmod->GetNetwork->GetModules->removeModule($cmod);
}
when ($ZNC::CModInfo::UserModule) {
$cmod->GetUser->GetModules->removeModule($cmod);
}
when ($ZNC::CModInfo::GlobalModule) {
ZNC::CZNC::Get()->GetModules->removeModule($cmod);
}
my $type = $cmod->GetType();
if ($type == $ZNC::CModInfo::NetworkModule) {
$cmod->GetNetwork->GetModules->removeModule($cmod);
} elsif ($type == $ZNC::CModInfo::UserModule) {
$cmod->GetUser->GetModules->removeModule($cmod);
} elsif ($type == $ZNC::CModInfo::GlobalModule) {
ZNC::CZNC::Get()->GetModules->removeModule($cmod);
} else {
die "UnloadModule: unknown module type $type for $modpath";
}
delete $pmod->{_cmod};
delete $pmod->{_nv};
@@ -110,16 +109,14 @@ sub LoadModule {
my ($modname, $args, $type, $user, $network) = @_;
$modname =~ /^\w+$/ or return ($ZNC::Perl_LoadError, "Module names can only contain letters, numbers and underscores, [$modname] is invalid.");
my $container;
given ($type) {
when ($ZNC::CModInfo::NetworkModule) {
$container = $network;
}
when ($ZNC::CModInfo::UserModule) {
$container = $user;
}
when ($ZNC::CModInfo::GlobalModule) {
$container = ZNC::CZNC::Get();
}
if ($type == $ZNC::CModInfo::NetworkModule) {
$container = $network;
} elsif ($type == $ZNC::CModInfo::UserModule) {
$container = $user;
} elsif ($type == $ZNC::CModInfo::GlobalModule) {
$container = ZNC::CZNC::Get();
} else {
die "LoadModule: unknown module type $type for $modname";
}
return ($ZNC::Perl_LoadError, "Uhm? No container for the module? Wtf?") unless $container;
$container = $container->GetModules;
@@ -405,6 +402,9 @@ sub OnPrivNotice {}
sub OnChanNotice {}
sub OnTopic {}
sub OnServerCapAvailable {}
sub OnServerCap302Available { my ($self, $cap, $value) = @_; $self->OnServerCapAvailable($cap) }
sub OnClientAttached {}
sub OnClientDetached {}
sub OnServerCapResult {}
sub OnTimerAutoJoin {}
sub OnEmbeddedWebRequest {}
@@ -666,28 +666,28 @@ sub CreateSocket {
}
sub t_s {
my $self = shift;
my $module = ref $self;
my $english = shift;
my $context = shift//'';
ZNC::CTranslation::Get->Singular("znc-$module", $context, $english);
my $self = shift;
my $module = ref $self;
my $english = shift;
my $context = shift//'';
ZNC::CTranslation::Get->Singular("znc-$module", $context, $english);
}
sub t_f {
my $self = shift;
my $fmt = $self->t_s(@_);
return sub { sprintf $fmt, @_ }
my $self = shift;
my $fmt = $self->t_s(@_);
return sub { sprintf $fmt, @_ }
}
sub t_p {
my $self = shift;
my $module = ref $self;
my $english = shift;
my $englishes = shift;
my $num = shift;
my $context = shift//'';
my $fmt = ZNC::CTranslation::Get->Plural("znc-$module", $context, $english, $englishes, $num);
return sub { sprintf $fmt, @_ }
my $self = shift;
my $module = ref $self;
my $english = shift;
my $englishes = shift;
my $num = shift;
my $context = shift//'';
my $fmt = ZNC::CTranslation::Get->Plural("znc-$module", $context, $english, $englishes, $num);
return sub { sprintf $fmt, @_ }
}
# TODO is t_d needed for perl? Maybe after AddCommand is implemented
@@ -788,12 +788,10 @@ sub Listen {
my %arg = @_;
my $addrtype = $ZNC::ADDR_ALL;
if (defined $arg{addrtype}) {
given ($arg{addrtype}) {
when (/^ipv4$/i) { $addrtype = $ZNC::ADDR_IPV4ONLY }
when (/^ipv6$/i) { $addrtype = $ZNC::ADDR_IPV6ONLY }
when (/^all$/i) { }
default { die "Specified addrtype [$arg{addrtype}] isn't supported" }
}
if ($arg{addrtype} =~ /^ipv4$/i) { $addrtype = $ZNC::ADDR_IPV4ONLY }
elsif ($arg{addrtype} =~ /^ipv6$/i) { $addrtype = $ZNC::ADDR_IPV6ONLY }
elsif ($arg{addrtype} =~ /^all$/i) { }
else { die "Specified addrtype [$arg{addrtype}] isn't supported" }
}
if (defined $arg{port}) {
return $arg{port} if $self->GetModule->GetManager->ListenHost(
+51 -35
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -289,42 +289,17 @@ class CModPython : public CModule {
return HALT;
}
void TryAddModInfo(const CString& sPath, const CString& sName,
void TryAddModInfo(const CString& sName,
set<CModInfo>& ssMods, set<CString>& ssAlready,
CModInfo::EModuleType eType) {
if (ssAlready.count(sName)) {
return;
}
PyObject* pyFunc =
PyObject_GetAttrString(m_PyZNCModule, "get_mod_info_path");
if (!pyFunc) {
CString sRetMsg = GetPyExceptionStr();
DEBUG("modpython tried to get info about ["
<< sPath << "] (1) but: " << sRetMsg);
return;
}
CModInfo ModInfo;
PyObject* pyRes = PyObject_CallFunction(
pyFunc, const_cast<char*>("ssN"), sPath.c_str(), sName.c_str(),
SWIG_NewInstanceObj(&ModInfo, SWIG_TypeQuery("CModInfo*"), 0));
if (!pyRes) {
CString sRetMsg = GetPyExceptionStr();
DEBUG("modpython tried to get info about ["
<< sPath << "] (2) but: " << sRetMsg);
Py_CLEAR(pyFunc);
return;
}
Py_CLEAR(pyFunc);
long int x = PyLong_AsLong(pyRes);
if (PyErr_Occurred()) {
CString sRetMsg = GetPyExceptionStr();
DEBUG("modpython tried to get info about ["
<< sPath << "] (3) but: " << sRetMsg);
Py_CLEAR(pyRes);
return;
}
Py_CLEAR(pyRes);
if (x && ModInfo.SupportsType(eType)) {
bool bSuccess = false;
CString sRetMsg;
OnGetModInfo(ModInfo, sName, bSuccess, sRetMsg);
if (bSuccess && ModInfo.SupportsType(eType)) {
ssMods.insert(ModInfo);
ssAlready.insert(sName);
}
@@ -342,20 +317,18 @@ class CModPython : public CModule {
for (unsigned int a = 0; a < Dir.size(); a++) {
CFile& File = *Dir[a];
CString sName = File.GetShortName();
CString sPath = File.GetLongName();
sPath.TrimSuffix(sName);
if (!File.IsDir()) {
if (sName.WildCmp("*.pyc")) {
sName.RightChomp(4);
} else if (sName.WildCmp("*.py") || sName.WildCmp("*.so")) {
} else if (sName.WildCmp("*.py")) {
sName.RightChomp(3);
} else {
continue;
}
}
TryAddModInfo(sPath, sName, ssMods, already, eType);
TryAddModInfo(sName, ssMods, already, eType);
}
dirs.pop();
@@ -505,6 +478,49 @@ CPySocket::~CPySocket() {
Py_CLEAR(m_pyObj);
}
CPyCapability::CPyCapability(PyObject* serverCb, PyObject* clientCb)
: m_serverCb(serverCb), m_clientCb(clientCb) {
Py_INCREF(serverCb);
Py_INCREF(clientCb);
}
CPyCapability::~CPyCapability() {
Py_CLEAR(m_serverCb);
Py_CLEAR(m_clientCb);
}
void CPyCapability::OnServerChangedSupport(CIRCNetwork* pNetwork, bool bState) {
PyObject* pyArg_Network =
SWIG_NewInstanceObj(pNetwork, SWIG_TypeQuery("CIRCNetwork*"), 0);
PyObject* pyArg_bState = Py_BuildValue("l", (long int)bState);
PyObject* pyRes = PyObject_CallFunctionObjArgs(m_serverCb, pyArg_Network,
pyArg_bState, nullptr);
if (!pyRes) {
CString sPyErr = ((CPyModule*)GetModule())->GetPyExceptionStr();
DEBUG("modpython: " << GetModule()->GetModName()
<< "/OnServerChangedSupport failed: " << sPyErr);
}
Py_CLEAR(pyRes);
Py_CLEAR(pyArg_bState);
Py_CLEAR(pyArg_Network);
}
void CPyCapability::OnClientChangedSupport(CClient* pClient, bool bState) {
PyObject* pyArg_Client =
SWIG_NewInstanceObj(pClient, SWIG_TypeQuery("CClient*"), 0);
PyObject* pyArg_bState = Py_BuildValue("l", (long int)bState);
PyObject* pyRes = PyObject_CallFunctionObjArgs(m_clientCb, pyArg_Client,
pyArg_bState, nullptr);
if (!pyRes) {
CString sPyErr = ((CPyModule*)GetModule())->GetPyExceptionStr();
DEBUG("modpython: " << GetModule()->GetModName()
<< "/OnClientChangedSupport failed: " << sPyErr);
}
Py_CLEAR(pyRes);
Py_CLEAR(pyArg_bState);
Py_CLEAR(pyArg_Client);
}
CPyModule* CPyModCommand::GetModule() {
return this->m_pModule;
}
+2 -2
View File
@@ -1,5 +1,5 @@
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -75,7 +75,7 @@ target_include_directories(modpython_lib PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/.."
"${CMAKE_CURRENT_SOURCE_DIR}/.."
${Python3_INCLUDE_DIRS})
target_link_libraries(modpython_lib ${znc_link} ${Python3_LDFLAGS})
target_link_libraries(modpython_lib ZNC ${Python3_LDFLAGS})
set_target_properties(modpython_lib PROPERTIES
PREFIX "_"
OUTPUT_NAME "znc_core"
+73 -31
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env perl
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@ open my $out, ">", $ARGV[1] or die;
print $out <<'EOF';
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -50,30 +50,7 @@ print $out <<'EOF';
***************************************************************************/
namespace {
/* template<class T>
struct pyobj_to_ptr {
CString m_sType;
SvToPtr(const CString& sType) {
m_sType = sType;
}
bool operator()(PyObject* py, T** result) {
T* x = nullptr;
int res = SWIG_ConvertPtr(sv, (void**)&x, SWIG_TypeQuery(m_sType.c_str()), 0);
if (SWIG_IsOK(res)) {
*result = x;
return true;
}
DEBUG("modpython: ");
return false;
}
};
CModule::EModRet SvToEModRet(PyObject* py, CModule::EModRet* result) {
long int x = PyLong_AsLong();
return static_cast<CModule::EModRet>(SvUV(sv));
}*/
inline swig_type_info* SWIG_pchar_descriptor(void) {
inline swig_type_info* ZNC_SWIG_pchar_descriptor(void) {
static int init = 0;
static swig_type_info* info = 0;
if (!init) {
@@ -83,7 +60,71 @@ namespace {
return info;
}
inline int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) {
// SWIG 4.2.0 replaced SWIG_Python_str_AsChar with SWIG_PyUnicode_AsUTF8AndSize.
// SWIG doesn't provide any good way to detect SWIG version (other than parsing
// `swig -version`), but it also introduced SWIG_NULLPTR in 4.2.0.
// So let's abuse that define to do different code for new SWIG.
#ifdef SWIG_NULLPTR
// This is copied/adapted from SWIG 4.2.0 from pystrings.swg
inline int ZNC_SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) {
#if PY_VERSION_HEX>=0x03000000
#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
if (PyBytes_Check(obj))
#else
if (PyUnicode_Check(obj))
#endif
#else
if (PyString_Check(obj))
#endif
{
char *cstr; Py_ssize_t len;
PyObject *bytes = NULL;
int ret = SWIG_OK;
if (alloc)
*alloc = SWIG_OLDOBJ;
#if PY_VERSION_HEX>=0x03000000 && defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
if (PyBytes_AsStringAndSize(obj, &cstr, &len) == -1)
return SWIG_TypeError;
#else
cstr = (char *)SWIG_PyUnicode_AsUTF8AndSize(obj, &len, &bytes);
if (!cstr)
return SWIG_TypeError;
/* The returned string is only duplicated if the char * returned is not owned and memory managed by obj */
if (bytes && cptr) {
if (alloc) {
//cstr = %new_copy_array(cstr, len + 1, char);
cstr = (char *)memcpy((char *)malloc((len + 1)*sizeof(char)), cstr, sizeof(char)*(len + 1));
*alloc = SWIG_NEWOBJ;
} else {
/* alloc must be set in order to clean up allocated memory */
return SWIG_RuntimeError;
}
}
#endif
if (cptr) *cptr = cstr;
if (psize) *psize = len + 1;
Py_XDECREF(bytes);
return ret;
} else {
swig_type_info* pchar_descriptor = ZNC_SWIG_pchar_descriptor();
if (pchar_descriptor) {
void* vptr = 0;
if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
if (cptr) *cptr = (char *) vptr;
if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
if (alloc) *alloc = SWIG_OLDOBJ;
return SWIG_OK;
}
}
}
return SWIG_TypeError;
}
#else
// TODO: at some point drop support for SWIG<4.2.0 (drop this branch of ifdef)
// This is copied from some old SWIG version from pystrings.swg
inline int ZNC_SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) {
#if PY_VERSION_HEX>=0x03000000
if (PyUnicode_Check(obj))
#else
@@ -142,7 +183,7 @@ namespace {
#endif
return SWIG_OK;
} else {
swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
swig_type_info* pchar_descriptor = ZNC_SWIG_pchar_descriptor();
if (pchar_descriptor) {
void* vptr = 0;
if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
@@ -155,10 +196,11 @@ namespace {
}
return SWIG_TypeError;
}
#endif
inline int SWIG_AsPtr_CString (PyObject * obj, CString **val) {
inline int ZNC_SWIG_AsPtr_CString (PyObject * obj, CString **val) {
char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ;
if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) {
if (SWIG_IsOK((ZNC_SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) {
if (buf) {
if (val) *val = new CString(buf, size - 1);
if (alloc == SWIG_NEWOBJ) delete[] buf;
@@ -389,7 +431,7 @@ while (<$in>) {
}
when ('CString') {
say $out "\t\tCString* p = nullptr;";
say $out "\t\tint res = SWIG_AsPtr_CString(pyRes, &p);";
say $out "\t\tint res = ZNC_SWIG_AsPtr_CString(pyRes, &p);";
say $out "\t\tif (!SWIG_IsOK(res)) {";
say $out "\t\t\tDEBUG(\"modpython: \" << (GetUser() ? GetUser()->GetUsername() : CString(\"<no user>\")) << \"/\" << GetModName() << \"/$name was expected to return '$type' but error=\" << res);";
say $out "\t\t\tresult = $default;";
+3
View File
@@ -61,7 +61,10 @@ EModRet OnPrivNotice(CNick& Nick, CString& sMessage)
EModRet OnChanNotice(CNick& Nick, CChan& Channel, CString& sMessage)
EModRet OnTopic(CNick& Nick, CChan& Channel, CString& sTopic)
bool OnServerCapAvailable(const CString& sCap)
bool OnServerCap302Available(const CString& sCap, const CString& sValue)
void OnServerCapResult(const CString& sCap, bool bSuccess)
void OnClientAttached()
void OnClientDetached()
EModRet OnTimerAutoJoin(CChan& Channel)
bool OnEmbeddedWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl)
EModRet OnAddNetwork(CIRCNetwork& Network, CString& sErrorRet)
+5 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -241,6 +241,10 @@ class CPyRetBool {
bool ExistsNV(const CString& sName) {
return $self->EndNV() != $self->FindNV(sName);
}
void AddServerDependentCapability(const CString& sName, PyObject* serverCb,
PyObject* clientCb) {
$self->AddServerDependentCapability(sName, std::make_unique<CPyCapability>(serverCb, clientCb));
}
}
%extend CModules {
+18 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -136,7 +136,10 @@ class ZNC_EXPORT_LIB_EXPORT CPyModule : public CModule {
CString& sMessage) override;
EModRet OnTopic(CNick& Nick, CChan& Channel, CString& sTopic) override;
bool OnServerCapAvailable(const CString& sCap) override;
bool OnServerCap302Available(const CString& sCap, const CString& sValue) override;
void OnServerCapResult(const CString& sCap, bool bSuccess) override;
void OnClientAttached() override;
void OnClientDetached() override;
EModRet OnTimerAutoJoin(CChan& Channel) override;
bool OnEmbeddedWebRequest(CWebSock&, const CString&, CTemplate&) override;
EModRet OnAddNetwork(CIRCNetwork& Network, CString& sErrorRet) override;
@@ -374,3 +377,17 @@ inline CPyModCommand* CreatePyModCommand(CPyModule* pModule,
PyObject* pyObj) {
return new CPyModCommand(pModule, sCmd, sArgs, sDesc, pyObj);
}
class ZNC_EXPORT_LIB_EXPORT CPyCapability : public CCapability {
public:
CPyCapability(PyObject* serverCb, PyObject* clientCb);
~CPyCapability();
void OnServerChangedSupport(CIRCNetwork* pNetwork, bool bState) override;
void OnClientChangedSupport(CClient* pClient, bool bState) override;
private:
PyObject* m_serverCb;
PyObject* m_clientCb;
};
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+10 -28
View File
@@ -1,5 +1,5 @@
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -410,6 +410,15 @@ class Module:
def OnServerCapAvailable(self, sCap):
pass
def OnServerCap302Available(self, sCap, sValue):
return self.OnServerCapAvailable(sCap)
def OnClientAttached(self):
pass
def OnClientDetached(self):
pass
def OnServerCapResult(self, sCap, bSuccess):
pass
@@ -949,33 +958,6 @@ def get_mod_info(modname, retmsg, modinfo):
return 2
def get_mod_info_path(path, modname, modinfo):
try:
x = imp.find_module(modname, [path])
except ImportError:
return 0
# x == (<open file './modules/admin.so', mode 'rb' at 0x7fa2dc748d20>,
# './modules/admin.so', ('.so', 'rb', 3))
# x == (<open file './modules/pythontest.py', mode 'U' at 0x7fa2dc748d20>,
# './modules/pythontest.py', ('.py', 'U', 1))
if x[0] is None and x[2][2] != imp.PKG_DIRECTORY:
return 0
try:
pymodule = imp.load_module(modname, *x)
except ImportError:
return 0
finally:
if x[0]:
x[0].close()
if modname not in pymodule.__dict__:
return 0
cl = pymodule.__dict__[modname]
modinfo.SetName(modname)
modinfo.SetPath(pymodule.__file__)
gather_mod_info(cl, modinfo)
return 1
CONTINUE = CModule.CONTINUE
HALT = CModule.HALT
HALTMODS = CModule.HALTMODS
+7 -4
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -248,8 +248,9 @@ class CModTcl : public CModule {
// chan specific
unsigned int nLength = vChans.size();
for (unsigned int n = 0; n < nLength; n++) {
CString sChannel = TclEscape(CString(vChans[n]->GetName()));
sCommand = "Binds::ProcessNick {" + sOldNick + "} {" + sHost +
"} - {" + vChans[n]->GetName() + "} {" + sNewNickTmp +
"} - {" + sChannel + "} {" + sNewNickTmp +
"}";
int i = Tcl_Eval(interp, sCommand.c_str());
if (i != TCL_OK) {
@@ -260,14 +261,16 @@ class CModTcl : public CModule {
void OnKick(const CNick& OpNick, const CString& sKickedNick, CChan& Channel,
const CString& sMessage) override {
CString sMes = TclEscape(sMessage);
CString sOpNick = TclEscape(CString(OpNick.GetNick()));
CString sNick = TclEscape(sKickedNick);
CString sOpHost =
TclEscape(CString(OpNick.GetIdent() + "@" + OpNick.GetHost()));
CString sChannel = TclEscape(Channel.GetName());
CString sCommand = "Binds::ProcessKick {" + sOpNick + "} {" + sOpHost +
"} - {" + Channel.GetName() + "} {" + sNick + "} {" +
sMessage + "}";
"} - {" + sChannel + "} {" + sNick + "} {" +
sMes + "}";
int i = Tcl_Eval(interp, sCommand.c_str());
if (i != TCL_OK) {
PutModule(Tcl_GetStringResult(interp));
+1 -1
View File
@@ -1,5 +1,5 @@
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
* Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
#
# Copyright (C) 2004-2023 ZNC, see the NOTICE file for details.
# Copyright (C) 2004-2025 ZNC, see the NOTICE file for details.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
+60
View File
@@ -0,0 +1,60 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/admindebug.pot\n"
"X-Crowdin-File-ID: 273\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: admindebug.cpp:30
msgid "Enable Debug Mode"
msgstr "Hata Ayıklama Modunu Etkinleştirme"
#: admindebug.cpp:32
msgid "Disable Debug Mode"
msgstr "Hata Ayıklama Modunu Devre Dışı Bırakma"
#: admindebug.cpp:34
msgid "Show the Debug Mode status"
msgstr "Hata Ayıklama Modu durumunu göster"
#: admindebug.cpp:40 admindebug.cpp:49
msgid "Access denied!"
msgstr "Erişim reddedildi!"
#: admindebug.cpp:58
msgid ""
"Failure. We need to be running with a TTY. (is ZNC running with --"
"foreground?)"
msgstr ""
"Arıza. Bir TTY ile çalışmamız gerekiyor. (ZNC --foreground ile mi çalışıyor?)"
#: admindebug.cpp:66
msgid "Already enabled."
msgstr "Zaten etkin."
#: admindebug.cpp:68
msgid "Already disabled."
msgstr "Zaten devre dışı."
#: admindebug.cpp:92
msgid "Debugging mode is on."
msgstr "Hata ayıklama modu açık."
#: admindebug.cpp:94
msgid "Debugging mode is off."
msgstr "Hata ayıklama modu kapalı."
#: admindebug.cpp:96
msgid "Logging to: stdout."
msgstr "Oturum açılıyor: stdout."
#: admindebug.cpp:105
msgid "Enable Debug mode dynamically."
msgstr "Hata Ayıklama modunu dinamik olarak etkinleştirin."
+69
View File
@@ -0,0 +1,69 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/adminlog.pot\n"
"X-Crowdin-File-ID: 149\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: adminlog.cpp:29
msgid "Show the logging target"
msgstr "Günlük hedefini göster"
#: adminlog.cpp:31
msgid "<file|syslog|both> [path]"
msgstr "<file|syslog|both> [yol]"
#: adminlog.cpp:32
msgid "Set the logging target"
msgstr "Günlük hedefini ayarlayın"
#: adminlog.cpp:142
msgid "Access denied"
msgstr "Erişim reddedildi"
#: adminlog.cpp:156
msgid "Now logging to file"
msgstr "Şimdi dosyaya giriş yapılıyor"
#: adminlog.cpp:160
msgid "Now only logging to syslog"
msgstr "Artık yalnızca sistem günlüğüne giriş yapılıyor"
#: adminlog.cpp:164
msgid "Now logging to syslog and file"
msgstr "Şimdi sistem günlüğüne ve dosyaya giriş yapılıyor"
#: adminlog.cpp:168
msgid "Usage: Target <file|syslog|both> [path]"
msgstr "Kullanımı: Target <file|syslog|both> [yol]"
#: adminlog.cpp:170
msgid "Unknown target"
msgstr "Bilinmeyen hedef"
#: adminlog.cpp:192
msgid "Logging is enabled for file"
msgstr "Dosya için günlük kaydı etkinleştirildi"
#: adminlog.cpp:195
msgid "Logging is enabled for syslog"
msgstr "Sistem günlüğü için günlük kaydı etkinleştirildi"
#: adminlog.cpp:198
msgid "Logging is enabled for both, file and syslog"
msgstr "Günlük kaydı hem dosya hem de sistem günlüğü için etkinleştirildi"
#: adminlog.cpp:204
msgid "Log file will be written to {1}"
msgstr "Günlük dosyası {1}'e yazılacak"
#: adminlog.cpp:222
msgid "Log ZNC events to file and/or syslog."
msgstr "ZNC olaylarını dosyaya ve/veya sistem günlüğüne kaydedin."
+123
View File
@@ -0,0 +1,123 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/alias.pot\n"
"X-Crowdin-File-ID: 150\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: alias.cpp:141
msgid "missing required parameter: {1}"
msgstr "gerekli parametre eksik: {1}"
#: alias.cpp:201
msgid "Created alias: {1}"
msgstr "Takma ad oluşturuldu: {1}"
#: alias.cpp:203
msgid "Alias already exists."
msgstr "Takma ad zaten mevcut."
#: alias.cpp:210
msgid "Deleted alias: {1}"
msgstr "Silinen takma ad: {1}"
#: alias.cpp:213 alias.cpp:224 alias.cpp:246 alias.cpp:265 alias.cpp:276
#: alias.cpp:333
msgid "Alias does not exist."
msgstr "Takma ad mevcut değil."
#: alias.cpp:222 alias.cpp:244 alias.cpp:263 alias.cpp:274
msgid "Modified alias."
msgstr "Değiştirilmiş takma ad."
#: alias.cpp:236 alias.cpp:256
msgid "Invalid index."
msgstr "Geçersiz dizin."
#: alias.cpp:282 alias.cpp:298
msgid "There are no aliases."
msgstr "Takma ad yok."
#: alias.cpp:289
msgid "The following aliases exist: {1}"
msgstr "Aşağıdaki takma adlar mevcuttur: {1}"
#: alias.cpp:290
msgctxt "list|separator"
msgid ", "
msgstr ", "
#: alias.cpp:324
msgid "Actions for alias {1}:"
msgstr "{1} takma adına ilişkin işlemler:"
#: alias.cpp:331
msgid "End of actions for alias {1}."
msgstr "{1} takma adına ilişkin işlemlerin sonu."
#: alias.cpp:338 alias.cpp:341 alias.cpp:352 alias.cpp:357
msgid "<name>"
msgstr "<adı>"
#: alias.cpp:339
msgid "Creates a new, blank alias called name."
msgstr "Ad adı verilen yeni, boş bir takma ad oluşturur."
#: alias.cpp:341
msgid "Deletes an existing alias."
msgstr "Mevcut bir takma adı siler."
#: alias.cpp:343
msgid "<name> <action ...>"
msgstr "<adı> <işlem ...>"
#: alias.cpp:344
msgid "Adds a line to an existing alias."
msgstr "Mevcut bir takma ada bir satır ekler."
#: alias.cpp:346
msgid "<name> <pos> <action ...>"
msgstr "<adı> <pozisyon> <işlem ...>"
#: alias.cpp:347
msgid "Inserts a line into an existing alias."
msgstr "Mevcut bir takma ada bir satır ekler."
#: alias.cpp:349
msgid "<name> <pos>"
msgstr "<adı> <pozisyon>"
#: alias.cpp:350
msgid "Removes a line from an existing alias."
msgstr "Mevcut bir takma addan bir satırı kaldırır."
#: alias.cpp:353
msgid "Removes all lines from an existing alias."
msgstr "Mevcut bir takma addan tüm satırları kaldırır."
#: alias.cpp:355
msgid "Lists all aliases by name."
msgstr "Tüm takma adları ada göre listeler."
#: alias.cpp:358
msgid "Reports the actions performed by an alias."
msgstr "Bir takma ad tarafından gerçekleştirilen eylemleri raporlar."
#: alias.cpp:362
msgid "Generate a list of commands to copy your alias config."
msgstr "Takma ad yapılandırmanızı kopyalamak için bir komut listesi oluşturun."
#: alias.cpp:374
msgid "Clearing all of them!"
msgstr "Hepsini temizleniyor!"
#: alias.cpp:409
msgid "Provides bouncer-side command alias support."
msgstr "Koruma tarafı komut takma adı desteği sağlar."
+86
View File
@@ -0,0 +1,86 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/autoattach.pot\n"
"X-Crowdin-File-ID: 151\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: autoattach.cpp:94
msgid "Added to list"
msgstr "Listeye eklendi"
#: autoattach.cpp:96
msgid "{1} is already added"
msgstr "{1} zaten eklendi"
#: autoattach.cpp:100
msgid "Usage: Add [!]<#chan> <search> <host>"
msgstr "Kullanımı: Add [!]<#kanal> <arama> <host>"
#: autoattach.cpp:101
msgid "Wildcards are allowed"
msgstr "Joker karakterlere izin verilir"
#: autoattach.cpp:113
msgid "Removed {1} from list"
msgstr "{1} listeden kaldırıldı"
#: autoattach.cpp:115
msgid "Usage: Del [!]<#chan> <search> <host>"
msgstr "Kullanımı: Del [!]<#kanal> <arama> <host>"
#: autoattach.cpp:121 autoattach.cpp:129
msgid "Neg"
msgstr "Ret"
#: autoattach.cpp:122 autoattach.cpp:130
msgid "Chan"
msgstr "Kanal"
#: autoattach.cpp:123 autoattach.cpp:131
msgid "Search"
msgstr "Arama"
#: autoattach.cpp:124 autoattach.cpp:132
msgid "Host"
msgstr "Host"
#: autoattach.cpp:138
msgid "You have no entries."
msgstr "Hiçbir girdiniz yok."
#: autoattach.cpp:146 autoattach.cpp:149
msgid "[!]<#chan> <search> <host>"
msgstr "[!]<#kanal> <arama> <host>"
#: autoattach.cpp:147
msgid "Add an entry, use !#chan to negate and * for wildcards"
msgstr ""
"Bir giriş ekleyin, reddetmek için !#chan ve joker karakterler için * kullanın"
#: autoattach.cpp:150
msgid "Remove an entry, needs to be an exact match"
msgstr "Bir girişi kaldırın; tam eşleşme olması gerekiyor"
#: autoattach.cpp:152
msgid "List all entries"
msgstr "Tüm girişleri listele"
#: autoattach.cpp:171
msgid "Unable to add [{1}]"
msgstr "[{1}] eklenemiyor"
#: autoattach.cpp:283
msgid "List of channel masks and channel masks with ! before them."
msgstr "Kanal maskeleri ve kanal maskelerinin listesi ! onlardan önce."
#: autoattach.cpp:286
msgid "Reattaches you to channels on activity."
msgstr "Sizi etkinlikteki kanallara yeniden bağlar."
+1 -1
View File
@@ -54,7 +54,7 @@ msgstr "Sintaxe: Del [!]<#canal>"
#: autocycle.cpp:85 autocycle.cpp:90 autocycle.cpp:95
msgid "Channel"
msgstr ""
msgstr "Canal"
#: autocycle.cpp:101
msgid "You have no entries."
+73
View File
@@ -0,0 +1,73 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/autocycle.pot\n"
"X-Crowdin-File-ID: 207\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: autocycle.cpp:27 autocycle.cpp:30
msgid "[!]<#chan>"
msgstr "[!]<#kanal>"
#: autocycle.cpp:28
msgid "Add an entry, use !#chan to negate and * for wildcards"
msgstr ""
"Bir giriş ekleyin, reddetmek için !#kanal ve joker karakterler için * "
"kullanın"
#: autocycle.cpp:31
msgid "Remove an entry, needs to be an exact match"
msgstr "Bir girişi kaldırın; tam eşleşme olması gerekiyor"
#: autocycle.cpp:33
msgid "List all entries"
msgstr "Tüm girişleri listele"
#: autocycle.cpp:46
msgid "Unable to add {1}"
msgstr "{1} eklenemiyor"
#: autocycle.cpp:66
msgid "{1} is already added"
msgstr "{1} zaten eklendi"
#: autocycle.cpp:68
msgid "Added {1} to list"
msgstr "{1} listeye eklendi"
#: autocycle.cpp:70
msgid "Usage: Add [!]<#chan>"
msgstr "Kullanımı: Add [!]<#kanal>"
#: autocycle.cpp:78
msgid "Removed {1} from list"
msgstr "{1} listeden kaldırıldı"
#: autocycle.cpp:80
msgid "Usage: Del [!]<#chan>"
msgstr "Kullanımı: Del [!]<#kanal>"
#: autocycle.cpp:85 autocycle.cpp:90 autocycle.cpp:95
msgid "Channel"
msgstr "Kanal"
#: autocycle.cpp:101
msgid "You have no entries."
msgstr "Hiçbir girdiniz yok."
#: autocycle.cpp:230
msgid "List of channel masks and channel masks with ! before them."
msgstr "Kanal maskeleri ve kanal maskelerinin listesi ! ile onlardan önce."
#: autocycle.cpp:235
msgid "Rejoins channels to gain Op if you're the only user left"
msgstr ""
"Geriye kalan tek kullanıcı sizseniz Op kazanmak için kanallara yeniden "
"katılır"
+179
View File
@@ -0,0 +1,179 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/autoop.pot\n"
"X-Crowdin-File-ID: 153\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: autoop.cpp:155
msgid "List all users"
msgstr "Tüm kullanıcıları listele"
#: autoop.cpp:157 autoop.cpp:160
msgid "<user> <channel> [channel] ..."
msgstr "<kullanıcı> <kanal> [kanal] ..."
#: autoop.cpp:158
msgid "Adds channels to a user"
msgstr "Bir kullanıcıya kanal ekler"
#: autoop.cpp:161
msgid "Removes channels from a user"
msgstr "Kullanıcıdan kanalları kaldırma"
#: autoop.cpp:163 autoop.cpp:166
msgid "<user> <mask>,[mask] ..."
msgstr "<kullanıcı> <maske>[maske] ..."
#: autoop.cpp:164
msgid "Adds masks to a user"
msgstr "Kullanıcıdan kanalları kaldırma"
#: autoop.cpp:167
msgid "Removes masks from a user"
msgstr "Kullanıcının maskelerini kaldırır"
#: autoop.cpp:170
msgid "<user> <hostmask>[,<hostmasks>...] <key> [channels]"
msgstr "<kullanıcı> <host_maskesi>[,<host_maskeleri>...] <anahtar> [kanallar]"
#: autoop.cpp:171
msgid "Adds a user"
msgstr "Bir kullanıcı ekler"
#: autoop.cpp:173
msgid "<user>"
msgstr "<kullanıcı>"
#: autoop.cpp:173
msgid "Removes a user"
msgstr "Bir kullanıcıyı kaldırır"
#: autoop.cpp:276
msgid "Usage: AddUser <user> <hostmask>[,<hostmasks>...] <key> [channels]"
msgstr ""
"Kullanımı: AddUser <kullanıcı> <host_maskesi>[,<host_maskeleri>...] "
"<anahtar> [kanallar]"
#: autoop.cpp:292
msgid "Usage: DelUser <user>"
msgstr "Kullanımı: DelUser <kullanıcı>"
#: autoop.cpp:301
msgid "There are no users defined"
msgstr "Tanımlanmış kullanıcı yok"
#: autoop.cpp:307 autoop.cpp:318 autoop.cpp:322 autoop.cpp:324
msgid "User"
msgstr "Kullanıcı"
#: autoop.cpp:308 autoop.cpp:326
msgid "Hostmasks"
msgstr "Host Maskeleri"
#: autoop.cpp:309 autoop.cpp:319
msgid "Key"
msgstr "Anahtar"
#: autoop.cpp:310 autoop.cpp:320
msgid "Channels"
msgstr "Kanallar"
#: autoop.cpp:338
msgid "Usage: AddChans <user> <channel> [channel] ..."
msgstr "Kullanımı: AddChans <kullanıcı> <kanal> [kanal] ..."
#: autoop.cpp:345 autoop.cpp:366 autoop.cpp:388 autoop.cpp:409 autoop.cpp:473
msgid "No such user"
msgstr "Böyle bir kullanıcı yok"
#: autoop.cpp:350
msgid "Channel(s) added to user {1}"
msgstr "Kanal(lar) {1} kullanıcısına eklendi"
#: autoop.cpp:359
msgid "Usage: DelChans <user> <channel> [channel] ..."
msgstr "Kullanımı: DelChans <kullanıcı> <kanal> [kanal] ..."
#: autoop.cpp:372
msgid "Channel(s) Removed from user {1}"
msgstr "Kanal(lar) {1} kullanıcısından silindi"
#: autoop.cpp:381
msgid "Usage: AddMasks <user> <mask>,[mask] ..."
msgstr "Kullanımı: AddMasks <kullanıcı> <maske>,[maske] ..."
#: autoop.cpp:393
msgid "Hostmasks(s) added to user {1}"
msgstr "Host maske(ler) {1} kullanıcısına eklendi"
#: autoop.cpp:402
msgid "Usage: DelMasks <user> <mask>,[mask] ..."
msgstr "Kullanımı: DelMasks <kullanıcı> <maske>,[maske] ..."
#: autoop.cpp:414
msgid "Removed user {1} with key {2} and channels {3}"
msgstr "{2} anahtarı ve {3} kanal(lar)ı olan {1} kullanıcısı kaldırıldı"
#: autoop.cpp:420
msgid "Hostmasks(s) Removed from user {1}"
msgstr "Host maske(ler) {1} kullanıcısından kaldırıldı"
#: autoop.cpp:479
msgid "User {1} removed"
msgstr "{1} kullanıcısı kaldırıldı"
#: autoop.cpp:485
msgid "That user already exists"
msgstr "Bu kullanıcı zaten mevcut"
#: autoop.cpp:491
msgid "User {1} added with hostmask(s) {2}"
msgstr "{1} kullanıcısı {2} host maskeleriyle eklendi"
#: autoop.cpp:533
msgid ""
"[{1}] sent us a challenge but they are not opped in any defined channels."
msgstr ""
"[{1}] bize bir challenge gönderiyor ancak tanımlanmış hiçbir kanalda op "
"değiller."
#: autoop.cpp:537
msgid "[{1}] sent us a challenge but they do not match a defined user."
msgstr ""
"[{1}] bize bir challenge gönderiyor ancak tanımlı bir kullanıcıyla "
"eşleşmiyor."
#: autoop.cpp:545
msgid "WARNING! [{1}] sent an invalid challenge."
msgstr "UYARI! [{1}] geçersiz bir meydan okuma gönderiyor."
#: autoop.cpp:561
msgid "[{1}] sent an unchallenged response. This could be due to lag."
msgstr ""
"[{1}] bize unchallenge bir yanıt gönderdi. Bunun nedeni gecikme olabilir."
#: autoop.cpp:578
msgid ""
"WARNING! [{1}] sent a bad response. Please verify that you have their "
"correct password."
msgstr ""
"UYARI! [{1}] kötü bir yanıt gönderiyor. Lütfen doğru şifreye sahip "
"olduğunuzu doğrulayın."
#: autoop.cpp:587
msgid "WARNING! [{1}] sent a response but did not match any defined users."
msgstr ""
"UYARI! [{1}] bir yanıt gönderdi ancak tanımlanmış hiçbir kullanıcıyla "
"eşleşmedi."
#: autoop.cpp:645
msgid "Auto op the good people"
msgstr "İyi insanları otomatik olarak op yapar"
+1 -1
View File
@@ -14,7 +14,7 @@ msgstr ""
#: autoreply.cpp:25
msgid "<reply>"
msgstr ""
msgstr "<reply>"
#: autoreply.cpp:25
msgid "Sets a new reply"
+45
View File
@@ -0,0 +1,45 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/autoreply.pot\n"
"X-Crowdin-File-ID: 154\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: autoreply.cpp:25
msgid "<reply>"
msgstr "<yanıt>"
#: autoreply.cpp:25
msgid "Sets a new reply"
msgstr "Yeni bir yanıt ayarlar"
#: autoreply.cpp:27
msgid "Displays the current query reply"
msgstr "Geçerli sorgu yanıtını görüntüler"
#: autoreply.cpp:75
msgid "Current reply is: {1} ({2})"
msgstr "Geçerli yanıt: {1} ({2})"
#: autoreply.cpp:81
msgid "New reply set to: {1} ({2})"
msgstr "Yeni yanıt şu şekilde ayarlandı: {1} ({2})"
#: autoreply.cpp:94
msgid ""
"You might specify a reply text. It is used when automatically answering "
"queries, if you are not connected to ZNC."
msgstr ""
"Bir yanıt metni belirtebilirsiniz. ZNC'ye bağlı değilseniz, sorguları "
"otomatik olarak yanıtlarken kullanılır."
#: autoreply.cpp:98
msgid "Reply to queries when you are away"
msgstr "Meşgul olduğunuzda sorguları yanıtlayın"
+114
View File
@@ -0,0 +1,114 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/autovoice.pot\n"
"X-Crowdin-File-ID: 155\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: autovoice.cpp:120
msgid "List all users"
msgstr "Tüm kullanıcıları listele"
#: autovoice.cpp:122 autovoice.cpp:125
msgid "<user> <channel> [channel] ..."
msgstr "<kullanıcı> <kanal> [kanal] ..."
#: autovoice.cpp:123
msgid "Adds channels to a user"
msgstr "Bir kullanıcıya kanal ekler"
#: autovoice.cpp:126
msgid "Removes channels from a user"
msgstr "Bir kullanıcıdan kanalları kaldırır"
#: autovoice.cpp:128
msgid "<user> <hostmask> [channels]"
msgstr "<kullanıcı> <host_maskesi> [kanallar]"
#: autovoice.cpp:129
msgid "Adds a user"
msgstr "Bir kullanıcı ekler"
#: autovoice.cpp:131
msgid "<user>"
msgstr "<kullanıcı>"
#: autovoice.cpp:131
msgid "Removes a user"
msgstr "Bir kullanıcıyı kaldırır"
#: autovoice.cpp:215
msgid "Usage: AddUser <user> <hostmask> [channels]"
msgstr "Kullanımı: AddUser <kullanıcı> <host_maskesi> [kanallar]"
#: autovoice.cpp:229
msgid "Usage: DelUser <user>"
msgstr "Kullanımı: DelUser <kullanıcı>"
#: autovoice.cpp:238
msgid "There are no users defined"
msgstr "Tanımlanmış kullanıcı yok"
#: autovoice.cpp:244 autovoice.cpp:250
msgid "User"
msgstr "Kullanıcı"
#: autovoice.cpp:245 autovoice.cpp:251
msgid "Hostmask"
msgstr "Host Maskesi"
#: autovoice.cpp:246 autovoice.cpp:252
msgid "Channels"
msgstr "Kanallar"
#: autovoice.cpp:263
msgid "Usage: AddChans <user> <channel> [channel] ..."
msgstr "Kullanımı: AddChans <kullanıcı> <kanal> [kanal] ..."
#: autovoice.cpp:270 autovoice.cpp:292 autovoice.cpp:329
msgid "No such user"
msgstr "Böyle bir kullanıcı yok"
#: autovoice.cpp:275
msgid "Channel(s) added to user {1}"
msgstr "Kanal(lar) {1} kullanıcısına eklendi"
#: autovoice.cpp:285
msgid "Usage: DelChans <user> <channel> [channel] ..."
msgstr "Kullanımı: DelChans <kullanıcı> <kanal> [kanal] ..."
#: autovoice.cpp:298
msgid "Channel(s) Removed from user {1}"
msgstr "Kanal(lar) {1} kullanıcısından silindi"
#: autovoice.cpp:335
msgid "User {1} removed"
msgstr "{1} kullanıcısı kaldırıldı"
#: autovoice.cpp:341
msgid "That user already exists"
msgstr "Bu kullanıcı zaten mevcut"
#: autovoice.cpp:347
msgid "User {1} added with hostmask {2}"
msgstr "{1} kullanıcısı {2} host maskeleriyle eklendi"
#: autovoice.cpp:360
msgid ""
"Each argument is either a channel you want autovoice for (which can include "
"wildcards) or, if it starts with !, it is an exception for autovoice."
msgstr ""
"Her bağımsız değişken otomatik voice istediğiniz bir kanaldır (joker "
"karakterler içerebilir) ya da ! ile başlıyorsa, otomatik voice için bir "
"istisnadır."
#: autovoice.cpp:365
msgid "Auto voice the good people"
msgstr "İyi insanlara otomatik olarak voice verir"
+118
View File
@@ -0,0 +1,118 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/awaystore.pot\n"
"X-Crowdin-File-ID: 156\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: awaystore.cpp:67
msgid "You have been marked as away"
msgstr "Away olarak işaretlendiniz"
#: awaystore.cpp:78 awaystore.cpp:385 awaystore.cpp:388
msgid "Welcome back!"
msgstr "Tekrar hoşgeldiniz!"
#: awaystore.cpp:100
msgid "Deleted {1} messages"
msgstr "{1} mesaj silindi"
#: awaystore.cpp:104
msgid "USAGE: delete <num|all>"
msgstr "Kullanımı: delete <num|all>"
#: awaystore.cpp:109
msgid "Illegal message # requested"
msgstr "İllegal mesaj # istendi"
#: awaystore.cpp:113
msgid "Message erased"
msgstr "Mesaj silindi"
#: awaystore.cpp:122
msgid "Messages saved to disk"
msgstr "Mesajlar diske kaydedildi"
#: awaystore.cpp:124
msgid "There are no messages to save"
msgstr "Kaydedilecek mesaj yok"
#: awaystore.cpp:135
msgid "Password updated to [{1}]"
msgstr "Şifre [{1}] olarak güncellendi"
#: awaystore.cpp:147
msgid "Corrupt message! [{1}]"
msgstr "Bozuk mesaj! [{1}]"
#: awaystore.cpp:159
msgid "Corrupt time stamp! [{1}]"
msgstr "Bozuk zaman damgası! [{1}]"
#: awaystore.cpp:178
msgid "#--- End of messages"
msgstr "#---Mesajların sonu"
#: awaystore.cpp:183
msgid "Timer set to 300 seconds"
msgstr "Zamanlayıcı 300 saniyeye ayarlandı"
#: awaystore.cpp:188 awaystore.cpp:197
msgid "Timer disabled"
msgstr "Zamanlayıcı devre dışı"
#: awaystore.cpp:199
msgid "Timer set to {1} seconds"
msgstr "Zamanlayıcı {1} saniyeye ayarlandı"
#: awaystore.cpp:203
msgid "Current timer setting: {1} seconds"
msgstr "Geçerli zamanlayıcı ayarı: {1} saniye"
#: awaystore.cpp:278
msgid "This module needs as an argument a keyphrase used for encryption"
msgstr ""
"Bu modülün argüman olarak şifreleme için kullanılan bir anahtar kelimeye "
"ihtiyacı var"
#: awaystore.cpp:285
msgid ""
"Failed to decrypt your saved messages - Did you give the right encryption "
"key as an argument to this module?"
msgstr ""
"Kayıtlı mesajlarınızın şifrelemesi çözülemedi - Bu modüle argüman olarak "
"doğru şifreleme anahtarını verdiniz mi?"
#: awaystore.cpp:386 awaystore.cpp:389
msgid "You have {1} messages!"
msgstr "{1} mesajınız var!"
#: awaystore.cpp:456
msgid "Unable to find buffer"
msgstr "Arabellek bulunamıyor"
#: awaystore.cpp:469
msgid "Unable to decode encrypted messages"
msgstr "Şifrelenmiş mesajların kodu çözülemiyor"
#: awaystore.cpp:516
msgid ""
"[ -notimer | -timer N ] [-chans] passw0rd . N is number of seconds, 600 by "
"default."
msgstr ""
"[ -notimer | -timer N ] [-chans] şifre . N saniye sayısı, varsayılan "
"600'dür."
#: awaystore.cpp:521
msgid ""
"Adds auto-away with logging, useful when you use ZNC from different locations"
msgstr ""
"ZNC'yi farklı konumlardan kullandığınızda kullanışlı olan günlük kaydıyla "
"otomatik away özelliği ekler"
+3 -3
View File
@@ -14,19 +14,19 @@ msgstr ""
#: block_motd.cpp:26
msgid "[<server>]"
msgstr ""
msgstr "[<server>]"
#: block_motd.cpp:27
msgid ""
"Override the block with this command. Can optionally specify which server to "
"query."
msgstr ""
"Écrase le bloc avec cette commande. Un serveur peut-être optionnellement "
"Écrase le bloc avec cette commande. Un serveur peut être optionnellement "
"spécifié pour la requête."
#: block_motd.cpp:36
msgid "You are not connected to an IRC Server."
msgstr "Vous n'êtes pas connecté à un serveur RIC."
msgstr "Vous n'êtes pas connecté à un serveur IRC."
#: block_motd.cpp:58
msgid "MOTD blocked by ZNC"
+37
View File
@@ -0,0 +1,37 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/block_motd.pot\n"
"X-Crowdin-File-ID: 157\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: block_motd.cpp:26
msgid "[<server>]"
msgstr "[<sunucu>]"
#: block_motd.cpp:27
msgid ""
"Override the block with this command. Can optionally specify which server to "
"query."
msgstr ""
"Bu komutla bloğu geçersiz kılın. İsteğe bağlı olarak hangi sunucunun "
"sorgulanacağını belirtebilir."
#: block_motd.cpp:36
msgid "You are not connected to an IRC Server."
msgstr "Bir IRC Sunucusuna bağlı değilsiniz."
#: block_motd.cpp:58
msgid "MOTD blocked by ZNC"
msgstr "MOTD ZNC tarafından engellendi"
#: block_motd.cpp:104
msgid "Block the MOTD from IRC so it's not sent to your client(s)."
msgstr "İstemcilerinize gönderilmemesi için MOTD'yi IRC'den engelleyin."
+1 -1
View File
@@ -26,7 +26,7 @@ msgstr "Liste des utilisateurs bloqués"
#: blockuser.cpp:31 blockuser.cpp:33
msgid "<user>"
msgstr ""
msgstr "<user>"
#: blockuser.cpp:31
msgid "Block a user"
+5 -5
View File
@@ -14,7 +14,7 @@ msgstr ""
#: modules/po/../data/blockuser/tmpl/blockuser_WebadminUser.tmpl:9
msgid "Account is blocked"
msgstr ""
msgstr "Conta bloqueada"
#: blockuser.cpp:23
msgid "Your account has been disabled. Contact your administrator."
@@ -28,7 +28,7 @@ msgstr "Listar usuários bloqueados"
#: blockuser.cpp:31 blockuser.cpp:33
msgid "<user>"
msgstr ""
msgstr "<usuário>"
#: blockuser.cpp:31
msgid "Block a user"
@@ -48,7 +48,7 @@ msgstr "Acesso negado"
#: blockuser.cpp:85
msgid "No users are blocked"
msgstr ""
msgstr "Nenhum usuário bloqueado"
#: blockuser.cpp:88
msgid "Blocked users:"
@@ -64,7 +64,7 @@ msgstr ""
#: blockuser.cpp:110 blockuser.cpp:152
msgid "Blocked {1}"
msgstr ""
msgstr "O usuário {1} foi bloqueado"
#: blockuser.cpp:112
msgid "Could not block {1} (misspelled?)"
@@ -92,7 +92,7 @@ msgstr "O usuário {1} não está bloqueado"
#: blockuser.cpp:216
msgid "Enter one or more user names. Separate them by spaces."
msgstr ""
msgstr "Insira um ou mais usuários, separados por espaços."
#: blockuser.cpp:219
msgid "Block certain users from logging in."
+97
View File
@@ -0,0 +1,97 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/blockuser.pot\n"
"X-Crowdin-File-ID: 158\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: modules/po/../data/blockuser/tmpl/blockuser_WebadminUser.tmpl:9
msgid "Account is blocked"
msgstr "Hesap bloke edildi"
#: blockuser.cpp:23
msgid "Your account has been disabled. Contact your administrator."
msgstr "Hesabınız engellendi. Yöneticinizle iletişime geçin."
#: blockuser.cpp:29
msgid "List blocked users"
msgstr "Bloke edilen kullanıcıları listele"
#: blockuser.cpp:31 blockuser.cpp:33
msgid "<user>"
msgstr "<kullanıcı>"
#: blockuser.cpp:31
msgid "Block a user"
msgstr "Bir kullanıcıyı bloke et"
#: blockuser.cpp:33
msgid "Unblock a user"
msgstr "Bir kullanıcının blokesini kaldır"
#: blockuser.cpp:55
msgid "Could not block {1}"
msgstr "{1} bloke edilemedi"
#: blockuser.cpp:76
msgid "Access denied"
msgstr "Erişim reddedildi"
#: blockuser.cpp:85
msgid "No users are blocked"
msgstr "Bloke edilen kullanıcı yok"
#: blockuser.cpp:88
msgid "Blocked users:"
msgstr "Bloke edilen kullanıcılar:"
#: blockuser.cpp:100
msgid "Usage: Block <user>"
msgstr "Kullanımı: Block <kullanıcı>"
#: blockuser.cpp:105 blockuser.cpp:147
msgid "You can't block yourself"
msgstr "Kendinizi kendinizi bloke edemezsiniz"
#: blockuser.cpp:110 blockuser.cpp:152
msgid "Blocked {1}"
msgstr "{1} bloke edildi"
#: blockuser.cpp:112
msgid "Could not block {1} (misspelled?)"
msgstr "{1} bloke edilemedi (yanlış mı yazılmış?)"
#: blockuser.cpp:120
msgid "Usage: Unblock <user>"
msgstr "Kullanımı: UnBlock <kullanıcı>"
#: blockuser.cpp:125 blockuser.cpp:161
msgid "Unblocked {1}"
msgstr "{1} blokesi kaldırıldı"
#: blockuser.cpp:127
msgid "This user is not blocked"
msgstr "Bu kullanıcı bloke edilmedi"
#: blockuser.cpp:155
msgid "Couldn't block {1}"
msgstr "{1} bloke edilemedi"
#: blockuser.cpp:164
msgid "User {1} is not blocked"
msgstr "{1} kullanıcısı bloke edilmedi"
#: blockuser.cpp:216
msgid "Enter one or more user names. Separate them by spaces."
msgstr "Bir veya daha fazla kullanıcı adı girin. Bunları boşluklarla ayırın."
#: blockuser.cpp:219
msgid "Block certain users from logging in."
msgstr "Belirli kullanıcıların giriş yapmasını bloke edin."
+135
View File
@@ -0,0 +1,135 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/bouncedcc.pot\n"
"X-Crowdin-File-ID: 159\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: bouncedcc.cpp:101 bouncedcc.cpp:119 bouncedcc.cpp:121
msgctxt "list"
msgid "Type"
msgstr "Tip"
#: bouncedcc.cpp:102 bouncedcc.cpp:132
msgctxt "list"
msgid "State"
msgstr "Durum"
#: bouncedcc.cpp:103
msgctxt "list"
msgid "Speed"
msgstr "Hız"
#: bouncedcc.cpp:104 bouncedcc.cpp:115
msgctxt "list"
msgid "Nick"
msgstr "Nick"
#: bouncedcc.cpp:105 bouncedcc.cpp:116
msgctxt "list"
msgid "IP"
msgstr "IP"
#: bouncedcc.cpp:106 bouncedcc.cpp:122
msgctxt "list"
msgid "File"
msgstr "Dosya"
#: bouncedcc.cpp:119
msgctxt "list"
msgid "Chat"
msgstr "Chat"
#: bouncedcc.cpp:121
msgctxt "list"
msgid "Xfer"
msgstr "Xfer"
#: bouncedcc.cpp:125
msgid "Waiting"
msgstr "Bekleniyor"
#: bouncedcc.cpp:127
msgid "Halfway"
msgstr "Halfway"
#: bouncedcc.cpp:129
msgid "Connected"
msgstr "Bağlandı"
#: bouncedcc.cpp:137
msgid "You have no active DCCs."
msgstr "Aktif DCCniz bulunmamaktadır."
#: bouncedcc.cpp:148
msgid "Use client IP: {1}"
msgstr "İstemci IP'sini kullan: {1}"
#: bouncedcc.cpp:153
msgid "List all active DCCs"
msgstr "Tüm etkin DCC'leri listele"
#: bouncedcc.cpp:156
msgid "Change the option to use IP of client"
msgstr "İstemcinin IP'sini kullanma seçeneğini değiştirin"
#: bouncedcc.cpp:383 bouncedcc.cpp:412 bouncedcc.cpp:436 bouncedcc.cpp:451
msgctxt "type"
msgid "Chat"
msgstr "Chat"
#: bouncedcc.cpp:383 bouncedcc.cpp:412 bouncedcc.cpp:436 bouncedcc.cpp:451
msgctxt "type"
msgid "Xfer"
msgstr "Xfer"
#: bouncedcc.cpp:385
msgid "DCC {1} Bounce ({2}): Too long line received"
msgstr "DCC {1} Geri Dönme ({2}): Çok uzun satır alındı"
#: bouncedcc.cpp:418
msgid "DCC {1} Bounce ({2}): Timeout while connecting to {3} {4}"
msgstr "DCC {1} Geri Dönme ({2}): {3} {4}'e bağlanırken zaman aşımı"
#: bouncedcc.cpp:422
msgid "DCC {1} Bounce ({2}): Timeout while connecting."
msgstr "DCC {1} Geri Dönme ({2}): Bağlantı sırasında zaman aşımı."
#: bouncedcc.cpp:427
msgid ""
"DCC {1} Bounce ({2}): Timeout while waiting for incoming connection on {3} "
"{4}"
msgstr ""
"DCC {1} Geri Dönme ({2}): {3} {4} üzerinde gelen bağlantı beklenirken zaman "
"aşımı"
#: bouncedcc.cpp:440
msgid "DCC {1} Bounce ({2}): Connection refused while connecting to {3} {4}"
msgstr "DCC {1} Geri Döndü ({2}): {3} {4}'e bağlanırken bağlantı reddedildi"
#: bouncedcc.cpp:444
msgid "DCC {1} Bounce ({2}): Connection refused while connecting."
msgstr "DCC {1} Geri Dönme ({2}): Bağlanırken bağlantı reddedildi."
#: bouncedcc.cpp:457 bouncedcc.cpp:465
msgid "DCC {1} Bounce ({2}): Socket error on {3} {4}: {5}"
msgstr "DCC {1} Geri Dönme ({2}): {3} {4} üzerinde soket hatası: {5}"
#: bouncedcc.cpp:460
msgid "DCC {1} Bounce ({2}): Socket error: {3}"
msgstr "DCC {1} Geri Dönme ({2}): Soket hatası: {3}"
#: bouncedcc.cpp:547
msgid ""
"Bounces DCC transfers through ZNC instead of sending them directly to the "
"user. "
msgstr ""
"DCC aktarımlarını doğrudan kullanıcıya göndermek yerine ZNC aracılığıyla "
"geri döndürür. "
+1 -1
View File
@@ -18,7 +18,7 @@ msgstr "Servidor"
#: buffextras.cpp:47
msgid "{1} set mode: {2} {3}"
msgstr ""
msgstr "{1} definiu o(s) modo(s): {2} {3}"
#: buffextras.cpp:55
msgid "{1} kicked {2} with reason: {3}"
+49
View File
@@ -0,0 +1,49 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/buffextras.pot\n"
"X-Crowdin-File-ID: 160\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: buffextras.cpp:45
msgid "Server"
msgstr "Sunucu"
#: buffextras.cpp:47
msgid "{1} set mode: {2} {3}"
msgstr "{1} modu ayarladı: {2} {3}"
#: buffextras.cpp:55
msgid "{1} kicked {2} with reason: {3}"
msgstr "{1}, {2}'yi şu nedenle attı: {3}"
#: buffextras.cpp:64
msgid "{1} quit: {2}"
msgstr "{1} çıkış: {2}"
#: buffextras.cpp:73
msgid "{1} joined"
msgstr "{1} katıldı"
#: buffextras.cpp:81
msgid "{1} parted: {2}"
msgstr "{1} ayrıldı: {2}"
#: buffextras.cpp:90
msgid "{1} is now known as {2}"
msgstr "{1} artık {2} olarak biliniyor"
#: buffextras.cpp:100
msgid "{1} changed the topic to: {2}"
msgstr "{1} başlığı şu şekilde değiştirdi: {2}"
#: buffextras.cpp:115
msgid "Adds joins, parts etc. to the playback buffer"
msgstr "Katılımlar, ayrılmalar vb. oynatma arabelleğine ekler"
+18 -11
View File
@@ -15,7 +15,7 @@ msgstr ""
# this text is inserted into `click here` in the other string
#: modules/po/../data/cert/tmpl/index.tmpl:5
msgid "here"
msgstr ""
msgstr "ici"
# {1} is `here`, translateable in the other string
#: modules/po/../data/cert/tmpl/index.tmpl:6
@@ -23,53 +23,60 @@ msgid ""
"You already have a certificate set, use the form below to overwrite the "
"current certificate. Alternatively click {1} to delete your certificate."
msgstr ""
"Vous avez déjà un certificat enregistré, utilisez le formulaire ci-dessous "
"pour écraser le certificat actuel. Alternativement, cliquez sur {1} pour "
"supprimer votre certificat."
#: modules/po/../data/cert/tmpl/index.tmpl:8
msgid "You do not have a certificate yet."
msgstr ""
msgstr "Vous n'avez pas encore de certificat."
#: modules/po/../data/cert/tmpl/index.tmpl:14 cert.cpp:72
msgid "Certificate"
msgstr ""
msgstr "Certificat"
#: modules/po/../data/cert/tmpl/index.tmpl:18
msgid "PEM File:"
msgstr ""
msgstr "Fichier PEM :"
#: modules/po/../data/cert/tmpl/index.tmpl:22
msgid "Update"
msgstr ""
msgstr "Mise à jour"
#: cert.cpp:28
msgid "Pem file deleted"
msgstr ""
msgstr "Fichier PEM supprimé"
#: cert.cpp:31
msgid "The pem file doesn't exist or there was a error deleting the pem file."
msgstr ""
"Le fichier PEM n'existe pas, ou bien une erreur est survenue en supprimant "
"le fichier PEM."
#: cert.cpp:38
msgid "You have a certificate in {1}"
msgstr ""
msgstr "Vous avez un certificat dans {1}"
#: cert.cpp:41
msgid ""
"You do not have a certificate. Please use the web interface to add a "
"certificate"
msgstr ""
"Vous n'avez pas de certificat. Utilisez l'interface web pour ajouter un "
"certificat"
#: cert.cpp:44
msgid "Alternatively you can either place one at {1}"
msgstr ""
msgstr "Alternativement, vous pouvez en placer un à {1}"
#: cert.cpp:52
msgid "Delete the current certificate"
msgstr ""
msgstr "Supprimer le certificat actuel"
#: cert.cpp:54
msgid "Show the current certificate"
msgstr ""
msgstr "Montrer le certificat actuel"
#: cert.cpp:105
msgid "Use a ssl certificate to connect to a server"
msgstr ""
msgstr "Utiliser un certificat SSL pour vous connecter à un serveur"
+2 -2
View File
@@ -15,7 +15,7 @@ msgstr ""
# this text is inserted into `click here` in the other string
#: modules/po/../data/cert/tmpl/index.tmpl:5
msgid "here"
msgstr ""
msgstr "aqui"
# {1} is `here`, translateable in the other string
#: modules/po/../data/cert/tmpl/index.tmpl:6
@@ -26,7 +26,7 @@ msgstr ""
#: modules/po/../data/cert/tmpl/index.tmpl:8
msgid "You do not have a certificate yet."
msgstr ""
msgstr "Você não possui um certificado."
#: modules/po/../data/cert/tmpl/index.tmpl:14 cert.cpp:72
msgid "Certificate"
+78
View File
@@ -0,0 +1,78 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/cert.pot\n"
"X-Crowdin-File-ID: 161\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
# this text is inserted into `click here` in the other string
#: modules/po/../data/cert/tmpl/index.tmpl:5
msgid "here"
msgstr "burada"
# {1} is `here`, translateable in the other string
#: modules/po/../data/cert/tmpl/index.tmpl:6
msgid ""
"You already have a certificate set, use the form below to overwrite the "
"current certificate. Alternatively click {1} to delete your certificate."
msgstr ""
"Zaten bir sertifika setiniz var, mevcut sertifikanın üzerine yazmak için "
"aşağıdaki formu kullanın. Alternatif olarak sertifikanızı silmek için {1} "
"öğesine tıklayın."
#: modules/po/../data/cert/tmpl/index.tmpl:8
msgid "You do not have a certificate yet."
msgstr "Henüz bir sertifikanız yok."
#: modules/po/../data/cert/tmpl/index.tmpl:14 cert.cpp:72
msgid "Certificate"
msgstr "Sertifika"
#: modules/po/../data/cert/tmpl/index.tmpl:18
msgid "PEM File:"
msgstr "PEM Dosyası:"
#: modules/po/../data/cert/tmpl/index.tmpl:22
msgid "Update"
msgstr "Güncelle"
#: cert.cpp:28
msgid "Pem file deleted"
msgstr "PEM dosyası silindi"
#: cert.cpp:31
msgid "The pem file doesn't exist or there was a error deleting the pem file."
msgstr "PEM dosyası mevcut değil veya PEM dosyası silinirken bir hata oluştu."
#: cert.cpp:38
msgid "You have a certificate in {1}"
msgstr "{1} alanında bir sertifikanız var"
#: cert.cpp:41
msgid ""
"You do not have a certificate. Please use the web interface to add a "
"certificate"
msgstr "Sertifikanız yok. Sertifika eklemek için lütfen web arayüzünü kullanın"
#: cert.cpp:44
msgid "Alternatively you can either place one at {1}"
msgstr "Alternatif olarak {1}'e de bir tane yerleştirebilirsiniz"
#: cert.cpp:52
msgid "Delete the current certificate"
msgstr "Mevcut sertifikayı sil"
#: cert.cpp:54
msgid "Show the current certificate"
msgstr "Geçerli sertifikayı göster"
#: cert.cpp:105
msgid "Use a ssl certificate to connect to a server"
msgstr "Bir sunucuya bağlanmak için SSL sertifikası kullan"
+24 -20
View File
@@ -14,95 +14,99 @@ msgstr ""
#: modules/po/../data/certauth/tmpl/index.tmpl:7
msgid "Add a key"
msgstr ""
msgstr "Ajouter une clé"
#: modules/po/../data/certauth/tmpl/index.tmpl:11
msgid "Key:"
msgstr ""
msgstr "Clé :"
#: modules/po/../data/certauth/tmpl/index.tmpl:15
msgid "Add Key"
msgstr ""
msgstr "Ajouter une clé"
#: modules/po/../data/certauth/tmpl/index.tmpl:23
msgid "You have no keys."
msgstr ""
msgstr "Vous n'avez pas de clé."
#: modules/po/../data/certauth/tmpl/index.tmpl:30
msgctxt "web"
msgid "Key"
msgstr ""
msgstr "Clé"
#: modules/po/../data/certauth/tmpl/index.tmpl:36
msgid "del"
msgstr ""
msgstr "Suppr"
#: certauth.cpp:31
msgid "[pubkey]"
msgstr ""
msgstr "[clé publique]"
#: certauth.cpp:32
msgid "Add a public key. If key is not provided will use the current key"
msgstr ""
"Ajouter une clé publique. Si aucune clé n'est spécifiée, la clé actuelle "
"sera utilisée"
#: certauth.cpp:35
msgid "id"
msgstr ""
msgstr "id"
#: certauth.cpp:35
msgid "Delete a key by its number in List"
msgstr ""
msgstr "Supprime une clé via sur numéro dans la liste"
#: certauth.cpp:37
msgid "List your public keys"
msgstr ""
msgstr "Lister vos clés publiques"
#: certauth.cpp:39
msgid "Print your current key"
msgstr ""
msgstr "Afficher votre clé actuelle"
#: certauth.cpp:142
msgid "You are not connected with any valid public key"
msgstr ""
msgstr "Vous n'êtes pas connecté(e) avec une clé publique valide"
#: certauth.cpp:144
msgid "Your current public key is: {1}"
msgstr ""
msgstr "Votre clé publique actuelle est : {1}"
#: certauth.cpp:157
msgid "You did not supply a public key or connect with one."
msgstr ""
"Vous n'avez pas fourni de clé publique ou ne vous êtes pas connecté avec."
#: certauth.cpp:160
msgid "Key '{1}' added."
msgstr ""
msgstr "Clé '{1}' ajoutée."
#: certauth.cpp:162
msgid "The key '{1}' is already added."
msgstr ""
msgstr "La clé '{1}' a déjà été ajoutée."
#: certauth.cpp:170 certauth.cpp:183
msgctxt "list"
msgid "Id"
msgstr ""
msgstr "ID"
#: certauth.cpp:171 certauth.cpp:184
msgctxt "list"
msgid "Key"
msgstr ""
msgstr "Clé"
#: certauth.cpp:176 certauth.cpp:190 certauth.cpp:199
msgid "No keys set for your user"
msgstr ""
msgstr "Pas de clés enregistrées pour votre utilisateur"
#: certauth.cpp:204
msgid "Invalid #, check \"list\""
msgstr ""
msgstr "Canal invalide, vérifiez avec \"/list\"."
#: certauth.cpp:216
msgid "Removed"
msgstr ""
msgstr "Supprimé"
#: certauth.cpp:291
msgid "Allows users to authenticate via SSL client certificates."
msgstr ""
"Autorise les utilisateurs à s'authentifier via le certificat SSL client."
+3 -3
View File
@@ -35,7 +35,7 @@ msgstr "Chave"
#: modules/po/../data/certauth/tmpl/index.tmpl:36
msgid "del"
msgstr ""
msgstr "excluir"
#: certauth.cpp:31
msgid "[pubkey]"
@@ -91,7 +91,7 @@ msgstr ""
#: certauth.cpp:171 certauth.cpp:184
msgctxt "list"
msgid "Key"
msgstr ""
msgstr "Chave"
#: certauth.cpp:176 certauth.cpp:190 certauth.cpp:199
msgid "No keys set for your user"
@@ -103,7 +103,7 @@ msgstr ""
#: certauth.cpp:216
msgid "Removed"
msgstr ""
msgstr "removida"
#: certauth.cpp:291
msgid "Allows users to authenticate via SSL client certificates."
+111
View File
@@ -0,0 +1,111 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/certauth.pot\n"
"X-Crowdin-File-ID: 162\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: modules/po/../data/certauth/tmpl/index.tmpl:7
msgid "Add a key"
msgstr "Bir anahtar ekle"
#: modules/po/../data/certauth/tmpl/index.tmpl:11
msgid "Key:"
msgstr "Anahtar:"
#: modules/po/../data/certauth/tmpl/index.tmpl:15
msgid "Add Key"
msgstr "Anahtar Ekle"
#: modules/po/../data/certauth/tmpl/index.tmpl:23
msgid "You have no keys."
msgstr "Hiçbir anahtarınız yok."
#: modules/po/../data/certauth/tmpl/index.tmpl:30
msgctxt "web"
msgid "Key"
msgstr "Anahtar"
#: modules/po/../data/certauth/tmpl/index.tmpl:36
msgid "del"
msgstr "sil"
#: certauth.cpp:31
msgid "[pubkey]"
msgstr "[pubkey]"
#: certauth.cpp:32
msgid "Add a public key. If key is not provided will use the current key"
msgstr ""
"Ortak anahtar ekleyin. Anahtar sağlanmazsa mevcut anahtar kullanılacaktır"
#: certauth.cpp:35
msgid "id"
msgstr "id"
#: certauth.cpp:35
msgid "Delete a key by its number in List"
msgstr "Listedeki numarasına göre bir anahtarı silme"
#: certauth.cpp:37
msgid "List your public keys"
msgstr "Genel anahtarlarınızı listeleyin"
#: certauth.cpp:39
msgid "Print your current key"
msgstr "Mevcut anahtarınızı yazdırın"
#: certauth.cpp:142
msgid "You are not connected with any valid public key"
msgstr "Herhangi bir geçerli genel anahtara bağlı değilsiniz"
#: certauth.cpp:144
msgid "Your current public key is: {1}"
msgstr "Mevcut genel anahtarınız: {1}"
#: certauth.cpp:157
msgid "You did not supply a public key or connect with one."
msgstr "Bir ortak anahtar sağlamadınız veya bir ortak anahtara bağlanmadınız."
#: certauth.cpp:160
msgid "Key '{1}' added."
msgstr "'{1}' anahtarı eklendi."
#: certauth.cpp:162
msgid "The key '{1}' is already added."
msgstr "'{1}' anahtarı zaten eklenmiş."
#: certauth.cpp:170 certauth.cpp:183
msgctxt "list"
msgid "Id"
msgstr "Id"
#: certauth.cpp:171 certauth.cpp:184
msgctxt "list"
msgid "Key"
msgstr "Anahtar"
#: certauth.cpp:176 certauth.cpp:190 certauth.cpp:199
msgid "No keys set for your user"
msgstr "Kullanıcınız için ayarlanmış anahtar yok"
#: certauth.cpp:204
msgid "Invalid #, check \"list\""
msgstr "Geçersiz #, \"listeyi\" kontrol et"
#: certauth.cpp:216
msgid "Removed"
msgstr "Kaldırıldı"
#: certauth.cpp:291
msgid "Allows users to authenticate via SSL client certificates."
msgstr ""
"Kullanıcıların SSL istemci sertifikaları aracılığıyla kimlik doğrulaması "
"yapmasına olanak tanır."
+18
View File
@@ -0,0 +1,18 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/chansaver.pot\n"
"X-Crowdin-File-ID: 163\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: chansaver.cpp:91
msgid "Keeps config up-to-date when user joins/parts."
msgstr ""
"Kullanıcı kanala katıldığında/ayrıldığında yapılandırmayı güncel tutar."
+18
View File
@@ -0,0 +1,18 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/clearbufferonmsg.pot\n"
"X-Crowdin-File-ID: 164\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: clearbufferonmsg.cpp:160
msgid "Clears all channel and query buffers whenever the user does something"
msgstr ""
"Kullanıcı bir şey yaptığında tüm kanal ve sorgu arabelleklerini temizler"
+3 -3
View File
@@ -14,16 +14,16 @@ msgstr ""
#: clientnotify.cpp:53
msgid "<message|notice|off>"
msgstr ""
msgstr "<message|notice|off>"
#: clientnotify.cpp:54
msgid "Sets the notify method"
msgstr ""
msgstr "Définit la méthode de notification"
#: clientnotify.cpp:56 clientnotify.cpp:59 clientnotify.cpp:63
#: clientnotify.cpp:68
msgid "<on|off>"
msgstr ""
msgstr "<on|off>"
#: clientnotify.cpp:57
msgid "Turns notifications for unseen connections on or off"
+105
View File
@@ -0,0 +1,105 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/clientnotify.pot\n"
"X-Crowdin-File-ID: 165\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: clientnotify.cpp:53
msgid "<message|notice|off>"
msgstr "<message|notice|off>"
#: clientnotify.cpp:54
msgid "Sets the notify method"
msgstr "Bildirim yöntemini ayarlayın"
#: clientnotify.cpp:56 clientnotify.cpp:59 clientnotify.cpp:63
#: clientnotify.cpp:68
msgid "<on|off>"
msgstr "<on|off>"
#: clientnotify.cpp:57
msgid "Turns notifications for unseen connections on or off"
msgstr "Görünmeyen bağlantılara ilişkin bildirimleri açar veya kapatır"
#: clientnotify.cpp:60
msgid ""
"Specifies whether you want to be notified about new connections with new IPs"
msgstr ""
"Yeni IP'lere sahip yeni bağlantılar hakkında bilgilendirilmek isteyip "
"istemediğinizi belirtir"
#: clientnotify.cpp:64
msgid ""
"Specifies whether you want to be notified about new connections with new "
"client IDs"
msgstr ""
"Yeni istemci kimlikleriyle yeni bağlantılar hakkında bilgilendirilmek "
"isteyip istemediğinizi belirtir"
#: clientnotify.cpp:69
msgid "Turns notifications for clients disconnecting on or off"
msgstr "Bağlantısı kesilen istemciler için bildirimleri açar veya kapatır"
#: clientnotify.cpp:71
msgid "Shows the current settings"
msgstr "Geçerli ayarları gösterir"
#: clientnotify.cpp:104 clientnotify.cpp:134
msgid "<This message is impossible for 1 client>"
msgid_plural ""
"Another client ({1}) authenticated as your user. Use the 'ListClients' "
"command to see all {2} clients."
msgstr[0] ""
msgstr[1] ""
"Başka bir istemcinin ({1}) kullanıcınız olarak kimliği doğrulandı. Tüm {2} "
"istemcilerini görmek için 'ListClients' komutunu kullanın."
#: clientnotify.cpp:147
msgid "Usage: Method <message|notice|off>"
msgstr "Kullanımı: Method <message|notice|off>"
#: clientnotify.cpp:153 clientnotify.cpp:166 clientnotify.cpp:179
#: clientnotify.cpp:192 clientnotify.cpp:205
msgid "Saved."
msgstr "Kaydedildi"
#: clientnotify.cpp:160
msgid "Usage: NewOnly <on|off>"
msgstr "Kullanımı: NewOnly <on|off>"
#: clientnotify.cpp:173
msgid "Usage: NotifyOnNewIP <on|off>"
msgstr "Kullanımı: NotifyOnNewIP <on|off>"
#: clientnotify.cpp:186
msgid "Usage: NotifyOnNewID <on|off>"
msgstr "Kullanımı: NotifyOnNewID <on|off>"
#: clientnotify.cpp:199
msgid "Usage: OnDisconnect <on|off>"
msgstr "Kullanımı: OnDisconnect <on|off>"
#: clientnotify.cpp:210
msgid ""
"Current settings: Method: {1}, for unseen only: {2}, notifyfor unseen IPs: "
"{3}, notify for unseen IDs: {4}, notify ondisconnecting clients: {5}"
msgstr ""
"Geçerli ayarlar: Yöntem: {1}, yalnızca görülmeyenler için: {2}, görünmeyen "
"IP'ler için bildir: {3}, görünmeyen kimlikler için bildir: {4}, istemcilerin "
"bağlantısı kesildiğinde bildir: {5}"
#: clientnotify.cpp:224
msgid ""
"Notifies you when another IRC client logs into or out of your account. "
"Configurable."
msgstr ""
"Başka bir IRC istemcisi hesabınıza giriş yaptığında veya hesabınızdan çıkış "
"yaptığında sizi bilgilendirir. Yapılandırılabilir."
+27 -27
View File
@@ -139,7 +139,7 @@ msgstr ""
#: controlpanel.cpp:619
msgid "Error: Invalid network."
msgstr ""
msgstr "Erro: Rede inválida"
#: controlpanel.cpp:663
msgid "Usage: SetNetwork <variable> <username> <network> <value>"
@@ -151,7 +151,7 @@ msgstr "Sintaxe: AddChan <usuário> <rede> <canal>"
#: controlpanel.cpp:762
msgid "Error: User {1} already has a channel named {2}."
msgstr ""
msgstr "Erro: O usuário {1} já possui o canal {2}"
#: controlpanel.cpp:769
msgid "Channel {1} for user {2} added to network {3}."
@@ -265,11 +265,11 @@ msgstr ""
#: controlpanel.cpp:1058
msgid "Error: Internal error!"
msgstr ""
msgstr "Erro: Erro interno!"
#: controlpanel.cpp:1062
msgid "User {1} deleted!"
msgstr ""
msgstr "O usuário {1} foi excluído"
#: controlpanel.cpp:1077
msgid "Usage: CloneUser <old username> <new username>"
@@ -320,7 +320,7 @@ msgstr ""
#: controlpanel.cpp:1216 controlpanel.cpp:1224
msgctxt "listnetworks"
msgid "Network"
msgstr ""
msgstr "Rede"
#: controlpanel.cpp:1217 controlpanel.cpp:1226 controlpanel.cpp:1234
msgctxt "listnetworks"
@@ -340,11 +340,11 @@ msgstr ""
#: controlpanel.cpp:1220 controlpanel.cpp:1231
msgctxt "listnetworks"
msgid "Channels"
msgstr ""
msgstr "Canais"
#: controlpanel.cpp:1239
msgid "No networks"
msgstr ""
msgstr "Não há redes disponíveis."
#: controlpanel.cpp:1250
msgid "Usage: AddServer <username> <network> <server> [[+]port] [password]"
@@ -352,7 +352,7 @@ msgstr "Sintaxe: AddServer <usuário> <rede> <servidor> [[+]porta] [senha]"
#: controlpanel.cpp:1269
msgid "Added IRC Server {1} to network {2} for user {3}."
msgstr ""
msgstr "O servidor {1} foi adicionado à rede {2} para o usuário {3}"
#: controlpanel.cpp:1273
msgid "Error: Could not add IRC server {1} to network {2} for user {3}."
@@ -449,7 +449,7 @@ msgstr ""
#: controlpanel.cpp:1492
msgid "Loaded module {1}"
msgstr ""
msgstr "Módulo {1} carregado"
#: controlpanel.cpp:1497
msgid "Error: Unable to reload module {1}: {2}"
@@ -494,7 +494,7 @@ msgstr "Sintaxe: UnloadNetModule <usuário> <rede> <nome do módulo>"
#: controlpanel.cpp:1611 controlpanel.cpp:1617
msgctxt "listmodules"
msgid "Name"
msgstr ""
msgstr "Nome"
#: controlpanel.cpp:1612 controlpanel.cpp:1618
msgctxt "listmodules"
@@ -503,11 +503,11 @@ msgstr ""
#: controlpanel.cpp:1637
msgid "User {1} has no modules loaded."
msgstr ""
msgstr "O usuário {1} não possui módulos carregados."
#: controlpanel.cpp:1641
msgid "Modules loaded for user {1}:"
msgstr ""
msgstr "Módulos carregados para o usuário {1}:"
#: controlpanel.cpp:1661
msgid "Network {1} of user {2} has no modules loaded."
@@ -523,7 +523,7 @@ msgstr ""
#: controlpanel.cpp:1674
msgid "Prints help for matching commands and variables"
msgstr ""
msgstr "Exibe ajuda para comandos e variáveis correspondentes"
#: controlpanel.cpp:1677
msgid "<variable> [username]"
@@ -579,11 +579,11 @@ msgstr ""
#: controlpanel.cpp:1697
msgid "Adds a new channel"
msgstr ""
msgstr "Adiciona um novo canal"
#: controlpanel.cpp:1700
msgid "Deletes a channel"
msgstr ""
msgstr "Exclui um canal"
#: controlpanel.cpp:1702
msgid "Lists users"
@@ -591,23 +591,23 @@ msgstr ""
#: controlpanel.cpp:1704
msgid "<username> <password>"
msgstr ""
msgstr "<usuário> <senha>"
#: controlpanel.cpp:1705
msgid "Adds a new user"
msgstr ""
msgstr "Cria um novo usuário"
#: controlpanel.cpp:1707 controlpanel.cpp:1730 controlpanel.cpp:1744
msgid "<username>"
msgstr ""
msgstr "<usuário>"
#: controlpanel.cpp:1707
msgid "Deletes a user"
msgstr ""
msgstr "Exclui um usuário"
#: controlpanel.cpp:1709
msgid "<old username> <new username>"
msgstr ""
msgstr "<antigo nome> <novo nome>"
#: controlpanel.cpp:1710
msgid "Clones a user"
@@ -615,11 +615,11 @@ msgstr ""
#: controlpanel.cpp:1712 controlpanel.cpp:1715
msgid "<username> <network> <server>"
msgstr ""
msgstr "<usuário> <rede> <servidor>"
#: controlpanel.cpp:1713
msgid "Adds a new IRC server for the given or current user"
msgstr ""
msgstr "Adiciona um novo servidor IRC para o usuário atual ou especificado"
#: controlpanel.cpp:1716
msgid "Deletes an IRC server from the given or current user"
@@ -643,7 +643,7 @@ msgstr ""
#: controlpanel.cpp:1725
msgid "Loads a Module for a user"
msgstr ""
msgstr "Carrega um módulo para um usuário"
#: controlpanel.cpp:1727
msgid "<username> <modulename>"
@@ -663,7 +663,7 @@ msgstr ""
#: controlpanel.cpp:1735
msgid "Loads a Module for a network"
msgstr ""
msgstr "Carrega um módulo para uma rede"
#: controlpanel.cpp:1738
msgid "<username> <network> <modulename>"
@@ -679,7 +679,7 @@ msgstr ""
#: controlpanel.cpp:1745
msgid "List the configured CTCP replies"
msgstr ""
msgstr "Lista as respostas CTCP configuradas"
#: controlpanel.cpp:1747
msgid "<username> <ctcp> [reply]"
@@ -703,7 +703,7 @@ msgstr ""
#: controlpanel.cpp:1756
msgid "Add a network for a user"
msgstr ""
msgstr "Adiciona uma rede para o usuário"
#: controlpanel.cpp:1759
msgid "Delete a network for a user"
@@ -715,7 +715,7 @@ msgstr ""
#: controlpanel.cpp:1762
msgid "List all networks for a user"
msgstr ""
msgstr "Lista todas as redes de um usuário"
#: controlpanel.cpp:1775
msgid ""
+741
View File
@@ -0,0 +1,741 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: znc-bouncer\n"
"X-Crowdin-Project-ID: 289533\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/modules/po/controlpanel.pot\n"
"X-Crowdin-File-ID: 166\n"
"Project-Id-Version: znc-bouncer\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
#: controlpanel.cpp:51 controlpanel.cpp:64
msgctxt "helptable"
msgid "Type"
msgstr "Tip"
#: controlpanel.cpp:52 controlpanel.cpp:66
msgctxt "helptable"
msgid "Variables"
msgstr "Değişkenler"
#: controlpanel.cpp:78
msgid "String"
msgstr "Dizi"
#: controlpanel.cpp:79
msgid "Boolean (true/false)"
msgstr "Boolean (doğru/yanlış)"
#: controlpanel.cpp:80
msgid "Integer"
msgstr "Tamsayı"
#: controlpanel.cpp:81
msgid "Number"
msgstr "Numara"
#: controlpanel.cpp:131
msgid "The following variables are available when using the Set/Get commands:"
msgstr "Set/Get komutlarını kullanırken aşağıdaki değişkenler kullanılabilir:"
#: controlpanel.cpp:155
msgid ""
"The following variables are available when using the SetNetwork/GetNetwork "
"commands:"
msgstr ""
"SetNetwork/GetNetwork komutlarını kullanırken aşağıdaki değişkenler "
"kullanılabilir:"
#: controlpanel.cpp:169
msgid ""
"The following variables are available when using the SetChan/GetChan "
"commands:"
msgstr ""
"SetChan/GetChan komutlarını kullanırken aşağıdaki değişkenler kullanılabilir:"
#: controlpanel.cpp:176
msgid ""
"You can use $user as the user name and $network as the network name for "
"modifying your own user and network."
msgstr ""
"Kendi kullanıcınızı ve ağınızı değiştirmek için kullanıcı adı olarak $user "
"ve ağ adı olarak $network kullanabilirsiniz."
#: controlpanel.cpp:186 controlpanel.cpp:1047 controlpanel.cpp:1084
msgid "Error: User [{1}] does not exist!"
msgstr "Hata: [{1}] kullanıcısı mevcut değil!"
#: controlpanel.cpp:191
msgid "Error: You need to have admin rights to modify other users!"
msgstr ""
"Hata: Diğer kullanıcıları değiştirmek için yönetici haklarına sahip olmanız "
"gerekiyor!"
#: controlpanel.cpp:201
msgid "Error: You cannot use $network to modify other users!"
msgstr "Hata: Diğer kullanıcıları değiştirmek için $network'ü kullanamazsınız!"
#: controlpanel.cpp:209
msgid "Error: User {1} does not have a network named [{2}]."
msgstr "Hata: {1} kullanıcısının [{2}] adında bir ağı yok."
#: controlpanel.cpp:221
msgid "Usage: Get <variable> [username]"
msgstr "Kullanımı: Get <değişken> [kullanıcı_adı]"
#: controlpanel.cpp:321 controlpanel.cpp:576 controlpanel.cpp:651
#: controlpanel.cpp:739 controlpanel.cpp:874 controlpanel.cpp:959
msgid "Error: Unknown variable"
msgstr "Hata: Bilinmeyen değişken"
#: controlpanel.cpp:330
msgid "Usage: Set <variable> <username> <value>"
msgstr "Kullanımı: Set <değişken> <kullanıcı_adı> <değer>"
#: controlpanel.cpp:348 controlpanel.cpp:355 controlpanel.cpp:367
#: controlpanel.cpp:379 controlpanel.cpp:387 controlpanel.cpp:395
#: controlpanel.cpp:403 controlpanel.cpp:411 controlpanel.cpp:419
#: controlpanel.cpp:427 controlpanel.cpp:437 controlpanel.cpp:494
#: controlpanel.cpp:513 controlpanel.cpp:529 controlpanel.cpp:539
#: controlpanel.cpp:688 controlpanel.cpp:695 controlpanel.cpp:707
#: controlpanel.cpp:728 controlpanel.cpp:1126 controlpanel.cpp:1176
#: controlpanel.cpp:1259 controlpanel.cpp:1295 controlpanel.cpp:1428
#: controlpanel.cpp:1455
msgid "Access denied!"
msgstr "Erişim reddedildi!"
#: controlpanel.cpp:360 controlpanel.cpp:700
msgid "This bind host is already set!"
msgstr "This bind host is already set!"
#: controlpanel.cpp:445 controlpanel.cpp:454 controlpanel.cpp:923
msgid "Setting failed, limit for buffer size is {1}"
msgstr "Ayar başarısız oldu, arabellek boyutu sınırı: {1}"
#: controlpanel.cpp:474
msgid "Password has been changed!"
msgstr "Şifre değiştirildi!"
#: controlpanel.cpp:482
msgid "Timeout can't be less than 30 seconds!"
msgstr "Zaman aşımı 30 saniyeden az olamaz!"
#: controlpanel.cpp:546
msgid "That would be a bad idea!"
msgstr "Bu kötü bir fikir olurdu!"
#: controlpanel.cpp:564
msgid "Supported languages: {1}"
msgstr "Desteklenen diller: {1}"
#: controlpanel.cpp:588
msgid "Usage: GetNetwork <variable> [username] [network]"
msgstr "Kullanımı: GetNetwork <değişken> [kullanıcı_adı] [ağ]"
#: controlpanel.cpp:607
msgid "Error: A network must be specified to get another users settings."
msgstr ""
"Hata: Başka bir kullanıcının ayarlarını alabilmek için bir ağ "
"belirtilmelidir."
#: controlpanel.cpp:613
msgid "You are not currently attached to a network."
msgstr ""
"Hata: Başka bir kullanıcının ayarlarını alabilmek için bir ağ "
"belirtilmelidir."
#: controlpanel.cpp:619
msgid "Error: Invalid network."
msgstr "Hata: Geçersiz ağ."
#: controlpanel.cpp:663
msgid "Usage: SetNetwork <variable> <username> <network> <value>"
msgstr "Kullanımı: SetNetwork <değişken> <kullanıcı_adı> <ağ> <değer>"
#: controlpanel.cpp:749
msgid "Usage: AddChan <username> <network> <channel>"
msgstr "Kullanımı: AddChan <kullanıcı_adı><ağ> <kanal>"
#: controlpanel.cpp:762
msgid "Error: User {1} already has a channel named {2}."
msgstr "Hata: {1} kullanıcısının zaten {2} adında bir kanalı var."
#: controlpanel.cpp:769
msgid "Channel {1} for user {2} added to network {3}."
msgstr "{2} kullanıcısı için {1} kanalı, {3} ağına eklendi."
#: controlpanel.cpp:773
msgid ""
"Could not add channel {1} for user {2} to network {3}, does it already exist?"
msgstr ""
"{2} kullanıcısı için {1} kanalı {3} ağına eklenemedi, zaten mevcut olabilir "
"mi?"
#: controlpanel.cpp:783
msgid "Usage: DelChan <username> <network> <channel>"
msgstr "Kullanımı: DelChan <kullanıcı_adı><ağ><kanal>"
#: controlpanel.cpp:798
msgid "Error: User {1} does not have any channel matching [{2}] in network {3}"
msgstr ""
"Hata: {1} kullanıcısının, {3} ağında [{2}] ile eşleşen herhangi bir kanalı "
"yok"
#: controlpanel.cpp:811
msgid "Channel {1} is deleted from network {2} of user {3}"
msgid_plural "Channels {1} are deleted from network {2} of user {3}"
msgstr[0] "{1} kanalı, {3} kullanıcısının {2} ağından silindi"
msgstr[1] "{1} kanalları, {3} kullanıcısının {2} ağından silindi"
#: controlpanel.cpp:826
msgid "Usage: GetChan <variable> <username> <network> <chan>"
msgstr "Kullanımı: GetChan <değişken> <kullanıcı_adı> <ağ> <kanal>"
#: controlpanel.cpp:840 controlpanel.cpp:904
msgid "Error: No channels matching [{1}] found."
msgstr "Hata: [{1}] ile eşleşen kanal bulunamadı."
#: controlpanel.cpp:889
msgid "Usage: SetChan <variable> <username> <network> <chan> <value>"
msgstr "Kullanımı: SetChan <değişken> <kullanıcı_adı> <ağ> <kanal> <değer>"
#: controlpanel.cpp:970 controlpanel.cpp:980
msgctxt "listusers"
msgid "Username"
msgstr "Kullanıcı Adı"
#: controlpanel.cpp:971 controlpanel.cpp:981
msgctxt "listusers"
msgid "Realname"
msgstr "Gerçek Adı"
#: controlpanel.cpp:972 controlpanel.cpp:984 controlpanel.cpp:986
msgctxt "listusers"
msgid "IsAdmin"
msgstr "Admin mi"
#: controlpanel.cpp:973 controlpanel.cpp:987
msgctxt "listusers"
msgid "Nick"
msgstr "Nick"
#: controlpanel.cpp:974 controlpanel.cpp:988
msgctxt "listusers"
msgid "AltNick"
msgstr "Alt(ernatif)Nick"
#: controlpanel.cpp:975 controlpanel.cpp:989
msgctxt "listusers"
msgid "Ident"
msgstr "Ident"
#: controlpanel.cpp:976 controlpanel.cpp:990
msgctxt "listusers"
msgid "BindHost"
msgstr "BindHost"
#: controlpanel.cpp:984 controlpanel.cpp:1234
msgid "No"
msgstr "Hayır"
#: controlpanel.cpp:986 controlpanel.cpp:1226
msgid "Yes"
msgstr "Evet"
#: controlpanel.cpp:1000 controlpanel.cpp:1069
msgid "Error: You need to have admin rights to add new users!"
msgstr ""
"Hata: Yeni kullanıcılar eklemek için yönetici haklarına sahip olmanız "
"gerekiyor!"
#: controlpanel.cpp:1006
msgid "Usage: AddUser <username> <password>"
msgstr "Kullanımı: AddUser <kullanıcı_adı> <şifre>"
#: controlpanel.cpp:1011
msgid "Error: User {1} already exists!"
msgstr ""
#: controlpanel.cpp:1023 controlpanel.cpp:1098
msgid "Error: User not added: {1}"
msgstr ""
#: controlpanel.cpp:1027 controlpanel.cpp:1102
msgid "User {1} added!"
msgstr ""
#: controlpanel.cpp:1034
msgid "Error: You need to have admin rights to delete users!"
msgstr ""
#: controlpanel.cpp:1040
msgid "Usage: DelUser <username>"
msgstr ""
#: controlpanel.cpp:1052
msgid "Error: You can't delete yourself!"
msgstr ""
#: controlpanel.cpp:1058
msgid "Error: Internal error!"
msgstr ""
#: controlpanel.cpp:1062
msgid "User {1} deleted!"
msgstr ""
#: controlpanel.cpp:1077
msgid "Usage: CloneUser <old username> <new username>"
msgstr ""
#: controlpanel.cpp:1092
msgid "Error: Cloning failed: {1}"
msgstr ""
#: controlpanel.cpp:1121
msgid "Usage: AddNetwork [user] network"
msgstr ""
#: controlpanel.cpp:1132
msgid ""
"Network number limit reached. Ask an admin to increase the limit for you, or "
"delete unneeded networks using /znc DelNetwork <name>"
msgstr ""
#: controlpanel.cpp:1140
msgid "Error: User {1} already has a network with the name {2}"
msgstr ""
#: controlpanel.cpp:1147
msgid "Network {1} added to user {2}."
msgstr ""
#: controlpanel.cpp:1151
msgid "Error: Network [{1}] could not be added for user {2}: {3}"
msgstr ""
#: controlpanel.cpp:1171
msgid "Usage: DelNetwork [user] network"
msgstr ""
#: controlpanel.cpp:1187
msgid "The currently active network can be deleted via {1}status"
msgstr ""
#: controlpanel.cpp:1193
msgid "Network {1} deleted for user {2}."
msgstr ""
#: controlpanel.cpp:1197
msgid "Error: Network {1} could not be deleted for user {2}."
msgstr ""
#: controlpanel.cpp:1216 controlpanel.cpp:1224
msgctxt "listnetworks"
msgid "Network"
msgstr ""
#: controlpanel.cpp:1217 controlpanel.cpp:1226 controlpanel.cpp:1234
msgctxt "listnetworks"
msgid "OnIRC"
msgstr ""
#: controlpanel.cpp:1218 controlpanel.cpp:1227
msgctxt "listnetworks"
msgid "IRC Server"
msgstr ""
#: controlpanel.cpp:1219 controlpanel.cpp:1229
msgctxt "listnetworks"
msgid "IRC User"
msgstr ""
#: controlpanel.cpp:1220 controlpanel.cpp:1231
msgctxt "listnetworks"
msgid "Channels"
msgstr ""
#: controlpanel.cpp:1239
msgid "No networks"
msgstr ""
#: controlpanel.cpp:1250
msgid "Usage: AddServer <username> <network> <server> [[+]port] [password]"
msgstr ""
#: controlpanel.cpp:1269
msgid "Added IRC Server {1} to network {2} for user {3}."
msgstr ""
#: controlpanel.cpp:1273
msgid "Error: Could not add IRC server {1} to network {2} for user {3}."
msgstr ""
#: controlpanel.cpp:1286
msgid "Usage: DelServer <username> <network> <server> [[+]port] [password]"
msgstr ""
#: controlpanel.cpp:1306
msgid "Deleted IRC Server {1} from network {2} for user {3}."
msgstr ""
#: controlpanel.cpp:1310
msgid "Error: Could not delete IRC server {1} from network {2} for user {3}."
msgstr ""
#: controlpanel.cpp:1320
msgid "Usage: Reconnect <username> <network>"
msgstr ""
#: controlpanel.cpp:1347
msgid "Queued network {1} of user {2} for a reconnect."
msgstr ""
#: controlpanel.cpp:1356
msgid "Usage: Disconnect <username> <network>"
msgstr ""
#: controlpanel.cpp:1371
msgid "Closed IRC connection for network {1} of user {2}."
msgstr ""
#: controlpanel.cpp:1386 controlpanel.cpp:1391
msgctxt "listctcp"
msgid "Request"
msgstr ""
#: controlpanel.cpp:1387 controlpanel.cpp:1392
msgctxt "listctcp"
msgid "Reply"
msgstr ""
#: controlpanel.cpp:1396
msgid "No CTCP replies for user {1} are configured"
msgstr ""
#: controlpanel.cpp:1399
msgid "CTCP replies for user {1}:"
msgstr ""
#: controlpanel.cpp:1415
msgid "Usage: AddCTCP [user] [request] [reply]"
msgstr ""
#: controlpanel.cpp:1417
msgid ""
"This will cause ZNC to reply to the CTCP instead of forwarding it to clients."
msgstr ""
#: controlpanel.cpp:1420
msgid "An empty reply will cause the CTCP request to be blocked."
msgstr ""
#: controlpanel.cpp:1434
msgid "CTCP requests {1} to user {2} will now be blocked."
msgstr ""
#: controlpanel.cpp:1438
msgid "CTCP requests {1} to user {2} will now get reply: {3}"
msgstr ""
#: controlpanel.cpp:1460
msgid "Usage: DelCTCP [user] [request]"
msgstr ""
#: controlpanel.cpp:1466
msgid "CTCP requests {1} to user {2} will now be sent to IRC clients"
msgstr ""
#: controlpanel.cpp:1470
msgid ""
"CTCP requests {1} to user {2} will be sent to IRC clients (nothing has "
"changed)"
msgstr ""
#: controlpanel.cpp:1480 controlpanel.cpp:1554
msgid "Loading modules has been disabled."
msgstr ""
#: controlpanel.cpp:1489
msgid "Error: Unable to load module {1}: {2}"
msgstr ""
#: controlpanel.cpp:1492
msgid "Loaded module {1}"
msgstr ""
#: controlpanel.cpp:1497
msgid "Error: Unable to reload module {1}: {2}"
msgstr ""
#: controlpanel.cpp:1500
msgid "Reloaded module {1}"
msgstr ""
#: controlpanel.cpp:1504
msgid "Error: Unable to load module {1} because it is already loaded"
msgstr ""
#: controlpanel.cpp:1515
msgid "Usage: LoadModule <username> <modulename> [args]"
msgstr ""
#: controlpanel.cpp:1534
msgid "Usage: LoadNetModule <username> <network> <modulename> [args]"
msgstr ""
#: controlpanel.cpp:1559
msgid "Please use /znc unloadmod {1}"
msgstr ""
#: controlpanel.cpp:1565
msgid "Error: Unable to unload module {1}: {2}"
msgstr ""
#: controlpanel.cpp:1568
msgid "Unloaded module {1}"
msgstr ""
#: controlpanel.cpp:1577
msgid "Usage: UnloadModule <username> <modulename>"
msgstr ""
#: controlpanel.cpp:1594
msgid "Usage: UnloadNetModule <username> <network> <modulename>"
msgstr ""
#: controlpanel.cpp:1611 controlpanel.cpp:1617
msgctxt "listmodules"
msgid "Name"
msgstr ""
#: controlpanel.cpp:1612 controlpanel.cpp:1618
msgctxt "listmodules"
msgid "Arguments"
msgstr ""
#: controlpanel.cpp:1637
msgid "User {1} has no modules loaded."
msgstr ""
#: controlpanel.cpp:1641
msgid "Modules loaded for user {1}:"
msgstr ""
#: controlpanel.cpp:1661
msgid "Network {1} of user {2} has no modules loaded."
msgstr ""
#: controlpanel.cpp:1666
msgid "Modules loaded for network {1} of user {2}:"
msgstr ""
#: controlpanel.cpp:1673
msgid "[command] [variable]"
msgstr ""
#: controlpanel.cpp:1674
msgid "Prints help for matching commands and variables"
msgstr ""
#: controlpanel.cpp:1677
msgid "<variable> [username]"
msgstr ""
#: controlpanel.cpp:1678
msgid "Prints the variable's value for the given or current user"
msgstr ""
#: controlpanel.cpp:1680
msgid "<variable> <username> <value>"
msgstr ""
#: controlpanel.cpp:1681
msgid "Sets the variable's value for the given user"
msgstr ""
#: controlpanel.cpp:1683
msgid "<variable> [username] [network]"
msgstr ""
#: controlpanel.cpp:1684
msgid "Prints the variable's value for the given network"
msgstr ""
#: controlpanel.cpp:1686
msgid "<variable> <username> <network> <value>"
msgstr ""
#: controlpanel.cpp:1687
msgid "Sets the variable's value for the given network"
msgstr ""
#: controlpanel.cpp:1689
msgid "<variable> [username] <network> <chan>"
msgstr ""
#: controlpanel.cpp:1690
msgid "Prints the variable's value for the given channel"
msgstr ""
#: controlpanel.cpp:1693
msgid "<variable> <username> <network> <chan> <value>"
msgstr ""
#: controlpanel.cpp:1694
msgid "Sets the variable's value for the given channel"
msgstr ""
#: controlpanel.cpp:1696 controlpanel.cpp:1699
msgid "<username> <network> <chan>"
msgstr ""
#: controlpanel.cpp:1697
msgid "Adds a new channel"
msgstr ""
#: controlpanel.cpp:1700
msgid "Deletes a channel"
msgstr ""
#: controlpanel.cpp:1702
msgid "Lists users"
msgstr ""
#: controlpanel.cpp:1704
msgid "<username> <password>"
msgstr ""
#: controlpanel.cpp:1705
msgid "Adds a new user"
msgstr ""
#: controlpanel.cpp:1707 controlpanel.cpp:1730 controlpanel.cpp:1744
msgid "<username>"
msgstr ""
#: controlpanel.cpp:1707
msgid "Deletes a user"
msgstr ""
#: controlpanel.cpp:1709
msgid "<old username> <new username>"
msgstr ""
#: controlpanel.cpp:1710
msgid "Clones a user"
msgstr ""
#: controlpanel.cpp:1712 controlpanel.cpp:1715
msgid "<username> <network> <server>"
msgstr ""
#: controlpanel.cpp:1713
msgid "Adds a new IRC server for the given or current user"
msgstr ""
#: controlpanel.cpp:1716
msgid "Deletes an IRC server from the given or current user"
msgstr ""
#: controlpanel.cpp:1718 controlpanel.cpp:1721 controlpanel.cpp:1741
msgid "<username> <network>"
msgstr ""
#: controlpanel.cpp:1719
msgid "Cycles the user's IRC server connection"
msgstr ""
#: controlpanel.cpp:1722
msgid "Disconnects the user from their IRC server"
msgstr ""
#: controlpanel.cpp:1724
msgid "<username> <modulename> [args]"
msgstr ""
#: controlpanel.cpp:1725
msgid "Loads a Module for a user"
msgstr ""
#: controlpanel.cpp:1727
msgid "<username> <modulename>"
msgstr ""
#: controlpanel.cpp:1728
msgid "Removes a Module of a user"
msgstr ""
#: controlpanel.cpp:1731
msgid "Get the list of modules for a user"
msgstr ""
#: controlpanel.cpp:1734
msgid "<username> <network> <modulename> [args]"
msgstr ""
#: controlpanel.cpp:1735
msgid "Loads a Module for a network"
msgstr ""
#: controlpanel.cpp:1738
msgid "<username> <network> <modulename>"
msgstr ""
#: controlpanel.cpp:1739
msgid "Removes a Module of a network"
msgstr ""
#: controlpanel.cpp:1742
msgid "Get the list of modules for a network"
msgstr ""
#: controlpanel.cpp:1745
msgid "List the configured CTCP replies"
msgstr ""
#: controlpanel.cpp:1747
msgid "<username> <ctcp> [reply]"
msgstr ""
#: controlpanel.cpp:1748
msgid "Configure a new CTCP reply"
msgstr ""
#: controlpanel.cpp:1750
msgid "<username> <ctcp>"
msgstr ""
#: controlpanel.cpp:1751
msgid "Remove a CTCP reply"
msgstr ""
#: controlpanel.cpp:1755 controlpanel.cpp:1758
msgid "[username] <network>"
msgstr ""
#: controlpanel.cpp:1756
msgid "Add a network for a user"
msgstr ""
#: controlpanel.cpp:1759
msgid "Delete a network for a user"
msgstr ""
#: controlpanel.cpp:1761
msgid "[username]"
msgstr ""
#: controlpanel.cpp:1762
msgid "List all networks for a user"
msgstr ""
#: controlpanel.cpp:1775
msgid ""
"Dynamic configuration through IRC. Allows editing only yourself if you're "
"not ZNC admin."
msgstr ""

Some files were not shown because too many files have changed in this diff Show More