Fri, 18 Apr 2025 18:36:48 +0200
Extracted the IRC widgets from eric-ide to provide them as a plug-in.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/ConfigurationPage/IrcPage.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the IRC configuration page. +""" + +from eric7.Preferences.ConfigurationPages.ConfigurationPageBase import ( + ConfigurationPageBase, +) + +from .Ui_IrcPage import Ui_IrcPage + + +class IrcPage(ConfigurationPageBase, Ui_IrcPage): + """ + Class implementing the IRC configuration page. + """ + + TimeFormats = ["hh:mm", "hh:mm:ss", "h:mm ap", "h:mm:ss ap"] + DateFormats = [ + "yyyy-MM-dd", + "dd.MM.yyyy", + "MM/dd/yyyy", + "yyyy MMM. dd", + "dd MMM. yyyy", + "MMM. dd, yyyy", + ] + + def __init__(self, plugin): + """ + Constructor + + @param plugin reference to the plugin object + @type PluginPipxInterface + """ + super().__init__() + self.setupUi(self) + self.setObjectName("IrcPage") + + self.__plugin = plugin + + self.timeFormatCombo.addItems(IrcPage.TimeFormats) + self.dateFormatCombo.addItems(IrcPage.DateFormats) + + # set initial values + # timestamps + self.timestampGroup.setChecked(self.__plugin.getPreferences("ShowTimestamps")) + self.showDateCheckBox.setChecked( + self.__plugin.getPreferences("TimestampIncludeDate") + ) + self.timeFormatCombo.setCurrentIndex( + self.timeFormatCombo.findText(self.__plugin.getPreferences("TimeFormat")) + ) + self.dateFormatCombo.setCurrentIndex( + self.dateFormatCombo.findText(self.__plugin.getPreferences("DateFormat")) + ) + + # colours + self.initColour( + "NetworkMessageColour", + self.networkButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "ServerMessageColour", + self.serverButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "ErrorMessageColour", + self.errorButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "TimestampColour", + self.timestampButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "HyperlinkColour", + self.hyperlinkButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "ChannelMessageColour", + self.channelButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "OwnNickColour", + self.ownNickButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "NickColour", self.nickButton, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "JoinChannelColour", + self.joinButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "LeaveChannelColour", + self.leaveButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "ChannelInfoColour", + self.infoButton, + self.__plugin.getPreferences, + byName=True, + ) + + # notifications + self.notificationsGroup.setChecked( + self.__plugin.getPreferences("ShowNotifications") + ) + self.joinLeaveCheckBox.setChecked( + self.__plugin.getPreferences("NotifyJoinPart") + ) + self.messageCheckBox.setChecked(self.__plugin.getPreferences("NotifyMessage")) + self.ownNickCheckBox.setChecked(self.__plugin.getPreferences("NotifyNick")) + + # IRC text colors + self.initColour( + "IrcColor0", self.ircColor0Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor1", self.ircColor1Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor2", self.ircColor2Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor3", self.ircColor3Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor4", self.ircColor4Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor5", self.ircColor5Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor6", self.ircColor6Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor7", self.ircColor7Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor8", self.ircColor8Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor9", self.ircColor9Button, self.__plugin.getPreferences, byName=True + ) + self.initColour( + "IrcColor10", + self.ircColor10Button, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "IrcColor11", + self.ircColor11Button, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "IrcColor12", + self.ircColor12Button, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "IrcColor13", + self.ircColor13Button, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "IrcColor14", + self.ircColor14Button, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "IrcColor15", + self.ircColor15Button, + self.__plugin.getPreferences, + byName=True, + ) + + # Automatic User Information Lookup + self.whoGroup.setChecked(self.__plugin.getPreferences("AutoUserInfoLookup")) + self.whoUsersSpinBox.setValue(self.__plugin.getPreferences("AutoUserInfoMax")) + self.whoIntervalSpinBox.setValue( + self.__plugin.getPreferences("AutoUserInfoInterval") + ) + + # Markers + self.markWhenHiddenCheckBox.setChecked( + self.__plugin.getPreferences("MarkPositionWhenHidden") + ) + self.initColour( + "MarkerLineForegroundColour", + self.markerForegroundButton, + self.__plugin.getPreferences, + byName=True, + ) + self.initColour( + "MarkerLineBackgroundColour", + self.markerBackgroundButton, + self.__plugin.getPreferences, + byName=True, + ) + + def save(self): + """ + Public slot to save the IRC configuration. + """ + # timestamps + self.__plugin.setPreferences("ShowTimestamps", self.timestampGroup.isChecked()) + self.__plugin.setPreferences( + "TimestampIncludeDate", self.showDateCheckBox.isChecked() + ) + self.__plugin.setPreferences("TimeFormat", self.timeFormatCombo.currentText()) + self.__plugin.setPreferences("DateFormat", self.dateFormatCombo.currentText()) + + # notifications + self.__plugin.setPreferences( + "ShowNotifications", self.notificationsGroup.isChecked() + ) + self.__plugin.setPreferences( + "NotifyJoinPart", self.joinLeaveCheckBox.isChecked() + ) + self.__plugin.setPreferences("NotifyMessage", self.messageCheckBox.isChecked()) + self.__plugin.setPreferences("NotifyNick", self.ownNickCheckBox.isChecked()) + + # Automatic User Information Lookup + self.__plugin.setPreferences("AutoUserInfoLookup", self.whoGroup.isChecked()) + self.__plugin.setPreferences("AutoUserInfoMax", self.whoUsersSpinBox.value()) + self.__plugin.setPreferences( + "AutoUserInfoInterval", self.whoIntervalSpinBox.value() + ) + + # Markers + self.__plugin.setPreferences( + "MarkPositionWhenHidden", self.markWhenHiddenCheckBox.isChecked() + ) + + # colours + self.saveColours(self.__plugin.setPreferences)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/ConfigurationPage/IrcPage.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,912 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcPage</class> + <widget class="QWidget" name="IrcPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>522</width> + <height>979</height> + </rect> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="headerLabel"> + <property name="text"> + <string><b>Configure IRC</b></string> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line3"> + <property name="frameShape"> + <enum>QFrame::Shape::HLine</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Shadow::Sunken</enum> + </property> + <property name="orientation"> + <enum>Qt::Orientation::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QGroupBox" name="timestampGroup"> + <property name="toolTip"> + <string>Enable to show timestamps</string> + </property> + <property name="title"> + <string>Show Timestamps</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Time Format:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="timeFormatCombo"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Select the time format to use</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Date Format</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QComboBox" name="dateFormatCombo"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Select the date format to use</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="4"> + <widget class="QCheckBox" name="showDateCheckBox"> + <property name="toolTip"> + <string>Select to show the date in timestamps</string> + </property> + <property name="text"> + <string>Show Date</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="coloursGroup"> + <property name="title"> + <string>Colors</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Network Messages:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QPushButton" name="networkButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for network messages</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Nick Names:</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QPushButton" name="nickButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for nick names</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Server Messages:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="serverButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for server messages</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Own Nick Name:</string> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QPushButton" name="ownNickButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for own nick name</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Channel Messages:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QPushButton" name="channelButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for channel messages</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Join Channel:</string> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QPushButton" name="joinButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for join channel messages</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>Error Messages:</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QPushButton" name="errorButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for error messages</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QLabel" name="label_12"> + <property name="text"> + <string>Leave Channel:</string> + </property> + </widget> + </item> + <item row="3" column="3"> + <widget class="QPushButton" name="leaveButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for leave channel messages</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Timestamp:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QPushButton" name="timestampButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for timestamps</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="4" column="2"> + <widget class="QLabel" name="label_13"> + <property name="text"> + <string>Channel Info:</string> + </property> + </widget> + </item> + <item row="4" column="3"> + <widget class="QPushButton" name="infoButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for channel info messages</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Hyperlink:</string> + </property> + </widget> + </item> + <item row="5" column="1"> + <widget class="QPushButton" name="hyperlinkButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the color for hyperlinks</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="textColoursGroup"> + <property name="toolTip"> + <string>Enable to allow colored text in IRC messages</string> + </property> + <property name="title"> + <string>Allow Colored Text in IRC Messages</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QLabel" name="label_15"> + <property name="text"> + <string notr="true">0:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QPushButton" name="ircColor0Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="label_19"> + <property name="text"> + <string notr="true">4:</string> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QPushButton" name="ircColor4Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="4"> + <widget class="QLabel" name="label_23"> + <property name="text"> + <string notr="true">8:</string> + </property> + </widget> + </item> + <item row="0" column="5"> + <widget class="QPushButton" name="ircColor8Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="0" column="6"> + <widget class="QLabel" name="label_27"> + <property name="text"> + <string notr="true">12:</string> + </property> + </widget> + </item> + <item row="0" column="7"> + <widget class="QPushButton" name="ircColor12Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_16"> + <property name="text"> + <string notr="true">1:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="ircColor1Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QLabel" name="label_20"> + <property name="text"> + <string notr="true">5:</string> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QPushButton" name="ircColor5Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="4"> + <widget class="QLabel" name="label_24"> + <property name="text"> + <string notr="true">9:</string> + </property> + </widget> + </item> + <item row="1" column="5"> + <widget class="QPushButton" name="ircColor9Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="1" column="6"> + <widget class="QLabel" name="label_28"> + <property name="text"> + <string notr="true">13:</string> + </property> + </widget> + </item> + <item row="1" column="7"> + <widget class="QPushButton" name="ircColor13Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_17"> + <property name="text"> + <string notr="true">2:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QPushButton" name="ircColor2Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QLabel" name="label_21"> + <property name="text"> + <string notr="true">6:</string> + </property> + </widget> + </item> + <item row="2" column="3"> + <widget class="QPushButton" name="ircColor6Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="4"> + <widget class="QLabel" name="label_25"> + <property name="text"> + <string notr="true">10:</string> + </property> + </widget> + </item> + <item row="2" column="5"> + <widget class="QPushButton" name="ircColor10Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="2" column="6"> + <widget class="QLabel" name="label_29"> + <property name="text"> + <string notr="true">14:</string> + </property> + </widget> + </item> + <item row="2" column="7"> + <widget class="QPushButton" name="ircColor14Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_18"> + <property name="text"> + <string notr="true">3:</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QPushButton" name="ircColor3Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QLabel" name="label_22"> + <property name="text"> + <string notr="true">7:</string> + </property> + </widget> + </item> + <item row="3" column="3"> + <widget class="QPushButton" name="ircColor7Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="3" column="4"> + <widget class="QLabel" name="label_26"> + <property name="text"> + <string notr="true">11:</string> + </property> + </widget> + </item> + <item row="3" column="5"> + <widget class="QPushButton" name="ircColor11Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item row="3" column="6"> + <widget class="QLabel" name="label_30"> + <property name="text"> + <string notr="true">15:</string> + </property> + </widget> + </item> + <item row="3" column="7"> + <widget class="QPushButton" name="ircColor15Button"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="notificationsGroup"> + <property name="toolTip"> + <string>Enable to show notifications</string> + </property> + <property name="title"> + <string>Show Notifications</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="QCheckBox" name="joinLeaveCheckBox"> + <property name="toolTip"> + <string>Select to show a notification for join and leave events</string> + </property> + <property name="text"> + <string>Join/Leave Event</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="messageCheckBox"> + <property name="toolTip"> + <string>Select to show a notification for every message</string> + </property> + <property name="text"> + <string>Every Message</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QCheckBox" name="ownNickCheckBox"> + <property name="toolTip"> + <string>Select to show a notification for every mentioning of your nick</string> + </property> + <property name="text"> + <string>Mentioning of Own Nick</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="whoGroup"> + <property name="toolTip"> + <string>Select this to enable the automatic lookup of user information for joined channels</string> + </property> + <property name="title"> + <string>Enable Automatic User Information Lookup (/WHO)</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="0"> + <widget class="QLabel" name="label_31"> + <property name="text"> + <string>Max. Number of Users in Channel:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="whoUsersSpinBox"> + <property name="toolTip"> + <string>Enter the maximum numbers of users in a channel allowed for this function</string> + </property> + <property name="alignment"> + <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set> + </property> + <property name="maximum"> + <number>999</number> + </property> + </widget> + </item> + <item row="0" column="2"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Orientation::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>174</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_32"> + <property name="text"> + <string>Update Interval:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="whoIntervalSpinBox"> + <property name="toolTip"> + <string>Enter the user information update interval</string> + </property> + <property name="alignment"> + <set>Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter</set> + </property> + <property name="suffix"> + <string> s</string> + </property> + <property name="minimum"> + <number>30</number> + </property> + <property name="maximum"> + <number>600</number> + </property> + <property name="singleStep"> + <number>10</number> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="markerGroup"> + <property name="title"> + <string>Marker</string> + </property> + <layout class="QGridLayout" name="gridLayout_6"> + <item row="0" column="0" colspan="3"> + <widget class="QCheckBox" name="markWhenHiddenCheckBox"> + <property name="toolTip"> + <string>Select to mark the current position, when the chat window is hidden</string> + </property> + <property name="text"> + <string>Mark Current Position When Hidden</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_33"> + <property name="text"> + <string>Marker Foreground:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="markerForegroundButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the foreground color for the marker</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="1" column="2" rowspan="2"> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Orientation::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>240</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="1" rowspan="2"> + <widget class="QPushButton" name="markerBackgroundButton"> + <property name="minimumSize"> + <size> + <width>100</width> + <height>0</height> + </size> + </property> + <property name="toolTip"> + <string>Select the background color for the marker</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_34"> + <property name="text"> + <string>Marker Background:</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>79</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <tabstops> + <tabstop>timestampGroup</tabstop> + <tabstop>timeFormatCombo</tabstop> + <tabstop>dateFormatCombo</tabstop> + <tabstop>showDateCheckBox</tabstop> + <tabstop>networkButton</tabstop> + <tabstop>serverButton</tabstop> + <tabstop>channelButton</tabstop> + <tabstop>errorButton</tabstop> + <tabstop>timestampButton</tabstop> + <tabstop>hyperlinkButton</tabstop> + <tabstop>nickButton</tabstop> + <tabstop>ownNickButton</tabstop> + <tabstop>joinButton</tabstop> + <tabstop>leaveButton</tabstop> + <tabstop>infoButton</tabstop> + <tabstop>textColoursGroup</tabstop> + <tabstop>ircColor0Button</tabstop> + <tabstop>ircColor1Button</tabstop> + <tabstop>ircColor2Button</tabstop> + <tabstop>ircColor3Button</tabstop> + <tabstop>ircColor4Button</tabstop> + <tabstop>ircColor5Button</tabstop> + <tabstop>ircColor6Button</tabstop> + <tabstop>ircColor7Button</tabstop> + <tabstop>ircColor8Button</tabstop> + <tabstop>ircColor9Button</tabstop> + <tabstop>ircColor10Button</tabstop> + <tabstop>ircColor11Button</tabstop> + <tabstop>ircColor12Button</tabstop> + <tabstop>ircColor13Button</tabstop> + <tabstop>ircColor14Button</tabstop> + <tabstop>ircColor15Button</tabstop> + <tabstop>notificationsGroup</tabstop> + <tabstop>joinLeaveCheckBox</tabstop> + <tabstop>messageCheckBox</tabstop> + <tabstop>ownNickCheckBox</tabstop> + <tabstop>whoGroup</tabstop> + <tabstop>whoUsersSpinBox</tabstop> + <tabstop>whoIntervalSpinBox</tabstop> + <tabstop>markWhenHiddenCheckBox</tabstop> + <tabstop>markerForegroundButton</tabstop> + <tabstop>markerBackgroundButton</tabstop> + </tabstops> + <resources/> + <connections/> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/ConfigurationPage/Ui_IrcPage.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,521 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/ConfigurationPage/IrcPage.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcPage(object): + def setupUi(self, IrcPage): + IrcPage.setObjectName("IrcPage") + IrcPage.resize(522, 979) + self.verticalLayout = QtWidgets.QVBoxLayout(IrcPage) + self.verticalLayout.setObjectName("verticalLayout") + self.headerLabel = QtWidgets.QLabel(parent=IrcPage) + self.headerLabel.setObjectName("headerLabel") + self.verticalLayout.addWidget(self.headerLabel) + self.line3 = QtWidgets.QFrame(parent=IrcPage) + self.line3.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line3.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line3.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line3.setObjectName("line3") + self.verticalLayout.addWidget(self.line3) + self.timestampGroup = QtWidgets.QGroupBox(parent=IrcPage) + self.timestampGroup.setCheckable(True) + self.timestampGroup.setObjectName("timestampGroup") + self.gridLayout = QtWidgets.QGridLayout(self.timestampGroup) + self.gridLayout.setObjectName("gridLayout") + self.label = QtWidgets.QLabel(parent=self.timestampGroup) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 0, 0, 1, 1) + self.timeFormatCombo = QtWidgets.QComboBox(parent=self.timestampGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.timeFormatCombo.sizePolicy().hasHeightForWidth()) + self.timeFormatCombo.setSizePolicy(sizePolicy) + self.timeFormatCombo.setObjectName("timeFormatCombo") + self.gridLayout.addWidget(self.timeFormatCombo, 0, 1, 1, 1) + self.label_2 = QtWidgets.QLabel(parent=self.timestampGroup) + self.label_2.setObjectName("label_2") + self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1) + self.dateFormatCombo = QtWidgets.QComboBox(parent=self.timestampGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.dateFormatCombo.sizePolicy().hasHeightForWidth()) + self.dateFormatCombo.setSizePolicy(sizePolicy) + self.dateFormatCombo.setObjectName("dateFormatCombo") + self.gridLayout.addWidget(self.dateFormatCombo, 0, 3, 1, 1) + self.showDateCheckBox = QtWidgets.QCheckBox(parent=self.timestampGroup) + self.showDateCheckBox.setObjectName("showDateCheckBox") + self.gridLayout.addWidget(self.showDateCheckBox, 1, 0, 1, 4) + self.verticalLayout.addWidget(self.timestampGroup) + self.coloursGroup = QtWidgets.QGroupBox(parent=IrcPage) + self.coloursGroup.setObjectName("coloursGroup") + self.gridLayout_2 = QtWidgets.QGridLayout(self.coloursGroup) + self.gridLayout_2.setObjectName("gridLayout_2") + self.label_3 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_3.setObjectName("label_3") + self.gridLayout_2.addWidget(self.label_3, 0, 0, 1, 1) + self.networkButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.networkButton.setMinimumSize(QtCore.QSize(100, 0)) + self.networkButton.setText("") + self.networkButton.setObjectName("networkButton") + self.gridLayout_2.addWidget(self.networkButton, 0, 1, 1, 1) + self.label_9 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_9.setObjectName("label_9") + self.gridLayout_2.addWidget(self.label_9, 0, 2, 1, 1) + self.nickButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.nickButton.setMinimumSize(QtCore.QSize(100, 0)) + self.nickButton.setText("") + self.nickButton.setObjectName("nickButton") + self.gridLayout_2.addWidget(self.nickButton, 0, 3, 1, 1) + self.label_4 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_4.setObjectName("label_4") + self.gridLayout_2.addWidget(self.label_4, 1, 0, 1, 1) + self.serverButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.serverButton.setMinimumSize(QtCore.QSize(100, 0)) + self.serverButton.setText("") + self.serverButton.setObjectName("serverButton") + self.gridLayout_2.addWidget(self.serverButton, 1, 1, 1, 1) + self.label_10 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_10.setObjectName("label_10") + self.gridLayout_2.addWidget(self.label_10, 1, 2, 1, 1) + self.ownNickButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.ownNickButton.setMinimumSize(QtCore.QSize(100, 0)) + self.ownNickButton.setText("") + self.ownNickButton.setObjectName("ownNickButton") + self.gridLayout_2.addWidget(self.ownNickButton, 1, 3, 1, 1) + self.label_5 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_5.setObjectName("label_5") + self.gridLayout_2.addWidget(self.label_5, 2, 0, 1, 1) + self.channelButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.channelButton.setMinimumSize(QtCore.QSize(100, 0)) + self.channelButton.setText("") + self.channelButton.setObjectName("channelButton") + self.gridLayout_2.addWidget(self.channelButton, 2, 1, 1, 1) + self.label_11 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_11.setObjectName("label_11") + self.gridLayout_2.addWidget(self.label_11, 2, 2, 1, 1) + self.joinButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.joinButton.setMinimumSize(QtCore.QSize(100, 0)) + self.joinButton.setText("") + self.joinButton.setObjectName("joinButton") + self.gridLayout_2.addWidget(self.joinButton, 2, 3, 1, 1) + self.label_6 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_6.setObjectName("label_6") + self.gridLayout_2.addWidget(self.label_6, 3, 0, 1, 1) + self.errorButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.errorButton.setMinimumSize(QtCore.QSize(100, 0)) + self.errorButton.setText("") + self.errorButton.setObjectName("errorButton") + self.gridLayout_2.addWidget(self.errorButton, 3, 1, 1, 1) + self.label_12 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_12.setObjectName("label_12") + self.gridLayout_2.addWidget(self.label_12, 3, 2, 1, 1) + self.leaveButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.leaveButton.setMinimumSize(QtCore.QSize(100, 0)) + self.leaveButton.setText("") + self.leaveButton.setObjectName("leaveButton") + self.gridLayout_2.addWidget(self.leaveButton, 3, 3, 1, 1) + self.label_7 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_7.setObjectName("label_7") + self.gridLayout_2.addWidget(self.label_7, 4, 0, 1, 1) + self.timestampButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.timestampButton.setMinimumSize(QtCore.QSize(100, 0)) + self.timestampButton.setText("") + self.timestampButton.setObjectName("timestampButton") + self.gridLayout_2.addWidget(self.timestampButton, 4, 1, 1, 1) + self.label_13 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_13.setObjectName("label_13") + self.gridLayout_2.addWidget(self.label_13, 4, 2, 1, 1) + self.infoButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.infoButton.setMinimumSize(QtCore.QSize(100, 0)) + self.infoButton.setText("") + self.infoButton.setObjectName("infoButton") + self.gridLayout_2.addWidget(self.infoButton, 4, 3, 1, 1) + self.label_8 = QtWidgets.QLabel(parent=self.coloursGroup) + self.label_8.setObjectName("label_8") + self.gridLayout_2.addWidget(self.label_8, 5, 0, 1, 1) + self.hyperlinkButton = QtWidgets.QPushButton(parent=self.coloursGroup) + self.hyperlinkButton.setMinimumSize(QtCore.QSize(100, 0)) + self.hyperlinkButton.setText("") + self.hyperlinkButton.setObjectName("hyperlinkButton") + self.gridLayout_2.addWidget(self.hyperlinkButton, 5, 1, 1, 1) + self.verticalLayout.addWidget(self.coloursGroup) + self.textColoursGroup = QtWidgets.QGroupBox(parent=IrcPage) + self.textColoursGroup.setCheckable(True) + self.textColoursGroup.setObjectName("textColoursGroup") + self.gridLayout_4 = QtWidgets.QGridLayout(self.textColoursGroup) + self.gridLayout_4.setObjectName("gridLayout_4") + self.label_15 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_15.setText("0:") + self.label_15.setObjectName("label_15") + self.gridLayout_4.addWidget(self.label_15, 0, 0, 1, 1) + self.ircColor0Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor0Button.sizePolicy().hasHeightForWidth()) + self.ircColor0Button.setSizePolicy(sizePolicy) + self.ircColor0Button.setObjectName("ircColor0Button") + self.gridLayout_4.addWidget(self.ircColor0Button, 0, 1, 1, 1) + self.label_19 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_19.setText("4:") + self.label_19.setObjectName("label_19") + self.gridLayout_4.addWidget(self.label_19, 0, 2, 1, 1) + self.ircColor4Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor4Button.sizePolicy().hasHeightForWidth()) + self.ircColor4Button.setSizePolicy(sizePolicy) + self.ircColor4Button.setObjectName("ircColor4Button") + self.gridLayout_4.addWidget(self.ircColor4Button, 0, 3, 1, 1) + self.label_23 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_23.setText("8:") + self.label_23.setObjectName("label_23") + self.gridLayout_4.addWidget(self.label_23, 0, 4, 1, 1) + self.ircColor8Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor8Button.sizePolicy().hasHeightForWidth()) + self.ircColor8Button.setSizePolicy(sizePolicy) + self.ircColor8Button.setObjectName("ircColor8Button") + self.gridLayout_4.addWidget(self.ircColor8Button, 0, 5, 1, 1) + self.label_27 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_27.setText("12:") + self.label_27.setObjectName("label_27") + self.gridLayout_4.addWidget(self.label_27, 0, 6, 1, 1) + self.ircColor12Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor12Button.sizePolicy().hasHeightForWidth()) + self.ircColor12Button.setSizePolicy(sizePolicy) + self.ircColor12Button.setObjectName("ircColor12Button") + self.gridLayout_4.addWidget(self.ircColor12Button, 0, 7, 1, 1) + self.label_16 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_16.setText("1:") + self.label_16.setObjectName("label_16") + self.gridLayout_4.addWidget(self.label_16, 1, 0, 1, 1) + self.ircColor1Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor1Button.sizePolicy().hasHeightForWidth()) + self.ircColor1Button.setSizePolicy(sizePolicy) + self.ircColor1Button.setObjectName("ircColor1Button") + self.gridLayout_4.addWidget(self.ircColor1Button, 1, 1, 1, 1) + self.label_20 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_20.setText("5:") + self.label_20.setObjectName("label_20") + self.gridLayout_4.addWidget(self.label_20, 1, 2, 1, 1) + self.ircColor5Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor5Button.sizePolicy().hasHeightForWidth()) + self.ircColor5Button.setSizePolicy(sizePolicy) + self.ircColor5Button.setObjectName("ircColor5Button") + self.gridLayout_4.addWidget(self.ircColor5Button, 1, 3, 1, 1) + self.label_24 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_24.setText("9:") + self.label_24.setObjectName("label_24") + self.gridLayout_4.addWidget(self.label_24, 1, 4, 1, 1) + self.ircColor9Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor9Button.sizePolicy().hasHeightForWidth()) + self.ircColor9Button.setSizePolicy(sizePolicy) + self.ircColor9Button.setObjectName("ircColor9Button") + self.gridLayout_4.addWidget(self.ircColor9Button, 1, 5, 1, 1) + self.label_28 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_28.setText("13:") + self.label_28.setObjectName("label_28") + self.gridLayout_4.addWidget(self.label_28, 1, 6, 1, 1) + self.ircColor13Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor13Button.sizePolicy().hasHeightForWidth()) + self.ircColor13Button.setSizePolicy(sizePolicy) + self.ircColor13Button.setObjectName("ircColor13Button") + self.gridLayout_4.addWidget(self.ircColor13Button, 1, 7, 1, 1) + self.label_17 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_17.setText("2:") + self.label_17.setObjectName("label_17") + self.gridLayout_4.addWidget(self.label_17, 2, 0, 1, 1) + self.ircColor2Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor2Button.sizePolicy().hasHeightForWidth()) + self.ircColor2Button.setSizePolicy(sizePolicy) + self.ircColor2Button.setObjectName("ircColor2Button") + self.gridLayout_4.addWidget(self.ircColor2Button, 2, 1, 1, 1) + self.label_21 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_21.setText("6:") + self.label_21.setObjectName("label_21") + self.gridLayout_4.addWidget(self.label_21, 2, 2, 1, 1) + self.ircColor6Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor6Button.sizePolicy().hasHeightForWidth()) + self.ircColor6Button.setSizePolicy(sizePolicy) + self.ircColor6Button.setObjectName("ircColor6Button") + self.gridLayout_4.addWidget(self.ircColor6Button, 2, 3, 1, 1) + self.label_25 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_25.setText("10:") + self.label_25.setObjectName("label_25") + self.gridLayout_4.addWidget(self.label_25, 2, 4, 1, 1) + self.ircColor10Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor10Button.sizePolicy().hasHeightForWidth()) + self.ircColor10Button.setSizePolicy(sizePolicy) + self.ircColor10Button.setObjectName("ircColor10Button") + self.gridLayout_4.addWidget(self.ircColor10Button, 2, 5, 1, 1) + self.label_29 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_29.setText("14:") + self.label_29.setObjectName("label_29") + self.gridLayout_4.addWidget(self.label_29, 2, 6, 1, 1) + self.ircColor14Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor14Button.sizePolicy().hasHeightForWidth()) + self.ircColor14Button.setSizePolicy(sizePolicy) + self.ircColor14Button.setObjectName("ircColor14Button") + self.gridLayout_4.addWidget(self.ircColor14Button, 2, 7, 1, 1) + self.label_18 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_18.setText("3:") + self.label_18.setObjectName("label_18") + self.gridLayout_4.addWidget(self.label_18, 3, 0, 1, 1) + self.ircColor3Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor3Button.sizePolicy().hasHeightForWidth()) + self.ircColor3Button.setSizePolicy(sizePolicy) + self.ircColor3Button.setObjectName("ircColor3Button") + self.gridLayout_4.addWidget(self.ircColor3Button, 3, 1, 1, 1) + self.label_22 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_22.setText("7:") + self.label_22.setObjectName("label_22") + self.gridLayout_4.addWidget(self.label_22, 3, 2, 1, 1) + self.ircColor7Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor7Button.sizePolicy().hasHeightForWidth()) + self.ircColor7Button.setSizePolicy(sizePolicy) + self.ircColor7Button.setObjectName("ircColor7Button") + self.gridLayout_4.addWidget(self.ircColor7Button, 3, 3, 1, 1) + self.label_26 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_26.setText("11:") + self.label_26.setObjectName("label_26") + self.gridLayout_4.addWidget(self.label_26, 3, 4, 1, 1) + self.ircColor11Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor11Button.sizePolicy().hasHeightForWidth()) + self.ircColor11Button.setSizePolicy(sizePolicy) + self.ircColor11Button.setObjectName("ircColor11Button") + self.gridLayout_4.addWidget(self.ircColor11Button, 3, 5, 1, 1) + self.label_30 = QtWidgets.QLabel(parent=self.textColoursGroup) + self.label_30.setText("15:") + self.label_30.setObjectName("label_30") + self.gridLayout_4.addWidget(self.label_30, 3, 6, 1, 1) + self.ircColor15Button = QtWidgets.QPushButton(parent=self.textColoursGroup) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.ircColor15Button.sizePolicy().hasHeightForWidth()) + self.ircColor15Button.setSizePolicy(sizePolicy) + self.ircColor15Button.setObjectName("ircColor15Button") + self.gridLayout_4.addWidget(self.ircColor15Button, 3, 7, 1, 1) + self.verticalLayout.addWidget(self.textColoursGroup) + self.notificationsGroup = QtWidgets.QGroupBox(parent=IrcPage) + self.notificationsGroup.setCheckable(True) + self.notificationsGroup.setObjectName("notificationsGroup") + self.gridLayout_3 = QtWidgets.QGridLayout(self.notificationsGroup) + self.gridLayout_3.setObjectName("gridLayout_3") + self.joinLeaveCheckBox = QtWidgets.QCheckBox(parent=self.notificationsGroup) + self.joinLeaveCheckBox.setObjectName("joinLeaveCheckBox") + self.gridLayout_3.addWidget(self.joinLeaveCheckBox, 0, 0, 1, 1) + self.messageCheckBox = QtWidgets.QCheckBox(parent=self.notificationsGroup) + self.messageCheckBox.setObjectName("messageCheckBox") + self.gridLayout_3.addWidget(self.messageCheckBox, 1, 0, 1, 1) + self.ownNickCheckBox = QtWidgets.QCheckBox(parent=self.notificationsGroup) + self.ownNickCheckBox.setObjectName("ownNickCheckBox") + self.gridLayout_3.addWidget(self.ownNickCheckBox, 0, 1, 1, 1) + self.verticalLayout.addWidget(self.notificationsGroup) + self.whoGroup = QtWidgets.QGroupBox(parent=IrcPage) + self.whoGroup.setCheckable(True) + self.whoGroup.setChecked(False) + self.whoGroup.setObjectName("whoGroup") + self.gridLayout_5 = QtWidgets.QGridLayout(self.whoGroup) + self.gridLayout_5.setObjectName("gridLayout_5") + self.label_31 = QtWidgets.QLabel(parent=self.whoGroup) + self.label_31.setObjectName("label_31") + self.gridLayout_5.addWidget(self.label_31, 0, 0, 1, 1) + self.whoUsersSpinBox = QtWidgets.QSpinBox(parent=self.whoGroup) + self.whoUsersSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.whoUsersSpinBox.setMaximum(999) + self.whoUsersSpinBox.setObjectName("whoUsersSpinBox") + self.gridLayout_5.addWidget(self.whoUsersSpinBox, 0, 1, 1, 1) + spacerItem = QtWidgets.QSpacerItem(174, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout_5.addItem(spacerItem, 0, 2, 1, 1) + self.label_32 = QtWidgets.QLabel(parent=self.whoGroup) + self.label_32.setObjectName("label_32") + self.gridLayout_5.addWidget(self.label_32, 1, 0, 1, 1) + self.whoIntervalSpinBox = QtWidgets.QSpinBox(parent=self.whoGroup) + self.whoIntervalSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.whoIntervalSpinBox.setMinimum(30) + self.whoIntervalSpinBox.setMaximum(600) + self.whoIntervalSpinBox.setSingleStep(10) + self.whoIntervalSpinBox.setObjectName("whoIntervalSpinBox") + self.gridLayout_5.addWidget(self.whoIntervalSpinBox, 1, 1, 1, 1) + self.verticalLayout.addWidget(self.whoGroup) + self.markerGroup = QtWidgets.QGroupBox(parent=IrcPage) + self.markerGroup.setObjectName("markerGroup") + self.gridLayout_6 = QtWidgets.QGridLayout(self.markerGroup) + self.gridLayout_6.setObjectName("gridLayout_6") + self.markWhenHiddenCheckBox = QtWidgets.QCheckBox(parent=self.markerGroup) + self.markWhenHiddenCheckBox.setObjectName("markWhenHiddenCheckBox") + self.gridLayout_6.addWidget(self.markWhenHiddenCheckBox, 0, 0, 1, 3) + self.label_33 = QtWidgets.QLabel(parent=self.markerGroup) + self.label_33.setObjectName("label_33") + self.gridLayout_6.addWidget(self.label_33, 1, 0, 1, 1) + self.markerForegroundButton = QtWidgets.QPushButton(parent=self.markerGroup) + self.markerForegroundButton.setMinimumSize(QtCore.QSize(100, 0)) + self.markerForegroundButton.setText("") + self.markerForegroundButton.setObjectName("markerForegroundButton") + self.gridLayout_6.addWidget(self.markerForegroundButton, 1, 1, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(240, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout_6.addItem(spacerItem1, 1, 2, 2, 1) + self.markerBackgroundButton = QtWidgets.QPushButton(parent=self.markerGroup) + self.markerBackgroundButton.setMinimumSize(QtCore.QSize(100, 0)) + self.markerBackgroundButton.setText("") + self.markerBackgroundButton.setObjectName("markerBackgroundButton") + self.gridLayout_6.addWidget(self.markerBackgroundButton, 2, 1, 2, 1) + self.label_34 = QtWidgets.QLabel(parent=self.markerGroup) + self.label_34.setObjectName("label_34") + self.gridLayout_6.addWidget(self.label_34, 3, 0, 1, 1) + self.verticalLayout.addWidget(self.markerGroup) + spacerItem2 = QtWidgets.QSpacerItem(20, 79, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout.addItem(spacerItem2) + + self.retranslateUi(IrcPage) + QtCore.QMetaObject.connectSlotsByName(IrcPage) + IrcPage.setTabOrder(self.timestampGroup, self.timeFormatCombo) + IrcPage.setTabOrder(self.timeFormatCombo, self.dateFormatCombo) + IrcPage.setTabOrder(self.dateFormatCombo, self.showDateCheckBox) + IrcPage.setTabOrder(self.showDateCheckBox, self.networkButton) + IrcPage.setTabOrder(self.networkButton, self.serverButton) + IrcPage.setTabOrder(self.serverButton, self.channelButton) + IrcPage.setTabOrder(self.channelButton, self.errorButton) + IrcPage.setTabOrder(self.errorButton, self.timestampButton) + IrcPage.setTabOrder(self.timestampButton, self.hyperlinkButton) + IrcPage.setTabOrder(self.hyperlinkButton, self.nickButton) + IrcPage.setTabOrder(self.nickButton, self.ownNickButton) + IrcPage.setTabOrder(self.ownNickButton, self.joinButton) + IrcPage.setTabOrder(self.joinButton, self.leaveButton) + IrcPage.setTabOrder(self.leaveButton, self.infoButton) + IrcPage.setTabOrder(self.infoButton, self.textColoursGroup) + IrcPage.setTabOrder(self.textColoursGroup, self.ircColor0Button) + IrcPage.setTabOrder(self.ircColor0Button, self.ircColor1Button) + IrcPage.setTabOrder(self.ircColor1Button, self.ircColor2Button) + IrcPage.setTabOrder(self.ircColor2Button, self.ircColor3Button) + IrcPage.setTabOrder(self.ircColor3Button, self.ircColor4Button) + IrcPage.setTabOrder(self.ircColor4Button, self.ircColor5Button) + IrcPage.setTabOrder(self.ircColor5Button, self.ircColor6Button) + IrcPage.setTabOrder(self.ircColor6Button, self.ircColor7Button) + IrcPage.setTabOrder(self.ircColor7Button, self.ircColor8Button) + IrcPage.setTabOrder(self.ircColor8Button, self.ircColor9Button) + IrcPage.setTabOrder(self.ircColor9Button, self.ircColor10Button) + IrcPage.setTabOrder(self.ircColor10Button, self.ircColor11Button) + IrcPage.setTabOrder(self.ircColor11Button, self.ircColor12Button) + IrcPage.setTabOrder(self.ircColor12Button, self.ircColor13Button) + IrcPage.setTabOrder(self.ircColor13Button, self.ircColor14Button) + IrcPage.setTabOrder(self.ircColor14Button, self.ircColor15Button) + IrcPage.setTabOrder(self.ircColor15Button, self.notificationsGroup) + IrcPage.setTabOrder(self.notificationsGroup, self.joinLeaveCheckBox) + IrcPage.setTabOrder(self.joinLeaveCheckBox, self.messageCheckBox) + IrcPage.setTabOrder(self.messageCheckBox, self.ownNickCheckBox) + IrcPage.setTabOrder(self.ownNickCheckBox, self.whoGroup) + IrcPage.setTabOrder(self.whoGroup, self.whoUsersSpinBox) + IrcPage.setTabOrder(self.whoUsersSpinBox, self.whoIntervalSpinBox) + IrcPage.setTabOrder(self.whoIntervalSpinBox, self.markWhenHiddenCheckBox) + IrcPage.setTabOrder(self.markWhenHiddenCheckBox, self.markerForegroundButton) + IrcPage.setTabOrder(self.markerForegroundButton, self.markerBackgroundButton) + + def retranslateUi(self, IrcPage): + _translate = QtCore.QCoreApplication.translate + self.headerLabel.setText(_translate("IrcPage", "<b>Configure IRC</b>")) + self.timestampGroup.setToolTip(_translate("IrcPage", "Enable to show timestamps")) + self.timestampGroup.setTitle(_translate("IrcPage", "Show Timestamps")) + self.label.setText(_translate("IrcPage", "Time Format:")) + self.timeFormatCombo.setToolTip(_translate("IrcPage", "Select the time format to use")) + self.label_2.setText(_translate("IrcPage", "Date Format")) + self.dateFormatCombo.setToolTip(_translate("IrcPage", "Select the date format to use")) + self.showDateCheckBox.setToolTip(_translate("IrcPage", "Select to show the date in timestamps")) + self.showDateCheckBox.setText(_translate("IrcPage", "Show Date")) + self.coloursGroup.setTitle(_translate("IrcPage", "Colors")) + self.label_3.setText(_translate("IrcPage", "Network Messages:")) + self.networkButton.setToolTip(_translate("IrcPage", "Select the color for network messages")) + self.label_9.setText(_translate("IrcPage", "Nick Names:")) + self.nickButton.setToolTip(_translate("IrcPage", "Select the color for nick names")) + self.label_4.setText(_translate("IrcPage", "Server Messages:")) + self.serverButton.setToolTip(_translate("IrcPage", "Select the color for server messages")) + self.label_10.setText(_translate("IrcPage", "Own Nick Name:")) + self.ownNickButton.setToolTip(_translate("IrcPage", "Select the color for own nick name")) + self.label_5.setText(_translate("IrcPage", "Channel Messages:")) + self.channelButton.setToolTip(_translate("IrcPage", "Select the color for channel messages")) + self.label_11.setText(_translate("IrcPage", "Join Channel:")) + self.joinButton.setToolTip(_translate("IrcPage", "Select the color for join channel messages")) + self.label_6.setText(_translate("IrcPage", "Error Messages:")) + self.errorButton.setToolTip(_translate("IrcPage", "Select the color for error messages")) + self.label_12.setText(_translate("IrcPage", "Leave Channel:")) + self.leaveButton.setToolTip(_translate("IrcPage", "Select the color for leave channel messages")) + self.label_7.setText(_translate("IrcPage", "Timestamp:")) + self.timestampButton.setToolTip(_translate("IrcPage", "Select the color for timestamps")) + self.label_13.setText(_translate("IrcPage", "Channel Info:")) + self.infoButton.setToolTip(_translate("IrcPage", "Select the color for channel info messages")) + self.label_8.setText(_translate("IrcPage", "Hyperlink:")) + self.hyperlinkButton.setToolTip(_translate("IrcPage", "Select the color for hyperlinks")) + self.textColoursGroup.setToolTip(_translate("IrcPage", "Enable to allow colored text in IRC messages")) + self.textColoursGroup.setTitle(_translate("IrcPage", "Allow Colored Text in IRC Messages")) + self.notificationsGroup.setToolTip(_translate("IrcPage", "Enable to show notifications")) + self.notificationsGroup.setTitle(_translate("IrcPage", "Show Notifications")) + self.joinLeaveCheckBox.setToolTip(_translate("IrcPage", "Select to show a notification for join and leave events")) + self.joinLeaveCheckBox.setText(_translate("IrcPage", "Join/Leave Event")) + self.messageCheckBox.setToolTip(_translate("IrcPage", "Select to show a notification for every message")) + self.messageCheckBox.setText(_translate("IrcPage", "Every Message")) + self.ownNickCheckBox.setToolTip(_translate("IrcPage", "Select to show a notification for every mentioning of your nick")) + self.ownNickCheckBox.setText(_translate("IrcPage", "Mentioning of Own Nick")) + self.whoGroup.setToolTip(_translate("IrcPage", "Select this to enable the automatic lookup of user information for joined channels")) + self.whoGroup.setTitle(_translate("IrcPage", "Enable Automatic User Information Lookup (/WHO)")) + self.label_31.setText(_translate("IrcPage", "Max. Number of Users in Channel:")) + self.whoUsersSpinBox.setToolTip(_translate("IrcPage", "Enter the maximum numbers of users in a channel allowed for this function")) + self.label_32.setText(_translate("IrcPage", "Update Interval:")) + self.whoIntervalSpinBox.setToolTip(_translate("IrcPage", "Enter the user information update interval")) + self.whoIntervalSpinBox.setSuffix(_translate("IrcPage", " s")) + self.markerGroup.setTitle(_translate("IrcPage", "Marker")) + self.markWhenHiddenCheckBox.setToolTip(_translate("IrcPage", "Select to mark the current position, when the chat window is hidden")) + self.markWhenHiddenCheckBox.setText(_translate("IrcPage", "Mark Current Position When Hidden")) + self.label_33.setText(_translate("IrcPage", "Marker Foreground:")) + self.markerForegroundButton.setToolTip(_translate("IrcPage", "Select the foreground color for the marker")) + self.markerBackgroundButton.setToolTip(_translate("IrcPage", "Select the background color for the marker")) + self.label_34.setText(_translate("IrcPage", "Marker Background:"))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/ConfigurationPage/__init__.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package implementing the configuration page for the IRC UI extension. +"""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcChannelEditDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to edit channel data. +""" + +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtWidgets import QDialog, QDialogButtonBox + +from .Ui_IrcChannelEditDialog import Ui_IrcChannelEditDialog + + +class IrcChannelEditDialog(QDialog, Ui_IrcChannelEditDialog): + """ + Class implementing a dialog to edit channel data. + """ + + def __init__(self, name, key, autoJoin, edit, parent=None): + """ + Constructor + + @param name channel name + @type str + @param key channel key + @type str + @param autoJoin flag indicating, that the channel should + be joined automatically + @type bool + @param edit flag indicating an edit of an existing + channel + @type bool + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + self.nameEdit.setText(name) + self.keyEdit.setText(key) + self.autoJoinCheckBox.setChecked(autoJoin) + + self.nameEdit.setReadOnly(edit) + + self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(name != "") + + msh = self.minimumSizeHint() + self.resize(max(self.width(), msh.width()), msh.height()) + + @pyqtSlot(str) + def on_nameEdit_textChanged(self, txt): + """ + Private slot to handle changes of the given name. + + @param txt text of the edit + @type str + """ + self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(txt != "") + + def getData(self): + """ + Public method to get the channel data. + + @return tuple giving the channel name, channel key and a flag + indicating, that the channel should be joined automatically + @rtype tuple of (str, str, bool) + """ + return ( + self.nameEdit.text(), + self.keyEdit.text(), + self.autoJoinCheckBox.isChecked(), + )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcChannelEditDialog.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcChannelEditDialog</class> + <widget class="QDialog" name="IrcChannelEditDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>303</width> + <height>128</height> + </rect> + </property> + <property name="windowTitle"> + <string>IRC Channel</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Name:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="nameEdit"> + <property name="toolTip"> + <string>Enter the channel name</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Key:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="keyEdit"> + <property name="toolTip"> + <string>Enter the channel key/password</string> + </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QCheckBox" name="autoJoinCheckBox"> + <property name="toolTip"> + <string>Select to join this channel automatically</string> + </property> + <property name="text"> + <string>Join channel automatically</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>nameEdit</tabstop> + <tabstop>keyEdit</tabstop> + <tabstop>autoJoinCheckBox</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>IrcChannelEditDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>IrcChannelEditDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcChannelWidget.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2257 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the IRC channel widget. +""" + +import pathlib +import re +from itertools import zip_longest + +from PyQt6.QtCore import ( + QCoreApplication, + QDateTime, + QPoint, + QTimer, + QUrl, + pyqtSignal, + pyqtSlot, +) +from PyQt6.QtGui import QDesktopServices, QIcon, QPainter, QTextCursor +from PyQt6.QtWidgets import ( + QApplication, + QInputDialog, + QLineEdit, + QListWidgetItem, + QMenu, + QWidget, +) + +from eric7 import EricUtilities +from eric7.__version__ import Version +from eric7.EricGui import EricPixmapCache +from eric7.EricWidgets import EricFileDialog, EricMessageBox +from eric7.EricWidgets.EricApplication import ericApp +from eric7.SystemUtilities import OSUtilities +from eric7.UI.Info import Copyright +from PluginExtensionIrc import ircExtensionPluginObject + +from .IrcUtilities import getChannelModesDict, ircFilter, ircTimestamp +from .Ui_IrcChannelWidget import Ui_IrcChannelWidget + + +class IrcUserItem(QListWidgetItem): + """ + Class implementing a list widget item containing an IRC channel user. + """ + + Normal = 0x00 # no privileges + Operator = 0x01 # channel operator + Voice = 0x02 # voice operator + Admin = 0x04 # administrator + Halfop = 0x08 # half operator + Owner = 0x10 # channel owner + Away = 0x80 # user away + + PrivilegeMapping = { + "a": Away, + "o": Operator, + "O": Owner, + "v": Voice, + } + + def __init__(self, name, parent=None): + """ + Constructor + + @param name string with user name and privilege prefix + @type str + @param parent reference to the parent widget + @type QListWidget or QListWidgetItem + """ + super().__init__(name, parent) + + self.__privilege = IrcUserItem.Normal + self.__name = name + self.__ignored = False + + self.__setText() + self.__setIcon() + + def name(self): + """ + Public method to get the user name. + + @return user name + @rtype str + """ + return self.__name + + def setName(self, name): + """ + Public method to set a new nick name. + + @param name new nick name for the user + @type str + """ + self.__name = name + self.__setText() + + def changePrivilege(self, privilege): + """ + Public method to set or unset a user privilege. + + @param privilege privilege to set or unset + @type str + """ + oper = privilege[0] + priv = privilege[1] + if priv in IrcUserItem.PrivilegeMapping: + if oper == "+": + self.__privilege |= IrcUserItem.PrivilegeMapping[priv] + elif oper == "-": + self.__privilege &= ~IrcUserItem.PrivilegeMapping[priv] + self.__setIcon() + + def clearPrivileges(self): + """ + Public method to clear the user privileges. + """ + self.__privilege = IrcUserItem.Normal + self.__setIcon() + + def __setText(self): + """ + Private method to set the user item text. + """ + if self.__ignored: + self.setText( + QCoreApplication.translate("IrcUserItem", "{0} (ignored)").format( + self.__name + ) + ) + else: + self.setText(self.__name) + + def __setIcon(self): + """ + Private method to set the icon dependent on user privileges. + """ + # step 1: determine the icon + if self.__privilege & IrcUserItem.Voice: + icon = ircExtensionPluginObject.getIcon("ircVoice") + elif self.__privilege & IrcUserItem.Owner: + icon = ircExtensionPluginObject.getIcon("ircOwner") + elif self.__privilege & IrcUserItem.Operator: + icon = ircExtensionPluginObject.getIcon("ircOp") + elif self.__privilege & IrcUserItem.Halfop: + icon = ircExtensionPluginObject.getIcon("ircHalfop") + elif self.__privilege & IrcUserItem.Admin: + icon = ircExtensionPluginObject.getIcon("ircAdmin") + else: + icon = ircExtensionPluginObject.getIcon("ircNormal") + if self.__privilege & IrcUserItem.Away: + icon = self.__awayIcon(icon) + + # step 2: set the icon + self.setIcon(icon) + + def __awayIcon(self, icon): + """ + Private method to convert an icon to an away icon. + + @param icon icon to be converted + @type QIcon + @return away icon + @rtype QIcon + """ + pix1 = icon.pixmap(16, 16) + pix2 = ircExtensionPluginObject.getPixmap("ircAway") + painter = QPainter(pix1) + painter.drawPixmap(0, 0, pix2) + painter.end() + return QIcon(pix1) + + def parseWhoFlags(self, flags): + """ + Public method to parse the user flags reported by a WHO command. + + @param flags user flags as reported by WHO + @type str + """ + # H The user is not away. + # G The user is set away. + # * The user is an IRC operator. + # @ The user is a channel op in the channel listed in the first field. + # + The user is voiced in the channel listed. + if flags.endswith("@"): + privilege = IrcUserItem.Operator + elif flags.endswith("+"): + privilege = IrcUserItem.Voice + else: + privilege = IrcUserItem.Normal + if "*" in flags: + privilege = IrcUserItem.Admin + if flags.startswith("G"): + privilege |= IrcUserItem.Away + self.__privilege = privilege + self.__setIcon() + + def canChangeTopic(self): + """ + Public method to check, if the user is allowed to change the topic. + + @return flag indicating that the topic can be changed + @rtype bool + """ + return ( + bool(self.__privilege & IrcUserItem.Operator) + or bool(self.__privilege & IrcUserItem.Admin) + or bool(self.__privilege & IrcUserItem.Owner) + ) + + def setIgnored(self, ignored): + """ + Public method to set the user status to ignored. + + @param ignored flag indicating the new ignored status + @type bool + """ + self.__ignored = ignored + self.__setText() + + def isIgnored(self): + """ + Public method to check, if this user is ignored. + + @return flag indicating the ignored status + @rtype bool + """ + return self.__ignored + + +class IrcChannelWidget(QWidget, Ui_IrcChannelWidget): + """ + Class implementing the IRC channel widget. + + @signal sendData(str) emitted to send a message to the channel + @signal sendCtcpRequest(str, str, str) emitted to send a CTCP request + @signal sendCtcpReply(str, str) emitted to send a CTCP reply + @signal channelClosed(str) emitted after the user has left the channel + @signal openPrivateChat(str) emitted to open a "channel" for private + messages + @signal awayCommand(str) emitted to set the away status via the /away + command + @signal leaveChannels(list) emitted to leave a list of channels + @signal leaveAllChannels() emitted to leave all channels + """ + + sendData = pyqtSignal(str) + sendCtcpRequest = pyqtSignal(str, str, str) + sendCtcpReply = pyqtSignal(str, str) + channelClosed = pyqtSignal(str) + openPrivateChat = pyqtSignal(str) + awayCommand = pyqtSignal(str) + leaveChannels = pyqtSignal(list) + leaveAllChannels = pyqtSignal() + + UrlRe = re.compile( + r"""((?:http|ftp|https):\/\/[\w\-_]+(?:\.[\w\-_]+)+""" + r"""(?:[\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)""" + ) + + JoinIndicator = "-->" + LeaveIndicator = "<--" + MessageIndicator = "***" + + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + self.__ui = ericApp().getObject("UserInterface") + self.__ircWidget = parent + + self.editTopicButton.setIcon(ircExtensionPluginObject.getIcon("ircEditTopic")) + self.editTopicButton.hide() + + height = self.usersList.height() + self.messages.height() + self.splitter.setSizes([int(height * 0.3), int(height * 0.7)]) + + self.__initMessagesMenu() + self.__initUsersMenu() + + self.__name = "" + self.__userName = "" + self.__partMessage = "" + self.__prefixToPrivilege = {} + self.__private = False + self.__privatePartner = "" + self.__whoIsNick = "" + + self.__markerLine = "" + self.__hidden = True + + self.__serviceNamesLower = ["nickserv", "chanserv", "memoserv"] + + self.__patterns = [ + # :foo_!n=foo@foohost.bar.net PRIVMSG #eric-ide :some long message + # :foo_!n=foo@foohost.bar.net PRIVMSG bar_ :some long message + (re.compile(r":([^!]+)!([^ ]+)\sPRIVMSG\s([^ ]+)\s:(.*)"), self.__message), + # :foo_!n=foo@foohost.bar.net JOIN :#eric-ide + (re.compile(r":([^!]+)!([^ ]+)\sJOIN\s:?([^ ]+)"), self.__userJoin), + # :foo_!n=foo@foohost.bar.net PART #eric-ide :part message + (re.compile(r":([^!]+).*\sPART\s([^ ]+)\s:(.*)"), self.__userPart), + # :foo_!n=foo@foohost.bar.net PART #eric-ide + (re.compile(r":([^!]+).*\sPART\s([^ ]+)\s*"), self.__userPart), + # :foo_!n=foo@foohost.bar.net QUIT :quit message + (re.compile(r":([^!]+).*\sQUIT\s:(.*)"), self.__userQuit), + # :foo_!n=foo@foohost.bar.net QUIT + (re.compile(r":([^!]+).*\sQUIT\s*"), self.__userQuit), + # :foo_!n=foo@foohost.bar.net NICK :newnick + (re.compile(r":([^!]+).*\sNICK\s:(.*)"), self.__userNickChange), + # :foo_!n=foo@foohost.bar.net MODE #eric-ide +o foo_ + ( + re.compile(r":([^!]+).*\sMODE\s([^ ]+)\s([+-][ovO]+)\s([^ ]+).*"), + self.__setUserPrivilege, + ), + # :cameron.libera.chat MODE #eric-ide +ns + (re.compile(r":([^ ]+)\sMODE\s([^ ]+)\s(.+)"), self.__updateChannelModes), + # :foo_!n=foo@foohost.bar.net TOPIC #eric-ide :eric - Python IDE + (re.compile(r":.*\sTOPIC\s([^ ]+)\s:(.*)"), self.__setTopic), + # :sturgeon.libera.chat 301 foo_ bar :Gone away for now + (re.compile(r":.*\s301\s([^ ]+)\s([^ ]+)\s:(.+)"), self.__userAway), + # :sturgeon.libera.chat 315 foo_ #eric-ide :End of /WHO list. + (re.compile(r":.*\s315\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoEnd), + # :zelazny.libera.chat 324 foo_ #eric-ide +cnt + (re.compile(r":.*\s324\s.*\s([^ ]+)\s(.+)"), self.__channelModes), + # :zelazny.libera.chat 328 foo_ #eric-ide :http://www.bugger.com/ + (re.compile(r":.*\s328\s.*\s([^ ]+)\s:(.+)"), self.__channelUrl), + # :zelazny.libera.chat 329 foo_ #eric-ide 1353001005 + (re.compile(r":.*\s329\s.*\s([^ ]+)\s(.+)"), self.__channelCreated), + # :zelazny.libera.chat 332 foo_ #eric-ide :eric support channel + (re.compile(r":.*\s332\s.*\s([^ ]+)\s:(.*)"), self.__setTopic), + # :zelazny.libera.chat foo_ 333 #eric-ide foo 1353089020 + (re.compile(r":.*\s333\s.*\s([^ ]+)\s([^ ]+)\s(\d+)"), self.__topicCreated), + # :cameron.libera.chat 352 detlev_ #eric-ide ~foo foohost.bar.net + # cameron.libera.chat foo_ H :0 Foo Bar + ( + re.compile( + r":.*\s352\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s[^ ]+\s([^ ]+)" + r"\s([^ ]+)\s:\d+\s(.*)" + ), + self.__whoEntry, + ), + # :zelazny.libera.chat 353 foo_ @ #eric-ide :@user1 +user2 user3 + (re.compile(r":.*\s353\s.*\s.\s([^ ]+)\s:(.*)"), self.__userList), + # :sturgeon.libera.chat 354 foo_ 42 ChanServ H@ + (re.compile(r":.*\s354\s[^ ]+\s42\s([^ ]+)\s(.*)"), self.__autoWhoEntry), + # :zelazny.libera.chat 366 foo_ #eric-ide :End of /NAMES list. + (re.compile(r":.*\s366\s.*\s([^ ]+)\s:(.*)"), self.__ignore), + # :sturgeon.libera.chat 704 foo_ index :Help topics available: + (re.compile(r":.*\s70[456]\s[^ ]+\s([^ ]+)\s:(.*)"), self.__help), + # WHOIS replies + # :sturgeon.libera.chat 311 foo_ bar ~bar barhost.foo.net * :Bar + ( + re.compile(r":.*\s311\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s\*\s:(.*)"), + self.__whoIsUser, + ), + # :sturgeon.libera.chat 319 foo_ bar :@#eric-ide + (re.compile(r":.*\s319\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsChannels), + # :sturgeon.libera.chat 312 foo_ bar sturgeon.libera.chat :London + ( + re.compile(r":.*\s312\s[^ ]+\s([^ ]+)\s([^ ]+)\s:(.*)"), + self.__whoIsServer, + ), + # :sturgeon.libera.chat 671 foo_ bar :is using a secure connection + (re.compile(r":.*\s671\s[^ ]+\s([^ ]+)\s:.*"), self.__whoIsSecure), + # :sturgeon.libera.chat 317 foo_ bar 3758 1355046912 :seconds + # idle, signon time + ( + re.compile(r":.*\s317\s[^ ]+\s([^ ]+)\s(\d+)\s(\d+)\s:.*"), + self.__whoIsIdle, + ), + # :sturgeon.libera.chat 330 foo_ bar bar :is logged in as + ( + re.compile(r":.*\s330\s[^ ]+\s([^ ]+)\s([^ ]+)\s:.*"), + self.__whoIsAccount, + ), + # :sturgeon.libera.chat 318 foo_ bar :End of /WHOIS list. + (re.compile(r":.*\s318\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsEnd), + # :sturgeon.libera.chat 307 foo_ bar :is an identified user + (re.compile(r":.*\s307\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsIdentify), + # :sturgeon.libera.chat 320 foo_ bar :is an identified user + (re.compile(r":.*\s320\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsIdentify), + # :sturgeon.libera.chat 310 foo_ bar :is available for help + (re.compile(r":.*\s310\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsHelper), + # :sturgeon.libera.chat 338 foo_ bar real.ident@real.host + # 12.34.56.78 :Actual user@host, Actual IP + ( + re.compile(r":.*\s338\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s:.*"), + self.__whoIsActually, + ), + # :sturgeon.libera.chat 313 foo_ bar :is an IRC Operator + (re.compile(r":.*\s313\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsOperator), + # :sturgeon.libera.chat 378 foo_ bar :is connecting from + # *@mnch-4d044d5a.pool.mediaWays.net 77.4.77.90 + ( + re.compile(r":.*\s378\s[^ ]+\s([^ ]+)\s:.*\s([^ ]+)\s([^ ]+)"), + self.__whoIsConnection, + ), + ] + + self.__autoWhoTemplate = "WHO {0} %tnf,42" + self.__autoWhoTimer = QTimer() + self.__autoWhoTimer.setSingleShot(True) + self.__autoWhoTimer.timeout.connect(self.__sendAutoWhoCommand) + self.__autoWhoRequested = False + + @pyqtSlot() + def on_messageEdit_returnPressed(self): + """ + Private slot to send a message to the channel. + """ + msg = self.messageEdit.text() + if msg: + self.__processUserMessage(msg) + + def __processUserMessage(self, msg): + """ + Private method to process a message entered by the user or via the + user list context menu. + + @param msg message to be processed + @type str + """ + self.messages.append( + '<font color="{0}">{2} <b><</b><font color="{1}">{3}</font>' + "<b>></b> {4}</font>".format( + ircExtensionPluginObject.getPreferences("ChannelMessageColour"), + ircExtensionPluginObject.getPreferences("OwnNickColour"), + ircTimestamp(), + self.__userName, + EricUtilities.html_encode(msg), + ) + ) + + if msg.startswith("/"): + if self.__private: + EricMessageBox.information( + self, + self.tr("Send Message"), + self.tr( + """Messages starting with a '/' are not allowed""" + """ in private chats.""" + ), + ) + else: + sendData = True + # flag set to False, if command was handled + + msgList = msg.split() + cmd = msgList[0][1:].upper() + if cmd in ["MSG", "QUERY"]: + cmd = "PRIVMSG" + if len(msgList) > 1: + if msgList[1].strip().lower() in self.__serviceNamesLower: + msg = ( + "PRIVMSG " + + msgList[1].strip().lower() + + " :" + + " ".join(msgList[2:]) + ) + else: + msg = "PRIVMSG {0} :{1}".format( + msgList[1], " ".join(msgList[2:]) + ) + else: + msgList[0] = cmd + msg = " ".join(msgList) + elif cmd == "NOTICE": + if len(msgList) > 2: + msg = "NOTICE {0} :{1}".format( + msgList[1], " ".join(msgList[2:]) + ) + else: + msg = "NOTICE {0}".format(" ".join(msgList[1:])) + elif cmd == "PING": + receiver = msgList[1] + msg = "PING {0} " + self.sendCtcpRequest.emit(receiver, "PING", "") + sendData = False + elif cmd == "IGNORE": + sendData = False + if len(msgList) > 1: + if msgList[1] == "-r": + ignored = False + userNamesList = msgList[2:] + else: + ignored = True + userNamesList = msgList[1:] + else: + userNamesList = [] + userNames = ",".join(u.rstrip(",") for u in userNamesList).split( + "," + ) + for userName in userNames: + itm = self.__findUser(userName) + if itm: + itm.setIgnored(ignored) + elif cmd == "UNIGNORE": + sendData = False + if len(msgList) > 1: + userNamesList = msgList[1:] + else: + userNamesList = [] + userNames = ",".join(u.rstrip(",") for u in userNamesList).split( + "," + ) + for userName in userNames: + itm = self.__findUser(userName) + if itm: + itm.setIgnored(False) + elif cmd == "AWAY": + sendData = False + if len(msgList) > 1: + msg = " ".join(msgList[1:]) + else: + msg = "" + self.awayCommand.emit(msg) + elif cmd == "JOIN": + sendData = False + if len(msgList) > 1: + channels = msgList[1].split(",") + if len(msgList) > 2: + keys = msgList[2].split(",") + else: + keys = [] + for channel, key in zip_longest(channels, keys, fillvalue=""): + self.__ircWidget.joinChannel(channel, key) + elif cmd == "PART": + sendData = False + if len(msgList) == 1: + self.leaveChannel() + else: + self.leaveChannels.emit(msgList[1:]) + elif cmd == "PARTALL": + sendData = False + self.leaveAllChannels.emit() + else: + msg = msg[1:] + if sendData: + self.sendData.emit(msg) + else: + if self.__private: + self.sendData.emit("PRIVMSG " + self.__privatePartner + " :" + msg) + else: + self.sendData.emit("PRIVMSG " + self.__name + " :" + msg) + + self.messageEdit.clear() + self.unsetMarkerLine() + + def requestLeave(self): + """ + Public method to leave the channel. + """ + ok = EricMessageBox.yesNo( + self, + self.tr("Leave IRC channel"), + self.tr( + """Do you really want to leave the IRC channel <b>{0}</b>?""" + ).format(self.__name), + ) + if ok: + self.leaveChannel() + + def leaveChannel(self): + """ + Public slot to leave the channel. + """ + if not self.__private: + self.sendData.emit("PART " + self.__name + " :" + self.__partMessage) + self.channelClosed.emit(self.__name) + + def name(self): + """ + Public method to get the name of the channel. + + @return name of the channel + @rtype str + """ + return self.__name + + def setName(self, name): + """ + Public method to set the name of the channel. + + @param name of the channel + @type str + """ + self.__name = name + + def getUsersCount(self): + """ + Public method to get the users count of the channel. + + @return users count of the channel + @rtype int + """ + return self.usersList.count() + + def userName(self): + """ + Public method to get the nick name of the user. + + @return nick name of the user + @rtype str + """ + return self.__userName + + def setUserName(self, name): + """ + Public method to set the user name for the channel. + + @param name user name for the channel + @type str + """ + self.__userName = name + + def partMessage(self): + """ + Public method to get the part message. + + @return part message + @rtype str + """ + return self.__partMessage + + def setPartMessage(self, message): + """ + Public method to set the part message. + + @param message message to be used for PART messages + @type str + """ + self.__partMessage = message + + def setPrivate(self, private, partner=""): + """ + Public method to set the private chat mode. + + @param private flag indicating private chat mode + @type bool + @param partner name of the partner user + @type str + """ + self.__private = private + self.__privatePartner = partner + self.editTopicButton.setEnabled(private) + + def setPrivateInfo(self, infoText): + """ + Public method to set some info text for private chat mode. + + @param infoText info text to be shown + @type str + """ + if self.__private: + self.topicLabel.setText(infoText) + + def handleMessage(self, line): + """ + Public method to handle the message sent by the server. + + @param line server message + @type str + @return flag indicating, if the message was handled + @rtype bool + """ + for patternRe, patternFunc in self.__patterns: + match = patternRe.match(line) + if match is not None and patternFunc(match): + return True + + return False + + def __message(self, match): + """ + Private method to handle messages to the channel. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) sender user name + # group(2) sender user@host + # group(3) target nick + # group(4) message + if match.group(3).lower() == self.__name.lower(): + senderName = match.group(1) + itm = self.__findUser(senderName) + if itm and itm.isIgnored(): + # user should be ignored + return True + + if match.group(4).startswith("\x01"): + return self.__handleCtcp(match) + + self.addMessage(senderName, match.group(4)) + if self.__private and not self.topicLabel.text(): + self.setPrivateInfo("{0} - {1}".format(match.group(1), match.group(2))) + return True + + return False + + def addMessage(self, sender, msg): + """ + Public method to add a message from external. + + @param sender nick name of the sender + @type str + @param msg message received from sender + @type str + """ + self.__appendMessage( + '<font color="{0}">{2} <b><</b><font color="{1}">{3}</font>' + "<b>></b> {4}</font>".format( + ircExtensionPluginObject.getPreferences("ChannelMessageColour"), + ircExtensionPluginObject.getPreferences("NickColour"), + ircTimestamp(), + sender, + ircFilter(msg), + ) + ) + if ircExtensionPluginObject.getPreferences("ShowNotifications"): + if ircExtensionPluginObject.getPreferences("NotifyMessage"): + self.__ui.showNotification( + ircExtensionPluginObject.getPixmap("irc48"), + self.tr("Channel Message"), + msg, + ) + elif ( + ircExtensionPluginObject.getPreferences("NotifyNick") + and self.__userName.lower() in msg.lower() + ): + self.__ui.showNotification( + ircExtensionPluginObject.getPixmap("irc48"), + self.tr("Nick mentioned"), + msg, + ) + + def addUsers(self, users): + """ + Public method to add users to the channel. + + @param users list of user names to add + @type list of str + """ + for user in users: + itm = self.__findUser(user) + if itm is None: + IrcUserItem(name=user, parent=self.usersList) + + def __userJoin(self, match): + """ + Private method to handle a user joining the channel. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(3).lower() == self.__name.lower(): + if self.__userName != match.group(1): + IrcUserItem(name=match.group(1), parent=self.usersList) + msg = self.tr("{0} has joined the channel {1} ({2}).").format( + match.group(1), self.__name, match.group(2) + ) + self.__addManagementMessage(IrcChannelWidget.JoinIndicator, msg) + else: + msg = self.tr("You have joined the channel {0} ({1}).").format( + self.__name, match.group(2) + ) + self.__addManagementMessage(IrcChannelWidget.JoinIndicator, msg) + if ircExtensionPluginObject.getPreferences( + "ShowNotifications" + ) and ircExtensionPluginObject.getPreferences("NotifyJoinPart"): + self.__ui.showNotification( + ircExtensionPluginObject.getPixmap("irc48"), + self.tr("Join Channel"), + msg, + ) + return True + + return False + + def __userPart(self, match): + """ + Private method to handle a user leaving the channel. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(2).lower() == self.__name.lower(): + itm = self.__findUser(match.group(1)) + self.usersList.takeItem(self.usersList.row(itm)) + del itm + if match.lastindex == 2: + msg = self.tr("{0} has left {1}.").format(match.group(1), self.__name) + nmsg = msg + self.__addManagementMessage(IrcChannelWidget.LeaveIndicator, msg) + else: + msg = self.tr("{0} has left {1}: {2}.").format( + match.group(1), self.__name, ircFilter(match.group(3)) + ) + nmsg = self.tr("{0} has left {1}: {2}.").format( + match.group(1), self.__name, match.group(3) + ) + self.__addManagementMessage(IrcChannelWidget.LeaveIndicator, msg) + if ircExtensionPluginObject.getPreferences( + "ShowNotifications" + ) and ircExtensionPluginObject.getPreferences("NotifyJoinPart"): + self.__ui.showNotification( + ircExtensionPluginObject.getPixmap("irc48"), + self.tr("Leave Channel"), + nmsg, + ) + return True + + return False + + def __userQuit(self, match): + """ + Private method to handle a user logging off the server. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + itm = self.__findUser(match.group(1)) + if itm: + self.usersList.takeItem(self.usersList.row(itm)) + del itm + if match.lastindex == 1: + msg = self.tr("{0} has quit {1}.").format(match.group(1), self.__name) + self.__addManagementMessage(IrcChannelWidget.MessageIndicator, msg) + else: + msg = self.tr("{0} has quit {1}: {2}.").format( + match.group(1), self.__name, ircFilter(match.group(2)) + ) + self.__addManagementMessage(IrcChannelWidget.MessageIndicator, msg) + if ircExtensionPluginObject.getPreferences( + "ShowNotifications" + ) and ircExtensionPluginObject.getPreferences("NotifyJoinPart"): + self.__ui.showNotification( + ircExtensionPluginObject.getPixmap("irc48"), self.tr("Quit"), msg + ) + + # always return False for other channels and server to process + return False + + def __userNickChange(self, match): + """ + Private method to handle a nickname change of a user. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + itm = self.__findUser(match.group(1)) + if itm: + itm.setName(match.group(2)) + if match.group(1) == self.__userName: + self.__addManagementMessage( + IrcChannelWidget.MessageIndicator, + self.tr("You are now known as {0}.").format(match.group(2)), + ) + self.__userName = match.group(2) + else: + self.__addManagementMessage( + IrcChannelWidget.MessageIndicator, + self.tr("User {0} is now known as {1}.").format( + match.group(1), match.group(2) + ), + ) + + # always return False for other channels and server to process + return False + + def __userList(self, match): + """ + Private method to handle the receipt of a list of users of the channel. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + users = match.group(2).split() + for user in users: + userPrivileges, userName = self.__extractPrivilege(user) + itm = self.__findUser(userName) + if itm is None: + itm = IrcUserItem(name=userName, parent=self.usersList) + for privilege in userPrivileges: + itm.changePrivilege(privilege) + + self.__setEditTopicButton() + return True + + return False + + def __userAway(self, match): + """ + Private method to handle a topic change of the channel. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + self.__addManagementMessage( + self.tr("Away"), + self.tr("{0} is away: {1}").format(match.group(2), match.group(3)), + ) + return True + + return False + + def __setTopic(self, match): + """ + Private method to handle a topic change of the channel. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + self.topicLabel.setText(match.group(2)) + self.__addManagementMessage( + IrcChannelWidget.MessageIndicator, + ircFilter( + self.tr('The channel topic is: "{0}".').format(match.group(2)) + ), + ) + return True + + return False + + def __topicCreated(self, match): + """ + Private method to handle a topic created message. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + self.__addManagementMessage( + IrcChannelWidget.MessageIndicator, + self.tr("The topic was set by {0} on {1}.").format( + match.group(2), + QDateTime.fromSecsSinceEpoch(int(match.group(3))).toString( + "yyyy-MM-dd hh:mm" + ), + ), + ) + return True + + return False + + def __channelUrl(self, match): + """ + Private method to handle a channel URL message. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + self.__addManagementMessage( + IrcChannelWidget.MessageIndicator, + ircFilter(self.tr("Channel URL: {0}").format(match.group(2))), + ) + return True + + return False + + def __channelModes(self, match): + """ + Private method to handle a message reporting the channel modes. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + modesDict = getChannelModesDict() + modesParameters = match.group(2).split() + modeString = modesParameters.pop(0) + modes = [] + for modeChar in modeString: + if modeChar == "+": + continue + elif modeChar == "k": + parameter = modesParameters.pop(0) + modes.append(self.tr("password protected ({0})").format(parameter)) + elif modeChar == "l": + parameter = modesParameters.pop(0) + modes.append(self.tr("limited to %n user(s)", "", int(parameter))) + elif modeChar in modesDict: + modes.append(modesDict[modeChar]) + else: + modes.append(modeChar) + + self.__addManagementMessage( + IrcChannelWidget.MessageIndicator, + self.tr("Channel modes: {0}.").format(", ".join(modes)), + ) + + return True + + return False + + def __channelCreated(self, match): + """ + Private method to handle a channel created message. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + self.__addManagementMessage( + IrcChannelWidget.MessageIndicator, + self.tr("This channel was created on {0}.").format( + QDateTime.fromSecsSinceEpoch(int(match.group(2))).toString( + "yyyy-MM-dd hh:mm" + ) + ), + ) + return True + + return False + + def __updateChannelModes(self, match): + """ + Private method to handle a message reporting the channel modes. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) user or server + # group(2) channel + # group(3) modes and parameter list + if match.group(2).lower() == self.__name.lower(): + nick = match.group(1) + modesParameters = match.group(3).split() + modeString = modesParameters.pop(0) + isPlus = True + message = "" + for mode in modeString: + if mode == "+": + isPlus = True + continue + elif mode == "-": + isPlus = False + continue + elif mode == "a": + if isPlus: + message = self.tr( + "{0} sets the channel mode to 'anonymous'." + ).format(nick) + else: + message = self.tr( + "{0} removes the 'anonymous' mode from the channel." + ).format(nick) + elif mode == "b": + if isPlus: + message = self.tr("{0} sets a ban on {1}.").format( + nick, modesParameters.pop(0) + ) + else: + message = self.tr("{0} removes the ban on {1}.").format( + nick, modesParameters.pop(0) + ) + elif mode == "c": + if isPlus: + message = self.tr( + "{0} sets the channel mode to 'no colors allowed'." + ).format(nick) + else: + message = self.tr( + "{0} sets the channel mode to 'allow color codes'." + ).format(nick) + elif mode == "e": + if isPlus: + message = self.tr("{0} sets a ban exception on {1}.").format( + nick, modesParameters.pop(0) + ) + else: + message = self.tr( + "{0} removes the ban exception on {1}." + ).format(nick, modesParameters.pop(0)) + elif mode == "i": + if isPlus: + message = self.tr( + "{0} sets the channel mode to 'invite only'." + ).format(nick) + else: + message = self.tr( + "{0} removes the 'invite only' mode from the channel." + ).format(nick) + elif mode == "k": + if isPlus: + message = self.tr("{0} sets the channel key to '{1}'.").format( + nick, modesParameters.pop(0) + ) + else: + message = self.tr("{0} removes the channel key.").format(nick) + elif mode == "l": + if isPlus: + message = self.tr( + "{0} sets the channel limit to %n nick(s).", + "", + int(modesParameters.pop(0)), + ).format(nick) + else: + message = self.tr("{0} removes the channel limit.").format(nick) + elif mode == "m": + if isPlus: + message = self.tr( + "{0} sets the channel mode to 'moderated'." + ).format(nick) + else: + message = self.tr( + "{0} sets the channel mode to 'unmoderated'." + ).format(nick) + elif mode == "n": + if isPlus: + message = self.tr( + "{0} sets the channel mode to 'no messages from" + " outside'." + ).format(nick) + else: + message = self.tr( + "{0} sets the channel mode to 'allow messages" + " from outside'." + ).format(nick) + elif mode == "p": + if isPlus: + message = self.tr( + "{0} sets the channel mode to 'private'." + ).format(nick) + else: + message = self.tr( + "{0} sets the channel mode to 'public'." + ).format(nick) + elif mode == "q": + if isPlus: + message = self.tr( + "{0} sets the channel mode to 'quiet'." + ).format(nick) + else: + message = self.tr( + "{0} removes the 'quiet' mode from the channel." + ).format(nick) + elif mode == "r": + continue + elif mode == "s": + if isPlus: + message = self.tr( + "{0} sets the channel mode to 'secret'." + ).format(nick) + else: + message = self.tr( + "{0} sets the channel mode to 'visible'." + ).format(nick) + elif mode == "t": + if isPlus: + message = self.tr("{0} switches on 'topic protection'.").format( + nick + ) + else: + message = self.tr( + "{0} switches off 'topic protection'." + ).format(nick) + elif mode == "I": + if isPlus: + message = self.tr("{0} sets invitation mask {1}.").format( + nick, modesParameters.pop(0) + ) + else: + message = self.tr( + "{0} removes the invitation mask {1}." + ).format(nick, modesParameters.pop(0)) + + self.__addManagementMessage(self.tr("Mode"), message) + + return True + + return False + + def __setUserPrivilege(self, match): + """ + Private method to handle a change of user privileges for the channel. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(2).lower() == self.__name.lower(): + itm = self.__findUser(match.group(4)) + if itm: + itm.changePrivilege(match.group(3)) + self.__setEditTopicButton() + self.__addManagementMessage( + IrcChannelWidget.MessageIndicator, + self.tr("{0} sets mode for {1}: {2}.").format( + match.group(1), match.group(4), match.group(3) + ), + ) + return True + + return False + + def __ignore(self, match): + """ + Private method to handle a channel message we are not interested in. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + return True + + return False + + def __help(self, match): + """ + Private method to handle a help message. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + self.__addManagementMessage( + self.tr("Help"), "{0} {1}".format(match.group(1), ircFilter(match.group(2))) + ) + return True + + def __handleCtcp(self, match): + """ + Private method to handle a CTCP channel command. + + @param match reference to the match object + @type re.Match + @return flag indicating, if the message was handled + @rtype bool + """ + # group(1) sender user name + # group(2) sender user@host + # group(3) target nick + # group(4) message + if match.group(4).startswith("\x01"): + ctcpCommand = match.group(4)[1:].split("\x01", 1)[0] + if " " in ctcpCommand: + ctcpRequest, ctcpArg = ctcpCommand.split(" ", 1) + else: + ctcpRequest, ctcpArg = ctcpCommand, "" + ctcpRequest = ctcpRequest.lower() + if ctcpRequest == "version": + msg = "Eric IRC client {0}, {1}".format(Version, Copyright) + self.__addManagementMessage( + self.tr("CTCP"), + self.tr("Received Version request from {0}.").format( + match.group(1) + ), + ) + self.sendCtcpReply.emit(match.group(1), "VERSION " + msg) + elif ctcpRequest == "ping": + self.__addManagementMessage( + self.tr("CTCP"), + self.tr( + "Received CTCP-PING request from {0}, sending answer." + ).format(match.group(1)), + ) + self.sendCtcpReply.emit(match.group(1), "PING {0}".format(ctcpArg)) + elif ctcpRequest == "clientinfo": + self.__addManagementMessage( + self.tr("CTCP"), + self.tr( + "Received CTCP-CLIENTINFO request from {0}, sending answer." + ).format(match.group(1)), + ) + self.sendCtcpReply.emit( + match.group(1), "CLIENTINFO CLIENTINFO PING VERSION" + ) + else: + self.__addManagementMessage( + self.tr("CTCP"), + self.tr("Received unknown CTCP-{0} request from {1}.").format( + ctcpRequest, match.group(1) + ), + ) + return True + + return False + + def setUserPrivilegePrefix(self, prefixes): + """ + Public method to set the user privilege to prefix mapping. + + @param prefixes dictionary with privilege as key and prefix as value + @type dict + """ + self.__prefixToPrivilege = {} + for privilege, prefix in prefixes.items(): + if prefix: + self.__prefixToPrivilege[prefix] = privilege + + def __findUser(self, name): + """ + Private method to find the user in the list of users. + + @param name user name to search for + @type str + @return reference to the list entry + @rtype QListWidgetItem + """ + for row in range(self.usersList.count()): + itm = self.usersList.item(row) + if itm.name() == name: + return itm + + return None + + def __extractPrivilege(self, name): + """ + Private method to extract the user privileges out of the name. + + @param name user name and prefixes + @type str + @return tuple containing a list of privileges and user name + @rtype tuple of (list of str, str) + """ + privileges = [] + while name[0] in self.__prefixToPrivilege: + prefix = name[0] + privileges.append(self.__prefixToPrivilege[prefix]) + name = name[1:] + if name[0] == ",": + name = name[1:] + + return privileges, name + + def __addManagementMessage(self, indicator, message): + """ + Private method to add a channel management message to the list. + + @param indicator indicator to be shown + @type str + @param message message to be shown + @type str + """ + if indicator == self.JoinIndicator: + color = ircExtensionPluginObject.getPreferences("JoinChannelColour") + elif indicator == self.LeaveIndicator: + color = ircExtensionPluginObject.getPreferences("LeaveChannelColour") + else: + color = ircExtensionPluginObject.getPreferences("ChannelInfoColour") + self.__appendMessage( + '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format( + color, ircTimestamp(), indicator, message + ) + ) + + def __appendMessage(self, message): + """ + Private slot to append a message. + + @param message message to be appended + @type str + """ + if ( + self.__hidden + and self.__markerLine == "" + and ircExtensionPluginObject.getPreferences("MarkPositionWhenHidden") + ): + self.setMarkerLine() + self.messages.append(message) + + def setMarkerLine(self): + """ + Public method to draw a line to mark the current position. + """ + self.unsetMarkerLine() + self.__markerLine = ( + '<span style=" color:{0}; background-color:{1};">{2}</span>'.format( + ircExtensionPluginObject.getPreferences("MarkerLineForegroundColour"), + ircExtensionPluginObject.getPreferences("MarkerLineBackgroundColour"), + self.tr("--- New From Here ---"), + ) + ) + self.messages.append(self.__markerLine) + + def unsetMarkerLine(self): + """ + Public method to remove the marker line. + """ + if self.__markerLine: + txt = self.messages.toHtml() + if txt.endswith(self.__markerLine + "</p></body></html>"): + # remove empty last paragraph + pos = txt.rfind("<p") + txt = txt[:pos] + "</body></html>" + else: + txt = txt.replace(self.__markerLine, "") + self.messages.setHtml(txt) + self.__markerLine = "" + self.messages.moveCursor(QTextCursor.MoveOperation.End) + + def __clearMessages(self): + """ + Private slot to clear the contents of the messages display. + """ + self.messages.clear() + + def __copyMessages(self): + """ + Private slot to copy the selection of the messages display to the + clipboard. + """ + self.messages.copy() + + def __copyAllMessages(self): + """ + Private slot to copy the contents of the messages display to the + clipboard. + """ + txt = self.messages.toPlainText() + if txt: + cb = QApplication.clipboard() + cb.setText(txt) + + def __cutAllMessages(self): + """ + Private slot to cut the contents of the messages display to the + clipboard. + """ + txt = self.messages.toPlainText() + if txt: + cb = QApplication.clipboard() + cb.setText(txt) + self.messages.clear() + + def __saveMessages(self): + """ + Private slot to save the contents of the messages display. + """ + hasText = not self.messages.document().isEmpty() + if hasText: + if OSUtilities.isWindowsPlatform(): + htmlExtension = "htm" + else: + htmlExtension = "html" + fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( + self, + self.tr("Save Messages"), + "", + self.tr("HTML Files (*.{0});;Text Files (*.txt);;All Files (*)").format( + htmlExtension + ), + None, + EricFileDialog.DontConfirmOverwrite, + ) + if fname: + fpath = pathlib.Path(fname) + if not fpath.suffix: + ex = selectedFilter.split("(*")[1].split(")")[0] + if ex: + fpath = fpath.with_suffix(ex) + if fpath.exists(): + res = EricMessageBox.yesNo( + self, + self.tr("Save Messages"), + self.tr( + "<p>The file <b>{0}</b> already exists." + " Overwrite it?</p>" + ).format(fpath), + icon=EricMessageBox.Warning, + ) + if not res: + return + + try: + txt = ( + self.messages.toHtml() + if fpath.suffix.lower() in [".htm", ".html"] + else self.messages.toPlainText() + ) + with fpath.open("w", encoding="utf-8") as f: + f.write(txt) + except OSError as err: + EricMessageBox.critical( + self, + self.tr("Error saving Messages"), + self.tr( + """<p>The messages contents could not be written""" + """ to <b>{0}</b></p><p>Reason: {1}</p>""" + ).format(fpath, str(err)), + ) + + def __initMessagesMenu(self): + """ + Private slot to initialize the context menu of the messages pane. + """ + self.__messagesMenu = QMenu(self) + self.__copyMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("editCopy"), self.tr("Copy"), self.__copyMessages + ) + self.__messagesMenu.addSeparator() + self.__cutAllMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("editCut"), + self.tr("Cut all"), + self.__cutAllMessages, + ) + self.__copyAllMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("editCopy"), + self.tr("Copy all"), + self.__copyAllMessages, + ) + self.__messagesMenu.addSeparator() + self.__clearMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("editDelete"), + self.tr("Clear"), + self.__clearMessages, + ) + self.__messagesMenu.addSeparator() + self.__saveMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("fileSave"), self.tr("Save"), self.__saveMessages + ) + self.__messagesMenu.addSeparator() + self.__setMarkerMessagesAct = self.__messagesMenu.addAction( + self.tr("Mark Current Position"), self.setMarkerLine + ) + self.__unsetMarkerMessagesAct = self.__messagesMenu.addAction( + self.tr("Remove Position Marker"), self.unsetMarkerLine + ) + + self.on_messages_copyAvailable(False) + + @pyqtSlot(bool) + def on_messages_copyAvailable(self, yes): + """ + Private slot to react to text selection/deselection of the messages + edit. + + @param yes flag signaling the availability of selected text + @type bool + """ + self.__copyMessagesAct.setEnabled(yes) + + @pyqtSlot(QPoint) + def on_messages_customContextMenuRequested(self, pos): + """ + Private slot to show the context menu of the messages pane. + + @param pos the position of the mouse pointer + @type QPoint + """ + enable = not self.messages.document().isEmpty() + self.__cutAllMessagesAct.setEnabled(enable) + self.__copyAllMessagesAct.setEnabled(enable) + self.__saveMessagesAct.setEnabled(enable) + self.__setMarkerMessagesAct.setEnabled(self.__markerLine == "") + self.__unsetMarkerMessagesAct.setEnabled(self.__markerLine != "") + self.__messagesMenu.popup(self.messages.mapToGlobal(pos)) + + def __whoIs(self): + """ + Private slot to get information about the selected user. + """ + self.__whoIsNick = self.usersList.selectedItems()[0].text() + self.sendData.emit("WHOIS " + self.__whoIsNick) + + def __openPrivateChat(self): + """ + Private slot to open a chat with the selected user. + """ + user = self.usersList.selectedItems()[0].text() + self.openPrivateChat.emit(user) + + def __sendUserMessage(self): + """ + Private slot to send a private message to a specific user. + """ + from eric7.EricWidgets import EricTextInputDialog + + user = self.usersList.selectedItems()[0].text() + ok, message = EricTextInputDialog.getText( + self, + self.tr("Send Message"), + self.tr("Enter the message to be sent:"), + minimumWidth=400, + ) + if ok and message: + self.__processUserMessage("/MSG {0} {1}".format(user, message)) + + def __sendUserQuery(self): + """ + Private slot to send a query message to a specific user. + """ + from eric7.EricWidgets import EricTextInputDialog + + user = self.usersList.selectedItems()[0].text() + ok, message = EricTextInputDialog.getText( + self, + self.tr("Send Query"), + self.tr("Enter the message to be sent:"), + minimumWidth=400, + ) + if ok and message: + self.__processUserMessage("/QUERY {0} {1}".format(user, message)) + + def __sendUserNotice(self): + """ + Private slot to send a notice message to a specific user. + """ + from eric7.EricWidgets import EricTextInputDialog + + user = self.usersList.selectedItems()[0].text() + ok, message = EricTextInputDialog.getText( + self, + self.tr("Send Notice"), + self.tr("Enter the message to be sent:"), + minimumWidth=400, + ) + if ok and message: + self.__processUserMessage("/NOTICE {0} {1}".format(user, message)) + + def __pingUser(self): + """ + Private slot to send a ping to a specific user. + """ + user = self.usersList.selectedItems()[0].text() + self.__processUserMessage("/PING {0}".format(user)) + + def __ignoreUser(self): + """ + Private slot to ignore a specific user. + """ + user = self.usersList.selectedItems()[0].text() + self.__processUserMessage("/IGNORE {0}".format(user)) + + def __initUsersMenu(self): + """ + Private slot to initialize the users list context menu. + """ + self.__usersMenu = QMenu(self) + self.__whoIsAct = self.__usersMenu.addAction(self.tr("Who Is"), self.__whoIs) + self.__usersMenu.addSeparator() + self.__privateChatAct = self.__usersMenu.addAction( + self.tr("Private Chat"), self.__openPrivateChat + ) + self.__usersMenu.addSeparator() + self.__sendUserMessageAct = self.__usersMenu.addAction( + self.tr("Send Message"), self.__sendUserMessage + ) + self.__sendUserQueryAct = self.__usersMenu.addAction( + self.tr("Send Query"), self.__sendUserQuery + ) + self.__sendUserNoticeAct = self.__usersMenu.addAction( + self.tr("Send Notice"), self.__sendUserNotice + ) + self.__usersMenu.addSeparator() + self.__pingUserAct = self.__usersMenu.addAction( + self.tr("Send Ping"), self.__pingUser + ) + self.__ignoreUserAct = self.__usersMenu.addAction( + self.tr("Ignore User"), self.__ignoreUser + ) + self.__usersMenu.addSeparator() + self.__usersListRefreshAct = self.__usersMenu.addAction( + self.tr("Refresh"), self.__sendAutoWhoCommand + ) + + @pyqtSlot(QPoint) + def on_usersList_customContextMenuRequested(self, pos): + """ + Private slot to show the context menu of the users list. + + @param pos the position of the mouse pointer + @type QPoint + """ + enable = len(self.usersList.selectedItems()) > 0 + enablePrivate = enable and not self.__private + itm = self.usersList.itemAt(pos) + if itm and enablePrivate: + enablePrivate = itm.text().lower() not in [ + "chanserv", + self.__userName.lower(), + ] + self.__whoIsAct.setEnabled(enable) + self.__privateChatAct.setEnabled(enablePrivate) + self.__usersListRefreshAct.setEnabled( + self.usersList.count() + <= ircExtensionPluginObject.getPreferences("AutoUserInfoMax") + ) + self.__usersMenu.popup(self.usersList.mapToGlobal(pos)) + + def hideEvent(self, _evt): + """ + Protected method handling hide events. + + @param _evt reference to the hide event (unused) + @type QHideEvent + """ + self.__hidden = True + + def showEvent(self, _evt): + """ + Protected method handling show events. + + @param _evt reference to the show event (unused) + @type QShowEvent + """ + self.__hidden = False + + def initAutoWho(self): + """ + Public method to initialize the Auto Who system. + """ + if ircExtensionPluginObject.getPreferences("AutoUserInfoLookup"): + self.__autoWhoTimer.setInterval( + ircExtensionPluginObject.getPreferences("AutoUserInfoInterval") * 1000 + ) + self.__autoWhoTimer.start() + + @pyqtSlot() + def __sendAutoWhoCommand(self): + """ + Private slot to send the WHO command to update the users list. + """ + if self.usersList.count() <= ircExtensionPluginObject.getPreferences( + "AutoUserInfoMax" + ): + self.__autoWhoRequested = True + self.sendData.emit(self.__autoWhoTemplate.format(self.__name)) + + def __autoWhoEntry(self, match): + """ + Private method to handle a WHO entry returned by the server as + requested automatically. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) user flags + if self.__autoWhoRequested: + itm = self.__findUser(match.group(1)) + if itm: + itm.parseWhoFlags(match.group(2)) + return True + + return False + + def __whoEnd(self, match): + """ + Private method to handle the end of the WHO list. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + if match.group(1).lower() == self.__name.lower(): + if self.__autoWhoRequested: + self.__autoWhoRequested = False + self.initAutoWho() + else: + self.__addManagementMessage( + self.tr("Who"), + self.tr("End of WHO list for {0}.").format(match.group(1)), + ) + return True + + return False + + def __whoEntry(self, match): + """ + Private method to handle a WHO entry returned by the server as + requested manually. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) channel + # group(2) user + # group(3) host + # group(4) nick + # group(5) user flags + # group(6) real name + if match.group(1).lower() == self.__name.lower(): + away = self.tr(" (Away)") if match.group(5).startswith("G") else "" + self.__addManagementMessage( + self.tr("Who"), + self.tr("{0} is {1}@{2} ({3}){4}").format( + match.group(4), match.group(2), match.group(3), match.group(6), away + ), + ) + return True + + return False + + def __whoIsUser(self, match): + """ + Private method to handle the WHOIS user reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) user + # group(3) host + # group(4) real name + if match.group(1) == self.__whoIsNick: + realName = match.group(4).replace("<", "<").replace(">", ">") + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is {1}@{2} ({3}).").format( + match.group(1), match.group(2), match.group(3), realName + ), + ) + return True + + return False + + def __whoIsChannels(self, match): + """ + Private method to handle the WHOIS channels reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) channels + if match.group(1) == self.__whoIsNick: + userChannels = [] + voiceChannels = [] + opChannels = [] + halfopChannels = [] + ownerChannels = [] + adminChannels = [] + + # generate the list of channels the user is in + channelList = match.group(2).split() + for channel in channelList: + if channel.startswith(("*", "&")): + adminChannels.append(channel[1:]) + elif channel.startswith(("!", "~")) and self.__ircWidget.isChannelName( + channel[1:] + ): + ownerChannels.append(channel[1:]) + elif channel.startswith("@+"): + opChannels.append(channel[2:]) + elif channel.startswith("@"): + opChannels.append(channel[1:]) + elif channel.startswith("%"): + halfopChannels.append(channel[1:]) + elif channel.startswith("+"): + voiceChannels.append(channel[1:]) + else: + userChannels.append(channel) + + # show messages + if userChannels: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is a user on channels: {1}").format( + match.group(1), " ".join(userChannels) + ), + ) + if voiceChannels: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} has voice on channels: {1}").format( + match.group(1), " ".join(voiceChannels) + ), + ) + if halfopChannels: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is a halfop on channels: {1}").format( + match.group(1), " ".join(halfopChannels) + ), + ) + if opChannels: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is an operator on channels: {1}").format( + match.group(1), " ".join(opChannels) + ), + ) + if ownerChannels: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is owner of channels: {1}").format( + match.group(1), " ".join(ownerChannels) + ), + ) + if adminChannels: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is admin on channels: {1}").format( + match.group(1), " ".join(adminChannels) + ), + ) + return True + + return False + + def __whoIsServer(self, match): + """ + Private method to handle the WHOIS server reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) server + # group(3) server info + if match.group(1) == self.__whoIsNick: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is online via {1} ({2}).").format( + match.group(1), match.group(2), match.group(3) + ), + ) + return True + + return False + + def __whoIsOperator(self, match): + """ + Private method to handle the WHOIS operator reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) message + if match.group(1) == self.__whoIsNick: + if match.group(2).lower().startswith("is an irc operator"): + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is an IRC Operator.").format(match.group(1)), + ) + else: + self.__addManagementMessage( + self.tr("Whois"), "{0} {1}".format(match.group(1), match.group(2)) + ) + return True + + return False + + def __whoIsIdle(self, match): + """ + Private method to handle the WHOIS idle reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) idle seconds + # group(3) signon time + if match.group(1) == self.__whoIsNick: + seconds = int(match.group(2)) + minutes = seconds // 60 + hours = minutes // 60 + days = hours // 24 + + signonTimestamp = int(match.group(3)) + signonTime = QDateTime() + signonTime.setTime_t(signonTimestamp) + + if days: + daysString = self.tr("%n day(s)", "", days) + hoursString = self.tr("%n hour(s)", "", hours) + minutesString = self.tr("%n minute(s)", "", minutes) + secondsString = self.tr("%n second(s)", "", seconds) + self.__addManagementMessage( + self.tr("Whois"), + self.tr( + "{0} has been idle for {1}, {2}, {3}, and {4}.", + "{0} = name of person, {1} = (x days)," + " {2} = (x hours), {3} = (x minutes)," + " {4} = (x seconds)", + ).format( + match.group(1), + daysString, + hoursString, + minutesString, + secondsString, + ), + ) + elif hours: + hoursString = self.tr("%n hour(s)", "", hours) + minutesString = self.tr("%n minute(s)", "", minutes) + secondsString = self.tr("%n second(s)", "", seconds) + self.__addManagementMessage( + self.tr("Whois"), + self.tr( + "{0} has been idle for {1}, {2}, and {3}.", + "{0} = name of person, {1} = (x hours), " + "{2} = (x minutes), {3} = (x seconds)", + ).format(match.group(1), hoursString, minutesString, secondsString), + ) + elif minutes: + minutesString = self.tr("%n minute(s)", "", minutes) + secondsString = self.tr("%n second(s)", "", seconds) + self.__addManagementMessage( + self.tr("Whois"), + self.tr( + "{0} has been idle for {1} and {2}.", + "{0} = name of person, {1} = (x minutes), {3} = (x seconds)", + ).format(match.group(1), minutesString, secondsString), + ) + else: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} has been idle for %n second(s).", "", seconds).format( + match.group(1) + ), + ) + + if not signonTime.isNull(): + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} has been online since {1}.").format( + match.group(1), signonTime.toString("yyyy-MM-dd, hh:mm:ss") + ), + ) + return True + + return False + + def __whoIsEnd(self, match): + """ + Private method to handle the end of WHOIS reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) end message + if match.group(1) == self.__whoIsNick: + self.__whoIsNick = "" + self.__addManagementMessage( + self.tr("Whois"), + self.tr("End of WHOIS list for {0}.").format(match.group(1)), + ) + return True + + return False + + def __whoIsIdentify(self, match): + """ + Private method to handle the WHOIS identify and identified replies. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) identified message + if match.group(1) == self.__whoIsNick: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is an identified user.").format(match.group(1)), + ) + return True + + return False + + def __whoIsHelper(self, match): + """ + Private method to handle the WHOIS helper reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) helper message + if match.group(1) == self.__whoIsNick: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is available for help.").format(match.group(1)), + ) + return True + + return False + + def __whoIsAccount(self, match): + """ + Private method to handle the WHOIS account reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) login name + if match.group(1) == self.__whoIsNick: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is logged in as {1}.").format( + match.group(1), match.group(2) + ), + ) + return True + + return False + + def __whoIsActually(self, match): + """ + Private method to handle the WHOIS actually reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) actual user@host + # group(3) actual IP + if match.group(1) == self.__whoIsNick: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is actually using the host {1} (IP: {2}).").format( + match.group(1), match.group(2), match.group(3) + ), + ) + return True + + return False + + def __whoIsSecure(self, match): + """ + Private method to handle the WHOIS secure reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + if match.group(1) == self.__whoIsNick: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is using a secure connection.").format(match.group(1)), + ) + return True + + return False + + def __whoIsConnection(self, match): + """ + Private method to handle the WHOIS connection reply. + + @param match match object that matched the pattern + @type re.Match + @return flag indicating whether the message was handled + @rtype bool + """ + # group(1) nick + # group(2) host name + # group(3) IP + if match.group(1) == self.__whoIsNick: + self.__addManagementMessage( + self.tr("Whois"), + self.tr("{0} is connecting from {1} (IP: {2}).").format( + match.group(1), match.group(2), match.group(3) + ), + ) + return True + + return False + + def __setEditTopicButton(self): + """ + Private method to set the visibility of the Edit Topic button. + """ + itm = self.__findUser(self.__userName) + if itm: + self.editTopicButton.setVisible(itm.canChangeTopic()) + + @pyqtSlot() + def on_editTopicButton_clicked(self): + """ + Private slot to change the topic of the channel. + """ + topic, ok = QInputDialog.getText( + self, + self.tr("Edit Channel Topic"), + self.tr("Enter the topic for this channel:"), + QLineEdit.EchoMode.Normal, + self.topicLabel.text(), + ) + if ok and topic != "": + self.sendData.emit("TOPIC {0} :{1}".format(self.__name, topic)) + + @pyqtSlot(QUrl) + def on_messages_anchorClicked(self, url): + """ + Private slot to open links in the default browser. + + @param url URL to be opened + @type QUrl + """ + QDesktopServices.openUrl(url)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcChannelWidget.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcChannelWidget</class> + <widget class="QWidget" name="IrcChannelWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>685</height> + </rect> + </property> + <property name="windowTitle"> + <string/> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>3</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="topicLabel"> + <property name="text"> + <string/> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="openExternalLinks"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="editTopicButton"> + <property name="toolTip"> + <string>Press to change the topic</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <widget class="QListWidget" name="usersList"> + <property name="contextMenuPolicy"> + <enum>Qt::ContextMenuPolicy::CustomContextMenu</enum> + </property> + <property name="toolTip"> + <string>Shows the list of users</string> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + </widget> + <widget class="QTextBrowser" name="messages"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="contextMenuPolicy"> + <enum>Qt::ContextMenuPolicy::CustomContextMenu</enum> + </property> + <property name="toolTip"> + <string>Shows the channel messages</string> + </property> + <property name="tabChangesFocus"> + <bool>true</bool> + </property> + <property name="openLinks"> + <bool>false</bool> + </property> + </widget> + </widget> + </item> + <item> + <widget class="IrcMessageEdit" name="messageEdit"> + <property name="toolTip"> + <string>Enter a message, send by pressing Return or Enter</string> + </property> + <property name="placeholderText"> + <string>Enter a message, send by pressing Return or Enter</string> + </property> + <property name="clearButtonEnabled"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>IrcMessageEdit</class> + <extends>QLineEdit</extends> + <header>ExtensionIrc/IrcMessageEdit.h</header> + </customwidget> + </customwidgets> + <tabstops> + <tabstop>messageEdit</tabstop> + <tabstop>messages</tabstop> + <tabstop>usersList</tabstop> + <tabstop>editTopicButton</tabstop> + </tabstops> + <resources/> + <connections/> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcIdentitiesEditDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,518 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the identities management dialog. +""" + +import copy + +from PyQt6.QtCore import QEvent, QItemSelectionModel, Qt, pyqtSlot +from PyQt6.QtWidgets import QDialog, QInputDialog, QLineEdit + +from eric7.EricGui import EricPixmapCache +from eric7.EricWidgets import EricMessageBox +from eric7.SystemUtilities import OSUtilities + +from .IrcNetworkManager import IrcIdentity +from .Ui_IrcIdentitiesEditDialog import Ui_IrcIdentitiesEditDialog + + +class IrcIdentitiesEditDialog(QDialog, Ui_IrcIdentitiesEditDialog): + """ + Class implementing the identities management dialog. + """ + + def __init__(self, manager, identityName, parent=None): + """ + Constructor + + @param manager reference to the IRC network manager object + @type IrcNetworkManager + @param identityName name of the identity to be selected + @type str + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + self.addButton.setIcon(EricPixmapCache.getIcon("plus")) + self.copyButton.setIcon(EricPixmapCache.getIcon("editCopy")) + self.renameButton.setIcon(EricPixmapCache.getIcon("editRename")) + self.deleteButton.setIcon(EricPixmapCache.getIcon("minus")) + self.nicknameAddButton.setIcon(EricPixmapCache.getIcon("plus")) + self.nicknameDeleteButton.setIcon(EricPixmapCache.getIcon("minus")) + self.nicknameUpButton.setIcon(EricPixmapCache.getIcon("1uparrow")) + self.nicknameDownButton.setIcon(EricPixmapCache.getIcon("1downarrow")) + self.showPasswordButton.setIcon(EricPixmapCache.getIcon("showPassword")) + + self.__manager = manager + + self.__identities = self.__manager.getIdentities() + self.__currentIdentity = None + + identities = sorted(self.__manager.getIdentityNames()) + identities[identities.index(IrcIdentity.DefaultIdentityName)] = ( + IrcIdentity.DefaultIdentityDisplay + ) + self.identitiesCombo.addItems(identities) + if identityName == IrcIdentity.DefaultIdentityName: + identityName = IrcIdentity.DefaultIdentityDisplay + index = self.identitiesCombo.findText(identityName) + if index == -1: + index = 0 + identityName = self.identitiesCombo.itemText(0) + self.identitiesCombo.setCurrentIndex(index) + + self.on_identitiesCombo_currentIndexChanged(index) + + self.nicknameEdit.installEventFilter(self) + + def eventFilter(self, obj, evt): + """ + Public method to handle events for other objects. + + @param obj reference to the object + @type QObject + @param evt reference to the event + @type QEvent + @return flag indicating that the event should be filtered out + @rtype bool + """ + if ( + obj == self.nicknameEdit + and evt.type() == QEvent.Type.KeyPress + and evt.key() in [Qt.Key.Key_Enter, Qt.Key.Key_Return] + ): + self.on_nicknameAddButton_clicked() + return True + + return super().eventFilter(obj, evt) + + def __updateIdentitiesButtons(self): + """ + Private slot to update the status of the identity related buttons. + """ + enable = ( + self.identitiesCombo.currentText() != IrcIdentity.DefaultIdentityDisplay + ) + self.renameButton.setEnabled(enable) + self.deleteButton.setEnabled(enable) + + @pyqtSlot(int) + def on_identitiesCombo_currentIndexChanged(self, index): + """ + Private slot to handle the selection of an identity. + + @param index index of the selected entry + @type int + """ + identity = self.identitiesCombo.itemText(index) + if identity == IrcIdentity.DefaultIdentityDisplay: + identity = IrcIdentity.DefaultIdentityName + self.__updateIdentitiesButtons() + + if self.__currentIdentity and not self.__checkCurrentIdentity(): + return + + self.__refreshCurrentIdentity() + + self.__currentIdentity = self.__identities[identity] + + # General Tab + self.realnameEdit.setText(self.__currentIdentity.getRealName()) + self.nicknamesList.clear() + self.nicknamesList.addItems(self.__currentIdentity.getNickNames()) + self.serviceEdit.setText(self.__currentIdentity.getServiceName()) + self.passwordEdit.setText(self.__currentIdentity.getPassword()) + + # Away Tab + self.rememberPosOnAwayCheckBox.setChecked( + self.__currentIdentity.rememberAwayPosition() + ) + self.awayEdit.setText(self.__currentIdentity.getAwayMessage()) + + # Advanced Tab + self.identEdit.setText(self.__currentIdentity.getIdent()) + self.quitEdit.setText(self.__currentIdentity.getQuitMessage()) + self.partEdit.setText(self.__currentIdentity.getPartMessage()) + + self.__updateIdentitiesButtons() + self.__updateNicknameUpDownButtons() + self.__updateNicknameButtons() + + self.identityTabWidget.setCurrentIndex(0) + + def __refreshCurrentIdentity(self): + """ + Private method to read back the data for the current identity. + """ + if self.__currentIdentity is None: + return + + # General Tab + self.__currentIdentity.setRealName(self.realnameEdit.text()) + self.__currentIdentity.setNickNames( + [ + self.nicknamesList.item(row).text() + for row in range(self.nicknamesList.count()) + ] + ) + self.__currentIdentity.setServiceName(self.serviceEdit.text()) + self.__currentIdentity.setPassword(self.passwordEdit.text()) + + # Away Tab + self.__currentIdentity.setRememberAwayPosition( + self.rememberPosOnAwayCheckBox.isChecked() + ) + self.__currentIdentity.setAwayMessage(self.awayEdit.text()) + + # Advanced Tab + self.__currentIdentity.setIdent(self.identEdit.text()) + self.__currentIdentity.setQuitMessage(self.quitEdit.text()) + self.__currentIdentity.setPartMessage(self.partEdit.text()) + + def __checkCurrentIdentity(self): + """ + Private method to check the data for the current identity. + + @return flag indicating a successful check + @rtype bool + """ + if self.nicknamesList.count() == 0: + EricMessageBox.critical( + self, + self.tr("Edit Identity"), + self.tr("""The identity must contain at least one nick name."""), + ) + block = self.identitiesCombo.blockSignals(True) + identity = self.__currentIdentity.getName() + if identity == IrcIdentity.DefaultIdentityName: + identity = IrcIdentity.DefaultIdentityDisplay + self.identitiesCombo.setCurrentIndex( + self.identitiesCombo.findText(identity) + ) + self.identitiesCombo.blockSignals(block) + self.identityTabWidget.setCurrentIndex(0) + self.nicknameEdit.setFocus() + return False + + if not self.realnameEdit.text(): + EricMessageBox.critical( + self, + self.tr("Edit Identity"), + self.tr("""The identity must have a real name."""), + ) + block = self.identitiesCombo.blockSignals(True) + identity = self.__currentIdentity.getName() + if identity == IrcIdentity.DefaultIdentityName: + identity = IrcIdentity.DefaultIdentityDisplay + self.identitiesCombo.setCurrentIndex( + self.identitiesCombo.findText(identity) + ) + self.identitiesCombo.blockSignals(block) + self.identityTabWidget.setCurrentIndex(0) + self.realnameEdit.setFocus() + return False + + return True + + @pyqtSlot() + def on_addButton_clicked(self): + """ + Private slot to add a new idntity. + """ + name, ok = QInputDialog.getText( + self, + self.tr("Add Identity"), + self.tr("Identity Name:"), + QLineEdit.EchoMode.Normal, + ) + + if ok: + if name: + if name in self.__identities: + EricMessageBox.critical( + self, + self.tr("Add Identity"), + self.tr( + """An identity named <b>{0}</b> already exists.""" + """ You must provide a different name.""" + ).format(name), + ) + self.on_addButton_clicked() + else: + identity = IrcIdentity(name) + identity.setIdent(OSUtilities.getUserName()) + identity.setRealName(OSUtilities.getRealName()) + self.__identities[name] = identity + self.identitiesCombo.addItem(name) + self.identitiesCombo.setCurrentIndex( + self.identitiesCombo.count() - 1 + ) + else: + EricMessageBox.critical( + self, + self.tr("Add Identity"), + self.tr("""The identity has to have a name."""), + ) + self.on_addButton_clicked() + + @pyqtSlot() + def on_copyButton_clicked(self): + """ + Private slot to copy the selected identity. + """ + currentIdentity = self.identitiesCombo.currentText() + name, ok = QInputDialog.getText( + self, + self.tr("Copy Identity"), + self.tr("Identity Name:"), + QLineEdit.EchoMode.Normal, + currentIdentity, + ) + + if ok: + if name: + if name in self.__identities: + EricMessageBox.critical( + self, + self.tr("Copy Identity"), + self.tr( + """An identity named <b>{0}</b> already exists.""" + """ You must provide a different name.""" + ).format(name), + ) + self.on_copyButton_clicked() + else: + identity = copy.deepcopy(self.__currentIdentity) + identity.setName(name) + self.__identities[name] = identity + self.identitiesCombo.addItem(name) + self.identitiesCombo.setCurrentIndex( + self.identitiesCombo.count() - 1 + ) + else: + EricMessageBox.critical( + self, + self.tr("Copy Identity"), + self.tr("""The identity has to have a name."""), + ) + self.on_copyButton_clicked() + + @pyqtSlot() + def on_renameButton_clicked(self): + """ + Private slot to rename the selected identity. + """ + currentIdentity = self.identitiesCombo.currentText() + name, ok = QInputDialog.getText( + self, + self.tr("Rename Identity"), + self.tr("Identity Name:"), + QLineEdit.EchoMode.Normal, + currentIdentity, + ) + + if ok and name != currentIdentity: + if name: + if name in self.__identities: + EricMessageBox.critical( + self, + self.tr("Rename Identity"), + self.tr( + """An identity named <b>{0}</b> already exists.""" + """ You must provide a different name.""" + ).format(name), + ) + self.on_renameButton_clicked() + else: + del self.__identities[currentIdentity] + self.__currentIdentity.setName(name) + self.__identities[name] = self.__currentIdentity + self.identitiesCombo.setItemText( + self.identitiesCombo.currentIndex(), name + ) + else: + EricMessageBox.critical( + self, + self.tr("Copy Identity"), + self.tr("""The identity has to have a name."""), + ) + self.on_renameButton_clicked() + + @pyqtSlot() + def on_deleteButton_clicked(self): + """ + Private slot to rename the selected identity. + """ + currentIdentity = self.identitiesCombo.currentText() + if currentIdentity == IrcIdentity.DefaultIdentityDisplay: + return + + inUse = False + for networkName in self.__manager.getNetworkNames(): + inUse = ( + self.__manager.getNetwork(networkName).getIdentityName() + == currentIdentity + ) + if inUse: + break + + msg = ( + self.tr( + "This identity is in use. If you remove it, the network" + " settings using it will fall back to the default" + " identity. Should it be deleted anyway?" + ) + if inUse + else self.tr( + "Do you really want to delete all information for this identity?" + ) + ) + res = EricMessageBox.yesNo( + self, self.tr("Delete Identity"), msg, icon=EricMessageBox.Warning + ) + if res: + del self.__identities[currentIdentity] + self.identitiesCombo.removeItem( + self.identitiesCombo.findText(currentIdentity) + ) + + def __updateNicknameUpDownButtons(self): + """ + Private method to set the enabled state of the nick name up and + down buttons. + """ + if len(self.nicknamesList.selectedItems()) == 0: + self.nicknameUpButton.setEnabled(False) + self.nicknameDownButton.setEnabled(False) + else: + if self.nicknamesList.currentRow() == 0: + self.nicknameUpButton.setEnabled(False) + self.nicknameDownButton.setEnabled(True) + elif self.nicknamesList.currentRow() == self.nicknamesList.count() - 1: + self.nicknameUpButton.setEnabled(True) + self.nicknameDownButton.setEnabled(False) + else: + self.nicknameUpButton.setEnabled(True) + self.nicknameDownButton.setEnabled(True) + + def __updateNicknameButtons(self): + """ + Private slot to update the nick name buttons except the up and + down buttons. + """ + self.nicknameDeleteButton.setEnabled( + len(self.nicknamesList.selectedItems()) != 0 + ) + + self.nicknameAddButton.setEnabled(self.nicknameEdit.text() != "") + + @pyqtSlot(str) + def on_nicknameEdit_textEdited(self, nick): + """ + Private slot handling a change of the nick name. + + @param nick new nick name + @type str + """ + sel = self.nicknamesList.selectedItems() + if sel: + sel[0].setText(nick) + + self.__updateNicknameButtons() + + @pyqtSlot() + def on_nicknamesList_itemSelectionChanged(self): + """ + Private slot handling the selection of a nick name. + """ + items = self.nicknamesList.selectedItems() + if items: + self.nicknameEdit.setText(items[0].text()) + + self.__updateNicknameUpDownButtons() + self.__updateNicknameButtons() + + self.nicknameEdit.setFocus() + + @pyqtSlot() + def on_nicknameAddButton_clicked(self): + """ + Private slot to add a new nickname. + """ + nick = self.nicknameEdit.text() + if nick not in [ + self.nicknamesList.item(row).text() + for row in range(self.nicknamesList.count()) + ]: + self.nicknamesList.insertItem(0, nick) + self.nicknamesList.setCurrentRow(0, QItemSelectionModel.SelectionFlag.Clear) + self.nicknameEdit.clear() + self.__updateNicknameButtons() + + @pyqtSlot() + def on_nicknameDeleteButton_clicked(self): + """ + Private slot to delete a nick name. + """ + itm = self.nicknamesList.takeItem(self.nicknamesList.currentRow()) + del itm + self.__updateNicknameButtons() + + @pyqtSlot() + def on_nicknameUpButton_clicked(self): + """ + Private slot to move the selected entry up one row. + """ + row = self.nicknamesList.currentRow() + if row > 0: + itm = self.nicknamesList.takeItem(row) + row -= 1 + self.nicknamesList.insertItem(row, itm) + self.nicknamesList.setCurrentItem(itm) + + @pyqtSlot() + def on_nicknameDownButton_clicked(self): + """ + Private slot to move the selected entry down one row. + """ + row = self.nicknamesList.currentRow() + if row < self.nicknamesList.count() - 1: + itm = self.nicknamesList.takeItem(row) + row += 1 + self.nicknamesList.insertItem(row, itm) + self.nicknamesList.setCurrentItem(itm) + + @pyqtSlot(bool) + def on_showPasswordButton_clicked(self, checked): + """ + Private slot to show or hide the password. + + @param checked state of the button + @type bool + """ + if checked: + self.passwordEdit.setEchoMode(QLineEdit.EchoMode.Normal) + self.showPasswordButton.setIcon(EricPixmapCache.getIcon("hidePassword")) + self.showPasswordButton.setToolTip(self.tr("Press to hide the password")) + else: + self.passwordEdit.setEchoMode(QLineEdit.EchoMode.Password) + self.showPasswordButton.setIcon(EricPixmapCache.getIcon("showPassword")) + self.showPasswordButton.setToolTip(self.tr("Press to show the password")) + + def accept(self): + """ + Public slot handling the acceptance of the dialog. + """ + if not self.__checkCurrentIdentity(): + return + + self.__refreshCurrentIdentity() + self.__manager.setIdentities(self.__identities) + + super().accept()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcIdentitiesEditDialog.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,399 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcIdentitiesEditDialog</class> + <widget class="QDialog" name="IrcIdentitiesEditDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>650</width> + <height>510</height> + </rect> + </property> + <property name="windowTitle"> + <string>IRC Identities</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Identity:</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="identitiesCombo"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Select the identity to work on</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="addButton"> + <property name="toolTip"> + <string>Press to add a new identity</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="copyButton"> + <property name="toolTip"> + <string>Press to copy the selected identity</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="renameButton"> + <property name="toolTip"> + <string>Press to rename the selected identity</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="deleteButton"> + <property name="toolTip"> + <string>Press to delete the selected identity</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QTabWidget" name="identityTabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="generalTab"> + <attribute name="title"> + <string>General</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Real Name:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="realnameEdit"> + <property name="toolTip"> + <string>Enter the real name</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QGroupBox" name="nickNameGroup"> + <property name="title"> + <string>Nick Names</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" colspan="2"> + <widget class="QLineEdit" name="nicknameEdit"> + <property name="toolTip"> + <string>Enter a nick name to add</string> + </property> + </widget> + </item> + <item row="1" column="0" rowspan="5"> + <widget class="QListWidget" name="nicknamesList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QToolButton" name="nicknameAddButton"> + <property name="toolTip"> + <string>Press to add the entered nick name</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QToolButton" name="nicknameDeleteButton"> + <property name="toolTip"> + <string>Press to delete the selected nick name</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QToolButton" name="nicknameUpButton"> + <property name="toolTip"> + <string>Press to move the selected nick name up</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QToolButton" name="nicknameDownButton"> + <property name="toolTip"> + <string>Press to move the selected nick name down</string> + </property> + </widget> + </item> + <item row="5" column="1"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>87</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QGroupBox" name="autoIdentifyGroup"> + <property name="title"> + <string>Auto Identify</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Service:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="serviceEdit"> + <property name="toolTip"> + <string>Enter the name of the service to identify against</string> + </property> + <property name="whatsThis"> + <string>Service name can be <b><i>nickserv</i></b> or a network-dependent name such as <b><i>nickserv@services.dal.net</i></b></string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Password:</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="passwordEdit"> + <property name="toolTip"> + <string>Enter the password</string> + </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="showPasswordButton"> + <property name="toolTip"> + <string>Press to show the password</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="awayTab"> + <attribute name="title"> + <string>Away</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="0" colspan="2"> + <widget class="QCheckBox" name="rememberPosOnAwayCheckBox"> + <property name="toolTip"> + <string>Select to mark the current position in the chat, when you send an AWAY command.</string> + </property> + <property name="whatsThis"> + <string/> + </property> + <property name="text"> + <string>Mark the current position in chat windows when going away</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Away Message:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="awayEdit"> + <property name="toolTip"> + <string>Enter the message to be sent when going away</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>219</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="advancedTab"> + <attribute name="title"> + <string>Advanced</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Ident:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="identEdit"> + <property name="toolTip"> + <string>Enter the identity to be used to log-on to the server</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>Reason for Quit:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="quitEdit"> + <property name="toolTip"> + <string>Enter a message to be sent when quitting</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Reason for Part:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="partEdit"> + <property name="toolTip"> + <string>Enter message to be sent when leaving a channel</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>291</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>identitiesCombo</tabstop> + <tabstop>addButton</tabstop> + <tabstop>copyButton</tabstop> + <tabstop>renameButton</tabstop> + <tabstop>deleteButton</tabstop> + <tabstop>identityTabWidget</tabstop> + <tabstop>realnameEdit</tabstop> + <tabstop>nicknameEdit</tabstop> + <tabstop>nicknamesList</tabstop> + <tabstop>nicknameAddButton</tabstop> + <tabstop>nicknameDeleteButton</tabstop> + <tabstop>nicknameUpButton</tabstop> + <tabstop>nicknameDownButton</tabstop> + <tabstop>serviceEdit</tabstop> + <tabstop>passwordEdit</tabstop> + <tabstop>showPasswordButton</tabstop> + <tabstop>rememberPosOnAwayCheckBox</tabstop> + <tabstop>awayEdit</tabstop> + <tabstop>identEdit</tabstop> + <tabstop>quitEdit</tabstop> + <tabstop>partEdit</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>IrcIdentitiesEditDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>IrcIdentitiesEditDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcMessageEdit.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a specialized line edit for entering IRC messages. +""" + +from PyQt6.QtCore import Qt +from PyQt6.QtWidgets import QLineEdit + + +class IrcMessageEdit(QLineEdit): + """ + Class implementing a specialized line edit for entering IRC messages. + """ + + MaxHistory = 100 + + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + + self.__historyList = [""] # initialize with one empty line + self.__historyLine = 0 + + def setText(self, text): + """ + Public method to set the text. + + Note: This reimplementation ensures, that the cursor is at the end of + the text. + + @param text text to be set + @type str + """ + super().setText(text) + self.setCursorPosition(len(text)) + + def keyPressEvent(self, evt): + """ + Protected method implementing special key handling. + + @param evt reference to the event + @type QKeyEvent + """ + key = evt.key() + if key == Qt.Key.Key_Up: + self.__getHistory(True) + return + elif key == Qt.Key.Key_Down: + self.__getHistory(False) + return + elif key in [Qt.Key.Key_Return, Qt.Key.Key_Enter]: + if self.text(): + self.__addHistory(self.text()) + elif evt.text() == chr(21): + # ^U: clear the text + self.setText("") + + super().keyPressEvent(evt) + + def wheelEvent(self, evt): + """ + Protected slot to support wheel events. + + @param evt reference to the wheel event + @type QWheelEvent + """ + delta = evt.angleDelta().y() + if delta > 0: + self.__getHistory(True) + elif delta < 0: + self.__getHistory(False) + + super().wheelEvent(evt) + + def __addHistory(self, txt): + """ + Private method to add an entry to the history. + + @param txt text to be added to the history + @type str + """ + # Only add the entry, if it is not the same as last time + if len(self.__historyList) == 1 or ( + len(self.__historyList) > 1 and self.__historyList[1] != txt + ): + # Replace empty first entry and add new empty first entry + self.__historyList[0] = txt + self.__historyList.insert(0, "") + # Keep history below the defined limit + del self.__historyList[IrcMessageEdit.MaxHistory :] + + self.__historyLine = 0 + + def __getHistory(self, up): + """ + Private method to move in the history. + + @param up flag indicating the direction + @type bool + """ + # preserve the current text, if it is not empty + if self.text(): + self.__historyList[self.__historyLine] = self.text() + + if up: + self.__historyLine += 1 + # If the position was moved past the end of the history, + # go to the last entry + if self.__historyLine == len(self.__historyList): + self.__historyLine -= 1 + return + else: + # If the position is at the top of the history, arrow-down shall + # add the text to the history and clear the line edit for new input + if self.__historyLine == 0: + if self.text(): + self.__addHistory(self.text()) + self.setText("") + else: + # If the position is not at the top of the history, + # decrement it + self.__historyLine -= 1 + + # replace the text of the line edit with the selected history entry + self.setText(self.__historyList[self.__historyLine])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcNetworkEditDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,276 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog for editing IRC network definitions. +""" + +import copy + +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem + +from eric7.EricGui import EricPixmapCache +from eric7.EricWidgets import EricMessageBox +from PluginExtensionIrc import ircExtensionPluginObject + +from .IrcNetworkManager import IrcNetwork +from .Ui_IrcNetworkEditDialog import Ui_IrcNetworkEditDialog + + +class IrcNetworkEditDialog(QDialog, Ui_IrcNetworkEditDialog): + """ + Class implementing a dialog for editing IRC network definitions. + """ + + def __init__(self, manager, networkName, parent=None): + """ + Constructor + + @param manager reference to the IRC network manager object + @type IrcNetworkManager + @param networkName name of the network to work on + @type str + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + self.__manager = manager + + self.editIdentitiesButton.setIcon( + ircExtensionPluginObject.getIcon("ircConfigure") + ) + self.editServerButton.setIcon(ircExtensionPluginObject.getIcon("ircConfigure")) + self.editChannelButton.setIcon(ircExtensionPluginObject.getIcon("ircConfigure")) + self.addChannelButton.setIcon(EricPixmapCache.getIcon("plus")) + self.deleteChannelButton.setIcon(EricPixmapCache.getIcon("minus")) + + self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok) + + if networkName: + self.__network = copy.deepcopy(self.__manager.getNetwork(networkName)) + else: + self.__network = IrcNetwork("") + + # network name + self.networkEdit.setText(networkName) + + # identities + self.__refreshIdentityCombo(self.__network.getIdentityName()) + + # server + self.serverEdit.setText(self.__network.getServerName()) + + # channels + for channelName in sorted(self.__network.getChannelNames()): + channel = self.__network.getChannel(channelName) + autoJoin = self.tr("Yes") if channel.autoJoin() else self.tr("No") + QTreeWidgetItem(self.channelList, [channelName, autoJoin]) + + self.__updateOkButton() + self.on_channelList_itemSelectionChanged() + + def __updateOkButton(self): + """ + Private method to update the OK button state. + """ + enable = True + enable &= self.networkEdit.text() != "" + enable &= self.serverEdit.text() != "" + + self.__okButton.setEnabled(enable) + + @pyqtSlot(str) + def on_networkEdit_textChanged(self, _txt): + """ + Private slot to handle changes of the network name. + + @param _txt text entered into the network name edit (unused) + @type str + """ + self.__updateOkButton() + + def __refreshIdentityCombo(self, currentIdentity): + """ + Private method to refresh the identity combo. + + @param currentIdentity name of the identity to select + @type str + """ + from .IrcNetworkManager import IrcIdentity + + self.identityCombo.clear() + + identities = sorted(self.__manager.getIdentityNames()) + identities[identities.index(IrcIdentity.DefaultIdentityName)] = ( + IrcIdentity.DefaultIdentityDisplay + ) + self.identityCombo.addItems(identities) + if currentIdentity == IrcIdentity.DefaultIdentityName: + currentIdentity = IrcIdentity.DefaultIdentityDisplay + index = self.identityCombo.findText(currentIdentity) + if index == -1: + index = 0 + self.identityCombo.setCurrentIndex(index) + + @pyqtSlot(str) + def on_identityCombo_currentTextChanged(self, identity): + """ + Private slot to handle the selection of an identity. + + @param identity selected identity + @type str + """ + from .IrcNetworkManager import IrcIdentity + + if identity == IrcIdentity.DefaultIdentityDisplay: + identity = IrcIdentity.DefaultIdentityName + self.__network.setIdentityName(identity) + + @pyqtSlot() + def on_editIdentitiesButton_clicked(self): + """ + Private slot to edit the identities. + """ + from .IrcIdentitiesEditDialog import IrcIdentitiesEditDialog + + currentIdentity = self.identityCombo.currentText() + dlg = IrcIdentitiesEditDialog(self.__manager, currentIdentity, parent=self) + dlg.exec() + self.__refreshIdentityCombo(currentIdentity) + + @pyqtSlot(str) + def on_serverEdit_textChanged(self, _txt): + """ + Private slot to handle changes of the server name. + + @param _txt text entered into the server name edit (unused) + @type str + """ + self.__updateOkButton() + + @pyqtSlot() + def on_editServerButton_clicked(self): + """ + Private slot to edit the server configuration. + """ + from .IrcServerEditDialog import IrcServerEditDialog + + dlg = IrcServerEditDialog(self.__network.getServer(), parent=self) + if dlg.exec() == QDialog.DialogCode.Accepted: + self.__network.setServer(dlg.getServer()) + self.serverEdit.setText(self.__network.getServerName()) + + @pyqtSlot() + def on_addChannelButton_clicked(self): + """ + Private slot to add a channel. + """ + self.__editChannel(None) + + @pyqtSlot() + def on_editChannelButton_clicked(self): + """ + Private slot to edit the selected channel. + """ + itm = self.channelList.selectedItems()[0] + if itm: + self.__editChannel(itm) + + @pyqtSlot() + def on_deleteChannelButton_clicked(self): + """ + Private slot to delete the selected channel. + """ + itm = self.channelList.selectedItems()[0] + if itm: + res = EricMessageBox.yesNo( + self, + self.tr("Delete Channel"), + self.tr("""Do you really want to delete channel <b>{0}</b>?""").format( + itm.text(0) + ), + ) + if res: + self.__network.deleteChannel(itm.text(0)) + + index = self.channelList.indexOfTopLevelItem(itm) + self.channelList.takeTopLevelItem(index) + del itm + + @pyqtSlot(QTreeWidgetItem, int) + def on_channelList_itemActivated(self, item, _column): + """ + Private slot to handle the activation of a channel entry. + + @param item reference to the activated item + @type QTreeWidgetItem + @param _column column the activation occurred in (unused) + @type int + """ + self.__editChannel(item) + + @pyqtSlot() + def on_channelList_itemSelectionChanged(self): + """ + Private slot to handle changes of the selection of channels. + """ + selectedItems = self.channelList.selectedItems() + enable = bool(selectedItems) + self.editChannelButton.setEnabled(enable) + self.deleteChannelButton.setEnabled(enable) + + def __editChannel(self, itm): + """ + Private method to edit a channel. + + @param itm reference to the item to be edited + @type QTreeWidgetItem + """ + from .IrcChannelEditDialog import IrcChannelEditDialog + from .IrcNetworkManager import IrcChannel + + if itm: + channel = self.__network.getChannel(itm.text(0)) + name = channel.getName() + key = channel.getKey() + autoJoin = channel.autoJoin() + else: + # add a new channel + name = "" + key = "" + autoJoin = False + + dlg = IrcChannelEditDialog(name, key, autoJoin, itm is not None, parent=self) + if dlg.exec() == QDialog.DialogCode.Accepted: + name, key, autoJoin = dlg.getData() + channel = IrcChannel(name) + channel.setKey(key) + channel.setAutoJoin(autoJoin) + if itm: + if autoJoin: + itm.setText(1, self.tr("Yes")) + else: + itm.setText(1, self.tr("No")) + self.__network.setChannel(channel) + else: + if autoJoin: + autoJoinTxt = self.tr("Yes") + else: + autoJoinTxt = self.tr("No") + QTreeWidgetItem(self.channelList, [name, autoJoinTxt]) + self.__network.addChannel(channel) + + def getNetwork(self): + """ + Public method to get the network object. + + @return edited network object + @rtype IrcNetwork + """ + self.__network.setName(self.networkEdit.text()) + return self.__network
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcNetworkEditDialog.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,227 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcNetworkEditDialog</class> + <widget class="QDialog" name="IrcNetworkEditDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>321</height> + </rect> + </property> + <property name="windowTitle"> + <string>IRC Network</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Network Name:</string> + </property> + </widget> + </item> + <item row="0" column="1" colspan="2"> + <widget class="QLineEdit" name="networkEdit"> + <property name="toolTip"> + <string>Enter the name of the IRC network</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Identity:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QComboBox" name="identityCombo"> + <property name="toolTip"> + <string>Select the identity to be used for the IRC network</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QToolButton" name="editIdentitiesButton"> + <property name="toolTip"> + <string>Press to edit the identities</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Server:</string> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QToolButton" name="editServerButton"> + <property name="toolTip"> + <string>Press to edit the server configuration</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Channels:</string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QTreeWidget" name="channelList"> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="itemsExpandable"> + <bool>false</bool> + </property> + <property name="expandsOnDoubleClick"> + <bool>false</bool> + </property> + <column> + <property name="text"> + <string>Channel</string> + </property> + </column> + <column> + <property name="text"> + <string>Join Automatically</string> + </property> + </column> + </widget> + </item> + <item row="3" column="2"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QToolButton" name="addChannelButton"> + <property name="toolTip"> + <string>Press to add a new channel</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="editChannelButton"> + <property name="toolTip"> + <string>Press to edit the selected channel</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="deleteChannelButton"> + <property name="toolTip"> + <string>Press to delete the selected channel</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>98</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="4" column="0" colspan="3"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="serverEdit"> + <property name="toolTip"> + <string>Shows the name of the server</string> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>networkEdit</tabstop> + <tabstop>identityCombo</tabstop> + <tabstop>editIdentitiesButton</tabstop> + <tabstop>serverEdit</tabstop> + <tabstop>editServerButton</tabstop> + <tabstop>channelList</tabstop> + <tabstop>addChannelButton</tabstop> + <tabstop>editChannelButton</tabstop> + <tabstop>deleteChannelButton</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>IrcNetworkEditDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>IrcNetworkEditDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcNetworkListDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,271 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to list the configured IRC networks. +""" + +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtWidgets import QDialog, QTreeWidgetItem + +from eric7.EricWidgets import EricMessageBox + +from .Ui_IrcNetworkListDialog import Ui_IrcNetworkListDialog + + +class IrcNetworkListDialog(QDialog, Ui_IrcNetworkListDialog): + """ + Class implementing a dialog to list the configured IRC networks. + """ + + def __init__(self, manager, parent=None): + """ + Constructor + + @param manager reference to the IRC network manager + @type IrcNetworkManager + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + self.__manager = manager + self.__ircWidget = parent + + self.__refreshNetworksList() + + def __resizeColumns(self): + """ + Private slot to resize all columns to their contents. + """ + for col in range(self.networksList.columnCount()): + self.networksList.resizeColumnToContents(col) + + def __checkButtons(self): + """ + Private slot to set the enabled state of the buttons. + """ + enable = True + selectedItems = self.networksList.selectedItems() + if len(selectedItems) == 0: + enable = False + else: + for itm in selectedItems: + enable &= itm.parent() is None + + self.editButton.setEnabled(enable) + self.deleteButton.setEnabled(enable) + self.autoConnectButton.setEnabled(enable) + + if enable: + itm = self.networksList.selectedItems()[0] + check = self.__manager.getNetwork(itm.text(0)).autoConnect() + self.autoConnectButton.setChecked(check) + + def __refreshNetworkEntry(self, itm): + """ + Private method to (re-)set the data of a network entry. + + @param itm reference to the network entry + @type QTreeWidgetItem + """ + from .IrcNetworkManager import IrcIdentity + + # step 1: delete all child entries + children = itm.takeChildren() + for child in children: + del child + + # step 2: (re-)add the child entries + networkName = itm.text(0) + network = self.__manager.getNetwork(networkName) + server = network.getServer() + identityName = network.getIdentityName() + if identityName == IrcIdentity.DefaultIdentityName: + identityName = IrcIdentity.DefaultIdentityDisplay + autoConnect = self.tr("Yes") if network.autoConnect() else self.tr("No") + + QTreeWidgetItem(itm, [self.tr("Identity"), identityName]) + QTreeWidgetItem( + itm, + [self.tr("Server"), "{0}:{1}".format(server.getName(), server.getPort())], + ) + QTreeWidgetItem( + itm, [self.tr("Channels"), ", ".join(network.getChannelNames())] + ) + QTreeWidgetItem(itm, [self.tr("Auto-Connect"), autoConnect]) + + self.__resizeColumns() + + def __refreshNetworksList(self): + """ + Private method to refresh the complete networks list. + """ + self.networksList.clear() + + networkNames = self.__manager.getNetworkNames() + for networkName in networkNames: + topitm = QTreeWidgetItem(self.networksList, [networkName]) + self.__refreshNetworkEntry(topitm) + topitm.setExpanded(True) + self.__resizeColumns() + + self.__checkButtons() + + @pyqtSlot() + def on_networksList_itemSelectionChanged(self): + """ + Private slot to handle changes of the selection of networks. + """ + self.__checkButtons() + + @pyqtSlot() + def on_newButton_clicked(self): + """ + Private slot to add a new network entry. + """ + from .IrcNetworkEditDialog import IrcNetworkEditDialog + + dlg = IrcNetworkEditDialog(manager=self.__manager, networkName="", parent=self) + if dlg.exec() == QDialog.DialogCode.Accepted: + network = dlg.getNetwork() + self.__manager.addNetwork(network) + self.__refreshNetworksList() + + @pyqtSlot() + def on_editButton_clicked(self): + """ + Private slot to edit the selected network. + """ + from .IrcNetworkEditDialog import IrcNetworkEditDialog + + itm = self.networksList.selectedItems()[0] + if itm: + networkName = itm.text(0) + dlg = IrcNetworkEditDialog( + manager=self.__manager, networkName=networkName, parent=self + ) + if dlg.exec() == QDialog.DialogCode.Accepted: + network = dlg.getNetwork() + self.__manager.setNetwork(network, networkName) + if network.getName() != networkName: + itm.setText(0, network.getName()) + self.__refreshNetworkEntry(itm) + + @pyqtSlot() + def on_deleteButton_clicked(self): + """ + Private slot to delete the selected entry. + """ + itm = self.networksList.selectedItems()[0] + if itm.parent() is None: + networkName = itm.text(0) + res = EricMessageBox.yesNo( + self, + self.tr("Delete Irc Network"), + self.tr( + """Do you really want to delete IRC network <b>{0}</b>?""" + ).format(networkName), + ) + if res: + index = self.networksList.indexOfTopLevelItem(itm) + self.networksList.takeTopLevelItem(index) + del itm + + self.__manager.deleteNetwork(networkName) + + @pyqtSlot(QTreeWidgetItem) + def on_networksList_itemExpanded(self, _item): + """ + Private slot handling the expansion of a top level item. + + @param _item reference to the expanded item (unused) + @type QTreeWidgetItem + """ + self.__resizeColumns() + + @pyqtSlot(QTreeWidgetItem) + def on_networksList_itemCollapsed(self, _item): + """ + Private slot handling the collapse of a top level item. + + @param _item reference to the collapsed item (unused) + @type QTreeWidgetItem + """ + self.__resizeColumns() + + @pyqtSlot(bool) + def on_autoConnectButton_clicked(self, checked): + """ + Private slot handling the auto-connect selection. + + @param checked flag indicating the state of the button + @type bool + """ + itm = self.networksList.selectedItems()[0] + if itm.parent() is None: + networkName = itm.text(0) + if checked: + # enable the selected network, disable all others + # step 1: update network objects + for name in self.__manager.getNetworkNames(): + network = self.__manager.getNetwork(networkName) + if name == networkName: + network.setAutoConnect(True) + else: + network.setAutoConnect(False) + self.__manager.networkChanged() + + # step 2: update list entries + for index in range(self.networksList.topLevelItemCount()): + titm = self.networksList.topLevelItem(index) + if titm.text(0) == networkName: + self.__setAutoConnectEntry(titm, True) + else: + self.__setAutoConnectEntry(titm, False) + else: + # step 1: update network object + network = self.__manager.getNetwork(networkName) + network.setAutoConnect(False) + self.__manager.networkChanged() + + # step 2: update list entry + self.__setAutoConnectEntry(itm, False) + + def __setAutoConnectEntry(self, itm, on): + """ + Private method to set the auto-connect entry of a network item. + + @param itm reference to the network item + @type QTreeWidgetItem + @param on flag indicating the auto-connect state + @type bool + """ + autoConnect = self.tr("Yes") if on else self.tr("No") + for index in range(itm.childCount()): + citm = itm.child(index) + if citm.text(0) == self.tr("Auto-Connect"): + citm.setText(1, autoConnect) + + @pyqtSlot() + def on_editIdentitiesButton_clicked(self): + """ + Private slot to edit the identities. + """ + from .IrcIdentitiesEditDialog import IrcIdentitiesEditDialog + + dlg = IrcIdentitiesEditDialog(self.__manager, "", parent=self) + dlg.exec() + + selectedNetwork = self.networksList.selectedItems() + selectedNetworkName = selectedNetwork[0].text(0) if selectedNetwork else "" + self.__refreshNetworksList() + if selectedNetworkName: + for index in range(self.networksList.topLevelItemCount()): + itm = self.networksList.topLevelItem(index) + if itm.text(0) == selectedNetworkName: + itm.setSelected(True) + break
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcNetworkListDialog.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,182 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcNetworkListDialog</class> + <widget class="QDialog" name="IrcNetworkListDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>500</width> + <height>350</height> + </rect> + </property> + <property name="windowTitle"> + <string>IRC Networks</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QTreeWidget" name="networksList"> + <property name="editTriggers"> + <set>QAbstractItemView::NoEditTriggers</set> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="columnCount"> + <number>2</number> + </property> + <attribute name="headerVisible"> + <bool>false</bool> + </attribute> + <column> + <property name="text"> + <string notr="true">1</string> + </property> + </column> + <column> + <property name="text"> + <string notr="true">2</string> + </property> + </column> + </widget> + </item> + <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QPushButton" name="newButton"> + <property name="toolTip"> + <string>Press to define a new network</string> + </property> + <property name="text"> + <string>&New...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="editButton"> + <property name="toolTip"> + <string>Press to edit the selected network</string> + </property> + <property name="text"> + <string>&Edit...</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="deleteButton"> + <property name="toolTip"> + <string>Press to delete the selected network</string> + </property> + <property name="text"> + <string>&Delete</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="autoConnectButton"> + <property name="toolTip"> + <string>Press to toggle the auto-connect flag of the selected network</string> + </property> + <property name="text"> + <string>&Auto-Connect</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line"> + <property name="lineWidth"> + <number>2</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="editIdentitiesButton"> + <property name="toolTip"> + <string>Press to edit the identities</string> + </property> + <property name="text"> + <string>Edit &Identities...</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Close</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>networksList</tabstop> + <tabstop>newButton</tabstop> + <tabstop>editButton</tabstop> + <tabstop>deleteButton</tabstop> + <tabstop>autoConnectButton</tabstop> + <tabstop>editIdentitiesButton</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>IrcNetworkListDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>IrcNetworkListDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcNetworkManager.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,1103 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the IRC data structures and their manager. +""" + +import copy + +from PyQt6.QtCore import QCoreApplication, QObject, pyqtSignal + +from eric7 import EricUtilities, Preferences +from eric7.EricUtilities.crypto import pwConvert +from eric7.SystemUtilities import OSUtilities +from eric7.Utilities.AutoSaver import AutoSaver + + +class IrcIdentity: + """ + Class implementing the IRC identity object. + """ + + DefaultIdentityName = "0default" + DefaultIdentityDisplay = QCoreApplication.translate( + "IrcIdentity", "Default Identity" + ) + + DefaultAwayMessage = QCoreApplication.translate("IrcIdentity", "Gone away for now.") + DefaultQuitMessage = QCoreApplication.translate("IrcIdentity", "IRC for eric IDE") + DefaultPartMessage = QCoreApplication.translate("IrcIdentity", "IRC for eric IDE") + + def __init__(self, name): + """ + Constructor + + @param name name of the identity + @type str + """ + super().__init__() + + self.__name = name + self.__realName = "" + self.__nickNames = [] + self.__serviceName = "" + self.__password = "" + self.__ident = OSUtilities.getUserName() + + self.__rememberPosOnAway = True + self.__awayMessage = IrcIdentity.DefaultAwayMessage + + self.__quitMessage = IrcIdentity.DefaultQuitMessage + self.__partMessage = IrcIdentity.DefaultPartMessage + + def save(self, settings): + """ + Public method to save the identity data. + + @param settings reference to the settings object + @type QSettings + """ + # no need to save the name because that is the group key + settings.setValue("Ident", self.__ident) + settings.setValue("RealName", self.__realName) + settings.setValue("NickNames", self.__nickNames) + settings.setValue("ServiceName", self.__serviceName) + settings.setValue("Password", self.__password) + settings.setValue("QuitMessage", self.__quitMessage) + settings.setValue("PartMessage", self.__partMessage) + settings.setValue("RememberAwayPosition", self.__rememberPosOnAway) + settings.setValue("AwayMessage", self.__awayMessage) + + def load(self, settings): + """ + Public method to load the identity data. + + @param settings reference to the settings object + @type QSettings + """ + self.__ident = settings.value("Ident", OSUtilities.getUserName()) + self.__realName = settings.value("RealName", "") + self.__nickNames = EricUtilities.toList(settings.value("NickNames", [])) + self.__serviceName = settings.value("ServiceName", "") + self.__password = settings.value("Password", "") + self.__quitMessage = settings.value( + "QuitMessage", IrcIdentity.DefaultQuitMessage + ) + self.__partMessage = settings.value( + "PartMessage", IrcIdentity.DefaultPartMessage + ) + self.__rememberPosOnAway = EricUtilities.toBool( + settings.value("RememberAwayPosition", True) + ) + self.__awayMessage = settings.value( + "AwayMessage", IrcIdentity.DefaultAwayMessage + ) + + def setName(self, name): + """ + Public method to set the identity name. + + @param name identity name + @type str + """ + self.__name = name + + def getName(self): + """ + Public method to get the identity name. + + @return identity name + @rtype str + """ + return self.__name + + def setIdent(self, name): + """ + Public method to set the real identity name. + + @param name real identity name + @type str + """ + self.__ident = name + + def getIdent(self): + """ + Public method to get the real identity name. + + @return real identity name + @rtype str + """ + return self.__ident + + def setRealName(self, name): + """ + Public method to set the real name of the identity. + + @param name real name + @type str + """ + self.__realName = name + + def getRealName(self): + """ + Public method to get the real name. + + @return real name + @rtype str + """ + return self.__realName + + def setNickNames(self, names): + """ + Public method to set the nick names of the identity. + + @param names nick names + @type list of str + """ + self.__nickNames = names[:] + + def getNickNames(self): + """ + Public method to get the nick names. + + @return nick names + @rtype list of str + """ + return self.__nickNames + + def setServiceName(self, name): + """ + Public method to set the service name of the identity used for + identification. + + @param name service name + @type str + """ + self.__serviceName = name + + def getServiceName(self): + """ + Public method to get the service name of the identity used for + identification. + + @return service name + @rtype str + """ + return self.__serviceName + + def setPassword(self, password): + """ + Public method to set a new password. + + @param password password to set + @type str + """ + self.__password = pwConvert(password, encode=True) + + def getPassword(self): + """ + Public method to get the password. + + @return password + @rtype str + """ + return pwConvert(self.__password, encode=False) + + def setQuitMessage(self, message): + """ + Public method to set the QUIT message. + + @param message QUIT message + @type str + """ + if message: + self.__quitMessage = message + else: + self.__quitMessage = IrcIdentity.DefaultQuitMessage + + def getQuitMessage(self): + """ + Public method to get the QUIT message. + + @return QUIT message + @rtype str + """ + return self.__quitMessage + + def setPartMessage(self, message): + """ + Public method to set the PART message. + + @param message PART message + @type str + """ + if message: + self.__partMessage = message + else: + self.__partMessage = IrcIdentity.DefaultPartMessage + + def getPartMessage(self): + """ + Public method to get the PART message. + + @return PART message + @rtype str + """ + return self.__partMessage + + def setRememberAwayPosition(self, remember): + """ + Public method to set to remember the chat position upon AWAY. + + @param remember flag indicating to remember the chat position + @type bool + """ + self.__rememberPosOnAway = remember + + def rememberAwayPosition(self): + """ + Public method to get a flag indicating to remember the chat position + upon AWAY. + + @return flag indicating to remember the chat position + @rtype bool + """ + return self.__rememberPosOnAway + + def setAwayMessage(self, message): + """ + Public method to set the AWAY message. + + @param message AWAY message + @type str + """ + if message: + self.__awayMessage = message + else: + self.__awayMessage = IrcIdentity.DefaultAwayMessage + + def getAwayMessage(self): + """ + Public method to get the AWAY message. + + @return AWAY message + @rtype str + """ + return self.__awayMessage + + @classmethod + def createDefaultIdentity(cls): + """ + Class method to create the default identity. + + @return default identity + @rtype IrcIdentity + """ + userName = OSUtilities.getUserName() + realName = OSUtilities.getRealName() + if not realName: + realName = "eric IDE chat" + identity = IrcIdentity(IrcIdentity.DefaultIdentityName) + identity.setNickNames([userName, userName + "_", userName + "__"]) + identity.setRealName(realName) + identity.setIdent(userName) + return identity + + +class IrcServer: + """ + Class implementing the IRC identity object. + """ + + DefaultPort = 6667 + DefaultSslPort = 6697 + + def __init__(self, name): + """ + Constructor + + @param name name of the server + @type str + """ + super().__init__() + + self.__server = name + self.__port = IrcServer.DefaultPort + self.__ssl = False + self.__password = "" + + def save(self, settings): + """ + Public method to save the server data. + + @param settings reference to the settings object + @type QSettings + """ + settings.setValue("Name", self.__server) + settings.setValue("Port", self.__port) + settings.setValue("SSL", self.__ssl) + settings.setValue("Password", self.__password) + + def load(self, settings): + """ + Public method to load the server data. + + @param settings reference to the settings object + @type QSettings + """ + self.__server = settings.value("Name", "") + self.__port = int(settings.value("Port", IrcServer.DefaultPort)) + self.__ssl = EricUtilities.toBool(settings.value("SSL", False)) + self.__password = settings.value("Password", "") + + def getName(self): + """ + Public method to get the server name. + + @return server name + @rtype str + """ + return self.__server + + def setName(self, name): + """ + Public method to set the server name. + + @param name server name + @type str + """ + self.__server = name + + def getPort(self): + """ + Public method to get the server port number. + + @return port number + @rtype int + """ + return self.__port + + def setPort(self, port): + """ + Public method to set the server port number. + + @param port server port number + @type int + """ + self.__port = port + + def useSSL(self): + """ + Public method to check for SSL usage. + + @return flag indicating SSL usage + @rtype bool + """ + return self.__ssl + + def setUseSSL(self, on): + """ + Public method to set the SSL usage. + + @param on flag indicating SSL usage + @type bool + """ + self.__ssl = on + + def setPassword(self, password): + """ + Public method to set a new password. + + @param password password to set + @type str + """ + self.__password = pwConvert(password, encode=True) + + def getPassword(self): + """ + Public method to get the password. + + @return password + @rtype str + """ + return pwConvert(self.__password, encode=False) + + +class IrcChannel: + """ + Class implementing the IRC channel object. + """ + + def __init__(self, name): + """ + Constructor + + @param name name of the network + @type str + """ + super().__init__() + + self.__name = name + self.__key = "" + self.__autoJoin = False + + def save(self, settings): + """ + Public method to save the channel data. + + @param settings reference to the settings object + @type QSettings + """ + # no need to save the channel name because that is the group key + settings.setValue("Key", self.__key) + settings.setValue("AutoJoin", self.__autoJoin) + + def load(self, settings): + """ + Public method to load the network data. + + @param settings reference to the settings object + @type QSettings + """ + self.__key = settings.value("Key", "") + self.__autoJoin = EricUtilities.toBool(settings.value("AutoJoin", False)) + + def getName(self): + """ + Public method to get the channel name. + + @return channel name + @rtype str + """ + return self.__name + + def setKey(self, key): + """ + Public method to set a new channel key. + + @param key channel key to set + @type str + """ + self.__key = pwConvert(key, encode=True) + + def getKey(self): + """ + Public method to get the channel key. + + @return channel key + @rtype str + """ + return pwConvert(self.__key, encode=False) + + def autoJoin(self): + """ + Public method to check the auto join status. + + @return flag indicating if the channel should be + joined automatically + @rtype bool + """ + return self.__autoJoin + + def setAutoJoin(self, enable): + """ + Public method to set the auto join status of the channel. + + @param enable flag indicating if the channel should be + joined automatically + @type bool + """ + self.__autoJoin = enable + + +class IrcNetwork: + """ + Class implementing the IRC network object. + """ + + def __init__(self, name): + """ + Constructor + + @param name name of the network + @type str + """ + super().__init__() + + self.__name = name + self.__identity = "" + self.__server = None + self.__channels = {} + self.__autoConnect = False + + def save(self, settings): + """ + Public method to save the network data. + + @param settings reference to the settings object + @type QSettings + """ + # no need to save the network name because that is the group key + settings.setValue("Identity", self.__identity) + settings.setValue("AutoConnect", self.__autoConnect) + + settings.beginGroup("Server") + self.__server.save(settings) + settings.endGroup() + + settings.beginGroup("Channels") + for key in self.__channels: + settings.beginGroup(key) + self.__channels[key].save(settings) + settings.endGroup() + settings.endGroup() + + def load(self, settings): + """ + Public method to load the network data. + + @param settings reference to the settings object + @type QSettings + """ + self.__identity = settings.value("Identity", "") + self.__autoConnect = EricUtilities.toBool(settings.value("AutoConnect", False)) + + settings.beginGroup("Server") + self.__server = IrcServer("") + self.__server.load(settings) + settings.endGroup() + + settings.beginGroup("Channels") + for key in settings.childGroups(): + self.__channels[key] = IrcChannel(key) + settings.beginGroup(key) + self.__channels[key].load(settings) + settings.endGroup() + settings.endGroup() + + def setName(self, name): + """ + Public method to set the network name. + + @param name network name + @type str + """ + self.__name = name + + def getName(self): + """ + Public method to get the network name. + + @return network name + @rtype str + """ + return self.__name + + def setIdentityName(self, name): + """ + Public method to set the name of the identity. + + @param name identity name + @type str + """ + self.__identity = name + + def getIdentityName(self): + """ + Public method to get the name of the identity. + + @return identity name + @rtype str + """ + return self.__identity + + def getServerName(self): + """ + Public method to get the server name. + + @return server name + @rtype str + """ + if self.__server: + return self.__server.getName() + else: + return "" + + def getServer(self): + """ + Public method to get the server object. + + @return reference to the server + @rtype IrcServer + """ + return self.__server + + def setServer(self, server): + """ + Public method to set the server. + + @param server server object to set + @type IrcServer + """ + self.__server = server + + def setChannels(self, channels): + """ + Public method to set the list of channels. + + @param channels list of channels for the network + @type list of IrcChannel + """ + self.__channels = {} + for channel in channels: + self.__channels[channel.getName()] = channel + + def getChannels(self): + """ + Public method to get the channels. + + @return list of channels for the network + @rtype list of IrcChannel + """ + return list(copy.deepcopy(self.__channels).values()) + + def getChannelNames(self): + """ + Public method to get the list of channels. + + @return list of channel names + @rtype list of str + """ + return sorted(self.__channels) + + def getChannel(self, channelName): + """ + Public method to get a channel. + + @param channelName name of the channel to retrieve + @type str + @return reference to the channel + @rtype IrcChannel + """ + if channelName in self.__channels: + return self.__channels[channelName] + else: + return None + + def setChannel(self, channel): + """ + Public method to set a channel. + + @param channel channel object to set + @type IrcChannel + """ + channelName = channel.getName() + if channelName in self.__channels: + self.__channels[channelName] = channel + + def addChannel(self, channel): + """ + Public method to add a channel. + + @param channel channel object to add + @type IrcChannel + """ + channelName = channel.getName() + if channelName not in self.__channels: + self.__channels[channelName] = channel + + def deleteChannel(self, channelName): + """ + Public method to delete the given channel. + + @param channelName name of the channel to be deleted + @type str + """ + if channelName in self.__channels: + del self.__channels[channelName] + + def setAutoConnect(self, enable): + """ + Public method to set the auto connect flag. + + @param enable flag indicate to connect to the network at start-up + @type bool + """ + self.__autoConnect = enable + + def autoConnect(self): + """ + Public method to check, if the network should be connected to at + start-up. + + @return flag indicating an auto connect + @rtype bool + """ + return self.__autoConnect + + @classmethod + def createDefaultNetwork(cls, ssl=False): + """ + Class method to create the default network. + + @param ssl flag indicating to create a SSL network configuration + @type bool + @return default network object + @rtype IrcNetwork + """ + # network + networkName = "libera.chat (SSL)" if ssl else "libera.chat" + network = IrcNetwork(networkName) + network.setIdentityName(IrcIdentity.DefaultIdentityName) + + # server + serverName = "irc.libera.chat" + server = IrcServer(serverName) + if ssl: + server.setPort(IrcServer.DefaultSslPort) + server.setUseSSL(True) + else: + server.setPort(IrcServer.DefaultPort) + network.setServer(server) + + # channel + channel = IrcChannel("#eric-ide") + channel.setAutoJoin(False) + network.addChannel(channel) + + # auto connect + network.setAutoConnect(False) + + return network + + +class IrcNetworkManager(QObject): + """ + Class implementing the IRC identity object. + + @signal dataChanged() emitted after some data has changed + @signal networksChanged() emitted after a network object has changed + @signal identitiesChanged() emitted after an identity object has changed + """ + + dataChanged = pyqtSignal() + networksChanged = pyqtSignal() + identitiesChanged = pyqtSignal() + + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent object + @type QObject + """ + super().__init__(parent) + + self.__loaded = False + self.__saveTimer = AutoSaver(self, self.save) + + self.__settings = Preferences.getSettings() + + self.__networks = {} + self.__identities = {} + + self.dataChanged.connect(self.__saveTimer.changeOccurred) + + def close(self): + """ + Public method to close the open search engines manager. + """ + self.__saveTimer.saveIfNeccessary() + + def save(self): + """ + Public slot to save the IRC data. + """ + if not self.__loaded: + return + + # save IRC data + self.__settings.beginGroup("IRC") + + # identities + self.__settings.remove("Identities") + self.__settings.beginGroup("Identities") + for key in self.__identities: + self.__settings.beginGroup(key) + self.__identities[key].save(self.__settings) + self.__settings.endGroup() + self.__settings.endGroup() + + # networks + self.__settings.remove("Networks") + self.__settings.beginGroup("Networks") + for key in self.__networks: + self.__settings.beginGroup(key) + self.__networks[key].save(self.__settings) + self.__settings.endGroup() + self.__settings.endGroup() + + self.__settings.endGroup() + + def __load(self): + """ + Private slot to load the IRC data. + """ + if self.__loaded: + return + + # load IRC data + self.__settings.beginGroup("IRC") + + # identities + self.__settings.beginGroup("Identities") + for key in self.__settings.childGroups(): + self.__identities[key] = IrcIdentity(key) + self.__settings.beginGroup(key) + self.__identities[key].load(self.__settings) + self.__settings.endGroup() + self.__settings.endGroup() + + # networks + self.__settings.beginGroup("Networks") + for key in self.__settings.childGroups(): + self.__networks[key] = IrcNetwork(key) + self.__settings.beginGroup(key) + self.__networks[key].load(self.__settings) + self.__settings.endGroup() + self.__settings.endGroup() + + self.__settings.endGroup() + + if not self.__identities or not self.__networks: + # data structures got corrupted; load defaults + self.__loadDefaults() + + if IrcIdentity.DefaultIdentityName not in self.__identities: + self.__loadDefaults(identityOnly=True) + + self.__loaded = True + + def __loadDefaults(self, identityOnly=False): + """ + Private method to load default values. + + @param identityOnly flag indicating to just load the default + identity + @type bool + """ + if not identityOnly: + self.__networks = {} + self.__identities = {} + + # identity + identity = IrcIdentity.createDefaultIdentity() + self.__identities[identity.getName()] = identity + + if not identityOnly: + network = IrcNetwork.createDefaultNetwork() + self.__networks[network.getName()] = network + network = IrcNetwork.createDefaultNetwork(True) + self.__networks[network.getName()] = network + + self.dataChanged.emit() + + ################################################################## + ## Identity related methods below + ################################################################## + + def getIdentity(self, name, create=False): + """ + Public method to get an identity object. + + @param name name of the identity to get + @type str + @param create flag indicating to create a new object, + if none exists + @type bool + @return reference to the identity + @rtype IrcIdentity + """ + if not name: + return None + + if not self.__loaded: + self.__load() + + if name in self.__identities: + return self.__identities[name] + elif create: + ircId = IrcIdentity(name) + self.__identities[name] = ircId + + self.dataChanged.emit() + + return ircId + else: + return None + + def getIdentities(self): + """ + Public method to get a copy of all identities. + + @return dictionary of all identities + @rtype dict of IrcIdentity + """ + return copy.deepcopy(self.__identities) + + def setIdentities(self, identities): + """ + Public method to set the identities. + + @param identities dictionary of all identities + @type dict of IrcIdentity + """ + self.__identities = copy.deepcopy(identities) + self.identityChanged() + + # Check all networks, if the identity they use is still available. + # If it isn't, change them to use the default identity. + for network in self.__networks.values(): + if network.getIdentityName() not in self.__identities: + network.setIdentityName(IrcIdentity.DefaultIdentityName) + + def getIdentityNames(self): + """ + Public method to get the names of all identities. + + @return names of all identities + @rtype list of string) + """ + return list(self.__identities) + + def addIdentity(self, identity): + """ + Public method to add a new identity. + + @param identity reference to the identity to add + @type IrcIdentity + """ + name = identity.getName() + self.__identities[name] = identity + self.identityChanged() + + def deleteIdentity(self, name): + """ + Public method to delete the given identity. + + @param name name of the identity to delete + @type str + """ + if name in self.__identities and name != IrcIdentity.DefaultIdentityName: + del self.__identities[name] + self.identityChanged() + + def renameIdentity(self, oldName, newName): + """ + Public method to rename an identity. + + @param oldName old name of the identity + @type str + @param newName new name of the identity + @type str + """ + if oldName in self.__identities: + self.__identities[newName] = self.__identities[oldName] + del self.__identities[oldName] + + for network in self.__networks: + if network.getIdentityName() == oldName: + network.setIdentityName(newName) + + self.identityChanged() + + def identityChanged(self): + """ + Public method to indicate a change of an identity object. + """ + self.dataChanged.emit() + self.identitiesChanged.emit() + + ################################################################## + ## Network related methods below + ################################################################## + + def getNetwork(self, name): + """ + Public method to get a network object. + + @param name name of the network + @type str + @return reference to the network object + @rtype IrcNetwork + """ + if not self.__loaded: + self.__load() + + if name in self.__networks: + return self.__networks[name] + else: + return None + + def setNetwork(self, network, networkName=""): + """ + Public method to set a network. + + @param network network object to set + @type IrcNetwork + @param networkName name the network was known for + @type str + """ + name = network.getName() + if networkName and name != networkName: + # the network name has changed + self.deleteNetwork(networkName) + self.addNetwork(network) + elif name in self.__networks: + self.__networks[name] = network + self.networkChanged() + + def addNetwork(self, network): + """ + Public method to add a network. + + @param network network object to add + @type IrcNetwork + """ + name = network.getName() + if name not in self.__networks: + self.__networks[name] = network + self.networkChanged() + + def deleteNetwork(self, name): + """ + Public method to delete the given network. + + @param name name of the network to delete + @type str + """ + if name in self.__networks: + del self.__networks[name] + self.networkChanged() + + def networkChanged(self): + """ + Public method to indicate a change of a network object. + """ + self.dataChanged.emit() + self.networksChanged.emit() + + def getNetworkNames(self): + """ + Public method to get a list of all known network names. + + @return list of network names + @rtype list of str + """ + if not self.__loaded: + self.__load() + + return sorted(self.__networks)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcNetworkWidget.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,551 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the network part of the IRC widget. +""" + +import pathlib + +from PyQt6.QtCore import QPoint, QThread, QUrl, pyqtSignal, pyqtSlot +from PyQt6.QtGui import QDesktopServices +from PyQt6.QtWidgets import QApplication, QMenu, QWidget + +from eric7.EricGui import EricPixmapCache +from eric7.EricWidgets import EricFileDialog, EricMessageBox +from eric7.EricWidgets.EricApplication import ericApp +from eric7.SystemUtilities import OSUtilities +from PluginExtensionIrc import ircExtensionPluginObject + +from .IrcUtilities import ircFilter, ircTimestamp +from .Ui_IrcNetworkWidget import Ui_IrcNetworkWidget + + +class IrcNetworkWidget(QWidget, Ui_IrcNetworkWidget): + """ + Class implementing the network part of the IRC widget. + + @signal connectNetwork(str,bool,bool) emitted to connect or disconnect from + a network + @signal editNetwork(str) emitted to edit a network configuration + @signal joinChannel(str) emitted to join a channel + @signal nickChanged(str) emitted to change the nick name + @signal sendData(str) emitted to send a message to the channel + @signal away(bool) emitted to indicate the away status + @signal autoConnected() emitted after an automatic connection was initiated + """ + + connectNetwork = pyqtSignal(str, bool, bool) + editNetwork = pyqtSignal(str) + joinChannel = pyqtSignal(str) + nickChanged = pyqtSignal(str) + sendData = pyqtSignal(str) + away = pyqtSignal(bool) + autoConnected = pyqtSignal() + + def __init__(self, parent=None): + """ + Constructor + + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + self.joinButton.setEnabled(False) + self.nickCombo.setEnabled(False) + self.awayButton.setEnabled(False) + + self.channelCombo.lineEdit().returnPressed.connect(self.on_joinButton_clicked) + self.nickCombo.lineEdit().returnPressed.connect( + self.on_nickCombo_currentIndexChanged + ) + + self.__manager = None + self.__connected = False + self.__registered = False + self.__away = False + + self.setConnected(False) + + self.__initMessagesMenu() + + self.connectButton.setIcon(ircExtensionPluginObject.getIcon("ircConnect")) + self.editButton.setIcon(ircExtensionPluginObject.getIcon("ircConfigure")) + self.joinButton.setIcon(ircExtensionPluginObject.getIcon("ircJoinChannel")) + self.awayButton.setIcon(ircExtensionPluginObject.getIcon("ircUserPresent")) + + def initialize(self, manager): + """ + Public method to initialize the widget. + + @param manager reference to the network manager + @type IrcNetworkManager + """ + self.__manager = manager + + self.networkCombo.addItems(self.__manager.getNetworkNames()) + + self.__manager.networksChanged.connect(self.__refreshNetworks) + self.__manager.identitiesChanged.connect(self.__refreshNetworks) + + def autoConnect(self): + """ + Public method to perform the IRC auto connection. + """ + userInterface = ericApp().getObject("UserInterface") + online = userInterface.isOnline() + self.connectButton.setEnabled(online) + userInterface.onlineStateChanged.connect(self.__onlineStateChanged) + if online: + self.__autoConnect() + + def __autoConnect(self): + """ + Private method to perform the IRC auto connection. + """ + for networkName in self.__manager.getNetworkNames(): + if self.__manager.getNetwork(networkName).autoConnect(): + row = self.networkCombo.findText(networkName) + self.networkCombo.setCurrentIndex(row) + self.on_connectButton_clicked() + self.autoConnected.emit() + break + + @pyqtSlot(bool) + def __onlineStateChanged(self, online): + """ + Private slot handling online state changes. + + @param online online state + @type bool + """ + self.connectButton.setEnabled(online) + if online: + # delay a bit because the signal seems to be sent before the + # network interface is fully up + QThread.msleep(200) + self.__autoConnect() + else: + network = self.networkCombo.currentText() + self.connectNetwork.emit(network, online, True) + + @pyqtSlot() + def __refreshNetworks(self): + """ + Private slot to refresh all network related widgets. + """ + currentNetwork = self.networkCombo.currentText() + currentNick = self.nickCombo.currentText() + currentChannel = self.channelCombo.currentText() + blocked = self.networkCombo.blockSignals(True) + self.networkCombo.clear() + self.networkCombo.addItems(self.__manager.getNetworkNames()) + self.networkCombo.blockSignals(blocked) + row = self.networkCombo.findText(currentNetwork) + if row == -1: + row = 0 + blocked = self.nickCombo.blockSignals(True) + self.networkCombo.setCurrentIndex(row) + self.nickCombo.setEditText(currentNick) + self.nickCombo.blockSignals(blocked) + self.channelCombo.setEditText(currentChannel) + + @pyqtSlot() + def on_connectButton_clicked(self): + """ + Private slot to connect to a network. + """ + network = self.networkCombo.currentText() + self.connectNetwork.emit(network, not self.__connected, False) + + @pyqtSlot() + def on_awayButton_clicked(self): + """ + Private slot to toggle the away status. + """ + if self.__away: + self.handleAwayCommand("") + else: + networkName = self.networkCombo.currentText() + identityName = self.__manager.getNetwork(networkName).getIdentityName() + identity = self.__manager.getIdentity(identityName) + if identity: + awayMessage = identity.getAwayMessage() + else: + awayMessage = "" + self.handleAwayCommand(awayMessage) + + @pyqtSlot(str) + def handleAwayCommand(self, awayMessage): + """ + Public slot to process an away command. + + @param awayMessage message to be set for being away + @type str + """ + if awayMessage and not self.__away: + # set being away + # don't send away, if the status is already set + self.sendData.emit("AWAY :" + awayMessage) + self.awayButton.setIcon(ircExtensionPluginObject.getIcon("ircUserAway")) + self.__away = True + self.away.emit(self.__away) + elif not awayMessage and self.__away: + # cancel being away + self.sendData.emit("AWAY") + self.awayButton.setIcon(ircExtensionPluginObject.getIcon("ircUserPresent")) + self.__away = False + self.away.emit(self.__away) + + @pyqtSlot() + def on_editButton_clicked(self): + """ + Private slot to edit a network. + """ + network = self.networkCombo.currentText() + self.editNetwork.emit(network) + + @pyqtSlot(str) + def on_channelCombo_editTextChanged(self, txt): + """ + Private slot to react upon changes of the channel. + + @param txt current text of the channel combo + @type str + """ + on = bool(txt) and self.__registered + self.joinButton.setEnabled(on) + + @pyqtSlot() + def on_joinButton_clicked(self): + """ + Private slot to join a channel. + """ + channel = self.channelCombo.currentText() + self.joinChannel.emit(channel) + + @pyqtSlot(int) + def on_networkCombo_currentIndexChanged(self, index): + """ + Private slot to handle selections of a network. + + @param index index of the selected entry + @type int + """ + networkName = self.networkCombo.itemText(index) + network = self.__manager.getNetwork(networkName) + self.nickCombo.clear() + self.channelCombo.clear() + if network: + channels = network.getChannelNames() + self.channelCombo.addItems(channels) + self.channelCombo.setEnabled(True) + identity = self.__manager.getIdentity(network.getIdentityName()) + if identity: + self.nickCombo.addItems(identity.getNickNames()) + else: + self.channelCombo.setEnabled(False) + + def getNetworkChannels(self): + """ + Public method to get the list of channels associated with the + selected network. + + @return associated channels + @rtype list of IrcChannel + """ + networkName = self.networkCombo.currentText() + network = self.__manager.getNetwork(networkName) + return network.getChannels() + + @pyqtSlot(int) + @pyqtSlot() + def on_nickCombo_currentIndexChanged(self, nick=0): + """ + Private slot to use another nick name. + + @param nick index of the selected nick name (unused) + @type int + """ + if self.__connected: + self.nickChanged.emit(self.nickCombo.currentText()) + + def getNickname(self): + """ + Public method to get the currently selected nick name. + + @return selected nick name + @rtype str + """ + return self.nickCombo.currentText() + + def setNickName(self, nick): + """ + Public slot to set the nick name in use. + + @param nick nick name in use + @type str + """ + self.nickCombo.blockSignals(True) + self.nickCombo.setEditText(nick) + self.nickCombo.blockSignals(False) + + def addMessage(self, msg): + """ + Public method to add a message. + + @param msg message to be added + @type str + """ + s = '<font color="{0}">{1} {2}</font>'.format( + ircExtensionPluginObject.getPreferences("NetworkMessageColour"), + ircTimestamp(), + msg, + ) + self.messages.append(s) + + def addServerMessage(self, msgType, msg, filterMsg=True): + """ + Public method to add a server message. + + @param msgType txpe of the message + @type str + @param msg message to be added + @type str + @param filterMsg flag indicating to filter the message + @type bool + """ + if filterMsg: + msg = ircFilter(msg) + s = '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format( + ircExtensionPluginObject.getPreferences("ServerMessageColour"), + ircTimestamp(), + msgType, + msg, + ) + self.messages.append(s) + + def addErrorMessage(self, msgType, msg): + """ + Public method to add an error message. + + @param msgType txpe of the message + @type str + @param msg message to be added + @type str + """ + s = '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format( + ircExtensionPluginObject.getPreferences("ErrorMessageColour"), + ircTimestamp(), + msgType, + msg, + ) + self.messages.append(s) + + def setConnected(self, connected): + """ + Public slot to set the connection state. + + @param connected flag indicating the connection state + @type bool + """ + self.__connected = connected + if self.__connected: + self.connectButton.setIcon( + ircExtensionPluginObject.getIcon("ircDisconnect") + ) + self.connectButton.setToolTip( + self.tr("Press to disconnect from the network") + ) + else: + self.connectButton.setIcon(ircExtensionPluginObject.getIcon("ircConnect")) + self.connectButton.setToolTip( + self.tr("Press to connect to the selected network") + ) + + def isConnected(self): + """ + Public method to check, if the network is connected. + + @return flag indicating a connected network + @rtype bool + """ + return self.__connected + + def setRegistered(self, registered): + """ + Public slot to set the registered state. + + @param registered flag indicating the registration state + @type bool + """ + self.__registered = registered + on = bool(self.channelCombo.currentText()) and self.__registered + self.joinButton.setEnabled(on) + self.nickCombo.setEnabled(registered) + self.awayButton.setEnabled(registered) + if registered: + self.awayButton.setIcon(ircExtensionPluginObject.getIcon("ircUserPresent")) + self.__away = False + + def __clearMessages(self): + """ + Private slot to clear the contents of the messages display. + """ + self.messages.clear() + + def __copyMessages(self): + """ + Private slot to copy the selection of the messages display to + the clipboard. + """ + self.messages.copy() + + def __copyAllMessages(self): + """ + Private slot to copy the contents of the messages display to + the clipboard. + """ + txt = self.messages.toPlainText() + if txt: + cb = QApplication.clipboard() + cb.setText(txt) + + def __cutAllMessages(self): + """ + Private slot to cut the contents of the messages display to + the clipboard. + """ + txt = self.messages.toPlainText() + if txt: + cb = QApplication.clipboard() + cb.setText(txt) + self.messages.clear() + + def __saveMessages(self): + """ + Private slot to save the contents of the messages display. + """ + hasText = not self.messages.document().isEmpty() + if hasText: + if OSUtilities.isWindowsPlatform(): + htmlExtension = "htm" + else: + htmlExtension = "html" + fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( + self, + self.tr("Save Messages"), + "", + self.tr("HTML Files (*.{0});;Text Files (*.txt);;All Files (*)").format( + htmlExtension + ), + None, + EricFileDialog.DontConfirmOverwrite, + ) + if fname: + fpath = pathlib.Path(fname) + if not fpath.suffix: + ex = selectedFilter.split("(*")[1].split(")")[0] + if ex: + fpath = fpath.with_suffix(ex) + if fpath.exists(): + res = EricMessageBox.yesNo( + self, + self.tr("Save Messages"), + self.tr( + "<p>The file <b>{0}</b> already exists." + " Overwrite it?</p>" + ).format(fpath), + icon=EricMessageBox.Warning, + ) + if not res: + return + + try: + txt = ( + self.messages.toHtml() + if fpath.suffix.lower() in [".htm", ".html"] + else self.messages.toPlainText() + ) + with fpath.open("w", encoding="utf-8") as f: + f.write(txt) + except OSError as err: + EricMessageBox.critical( + self, + self.tr("Error saving Messages"), + self.tr( + """<p>The messages contents could not be written""" + """ to <b>{0}</b></p><p>Reason: {1}</p>""" + ).format(fpath, str(err)), + ) + + def __initMessagesMenu(self): + """ + Private slot to initialize the context menu of the messages pane. + """ + self.__messagesMenu = QMenu(self) + self.__copyMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("editCopy"), self.tr("Copy"), self.__copyMessages + ) + self.__messagesMenu.addSeparator() + self.__cutAllMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("editCut"), + self.tr("Cut all"), + self.__cutAllMessages, + ) + self.__copyAllMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("editCopy"), + self.tr("Copy all"), + self.__copyAllMessages, + ) + self.__messagesMenu.addSeparator() + self.__clearMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("editDelete"), + self.tr("Clear"), + self.__clearMessages, + ) + self.__messagesMenu.addSeparator() + self.__saveMessagesAct = self.__messagesMenu.addAction( + EricPixmapCache.getIcon("fileSave"), self.tr("Save"), self.__saveMessages + ) + + self.on_messages_copyAvailable(False) + + @pyqtSlot(bool) + def on_messages_copyAvailable(self, yes): + """ + Private slot to react to text selection/deselection of the + messages edit. + + @param yes flag signaling the availability of selected text + @type bool + """ + self.__copyMessagesAct.setEnabled(yes) + + @pyqtSlot(QPoint) + def on_messages_customContextMenuRequested(self, pos): + """ + Private slot to show the context menu of the messages pane. + + @param pos position the menu should be opened at + @type QPoint + """ + enable = not self.messages.document().isEmpty() + self.__cutAllMessagesAct.setEnabled(enable) + self.__copyAllMessagesAct.setEnabled(enable) + self.__saveMessagesAct.setEnabled(enable) + self.__messagesMenu.popup(self.messages.mapToGlobal(pos)) + + @pyqtSlot(QUrl) + def on_messages_anchorClicked(self, url): + """ + Private slot to open links in the default browser. + + @param url URL to be opened + @type QUrl + """ + QDesktopServices.openUrl(url)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcNetworkWidget.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,153 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcNetworkWidget</class> + <widget class="QWidget" name="IrcNetworkWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>322</height> + </rect> + </property> + <property name="windowTitle"> + <string/> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>3</number> + </property> + <property name="margin"> + <number>0</number> + </property> + <item> + <widget class="QTextBrowser" name="messages"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + <property name="toolTip"> + <string>Shows the network messages</string> + </property> + <property name="tabChangesFocus"> + <bool>true</bool> + </property> + <property name="openLinks"> + <bool>false</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QComboBox" name="networkCombo"> + <property name="toolTip"> + <string>Select a network to connect to</string> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="connectButton"> + <property name="toolTip"> + <string/> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="awayButton"> + <property name="toolTip"> + <string>Press to set the user status to AWAY</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="editButton"> + <property name="toolTip"> + <string>Press to edit the networks</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QComboBox" name="nickCombo"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Select a nick name for the channel</string> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="channelCombo"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip"> + <string>Enter the channel to join</string> + </property> + <property name="editable"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QToolButton" name="joinButton"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="toolTip"> + <string>Press to join the channel</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <tabstops> + <tabstop>networkCombo</tabstop> + <tabstop>connectButton</tabstop> + <tabstop>awayButton</tabstop> + <tabstop>editButton</tabstop> + <tabstop>nickCombo</tabstop> + <tabstop>channelCombo</tabstop> + <tabstop>joinButton</tabstop> + <tabstop>messages</tabstop> + </tabstops> + <resources/> + <connections/> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcServerEditDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog for editing the IRC server configuration. +""" + +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtWidgets import QDialog, QDialogButtonBox + +from .Ui_IrcServerEditDialog import Ui_IrcServerEditDialog + + +class IrcServerEditDialog(QDialog, Ui_IrcServerEditDialog): + """ + Class implementing a dialog for editing the IRC server configuration. + """ + + def __init__(self, server, parent=None): + """ + Constructor + + @param server reference to the IRC server object + @type IrcServer + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok) + + if server: + self.serverEdit.setText(server.getName()) + self.portSpinBox.setValue(server.getPort()) + self.passwordEdit.setText(server.getPassword()) + self.sslCheckBox.setChecked(server.useSSL()) + + self.__updateOkButton() + + msh = self.minimumSizeHint() + self.resize(max(self.width(), msh.width()), msh.height()) + + def __updateOkButton(self): + """ + Private method to update the OK button state. + """ + self.__okButton.setEnabled(self.serverEdit.text() != "") + + @pyqtSlot(str) + def on_serverEdit_textChanged(self, _name): + """ + Private slot handling changes of the server name. + + @param _name current name of the server (unused) + @type str + """ + self.__updateOkButton() + + def getServer(self): + """ + Public method to create a server object from the data entered into + the dialog. + + @return server object + @rtype IrcServer + """ + from .IrcNetworkManager import IrcServer + + server = IrcServer(self.serverEdit.text()) + server.setPort(self.portSpinBox.value()) + server.setPassword(self.passwordEdit.text()) + server.setUseSSL(self.sslCheckBox.isChecked()) + + return server
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcServerEditDialog.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcServerEditDialog</class> + <widget class="QDialog" name="IrcServerEditDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>158</height> + </rect> + </property> + <property name="windowTitle"> + <string>IRC Server</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Server:</string> + </property> + </widget> + </item> + <item row="0" column="1" colspan="2"> + <widget class="QLineEdit" name="serverEdit"> + <property name="toolTip"> + <string>Enter the host name of the IRC server</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Port:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="portSpinBox"> + <property name="toolTip"> + <string>Enter the port number</string> + </property> + <property name="alignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>65535</number> + </property> + <property name="value"> + <number>6667</number> + </property> + </widget> + </item> + <item row="1" column="2"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>238</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Password:</string> + </property> + </widget> + </item> + <item row="2" column="1" colspan="2"> + <widget class="QLineEdit" name="passwordEdit"> + <property name="toolTip"> + <string>Enter the server password</string> + </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + </widget> + </item> + <item row="3" column="0" colspan="3"> + <widget class="QCheckBox" name="sslCheckBox"> + <property name="toolTip"> + <string>Select to use an SSL encrypted connection</string> + </property> + <property name="text"> + <string>Use Encrypted Connection (SSL)</string> + </property> + </widget> + </item> + <item row="4" column="0" colspan="3"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <tabstops> + <tabstop>serverEdit</tabstop> + <tabstop>portSpinBox</tabstop> + <tabstop>passwordEdit</tabstop> + <tabstop>sslCheckBox</tabstop> + <tabstop>buttonBox</tabstop> + </tabstops> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>IrcServerEditDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>IrcServerEditDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcUtilities.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing functions used by several IRC objects. +""" + +import re + +from PyQt6.QtCore import QCoreApplication, QTime +from PyQt6.QtWidgets import QApplication + +from eric7 import EricUtilities +from PluginExtensionIrc import ircExtensionPluginObject + +__UrlRe = re.compile( + r"""((?:http|ftp|https):\/\/[\w\-_]+(?:\.[\w\-_]+)+""" + r"""(?:[\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)""" +) +__ColorRe = re.compile( + r"""((?:\x03(?:0[0-9]|1[0-5]|[0-9])?(?:,(?:0[0-9]|1[0-5]|[0-9]))?)""" + r"""|\x02|\x03|\x13|\x15|\x16|\x17|\x1d|\x1f)""" +) + + +def ircTimestamp(): + """ + Module method to generate a time stamp string. + + @return time stamp + @rtype str + """ + if ircExtensionPluginObject.getPreferences("ShowTimestamps"): + if ircExtensionPluginObject.getPreferences("TimestampIncludeDate"): + if QApplication.isLeftToRight(): + f = "{0} {1}" + else: + f = "{1} {0}" + formatString = f.format( + ircExtensionPluginObject.getPreferences("DateFormat"), + ircExtensionPluginObject.getPreferences("TimeFormat"), + ) + else: + formatString = ircExtensionPluginObject.getPreferences("TimeFormat") + return '<font color="{0}">[{1}]</font> '.format( + ircExtensionPluginObject.getPreferences("TimestampColour"), + QTime.currentTime().toString(formatString), + ) + else: + return "" + + +def ircFilter(msg): + """ + Module method to make the message HTML compliant and detect URLs. + + @param msg message to process + @type str + @return processed message + @rtype str + """ + # step 1: cleanup message + msg = EricUtilities.html_encode(msg) + + # step 2: replace IRC formatting characters + openTags = [] + parts = __ColorRe.split(msg) + msgParts = [] + for part in parts: + if part == "\x02": # bold + if openTags and openTags[-1] == "b": + msgParts.append("</" + openTags.pop(-1) + ">") + else: + msgParts.append("<b>") + openTags.append("b") + elif part in ["\x03", "\x17"]: + if ircExtensionPluginObject.getPreferences("EnableIrcColours"): + if openTags and openTags[-1] == "span": + msgParts.append("</" + openTags.pop(-1) + ">") + else: + continue + else: + continue + elif part == "\x0f": # reset + while openTags: + msgParts.append("</" + openTags.pop(-1) + ">") + elif part == "\x13": # strikethru + if openTags and openTags[-1] == "s": + msgParts.append("</" + openTags.pop(-1) + ">") + else: + msgParts.append("<s>") + openTags.append("s") + elif part in ["\x15", "\x1f"]: # underline + if openTags and openTags[-1] == "u": + msgParts.append("</" + openTags.pop(-1) + ">") + else: + msgParts.append("<u>") + openTags.append("u") + elif part == "\x16": + # revert color not supported + continue + elif part == "\x1d": # italic + if openTags and openTags[-1] == "i": + msgParts.append("</" + openTags.pop(-1) + ">") + else: + msgParts.append("<i>") + openTags.append("i") + elif part.startswith("\x03"): + if ircExtensionPluginObject.getPreferences("EnableIrcColours"): + colors = part[1:].split(",", 1) + if len(colors) == 1: + # foreground color only + tag = '<span style="color:{0}">'.format( + ircExtensionPluginObject.getPreferences( + "IrcColor{0}".format(int(colors[0])) + ) + ) + else: + if colors[0]: + # foreground and background + tag = '<span style="background-color:{0};color={1}">'.format( + ircExtensionPluginObject.getPreferences( + "IrcColor{0}".format(int(colors[0])) + ), + ircExtensionPluginObject.getPreferences( + "IrcColor{0}".format(int(colors[1])) + ), + ) + else: + # background only + tag = '<span style="background-color:{0}">'.format( + ircExtensionPluginObject.getPreferences( + "IrcColor{0}".format(int(colors[1])) + ) + ) + msgParts.append(tag) + openTags.append("span") + else: + continue + else: + msgParts.append(part) + msg = "".join(msgParts) + + # step 3: find http and https links + parts = __UrlRe.split(msg) + msgParts = [] + for part in parts: + if part.startswith(("http://", "https://", "ftp://")): + msgParts.append( + '<a href="{0}" style="color:{1}">{0}</a>'.format( + part, ircExtensionPluginObject.getPreferences("HyperlinkColour") + ) + ) + else: + msgParts.append(part) + + return "".join(msgParts) + + +__channelModesDict = None + + +def __initChannelModesDict(): + """ + Private module function to initialize the channels modes dictionary. + """ + global __channelModesDict + + modesDict = { + "a": QCoreApplication.translate("IrcUtilities", "anonymous"), + "b": QCoreApplication.translate("IrcUtilities", "ban mask"), + "c": QCoreApplication.translate("IrcUtilities", "no colors allowed"), + "e": QCoreApplication.translate("IrcUtilities", "ban exception mask"), + "i": QCoreApplication.translate("IrcUtilities", "invite only"), + "k": QCoreApplication.translate("IrcUtilities", "password protected"), + "l": QCoreApplication.translate("IrcUtilities", "user limit"), + "m": QCoreApplication.translate("IrcUtilities", "moderated"), + "n": QCoreApplication.translate("IrcUtilities", "no messages from outside"), + "p": QCoreApplication.translate("IrcUtilities", "private"), + "q": QCoreApplication.translate("IrcUtilities", "quiet"), + "r": QCoreApplication.translate("IrcUtilities", "reop channel"), + "s": QCoreApplication.translate("IrcUtilities", "secret"), + "t": QCoreApplication.translate("IrcUtilities", "topic protection"), + "I": QCoreApplication.translate("IrcUtilities", "invitation mask"), + } + __channelModesDict = modesDict + + +def getChannelModesDict(): + """ + Module function to get the dictionary with the channel modes mappings. + + @return dictionary with channel modes mapping + @rtype dict + """ + global __channelModesDict + + if __channelModesDict is None: + __initChannelModesDict() + + return __channelModesDict
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcWidget.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,1166 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the IRC window. +""" + +import enum +import logging +import re + +from PyQt6.QtCore import QByteArray, QDateTime, Qt, QTimer, pyqtSignal, pyqtSlot +from PyQt6.QtNetwork import QAbstractSocket, QTcpSocket +from PyQt6.QtWidgets import QLabel, QTabWidget, QToolButton, QWidget + +try: + from PyQt6.QtNetwork import QSslConfiguration, QSslSocket + + from eric7.EricNetwork.EricSslErrorHandler import ( + EricSslErrorHandler, + EricSslErrorState, + ) + + SSL_AVAILABLE = True +except ImportError: + SSL_AVAILABLE = False + +from eric7 import Preferences +from eric7.__version__ import Version +from eric7.EricWidgets import EricMessageBox +from eric7.SystemUtilities import OSUtilities +from eric7.UI.Info import Copyright + +from .IrcNetworkManager import IrcNetworkManager +from .Ui_IrcWidget import Ui_IrcWidget + + +class IrcConnectionState(enum.Enum): + """ + Class defining the connection states. + """ + + Disconnected = 1 + Connected = 2 + Connecting = 3 + + +class IrcWidget(QWidget, Ui_IrcWidget): + """ + Class implementing the IRC window. + + @signal autoConnected() emitted after an automatic connection was initiated + """ + + autoConnected = pyqtSignal() + + def __init__(self, plugin, parent=None): + """ + Constructor + + @param plugin reference to the plug-in object + @type MqttMonitorPlugin + @param parent reference to the parent widget + @type QWidget + """ + super().__init__(parent) + self.setupUi(self) + + self.layout().setContentsMargins(0, 3, 0, 0) + + self.__plugin = plugin + + self.__ircNetworkManager = IrcNetworkManager(self) + + self.__leaveButton = QToolButton(self) + self.__leaveButton.setIcon(self.__plugin.getIcon("ircCloseChannel")) + self.__leaveButton.setToolTip(self.tr("Press to leave the current channel")) + self.__leaveButton.clicked.connect(self.__leaveChannel) + self.__leaveButton.setEnabled(False) + self.channelsWidget.setCornerWidget( + self.__leaveButton, Qt.Corner.BottomRightCorner + ) + self.channelsWidget.setTabsClosable(False) + if not OSUtilities.isMacPlatform(): + self.channelsWidget.setTabPosition(QTabWidget.TabPosition.South) + + height = self.height() + self.splitter.setSizes([int(height * 0.6), int(height * 0.4)]) + + self.__channelList = [] + self.__channelTypePrefixes = "" + self.__userName = "" + self.__identityName = "" + self.__quitMessage = "" + self.__nickIndex = -1 + self.__nickName = "" + self.__server = None + self.__registering = False + + self.__connectionState = IrcConnectionState.Disconnected + self.__sslErrorLock = False + + self.__buffer = "" + self.__userPrefix = {} + + self.__socket = None + if SSL_AVAILABLE: + self.__sslErrorHandler = EricSslErrorHandler( + Preferences.getSettings(), self + ) + else: + self.__sslErrorHandler = None + + self.__patterns = [ + # :foo_!n=foo@foohost.bar.net PRIVMSG bar_ :some long message + (re.compile(r":([^!]+)!([^ ]+)\sPRIVMSG\s([^ ]+)\s:(.*)"), self.__query), + # :foo.bar.net COMMAND some message + (re.compile(r""":([^ ]+)\s+([A-Z]+)\s+(.+)"""), self.__handleNamedMessage), + # :foo.bar.net 123 * :info + (re.compile(r""":([^ ]+)\s+(\d{3})\s+(.+)"""), self.__handleNumericMessage), + # PING :ping message + (re.compile(r"""PING\s+:(.*)"""), self.__ping), + ] + self.__prefixRe = re.compile(r""".*\sPREFIX=\((.*)\)([^ ]+).*""") + self.__chanTypesRe = re.compile(r""".*\sCHANTYPES=([^ ]+).*""") + + ircPic = self.__plugin.getPixmap("irc128") + self.__emptyLabel = QLabel() + self.__emptyLabel.setPixmap(ircPic) + self.__emptyLabel.setAlignment( + Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignHCenter + ) + self.channelsWidget.addTab(self.__emptyLabel, "") + + # all initialized, do connections now + self.__ircNetworkManager.dataChanged.connect(self.__networkDataChanged) + self.networkWidget.initialize(manager=self.__ircNetworkManager) + self.networkWidget.connectNetwork.connect(self.__connectNetwork) + self.networkWidget.editNetwork.connect(self.__editNetwork) + self.networkWidget.joinChannel.connect(self.joinChannel) + self.networkWidget.nickChanged.connect(self.__changeNick) + self.networkWidget.sendData.connect(self.__send) + self.networkWidget.away.connect(self.__away) + self.networkWidget.autoConnected.connect(self.autoConnected) + + @pyqtSlot() + def shutdown(self): + """ + Public slot to shut down the widget. + """ + if self.__server: + self.__connectNetwork("", False, True) + + self.__ircNetworkManager.close() + + def autoConnect(self): + """ + Public method to initiate the IRC auto connection. + """ + self.networkWidget.autoConnect() + + def __connectNetwork(self, name, connect, silent): + """ + Private slot to connect to or disconnect from the given network. + + @param name name of the network to connect to + @type str + @param connect flag indicating to connect + @type bool + @param silent flag indicating a silent connect/disconnect + @type bool + """ + if connect: + network = self.__ircNetworkManager.getNetwork(name) + if network: + self.__server = network.getServer() + self.__identityName = network.getIdentityName() + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + if identity: + self.__userName = identity.getIdent() + self.__quitMessage = identity.getQuitMessage() + if self.__server: + useSSL = self.__server.useSSL() + if useSSL and not SSL_AVAILABLE: + EricMessageBox.critical( + self, + self.tr("SSL Connection"), + self.tr( + """An encrypted connection to the IRC""" + """ network was requested but SSL is not""" + """ available. Please change the server""" + """ configuration.""" + ), + ) + return + + if useSSL: + # create SSL socket + self.__socket = QSslSocket(self) + self.__socket.encrypted.connect(self.__hostConnected) + self.__socket.sslErrors.connect(self.__sslErrors) + else: + # create TCP socket + self.__socket = QTcpSocket(self) + self.__socket.connected.connect(self.__hostConnected) + self.__socket.hostFound.connect(self.__hostFound) + self.__socket.disconnected.connect(self.__hostDisconnected) + self.__socket.readyRead.connect(self.__readyRead) + self.__socket.errorOccurred.connect(self.__tcpError) + + self.__connectionState = IrcConnectionState.Connecting + if useSSL: + self.networkWidget.addServerMessage( + self.tr("Info"), + self.tr( + "Looking for server {0} (port {1})" + " using an SSL encrypted connection" + "..." + ).format( + self.__server.getName(), self.__server.getPort() + ), + ) + self.__socket.connectToHostEncrypted( + self.__server.getName(), self.__server.getPort() + ) + else: + self.networkWidget.addServerMessage( + self.tr("Info"), + self.tr("Looking for server {0} (port {1})...").format( + self.__server.getName(), self.__server.getPort() + ), + ) + self.__socket.connectToHost( + self.__server.getName(), self.__server.getPort() + ) + else: + if silent: + ok = True + else: + ok = EricMessageBox.yesNo( + self, + self.tr("Disconnect from Server"), + self.tr( + """<p>Do you really want to disconnect from""" + """ <b>{0}</b>?</p><p>All channels will be""" + """ closed.</p>""" + ).format(self.__server.getName()), + ) + if ok: + if self.__server is not None: + self.networkWidget.addServerMessage( + self.tr("Info"), + self.tr("Disconnecting from server {0}...").format( + self.__server.getName() + ), + ) + elif name: + self.networkWidget.addServerMessage( + self.tr("Info"), + self.tr("Disconnecting from network {0}...").format(name), + ) + else: + self.networkWidget.addServerMessage( + self.tr("Info"), self.tr("Disconnecting from server.") + ) + self.__closeAllChannels() + self.__send("QUIT :" + self.__quitMessage) + if self.__socket: + self.__socket.flush() + self.__socket.close() + if self.__socket: + # socket is still existing + self.__socket.deleteLater() + self.__socket = None + self.__userName = "" + self.__identityName = "" + self.__quitMessage = "" + + @pyqtSlot() + def __editNetwork(self): + """ + Private slot to edit the network configuration. + """ + from .IrcNetworkListDialog import IrcNetworkListDialog + + dlg = IrcNetworkListDialog(manager=self.__ircNetworkManager, parent=self) + dlg.exec() + + def __networkDataChanged(self): + """ + Private slot handling changes of the network and identity definitions. + """ + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + if identity: + partMsg = identity.getPartMessage() + for channel in self.__channelList: + channel.setPartMessage(partMsg) + + def joinChannel(self, name, key=""): + """ + Public slot to join a channel. + + @param name name of the channel + @type str + @param key key of the channel + @type str + """ + from .IrcChannelWidget import IrcChannelWidget + + # step 1: check, if this channel is already joined + for channel in self.__channelList: + if channel.name() == name: + return + + channel = IrcChannelWidget(self) + channel.setName(name) + channel.setUserName(self.__nickName) + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + if identity: + channel.setPartMessage(identity.getPartMessage()) + channel.setUserPrivilegePrefix(self.__userPrefix) + channel.initAutoWho() + + channel.sendData.connect(self.__send) + channel.sendCtcpRequest.connect(self.__sendCtcpRequest) + channel.sendCtcpReply.connect(self.__sendCtcpReply) + channel.channelClosed.connect(self.__closeChannel) + channel.openPrivateChat.connect(self.__openPrivate) + channel.awayCommand.connect(self.networkWidget.handleAwayCommand) + channel.leaveChannels.connect(self.__leaveChannels) + channel.leaveAllChannels.connect(self.__leaveAllChannels) + + self.channelsWidget.addTab(channel, name) + self.__channelList.append(channel) + self.channelsWidget.setCurrentWidget(channel) + + joinCommand = ["JOIN", name] + if key: + joinCommand.append(key) + self.__send(" ".join(joinCommand)) + self.__send("MODE " + name) + + emptyIndex = self.channelsWidget.indexOf(self.__emptyLabel) + if emptyIndex > -1: + self.channelsWidget.removeTab(emptyIndex) + self.__leaveButton.setEnabled(True) + self.channelsWidget.setTabsClosable(True) + + def __query(self, match): + """ + Private method to handle a new private connection. + + @param match reference to the match object + @type re.Match + @return flag indicating, if the message was handled + @rtype bool + """ + # group(1) sender user name + # group(2) sender user@host + # group(3) target nick + # group(4) message + if match.group(4).startswith("\x01"): + return self.__handleCtcp(match) + + self.__openPrivate(match.group(1)) + # the above call sets the new channel as the current widget + channel = self.channelsWidget.currentWidget() + channel.addMessage(match.group(1), match.group(4)) + channel.setPrivateInfo("{0} - {1}".format(match.group(1), match.group(2))) + + return True + + @pyqtSlot(str) + def __openPrivate(self, name): + """ + Private slot to open a private chat with the given user. + + @param name name of the user + @type str + """ + from .IrcChannelWidget import IrcChannelWidget + + channel = IrcChannelWidget(self) + channel.setName(self.__nickName) + channel.setUserName(self.__nickName) + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + if identity: + channel.setPartMessage(identity.getPartMessage()) + channel.setUserPrivilegePrefix(self.__userPrefix) + channel.setPrivate(True, name) + channel.addUsers([name, self.__nickName]) + + channel.sendData.connect(self.__send) + channel.sendCtcpRequest.connect(self.__sendCtcpRequest) + channel.sendCtcpReply.connect(self.__sendCtcpReply) + channel.channelClosed.connect(self.__closeChannel) + channel.awayCommand.connect(self.networkWidget.handleAwayCommand) + channel.leaveChannels.connect(self.__leaveChannels) + channel.leaveAllChannels.connect(self.__leaveAllChannels) + + self.channelsWidget.addTab(channel, name) + self.__channelList.append(channel) + self.channelsWidget.setCurrentWidget(channel) + + @pyqtSlot() + def __leaveChannel(self): + """ + Private slot to leave a channel and close the associated tab. + """ + channel = self.channelsWidget.currentWidget() + channel.requestLeave() + + @pyqtSlot(list) + def __leaveChannels(self, channelNames): + """ + Private slot to leave a list of channels and close their associated + tabs. + + @param channelNames list of channels to leave + @type list of str + """ + for channelName in channelNames: + for channel in self.__channelList: + if channel.name() == channelName: + channel.leaveChannel() + + @pyqtSlot() + def __leaveAllChannels(self): + """ + Private slot to leave all channels and close their tabs. + """ + while self.__channelList: + channel = self.__channelList[0] + channel.leaveChannel() + + def __closeAllChannels(self): + """ + Private method to close all channels. + """ + while self.__channelList: + channel = self.__channelList.pop() + self.channelsWidget.removeTab(self.channelsWidget.indexOf(channel)) + channel.deleteLater() + channel = None + + self.channelsWidget.addTab(self.__emptyLabel, "") + self.__emptyLabel.show() + self.__leaveButton.setEnabled(False) + self.channelsWidget.setTabsClosable(False) + + def __closeChannel(self, name): + """ + Private slot handling the closing of a channel. + + @param name name of the closed channel + @type str + """ + for channel in self.__channelList[:]: + if channel.name() == name: + self.channelsWidget.removeTab(self.channelsWidget.indexOf(channel)) + self.__channelList.remove(channel) + channel.deleteLater() + + if self.channelsWidget.count() == 0: + self.channelsWidget.addTab(self.__emptyLabel, "") + self.__emptyLabel.show() + self.__leaveButton.setEnabled(False) + self.channelsWidget.setTabsClosable(False) + + @pyqtSlot(int) + def on_channelsWidget_tabCloseRequested(self, index): + """ + Private slot to close a channel by pressing the close button of + the channels widget. + + @param index index of the tab to be closed + @type int + """ + channel = self.channelsWidget.widget(index) + channel.requestLeave() + + def __send(self, data): + """ + Private slot to send data to the IRC server. + + @param data data to be sent + @type str + """ + if self.__socket: + self.__socket.write(QByteArray("{0}\r\n".format(data).encode("utf-8"))) + + def __sendCtcpRequest(self, receiver, request, arguments): + """ + Private slot to send a CTCP request. + + @param receiver nick name of the receiver + @type str + @param request CTCP request to be sent + @type str + @param arguments arguments to be sent + @type str + """ + request = request.upper() + if request == "PING": + arguments = "Eric IRC {0}".format(QDateTime.currentMSecsSinceEpoch()) + + self.__send("PRIVMSG {0} :\x01{1} {2}\x01".format(receiver, request, arguments)) + + def __sendCtcpReply(self, receiver, text): + """ + Private slot to send a CTCP reply. + + @param receiver nick name of the receiver + @type str + @param text text to be sent + @type str + """ + self.__send("NOTICE {0} :\x01{1}\x01".format(receiver, text)) + + def __hostFound(self): + """ + Private slot to indicate the host was found. + """ + self.networkWidget.addServerMessage( + self.tr("Info"), self.tr("Server found,connecting...") + ) + + def __hostConnected(self): + """ + Private slot to log in to the server after the connection was + established. + """ + self.networkWidget.addServerMessage( + self.tr("Info"), self.tr("Connected,logging in...") + ) + self.networkWidget.setConnected(True) + + self.__registering = True + serverPassword = self.__server.getPassword() + if serverPassword: + self.__send("PASS " + serverPassword) + + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + nick = self.networkWidget.getNickname() + if not nick and identity: + self.__nickIndex = 0 + try: + nick = identity.getNickNames()[self.__nickIndex] + except IndexError: + nick = "" + if not nick: + nick = self.__userName + self.__nickName = nick + self.networkWidget.setNickName(nick) + if identity: + realName = identity.getRealName() + if not realName: + realName = "eric IDE chat" + self.__send("NICK " + nick) + self.__send("USER " + self.__userName + " 0 * :" + realName) + + def __hostDisconnected(self): + """ + Private slot to indicate the host was disconnected. + """ + if self.networkWidget.isConnected(): + self.__closeAllChannels() + self.networkWidget.addServerMessage( + self.tr("Info"), self.tr("Server disconnected.") + ) + self.networkWidget.setRegistered(False) + self.networkWidget.setConnected(False) + self.__server = None + self.__nickName = "" + self.__nickIndex = -1 + self.__channelTypePrefixes = "" + + if self.__socket: + self.__socket.deleteLater() + self.__socket = None + + self.__connectionState = IrcConnectionState.Disconnected + self.__sslErrorLock = False + + def __readyRead(self): + """ + Private slot to read data from the socket. + """ + if self.__socket: + self.__buffer += str( + self.__socket.readAll(), Preferences.getSystem("IOEncoding"), "replace" + ) + if self.__buffer.endswith("\r\n"): + for line in self.__buffer.splitlines(): + line = line.strip() + if line: + logging.getLogger(__name__).debug("<IRC> %s", line) + handled = False + # step 1: give channels a chance to handle the message + for channel in self.__channelList: + handled = channel.handleMessage(line) + if handled: + break + else: + # step 2: try to process the message ourselves + for patternRe, patternFunc in self.__patterns: + match = patternRe.match(line) + if match is not None and patternFunc(match): + break + else: + # Oops, the message wasn't handled + self.networkWidget.addErrorMessage( + self.tr("Message Error"), + self.tr( + "Unknown message received from server:" + "<br/>{0}" + ).format(line), + ) + + self.__updateUsersCount() + self.__buffer = "" + + def __handleCtcpReply(self, match): + """ + Private method to handle a server message containing a CTCP reply. + + @param match reference to the match object + @type re.Match + """ + if "!" in match.group(1): + sender = match.group(1).split("!", 1)[0] + + try: + ctcpCommand = match.group(3).split(":", 1)[1] + except IndexError: + ctcpCommand = match.group(3) + ctcpCommand = ctcpCommand[1:].split("\x01", 1)[0] + if " " in ctcpCommand: + ctcpReply, ctcpArg = ctcpCommand.split(" ", 1) + else: + ctcpReply, ctcpArg = ctcpCommand, "" + ctcpReply = ctcpReply.upper() + + if ctcpReply == "PING" and ctcpArg.startswith("Eric IRC "): + # it is a response to a ping request + pingDateTime = int(ctcpArg.split()[-1]) + latency = QDateTime.currentMSecsSinceEpoch() - pingDateTime + self.networkWidget.addServerMessage( + self.tr("CTCP"), + self.tr( + "Received CTCP-PING response from {0} with latency" + " of {1} ms." + ).format(sender, latency), + ) + else: + self.networkWidget.addServerMessage( + self.tr("CTCP"), + self.tr("Received unknown CTCP-{0} response from {1}.").format( + ctcpReply, sender + ), + ) + + def __handleNamedMessage(self, match): + """ + Private method to handle a server message containing a message name. + + @param match reference to the match object + @type re.Match + @return flag indicating, if the message was handled + @rtype bool + """ + name = match.group(2) + if name == "NOTICE": + try: + msg = match.group(3).split(":", 1)[1] + except IndexError: + msg = match.group(3) + + if msg.startswith("\x01"): + self.__handleCtcpReply(match) + return True + + if "!" in match.group(1): + name = match.group(1).split("!", 1)[0] + msg = "-{0}- {1}".format(name, msg) + self.networkWidget.addServerMessage(self.tr("Notice"), msg) + return True + elif name == "MODE": + self.__registering = False + if ":" in match.group(3): + # :foo MODE foo :+i + name, modes = match.group(3).split(" :") + sourceNick = match.group(1) + if not self.isChannelName(name) and name == self.__nickName: + if sourceNick == self.__nickName: + msg = self.tr( + "You have set your personal modes to <b>[{0}]</b>." + ).format(modes) + else: + msg = self.tr( + "{0} has changed your personal modes to <b>[{1}]</b>." + ).format(sourceNick, modes) + self.networkWidget.addServerMessage( + self.tr("Mode"), msg, filterMsg=False + ) + return True + elif name == "PART": + nick = match.group(1).split("!", 1)[0] + if nick == self.__nickName: + channel = match.group(3).split(None, 1)[0] + self.networkWidget.addMessage( + self.tr("You have left channel {0}.").format(channel) + ) + return True + elif name == "QUIT": + # don't do anything with it here + return True + elif name == "NICK": + # :foo_!n=foo@foohost.bar.net NICK :newnick + oldNick = match.group(1).split("!", 1)[0] + newNick = match.group(3).split(":", 1)[1] + if oldNick == self.__nickName: + self.networkWidget.addMessage( + self.tr("You are now known as {0}.").format(newNick) + ) + self.__nickName = newNick + self.networkWidget.setNickName(newNick) + else: + self.networkWidget.addMessage( + self.tr("User {0} is now known as {1}.").format(oldNick, newNick) + ) + return True + elif name == "PONG": + nick = match.group(3).split(":", 1)[1] + self.networkWidget.addMessage( + self.tr("Received PONG from {0}").format(nick) + ) + return True + elif name == "ERROR": + self.networkWidget.addErrorMessage( + self.tr("Server Error"), match.group(3).split(":", 1)[1] + ) + return True + + return False + + def __handleNumericMessage(self, match): + """ + Private method to handle a server message containing a numeric code. + + @param match reference to the match object + @type re.Match + @return flag indicating, if the message was handled + @rtype bool + """ + code = int(match.group(2)) + if code < 400: + return self.__handleServerReply(code, match.group(1), match.group(3)) + else: + return self.__handleServerError(code, match.group(3)) + + def __handleServerError(self, code, message): + """ + Private slot to handle a server error reply. + + @param code numerical code sent by the server + @type int + @param message message sent by the server + @type str + @return flag indicating, if the message was handled + @rtype bool + """ + if code == 433: + if self.__registering: + self.__handleNickInUseLogin() + else: + self.__handleNickInUse() + else: + self.networkWidget.addServerMessage(self.tr("Error"), message) + + return True + + def __handleServerReply(self, code, server, message): + """ + Private slot to handle a server reply. + + @param code numerical code sent by the server + @type int + @param server name of the server + @type str + @param message message sent by the server + @type str + @return flag indicating, if the message was handled + @rtype bool + """ + # determine message type + if code in [1, 2, 3, 4]: + msgType = self.tr("Welcome") + elif code == 5: + msgType = self.tr("Support") + elif code in [250, 251, 252, 253, 254, 255, 265, 266]: + msgType = self.tr("User") + elif code in [372, 375, 376]: + msgType = self.tr("MOTD") + elif code in [305, 306]: + msgType = self.tr("Away") + else: + msgType = self.tr("Info ({0})").format(code) + + # special treatment for some messages + if code == 375: + message = self.tr("Message of the day") + elif code == 376: + message = self.tr("End of message of the day") + elif code == 4: + parts = message.strip().split() + message = self.tr( + "Server {0} (Version {1}), User-Modes: {2}, Channel-Modes: {3}" + ).format(parts[1], parts[2], parts[3], parts[4]) + elif code == 265: + parts = message.strip().split() + message = self.tr("Current users on {0}: {1}, max. {2}").format( + server, parts[1], parts[2] + ) + elif code == 266: + parts = message.strip().split() + message = self.tr("Current users on the network: {0}, max. {1}").format( + parts[1], parts[2] + ) + elif code == 305: + message = self.tr("You are no longer marked as being away.") + elif code == 306: + message = self.tr("You have been marked as being away.") + else: + _first, message = message.split(None, 1) + if message.startswith(":"): + message = message[1:] + else: + message = message.replace(":", "", 1) + + self.networkWidget.addServerMessage(msgType, message) + + if code == 1: + # register with services after the welcome message + self.__connectionState = IrcConnectionState.Connected + self.__registerWithServices() + self.networkWidget.setRegistered(True) + QTimer.singleShot(1000, self.__autoJoinChannels) + elif code == 5: + # extract the user privilege prefixes + # ... PREFIX=(ov)@+ ... + m = self.__prefixRe.match(message) + if m: + self.__setUserPrivilegePrefix(m.group(1), m.group(2)) + # extract the channel type prefixes + # ... CHANTYPES=# ... + m = self.__chanTypesRe.match(message) + if m: + self.__setChannelTypePrefixes(m.group(1)) + + return True + + def __registerWithServices(self): + """ + Private method to register to services. + """ + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + if identity: + service = identity.getServiceName() + password = identity.getPassword() + if service and password: + self.__send("PRIVMSG " + service + " :identify " + password) + + def __autoJoinChannels(self): + """ + Private slot to join channels automatically once a server got + connected. + """ + for channel in self.networkWidget.getNetworkChannels(): + if channel.autoJoin(): + name = channel.getName() + key = channel.getKey() + self.joinChannel(name, key) + + def __tcpError(self, error): + """ + Private slot to handle errors reported by the TCP socket. + + @param error error code reported by the socket + @type QAbstractSocket.SocketError + """ + if error == QAbstractSocket.SocketError.RemoteHostClosedError: + # ignore this one, it's a disconnect + if self.__sslErrorLock: + self.networkWidget.addErrorMessage( + self.tr("SSL Error"), + self.tr( + """Connection to server {0} (port {1}) lost while""" + """ waiting for user response to an SSL error.""" + ).format(self.__server.getName(), self.__server.getPort()), + ) + self.__connectionState = IrcConnectionState.Disconnected + elif error == QAbstractSocket.SocketError.HostNotFoundError: + self.networkWidget.addErrorMessage( + self.tr("Socket Error"), + self.tr( + "The host was not found. Please check the host name" + " and port settings." + ), + ) + elif error == QAbstractSocket.SocketError.ConnectionRefusedError: + self.networkWidget.addErrorMessage( + self.tr("Socket Error"), + self.tr( + "The connection was refused by the peer. Please check the" + " host name and port settings." + ), + ) + elif error == QAbstractSocket.SocketError.SslHandshakeFailedError: + self.networkWidget.addErrorMessage( + self.tr("Socket Error"), self.tr("The SSL handshake failed.") + ) + else: + if self.__socket: + self.networkWidget.addErrorMessage( + self.tr("Socket Error"), + self.tr("The following network error occurred:<br/>{0}").format( + self.__socket.errorString() + ), + ) + else: + self.networkWidget.addErrorMessage( + self.tr("Socket Error"), self.tr("A network error occurred.") + ) + + def __sslErrors(self, errors): + """ + Private slot to handle SSL errors. + + @param errors list of SSL errors + @type list of QSslError + """ + ignored, defaultChanged = self.__sslErrorHandler.sslErrors( + errors, self.__server.getName(), self.__server.getPort() + ) + if ignored == EricSslErrorState.NOT_IGNORED: + self.networkWidget.addErrorMessage( + self.tr("SSL Error"), + self.tr( + """Could not connect to {0} (port {1}) using an SSL""" + """ encrypted connection. Either the server does not""" + """ support SSL (did you use the correct port?) or""" + """ you rejected the certificate.""" + ).format(self.__server.getName(), self.__server.getPort()), + ) + self.__socket.close() + else: + if defaultChanged: + self.__socket.setSslConfiguration( + QSslConfiguration.defaultConfiguration() + ) + if ignored == EricSslErrorState.USER_IGNORED: + self.networkWidget.addErrorMessage( + self.tr("SSL Error"), + self.tr( + """The SSL certificate for the server {0} (port {1})""" + """ failed the authenticity check. SSL errors""" + """ were accepted by you.""" + ).format(self.__server.getName(), self.__server.getPort()), + ) + if self.__connectionState == IrcConnectionState.Connecting: + self.__socket.ignoreSslErrors() + + def __setUserPrivilegePrefix(self, prefix1, prefix2): + """ + Private method to set the user privilege prefix. + + @param prefix1 first part of the prefix + @type str + @param prefix2 indictors the first part gets mapped to + @type str + """ + # PREFIX=(ov)@+ + # o = @ -> @ircbot , channel operator + # v = + -> +userName , voice operator + for i in range(len(prefix1)): + self.__userPrefix["+" + prefix1[i]] = prefix2[i] + self.__userPrefix["-" + prefix1[i]] = "" + + def __ping(self, match): + """ + Private method to handle a PING message. + + @param match reference to the match object + @type re.Match + @return flag indicating, if the message was handled + @rtype bool + """ + self.__send("PONG " + match.group(1)) + return True + + def __handleCtcp(self, match): + """ + Private method to handle a CTCP command. + + @param match reference to the match object + @type re.Match + @return flag indicating, if the message was handled + @rtype bool + """ + # group(1) sender user name + # group(2) sender user@host + # group(3) target nick + # group(4) message + if match.group(4).startswith("\x01"): + ctcpCommand = match.group(4)[1:].split("\x01", 1)[0] + if " " in ctcpCommand: + ctcpRequest, ctcpArg = ctcpCommand.split(" ", 1) + else: + ctcpRequest, ctcpArg = ctcpCommand, "" + ctcpRequest = ctcpRequest.lower() + if ctcpRequest == "version": + if Version.startswith("@@"): + vers = "" + else: + vers = " " + Version + msg = "Eric IRC client{0}, {1}".format(vers, Copyright) + self.networkWidget.addServerMessage( + self.tr("CTCP"), + self.tr("Received Version request from {0}.").format( + match.group(1) + ), + ) + self.__sendCtcpReply(match.group(1), "VERSION " + msg) + elif ctcpRequest == "ping": + self.networkWidget.addServerMessage( + self.tr("CTCP"), + self.tr( + "Received CTCP-PING request from {0}, sending answer." + ).format(match.group(1)), + ) + self.__sendCtcpReply(match.group(1), "PING {0}".format(ctcpArg)) + elif ctcpRequest == "clientinfo": + self.networkWidget.addServerMessage( + self.tr("CTCP"), + self.tr( + "Received CTCP-CLIENTINFO request from {0}, sending answer." + ).format(match.group(1)), + ) + self.__sendCtcpReply( + match.group(1), "CLIENTINFO CLIENTINFO PING VERSION" + ) + else: + self.networkWidget.addServerMessage( + self.tr("CTCP"), + self.tr("Received unknown CTCP-{0} request from {1}.").format( + ctcpRequest, match.group(1) + ), + ) + return True + + return False + + def __updateUsersCount(self): + """ + Private method to update the users count on the channel tabs. + """ + for channel in self.__channelList: + index = self.channelsWidget.indexOf(channel) + self.channelsWidget.setTabText( + index, + self.tr("{0} ({1})", "channel name, users count").format( + channel.name(), channel.getUsersCount() + ), + ) + + def __handleNickInUseLogin(self): + """ + Private method to handle a 443 server error at login. + """ + self.__nickIndex += 1 + try: + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + if identity: + nick = identity.getNickNames()[self.__nickIndex] + self.__nickName = nick + else: + self.__connectNetwork("", False, True) + self.__nickName = "" + self.__nickIndex = -1 + return + except IndexError: + self.networkWidget.addServerMessage( + self.tr("Critical"), + self.tr( + "No nickname acceptable to the server configured" + " for <b>{0}</b>. Disconnecting..." + ).format(self.__userName), + filterMsg=False, + ) + self.__connectNetwork("", False, True) + self.__nickName = "" + self.__nickIndex = -1 + return + + self.networkWidget.setNickName(nick) + self.__send("NICK " + nick) + + def __handleNickInUse(self): + """ + Private method to handle a 443 server error. + """ + self.networkWidget.addServerMessage( + self.tr("Critical"), self.tr("The given nickname is already in use.") + ) + + def __changeNick(self, nick): + """ + Private slot to use a new nick name. + + @param nick nick name to use + @type str + """ + if nick and nick != self.__nickName: + self.__send("NICK " + nick) + + def __setChannelTypePrefixes(self, prefixes): + """ + Private method to set the channel type prefixes. + + @param prefixes channel prefix characters + @type str + """ + self.__channelTypePrefixes = prefixes + + def isChannelName(self, name): + """ + Public method to check, if the given name is a channel name. + + @param name name to check + @type str + @return flag indicating a channel name + @rtype bool + """ + if not name: + return False + + if self.__channelTypePrefixes: + return name[0] in self.__channelTypePrefixes + else: + return name[0] in "#&" + + def __away(self, isAway): + """ + Private slot handling the change of the away state. + + @param isAway flag indicating the current away state + @type bool + """ + if isAway and self.__identityName: + identity = self.__ircNetworkManager.getIdentity(self.__identityName) + if identity and identity.rememberAwayPosition(): + for channel in self.__channelList: + channel.setMarkerLine()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/IrcWidget.ui Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>IrcWidget</class> + <widget class="QWidget" name="IrcWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>941</height> + </rect> + </property> + <property name="windowTitle"> + <string/> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Orientation::Vertical</enum> + </property> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Channels</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTabWidget" name="channelsWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>3</verstretch> + </sizepolicy> + </property> + <property name="documentMode"> + <bool>true</bool> + </property> + <property name="tabsClosable"> + <bool>true</bool> + </property> + <property name="movable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Network</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="IrcNetworkWidget" name="networkWidget" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> + <horstretch>0</horstretch> + <verstretch>2</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy"> + <enum>Qt::FocusPolicy::TabFocus</enum> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>IrcNetworkWidget</class> + <extends>QWidget</extends> + <header>ExtensionIrc/IrcNetworkWidget.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <tabstops> + <tabstop>networkWidget</tabstop> + <tabstop>channelsWidget</tabstop> + </tabstops> + <resources/> + <connections/> +</ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/Ui_IrcChannelEditDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,57 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/IrcChannelEditDialog.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcChannelEditDialog(object): + def setupUi(self, IrcChannelEditDialog): + IrcChannelEditDialog.setObjectName("IrcChannelEditDialog") + IrcChannelEditDialog.resize(303, 128) + IrcChannelEditDialog.setSizeGripEnabled(True) + self.gridLayout = QtWidgets.QGridLayout(IrcChannelEditDialog) + self.gridLayout.setObjectName("gridLayout") + self.label = QtWidgets.QLabel(parent=IrcChannelEditDialog) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 0, 0, 1, 1) + self.nameEdit = QtWidgets.QLineEdit(parent=IrcChannelEditDialog) + self.nameEdit.setObjectName("nameEdit") + self.gridLayout.addWidget(self.nameEdit, 0, 1, 1, 1) + self.label_2 = QtWidgets.QLabel(parent=IrcChannelEditDialog) + self.label_2.setObjectName("label_2") + self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) + self.keyEdit = QtWidgets.QLineEdit(parent=IrcChannelEditDialog) + self.keyEdit.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.keyEdit.setObjectName("keyEdit") + self.gridLayout.addWidget(self.keyEdit, 1, 1, 1, 1) + self.autoJoinCheckBox = QtWidgets.QCheckBox(parent=IrcChannelEditDialog) + self.autoJoinCheckBox.setObjectName("autoJoinCheckBox") + self.gridLayout.addWidget(self.autoJoinCheckBox, 2, 0, 1, 2) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=IrcChannelEditDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.gridLayout.addWidget(self.buttonBox, 3, 0, 1, 2) + + self.retranslateUi(IrcChannelEditDialog) + self.buttonBox.accepted.connect(IrcChannelEditDialog.accept) # type: ignore + self.buttonBox.rejected.connect(IrcChannelEditDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(IrcChannelEditDialog) + IrcChannelEditDialog.setTabOrder(self.nameEdit, self.keyEdit) + IrcChannelEditDialog.setTabOrder(self.keyEdit, self.autoJoinCheckBox) + IrcChannelEditDialog.setTabOrder(self.autoJoinCheckBox, self.buttonBox) + + def retranslateUi(self, IrcChannelEditDialog): + _translate = QtCore.QCoreApplication.translate + IrcChannelEditDialog.setWindowTitle(_translate("IrcChannelEditDialog", "IRC Channel")) + self.label.setText(_translate("IrcChannelEditDialog", "Name:")) + self.nameEdit.setToolTip(_translate("IrcChannelEditDialog", "Enter the channel name")) + self.label_2.setText(_translate("IrcChannelEditDialog", "Key:")) + self.keyEdit.setToolTip(_translate("IrcChannelEditDialog", "Enter the channel key/password")) + self.autoJoinCheckBox.setToolTip(_translate("IrcChannelEditDialog", "Select to join this channel automatically")) + self.autoJoinCheckBox.setText(_translate("IrcChannelEditDialog", "Join channel automatically"))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/Ui_IrcChannelWidget.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,71 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/IrcChannelWidget.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcChannelWidget(object): + def setupUi(self, IrcChannelWidget): + IrcChannelWidget.setObjectName("IrcChannelWidget") + IrcChannelWidget.resize(400, 685) + IrcChannelWidget.setWindowTitle("") + self.verticalLayout = QtWidgets.QVBoxLayout(IrcChannelWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setSpacing(3) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.topicLabel = QtWidgets.QLabel(parent=IrcChannelWidget) + self.topicLabel.setText("") + self.topicLabel.setWordWrap(True) + self.topicLabel.setOpenExternalLinks(True) + self.topicLabel.setObjectName("topicLabel") + self.horizontalLayout.addWidget(self.topicLabel) + self.editTopicButton = QtWidgets.QToolButton(parent=IrcChannelWidget) + self.editTopicButton.setText("") + self.editTopicButton.setObjectName("editTopicButton") + self.horizontalLayout.addWidget(self.editTopicButton) + self.verticalLayout.addLayout(self.horizontalLayout) + self.splitter = QtWidgets.QSplitter(parent=IrcChannelWidget) + self.splitter.setOrientation(QtCore.Qt.Orientation.Vertical) + self.splitter.setObjectName("splitter") + self.usersList = QtWidgets.QListWidget(parent=self.splitter) + self.usersList.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) + self.usersList.setAlternatingRowColors(True) + self.usersList.setObjectName("usersList") + self.messages = QtWidgets.QTextBrowser(parent=self.splitter) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(1) + sizePolicy.setHeightForWidth(self.messages.sizePolicy().hasHeightForWidth()) + self.messages.setSizePolicy(sizePolicy) + self.messages.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) + self.messages.setTabChangesFocus(True) + self.messages.setOpenLinks(False) + self.messages.setObjectName("messages") + self.verticalLayout.addWidget(self.splitter) + self.messageEdit = IrcMessageEdit(parent=IrcChannelWidget) + self.messageEdit.setClearButtonEnabled(True) + self.messageEdit.setObjectName("messageEdit") + self.verticalLayout.addWidget(self.messageEdit) + + self.retranslateUi(IrcChannelWidget) + QtCore.QMetaObject.connectSlotsByName(IrcChannelWidget) + IrcChannelWidget.setTabOrder(self.messageEdit, self.messages) + IrcChannelWidget.setTabOrder(self.messages, self.usersList) + IrcChannelWidget.setTabOrder(self.usersList, self.editTopicButton) + + def retranslateUi(self, IrcChannelWidget): + _translate = QtCore.QCoreApplication.translate + self.editTopicButton.setToolTip(_translate("IrcChannelWidget", "Press to change the topic")) + self.usersList.setToolTip(_translate("IrcChannelWidget", "Shows the list of users")) + self.usersList.setSortingEnabled(True) + self.messages.setToolTip(_translate("IrcChannelWidget", "Shows the channel messages")) + self.messageEdit.setToolTip(_translate("IrcChannelWidget", "Enter a message, send by pressing Return or Enter")) + self.messageEdit.setPlaceholderText(_translate("IrcChannelWidget", "Enter a message, send by pressing Return or Enter")) +from ExtensionIrc.IrcMessageEdit import IrcMessageEdit
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/Ui_IrcIdentitiesEditDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,218 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/IrcIdentitiesEditDialog.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcIdentitiesEditDialog(object): + def setupUi(self, IrcIdentitiesEditDialog): + IrcIdentitiesEditDialog.setObjectName("IrcIdentitiesEditDialog") + IrcIdentitiesEditDialog.resize(650, 510) + IrcIdentitiesEditDialog.setSizeGripEnabled(True) + self.verticalLayout = QtWidgets.QVBoxLayout(IrcIdentitiesEditDialog) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.label = QtWidgets.QLabel(parent=IrcIdentitiesEditDialog) + self.label.setObjectName("label") + self.horizontalLayout.addWidget(self.label) + self.identitiesCombo = QtWidgets.QComboBox(parent=IrcIdentitiesEditDialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.identitiesCombo.sizePolicy().hasHeightForWidth()) + self.identitiesCombo.setSizePolicy(sizePolicy) + self.identitiesCombo.setObjectName("identitiesCombo") + self.horizontalLayout.addWidget(self.identitiesCombo) + self.addButton = QtWidgets.QToolButton(parent=IrcIdentitiesEditDialog) + self.addButton.setObjectName("addButton") + self.horizontalLayout.addWidget(self.addButton) + self.copyButton = QtWidgets.QToolButton(parent=IrcIdentitiesEditDialog) + self.copyButton.setObjectName("copyButton") + self.horizontalLayout.addWidget(self.copyButton) + self.renameButton = QtWidgets.QToolButton(parent=IrcIdentitiesEditDialog) + self.renameButton.setObjectName("renameButton") + self.horizontalLayout.addWidget(self.renameButton) + self.deleteButton = QtWidgets.QToolButton(parent=IrcIdentitiesEditDialog) + self.deleteButton.setObjectName("deleteButton") + self.horizontalLayout.addWidget(self.deleteButton) + self.verticalLayout.addLayout(self.horizontalLayout) + self.identityTabWidget = QtWidgets.QTabWidget(parent=IrcIdentitiesEditDialog) + self.identityTabWidget.setObjectName("identityTabWidget") + self.generalTab = QtWidgets.QWidget() + self.generalTab.setObjectName("generalTab") + self.gridLayout_2 = QtWidgets.QGridLayout(self.generalTab) + self.gridLayout_2.setObjectName("gridLayout_2") + self.label_2 = QtWidgets.QLabel(parent=self.generalTab) + self.label_2.setObjectName("label_2") + self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1) + self.realnameEdit = QtWidgets.QLineEdit(parent=self.generalTab) + self.realnameEdit.setObjectName("realnameEdit") + self.gridLayout_2.addWidget(self.realnameEdit, 0, 1, 1, 1) + self.nickNameGroup = QtWidgets.QGroupBox(parent=self.generalTab) + self.nickNameGroup.setObjectName("nickNameGroup") + self.gridLayout = QtWidgets.QGridLayout(self.nickNameGroup) + self.gridLayout.setObjectName("gridLayout") + self.nicknameEdit = QtWidgets.QLineEdit(parent=self.nickNameGroup) + self.nicknameEdit.setObjectName("nicknameEdit") + self.gridLayout.addWidget(self.nicknameEdit, 0, 0, 1, 2) + self.nicknamesList = QtWidgets.QListWidget(parent=self.nickNameGroup) + self.nicknamesList.setAlternatingRowColors(True) + self.nicknamesList.setObjectName("nicknamesList") + self.gridLayout.addWidget(self.nicknamesList, 1, 0, 5, 1) + self.nicknameAddButton = QtWidgets.QToolButton(parent=self.nickNameGroup) + self.nicknameAddButton.setObjectName("nicknameAddButton") + self.gridLayout.addWidget(self.nicknameAddButton, 1, 1, 1, 1) + self.nicknameDeleteButton = QtWidgets.QToolButton(parent=self.nickNameGroup) + self.nicknameDeleteButton.setText("") + self.nicknameDeleteButton.setObjectName("nicknameDeleteButton") + self.gridLayout.addWidget(self.nicknameDeleteButton, 2, 1, 1, 1) + self.nicknameUpButton = QtWidgets.QToolButton(parent=self.nickNameGroup) + self.nicknameUpButton.setObjectName("nicknameUpButton") + self.gridLayout.addWidget(self.nicknameUpButton, 3, 1, 1, 1) + self.nicknameDownButton = QtWidgets.QToolButton(parent=self.nickNameGroup) + self.nicknameDownButton.setObjectName("nicknameDownButton") + self.gridLayout.addWidget(self.nicknameDownButton, 4, 1, 1, 1) + spacerItem = QtWidgets.QSpacerItem(20, 87, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.gridLayout.addItem(spacerItem, 5, 1, 1, 1) + self.gridLayout_2.addWidget(self.nickNameGroup, 1, 0, 1, 2) + self.autoIdentifyGroup = QtWidgets.QGroupBox(parent=self.generalTab) + self.autoIdentifyGroup.setObjectName("autoIdentifyGroup") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.autoIdentifyGroup) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.label_3 = QtWidgets.QLabel(parent=self.autoIdentifyGroup) + self.label_3.setObjectName("label_3") + self.horizontalLayout_2.addWidget(self.label_3) + self.serviceEdit = QtWidgets.QLineEdit(parent=self.autoIdentifyGroup) + self.serviceEdit.setObjectName("serviceEdit") + self.horizontalLayout_2.addWidget(self.serviceEdit) + self.label_4 = QtWidgets.QLabel(parent=self.autoIdentifyGroup) + self.label_4.setObjectName("label_4") + self.horizontalLayout_2.addWidget(self.label_4) + self.passwordEdit = QtWidgets.QLineEdit(parent=self.autoIdentifyGroup) + self.passwordEdit.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.passwordEdit.setObjectName("passwordEdit") + self.horizontalLayout_2.addWidget(self.passwordEdit) + self.showPasswordButton = QtWidgets.QToolButton(parent=self.autoIdentifyGroup) + self.showPasswordButton.setCheckable(True) + self.showPasswordButton.setObjectName("showPasswordButton") + self.horizontalLayout_2.addWidget(self.showPasswordButton) + self.gridLayout_2.addWidget(self.autoIdentifyGroup, 2, 0, 1, 2) + self.identityTabWidget.addTab(self.generalTab, "") + self.awayTab = QtWidgets.QWidget() + self.awayTab.setObjectName("awayTab") + self.gridLayout_5 = QtWidgets.QGridLayout(self.awayTab) + self.gridLayout_5.setObjectName("gridLayout_5") + self.rememberPosOnAwayCheckBox = QtWidgets.QCheckBox(parent=self.awayTab) + self.rememberPosOnAwayCheckBox.setWhatsThis("") + self.rememberPosOnAwayCheckBox.setObjectName("rememberPosOnAwayCheckBox") + self.gridLayout_5.addWidget(self.rememberPosOnAwayCheckBox, 0, 0, 1, 2) + self.label_8 = QtWidgets.QLabel(parent=self.awayTab) + self.label_8.setObjectName("label_8") + self.gridLayout_5.addWidget(self.label_8, 1, 0, 1, 1) + self.awayEdit = QtWidgets.QLineEdit(parent=self.awayTab) + self.awayEdit.setObjectName("awayEdit") + self.gridLayout_5.addWidget(self.awayEdit, 1, 1, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(20, 219, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.gridLayout_5.addItem(spacerItem1, 2, 1, 1, 1) + self.identityTabWidget.addTab(self.awayTab, "") + self.advancedTab = QtWidgets.QWidget() + self.advancedTab.setObjectName("advancedTab") + self.gridLayout_3 = QtWidgets.QGridLayout(self.advancedTab) + self.gridLayout_3.setObjectName("gridLayout_3") + self.label_5 = QtWidgets.QLabel(parent=self.advancedTab) + self.label_5.setObjectName("label_5") + self.gridLayout_3.addWidget(self.label_5, 0, 0, 1, 1) + self.identEdit = QtWidgets.QLineEdit(parent=self.advancedTab) + self.identEdit.setObjectName("identEdit") + self.gridLayout_3.addWidget(self.identEdit, 0, 1, 1, 1) + self.label_6 = QtWidgets.QLabel(parent=self.advancedTab) + self.label_6.setObjectName("label_6") + self.gridLayout_3.addWidget(self.label_6, 1, 0, 1, 1) + self.quitEdit = QtWidgets.QLineEdit(parent=self.advancedTab) + self.quitEdit.setObjectName("quitEdit") + self.gridLayout_3.addWidget(self.quitEdit, 1, 1, 1, 1) + self.label_7 = QtWidgets.QLabel(parent=self.advancedTab) + self.label_7.setObjectName("label_7") + self.gridLayout_3.addWidget(self.label_7, 2, 0, 1, 1) + self.partEdit = QtWidgets.QLineEdit(parent=self.advancedTab) + self.partEdit.setObjectName("partEdit") + self.gridLayout_3.addWidget(self.partEdit, 2, 1, 1, 1) + spacerItem2 = QtWidgets.QSpacerItem(20, 291, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.gridLayout_3.addItem(spacerItem2, 3, 1, 1, 1) + self.identityTabWidget.addTab(self.advancedTab, "") + self.verticalLayout.addWidget(self.identityTabWidget) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=IrcIdentitiesEditDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.verticalLayout.addWidget(self.buttonBox) + + self.retranslateUi(IrcIdentitiesEditDialog) + self.identityTabWidget.setCurrentIndex(0) + self.buttonBox.accepted.connect(IrcIdentitiesEditDialog.accept) # type: ignore + self.buttonBox.rejected.connect(IrcIdentitiesEditDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(IrcIdentitiesEditDialog) + IrcIdentitiesEditDialog.setTabOrder(self.identitiesCombo, self.addButton) + IrcIdentitiesEditDialog.setTabOrder(self.addButton, self.copyButton) + IrcIdentitiesEditDialog.setTabOrder(self.copyButton, self.renameButton) + IrcIdentitiesEditDialog.setTabOrder(self.renameButton, self.deleteButton) + IrcIdentitiesEditDialog.setTabOrder(self.deleteButton, self.identityTabWidget) + IrcIdentitiesEditDialog.setTabOrder(self.identityTabWidget, self.realnameEdit) + IrcIdentitiesEditDialog.setTabOrder(self.realnameEdit, self.nicknameEdit) + IrcIdentitiesEditDialog.setTabOrder(self.nicknameEdit, self.nicknamesList) + IrcIdentitiesEditDialog.setTabOrder(self.nicknamesList, self.nicknameAddButton) + IrcIdentitiesEditDialog.setTabOrder(self.nicknameAddButton, self.nicknameDeleteButton) + IrcIdentitiesEditDialog.setTabOrder(self.nicknameDeleteButton, self.nicknameUpButton) + IrcIdentitiesEditDialog.setTabOrder(self.nicknameUpButton, self.nicknameDownButton) + IrcIdentitiesEditDialog.setTabOrder(self.nicknameDownButton, self.serviceEdit) + IrcIdentitiesEditDialog.setTabOrder(self.serviceEdit, self.passwordEdit) + IrcIdentitiesEditDialog.setTabOrder(self.passwordEdit, self.showPasswordButton) + IrcIdentitiesEditDialog.setTabOrder(self.showPasswordButton, self.rememberPosOnAwayCheckBox) + IrcIdentitiesEditDialog.setTabOrder(self.rememberPosOnAwayCheckBox, self.awayEdit) + IrcIdentitiesEditDialog.setTabOrder(self.awayEdit, self.identEdit) + IrcIdentitiesEditDialog.setTabOrder(self.identEdit, self.quitEdit) + IrcIdentitiesEditDialog.setTabOrder(self.quitEdit, self.partEdit) + + def retranslateUi(self, IrcIdentitiesEditDialog): + _translate = QtCore.QCoreApplication.translate + IrcIdentitiesEditDialog.setWindowTitle(_translate("IrcIdentitiesEditDialog", "IRC Identities")) + self.label.setText(_translate("IrcIdentitiesEditDialog", "Identity:")) + self.identitiesCombo.setToolTip(_translate("IrcIdentitiesEditDialog", "Select the identity to work on")) + self.addButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to add a new identity")) + self.copyButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to copy the selected identity")) + self.renameButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to rename the selected identity")) + self.deleteButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to delete the selected identity")) + self.label_2.setText(_translate("IrcIdentitiesEditDialog", "Real Name:")) + self.realnameEdit.setToolTip(_translate("IrcIdentitiesEditDialog", "Enter the real name")) + self.nickNameGroup.setTitle(_translate("IrcIdentitiesEditDialog", "Nick Names")) + self.nicknameEdit.setToolTip(_translate("IrcIdentitiesEditDialog", "Enter a nick name to add")) + self.nicknameAddButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to add the entered nick name")) + self.nicknameDeleteButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to delete the selected nick name")) + self.nicknameUpButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to move the selected nick name up")) + self.nicknameDownButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to move the selected nick name down")) + self.autoIdentifyGroup.setTitle(_translate("IrcIdentitiesEditDialog", "Auto Identify")) + self.label_3.setText(_translate("IrcIdentitiesEditDialog", "Service:")) + self.serviceEdit.setToolTip(_translate("IrcIdentitiesEditDialog", "Enter the name of the service to identify against")) + self.serviceEdit.setWhatsThis(_translate("IrcIdentitiesEditDialog", "Service name can be <b><i>nickserv</i></b> or a network-dependent name such as <b><i>nickserv@services.dal.net</i></b>")) + self.label_4.setText(_translate("IrcIdentitiesEditDialog", "Password:")) + self.passwordEdit.setToolTip(_translate("IrcIdentitiesEditDialog", "Enter the password")) + self.showPasswordButton.setToolTip(_translate("IrcIdentitiesEditDialog", "Press to show the password")) + self.identityTabWidget.setTabText(self.identityTabWidget.indexOf(self.generalTab), _translate("IrcIdentitiesEditDialog", "General")) + self.rememberPosOnAwayCheckBox.setToolTip(_translate("IrcIdentitiesEditDialog", "Select to mark the current position in the chat, when you send an AWAY command.")) + self.rememberPosOnAwayCheckBox.setText(_translate("IrcIdentitiesEditDialog", "Mark the current position in chat windows when going away")) + self.label_8.setText(_translate("IrcIdentitiesEditDialog", "Away Message:")) + self.awayEdit.setToolTip(_translate("IrcIdentitiesEditDialog", "Enter the message to be sent when going away")) + self.identityTabWidget.setTabText(self.identityTabWidget.indexOf(self.awayTab), _translate("IrcIdentitiesEditDialog", "Away")) + self.label_5.setText(_translate("IrcIdentitiesEditDialog", "Ident:")) + self.identEdit.setToolTip(_translate("IrcIdentitiesEditDialog", "Enter the identity to be used to log-on to the server")) + self.label_6.setText(_translate("IrcIdentitiesEditDialog", "Reason for Quit:")) + self.quitEdit.setToolTip(_translate("IrcIdentitiesEditDialog", "Enter a message to be sent when quitting")) + self.label_7.setText(_translate("IrcIdentitiesEditDialog", "Reason for Part:")) + self.partEdit.setToolTip(_translate("IrcIdentitiesEditDialog", "Enter message to be sent when leaving a channel")) + self.identityTabWidget.setTabText(self.identityTabWidget.indexOf(self.advancedTab), _translate("IrcIdentitiesEditDialog", "Advanced"))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/Ui_IrcNetworkEditDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,110 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/IrcNetworkEditDialog.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcNetworkEditDialog(object): + def setupUi(self, IrcNetworkEditDialog): + IrcNetworkEditDialog.setObjectName("IrcNetworkEditDialog") + IrcNetworkEditDialog.resize(400, 321) + IrcNetworkEditDialog.setSizeGripEnabled(True) + self.gridLayout = QtWidgets.QGridLayout(IrcNetworkEditDialog) + self.gridLayout.setObjectName("gridLayout") + self.label = QtWidgets.QLabel(parent=IrcNetworkEditDialog) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 0, 0, 1, 1) + self.networkEdit = QtWidgets.QLineEdit(parent=IrcNetworkEditDialog) + self.networkEdit.setObjectName("networkEdit") + self.gridLayout.addWidget(self.networkEdit, 0, 1, 1, 2) + self.label_2 = QtWidgets.QLabel(parent=IrcNetworkEditDialog) + self.label_2.setObjectName("label_2") + self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) + self.identityCombo = QtWidgets.QComboBox(parent=IrcNetworkEditDialog) + self.identityCombo.setObjectName("identityCombo") + self.gridLayout.addWidget(self.identityCombo, 1, 1, 1, 1) + self.editIdentitiesButton = QtWidgets.QToolButton(parent=IrcNetworkEditDialog) + self.editIdentitiesButton.setText("") + self.editIdentitiesButton.setObjectName("editIdentitiesButton") + self.gridLayout.addWidget(self.editIdentitiesButton, 1, 2, 1, 1) + self.label_3 = QtWidgets.QLabel(parent=IrcNetworkEditDialog) + self.label_3.setObjectName("label_3") + self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) + self.editServerButton = QtWidgets.QToolButton(parent=IrcNetworkEditDialog) + self.editServerButton.setText("") + self.editServerButton.setObjectName("editServerButton") + self.gridLayout.addWidget(self.editServerButton, 2, 2, 1, 1) + self.label_4 = QtWidgets.QLabel(parent=IrcNetworkEditDialog) + self.label_4.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeading|QtCore.Qt.AlignmentFlag.AlignLeft|QtCore.Qt.AlignmentFlag.AlignTop) + self.label_4.setObjectName("label_4") + self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1) + self.channelList = QtWidgets.QTreeWidget(parent=IrcNetworkEditDialog) + self.channelList.setAlternatingRowColors(True) + self.channelList.setRootIsDecorated(False) + self.channelList.setItemsExpandable(False) + self.channelList.setExpandsOnDoubleClick(False) + self.channelList.setObjectName("channelList") + self.gridLayout.addWidget(self.channelList, 3, 1, 1, 1) + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.addChannelButton = QtWidgets.QToolButton(parent=IrcNetworkEditDialog) + self.addChannelButton.setText("") + self.addChannelButton.setObjectName("addChannelButton") + self.verticalLayout.addWidget(self.addChannelButton) + self.editChannelButton = QtWidgets.QToolButton(parent=IrcNetworkEditDialog) + self.editChannelButton.setText("") + self.editChannelButton.setObjectName("editChannelButton") + self.verticalLayout.addWidget(self.editChannelButton) + self.deleteChannelButton = QtWidgets.QToolButton(parent=IrcNetworkEditDialog) + self.deleteChannelButton.setText("") + self.deleteChannelButton.setObjectName("deleteChannelButton") + self.verticalLayout.addWidget(self.deleteChannelButton) + spacerItem = QtWidgets.QSpacerItem(20, 98, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.gridLayout.addLayout(self.verticalLayout, 3, 2, 1, 1) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=IrcNetworkEditDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.gridLayout.addWidget(self.buttonBox, 4, 0, 1, 3) + self.serverEdit = QtWidgets.QLineEdit(parent=IrcNetworkEditDialog) + self.serverEdit.setReadOnly(True) + self.serverEdit.setObjectName("serverEdit") + self.gridLayout.addWidget(self.serverEdit, 2, 1, 1, 1) + + self.retranslateUi(IrcNetworkEditDialog) + self.buttonBox.accepted.connect(IrcNetworkEditDialog.accept) # type: ignore + self.buttonBox.rejected.connect(IrcNetworkEditDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(IrcNetworkEditDialog) + IrcNetworkEditDialog.setTabOrder(self.networkEdit, self.identityCombo) + IrcNetworkEditDialog.setTabOrder(self.identityCombo, self.editIdentitiesButton) + IrcNetworkEditDialog.setTabOrder(self.editIdentitiesButton, self.serverEdit) + IrcNetworkEditDialog.setTabOrder(self.serverEdit, self.editServerButton) + IrcNetworkEditDialog.setTabOrder(self.editServerButton, self.channelList) + IrcNetworkEditDialog.setTabOrder(self.channelList, self.addChannelButton) + IrcNetworkEditDialog.setTabOrder(self.addChannelButton, self.editChannelButton) + IrcNetworkEditDialog.setTabOrder(self.editChannelButton, self.deleteChannelButton) + IrcNetworkEditDialog.setTabOrder(self.deleteChannelButton, self.buttonBox) + + def retranslateUi(self, IrcNetworkEditDialog): + _translate = QtCore.QCoreApplication.translate + IrcNetworkEditDialog.setWindowTitle(_translate("IrcNetworkEditDialog", "IRC Network")) + self.label.setText(_translate("IrcNetworkEditDialog", "Network Name:")) + self.networkEdit.setToolTip(_translate("IrcNetworkEditDialog", "Enter the name of the IRC network")) + self.label_2.setText(_translate("IrcNetworkEditDialog", "Identity:")) + self.identityCombo.setToolTip(_translate("IrcNetworkEditDialog", "Select the identity to be used for the IRC network")) + self.editIdentitiesButton.setToolTip(_translate("IrcNetworkEditDialog", "Press to edit the identities")) + self.label_3.setText(_translate("IrcNetworkEditDialog", "Server:")) + self.editServerButton.setToolTip(_translate("IrcNetworkEditDialog", "Press to edit the server configuration")) + self.label_4.setText(_translate("IrcNetworkEditDialog", "Channels:")) + self.channelList.headerItem().setText(0, _translate("IrcNetworkEditDialog", "Channel")) + self.channelList.headerItem().setText(1, _translate("IrcNetworkEditDialog", "Join Automatically")) + self.addChannelButton.setToolTip(_translate("IrcNetworkEditDialog", "Press to add a new channel")) + self.editChannelButton.setToolTip(_translate("IrcNetworkEditDialog", "Press to edit the selected channel")) + self.deleteChannelButton.setToolTip(_translate("IrcNetworkEditDialog", "Press to delete the selected channel")) + self.serverEdit.setToolTip(_translate("IrcNetworkEditDialog", "Shows the name of the server"))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/Ui_IrcNetworkListDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,84 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/IrcNetworkListDialog.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcNetworkListDialog(object): + def setupUi(self, IrcNetworkListDialog): + IrcNetworkListDialog.setObjectName("IrcNetworkListDialog") + IrcNetworkListDialog.resize(500, 350) + IrcNetworkListDialog.setSizeGripEnabled(True) + self.gridLayout = QtWidgets.QGridLayout(IrcNetworkListDialog) + self.gridLayout.setObjectName("gridLayout") + self.networksList = QtWidgets.QTreeWidget(parent=IrcNetworkListDialog) + self.networksList.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.networksList.setAlternatingRowColors(True) + self.networksList.setColumnCount(2) + self.networksList.setObjectName("networksList") + self.networksList.headerItem().setText(0, "1") + self.networksList.headerItem().setText(1, "2") + self.networksList.header().setVisible(False) + self.gridLayout.addWidget(self.networksList, 0, 0, 1, 1) + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.newButton = QtWidgets.QPushButton(parent=IrcNetworkListDialog) + self.newButton.setObjectName("newButton") + self.verticalLayout.addWidget(self.newButton) + self.editButton = QtWidgets.QPushButton(parent=IrcNetworkListDialog) + self.editButton.setObjectName("editButton") + self.verticalLayout.addWidget(self.editButton) + self.deleteButton = QtWidgets.QPushButton(parent=IrcNetworkListDialog) + self.deleteButton.setObjectName("deleteButton") + self.verticalLayout.addWidget(self.deleteButton) + self.autoConnectButton = QtWidgets.QPushButton(parent=IrcNetworkListDialog) + self.autoConnectButton.setCheckable(True) + self.autoConnectButton.setObjectName("autoConnectButton") + self.verticalLayout.addWidget(self.autoConnectButton) + self.line = QtWidgets.QFrame(parent=IrcNetworkListDialog) + self.line.setLineWidth(2) + self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.verticalLayout.addWidget(self.line) + self.editIdentitiesButton = QtWidgets.QPushButton(parent=IrcNetworkListDialog) + self.editIdentitiesButton.setObjectName("editIdentitiesButton") + self.verticalLayout.addWidget(self.editIdentitiesButton) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.gridLayout.addLayout(self.verticalLayout, 0, 1, 1, 1) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=IrcNetworkListDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Close) + self.buttonBox.setObjectName("buttonBox") + self.gridLayout.addWidget(self.buttonBox, 1, 0, 1, 2) + + self.retranslateUi(IrcNetworkListDialog) + self.buttonBox.accepted.connect(IrcNetworkListDialog.accept) # type: ignore + self.buttonBox.rejected.connect(IrcNetworkListDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(IrcNetworkListDialog) + IrcNetworkListDialog.setTabOrder(self.networksList, self.newButton) + IrcNetworkListDialog.setTabOrder(self.newButton, self.editButton) + IrcNetworkListDialog.setTabOrder(self.editButton, self.deleteButton) + IrcNetworkListDialog.setTabOrder(self.deleteButton, self.autoConnectButton) + IrcNetworkListDialog.setTabOrder(self.autoConnectButton, self.editIdentitiesButton) + IrcNetworkListDialog.setTabOrder(self.editIdentitiesButton, self.buttonBox) + + def retranslateUi(self, IrcNetworkListDialog): + _translate = QtCore.QCoreApplication.translate + IrcNetworkListDialog.setWindowTitle(_translate("IrcNetworkListDialog", "IRC Networks")) + self.newButton.setToolTip(_translate("IrcNetworkListDialog", "Press to define a new network")) + self.newButton.setText(_translate("IrcNetworkListDialog", "&New...")) + self.editButton.setToolTip(_translate("IrcNetworkListDialog", "Press to edit the selected network")) + self.editButton.setText(_translate("IrcNetworkListDialog", "&Edit...")) + self.deleteButton.setToolTip(_translate("IrcNetworkListDialog", "Press to delete the selected network")) + self.deleteButton.setText(_translate("IrcNetworkListDialog", "&Delete")) + self.autoConnectButton.setToolTip(_translate("IrcNetworkListDialog", "Press to toggle the auto-connect flag of the selected network")) + self.autoConnectButton.setText(_translate("IrcNetworkListDialog", "&Auto-Connect")) + self.editIdentitiesButton.setToolTip(_translate("IrcNetworkListDialog", "Press to edit the identities")) + self.editIdentitiesButton.setText(_translate("IrcNetworkListDialog", "Edit &Identities..."))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/Ui_IrcNetworkWidget.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,97 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/IrcNetworkWidget.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcNetworkWidget(object): + def setupUi(self, IrcNetworkWidget): + IrcNetworkWidget.setObjectName("IrcNetworkWidget") + IrcNetworkWidget.resize(400, 322) + IrcNetworkWidget.setWindowTitle("") + self.verticalLayout = QtWidgets.QVBoxLayout(IrcNetworkWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setSpacing(3) + self.verticalLayout.setObjectName("verticalLayout") + self.messages = QtWidgets.QTextBrowser(parent=IrcNetworkWidget) + self.messages.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) + self.messages.setTabChangesFocus(True) + self.messages.setOpenLinks(False) + self.messages.setObjectName("messages") + self.verticalLayout.addWidget(self.messages) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.networkCombo = QtWidgets.QComboBox(parent=IrcNetworkWidget) + self.networkCombo.setObjectName("networkCombo") + self.horizontalLayout_2.addWidget(self.networkCombo) + self.connectButton = QtWidgets.QToolButton(parent=IrcNetworkWidget) + self.connectButton.setToolTip("") + self.connectButton.setText("") + self.connectButton.setObjectName("connectButton") + self.horizontalLayout_2.addWidget(self.connectButton) + self.awayButton = QtWidgets.QToolButton(parent=IrcNetworkWidget) + self.awayButton.setText("") + self.awayButton.setObjectName("awayButton") + self.horizontalLayout_2.addWidget(self.awayButton) + self.editButton = QtWidgets.QToolButton(parent=IrcNetworkWidget) + self.editButton.setText("") + self.editButton.setObjectName("editButton") + self.horizontalLayout_2.addWidget(self.editButton) + self.verticalLayout.addLayout(self.horizontalLayout_2) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.nickCombo = QtWidgets.QComboBox(parent=IrcNetworkWidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.nickCombo.sizePolicy().hasHeightForWidth()) + self.nickCombo.setSizePolicy(sizePolicy) + self.nickCombo.setEditable(True) + self.nickCombo.setObjectName("nickCombo") + self.horizontalLayout.addWidget(self.nickCombo) + self.line = QtWidgets.QFrame(parent=IrcNetworkWidget) + self.line.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.horizontalLayout.addWidget(self.line) + self.channelCombo = QtWidgets.QComboBox(parent=IrcNetworkWidget) + self.channelCombo.setEnabled(False) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.channelCombo.sizePolicy().hasHeightForWidth()) + self.channelCombo.setSizePolicy(sizePolicy) + self.channelCombo.setEditable(True) + self.channelCombo.setObjectName("channelCombo") + self.horizontalLayout.addWidget(self.channelCombo) + self.joinButton = QtWidgets.QToolButton(parent=IrcNetworkWidget) + self.joinButton.setEnabled(False) + self.joinButton.setText("") + self.joinButton.setObjectName("joinButton") + self.horizontalLayout.addWidget(self.joinButton) + self.verticalLayout.addLayout(self.horizontalLayout) + + self.retranslateUi(IrcNetworkWidget) + QtCore.QMetaObject.connectSlotsByName(IrcNetworkWidget) + IrcNetworkWidget.setTabOrder(self.networkCombo, self.connectButton) + IrcNetworkWidget.setTabOrder(self.connectButton, self.awayButton) + IrcNetworkWidget.setTabOrder(self.awayButton, self.editButton) + IrcNetworkWidget.setTabOrder(self.editButton, self.nickCombo) + IrcNetworkWidget.setTabOrder(self.nickCombo, self.channelCombo) + IrcNetworkWidget.setTabOrder(self.channelCombo, self.joinButton) + IrcNetworkWidget.setTabOrder(self.joinButton, self.messages) + + def retranslateUi(self, IrcNetworkWidget): + _translate = QtCore.QCoreApplication.translate + self.messages.setToolTip(_translate("IrcNetworkWidget", "Shows the network messages")) + self.networkCombo.setToolTip(_translate("IrcNetworkWidget", "Select a network to connect to")) + self.awayButton.setToolTip(_translate("IrcNetworkWidget", "Press to set the user status to AWAY")) + self.editButton.setToolTip(_translate("IrcNetworkWidget", "Press to edit the networks")) + self.nickCombo.setToolTip(_translate("IrcNetworkWidget", "Select a nick name for the channel")) + self.channelCombo.setToolTip(_translate("IrcNetworkWidget", "Enter the channel to join")) + self.joinButton.setToolTip(_translate("IrcNetworkWidget", "Press to join the channel"))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/Ui_IrcServerEditDialog.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,72 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/IrcServerEditDialog.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcServerEditDialog(object): + def setupUi(self, IrcServerEditDialog): + IrcServerEditDialog.setObjectName("IrcServerEditDialog") + IrcServerEditDialog.resize(400, 158) + IrcServerEditDialog.setSizeGripEnabled(True) + self.gridLayout = QtWidgets.QGridLayout(IrcServerEditDialog) + self.gridLayout.setObjectName("gridLayout") + self.label = QtWidgets.QLabel(parent=IrcServerEditDialog) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 0, 0, 1, 1) + self.serverEdit = QtWidgets.QLineEdit(parent=IrcServerEditDialog) + self.serverEdit.setObjectName("serverEdit") + self.gridLayout.addWidget(self.serverEdit, 0, 1, 1, 2) + self.label_2 = QtWidgets.QLabel(parent=IrcServerEditDialog) + self.label_2.setObjectName("label_2") + self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) + self.portSpinBox = QtWidgets.QSpinBox(parent=IrcServerEditDialog) + self.portSpinBox.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter) + self.portSpinBox.setMinimum(1) + self.portSpinBox.setMaximum(65535) + self.portSpinBox.setProperty("value", 6667) + self.portSpinBox.setObjectName("portSpinBox") + self.gridLayout.addWidget(self.portSpinBox, 1, 1, 1, 1) + spacerItem = QtWidgets.QSpacerItem(238, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout.addItem(spacerItem, 1, 2, 1, 1) + self.label_3 = QtWidgets.QLabel(parent=IrcServerEditDialog) + self.label_3.setObjectName("label_3") + self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) + self.passwordEdit = QtWidgets.QLineEdit(parent=IrcServerEditDialog) + self.passwordEdit.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password) + self.passwordEdit.setObjectName("passwordEdit") + self.gridLayout.addWidget(self.passwordEdit, 2, 1, 1, 2) + self.sslCheckBox = QtWidgets.QCheckBox(parent=IrcServerEditDialog) + self.sslCheckBox.setObjectName("sslCheckBox") + self.gridLayout.addWidget(self.sslCheckBox, 3, 0, 1, 3) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=IrcServerEditDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.gridLayout.addWidget(self.buttonBox, 4, 0, 1, 3) + + self.retranslateUi(IrcServerEditDialog) + self.buttonBox.accepted.connect(IrcServerEditDialog.accept) # type: ignore + self.buttonBox.rejected.connect(IrcServerEditDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(IrcServerEditDialog) + IrcServerEditDialog.setTabOrder(self.serverEdit, self.portSpinBox) + IrcServerEditDialog.setTabOrder(self.portSpinBox, self.passwordEdit) + IrcServerEditDialog.setTabOrder(self.passwordEdit, self.sslCheckBox) + IrcServerEditDialog.setTabOrder(self.sslCheckBox, self.buttonBox) + + def retranslateUi(self, IrcServerEditDialog): + _translate = QtCore.QCoreApplication.translate + IrcServerEditDialog.setWindowTitle(_translate("IrcServerEditDialog", "IRC Server")) + self.label.setText(_translate("IrcServerEditDialog", "Server:")) + self.serverEdit.setToolTip(_translate("IrcServerEditDialog", "Enter the host name of the IRC server")) + self.label_2.setText(_translate("IrcServerEditDialog", "Port:")) + self.portSpinBox.setToolTip(_translate("IrcServerEditDialog", "Enter the port number")) + self.label_3.setText(_translate("IrcServerEditDialog", "Password:")) + self.passwordEdit.setToolTip(_translate("IrcServerEditDialog", "Enter the server password")) + self.sslCheckBox.setToolTip(_translate("IrcServerEditDialog", "Select to use an SSL encrypted connection")) + self.sslCheckBox.setText(_translate("IrcServerEditDialog", "Use Encrypted Connection (SSL)"))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/Ui_IrcWidget.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,61 @@ +# Form implementation generated from reading ui file 'ExtensionIrc/IrcWidget.ui' +# +# Created by: PyQt6 UI code generator 6.9.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_IrcWidget(object): + def setupUi(self, IrcWidget): + IrcWidget.setObjectName("IrcWidget") + IrcWidget.resize(400, 941) + IrcWidget.setWindowTitle("") + self.verticalLayout_3 = QtWidgets.QVBoxLayout(IrcWidget) + self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.splitter = QtWidgets.QSplitter(parent=IrcWidget) + self.splitter.setOrientation(QtCore.Qt.Orientation.Vertical) + self.splitter.setObjectName("splitter") + self.groupBox = QtWidgets.QGroupBox(parent=self.splitter) + self.groupBox.setObjectName("groupBox") + self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox) + self.verticalLayout.setObjectName("verticalLayout") + self.channelsWidget = QtWidgets.QTabWidget(parent=self.groupBox) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(3) + sizePolicy.setHeightForWidth(self.channelsWidget.sizePolicy().hasHeightForWidth()) + self.channelsWidget.setSizePolicy(sizePolicy) + self.channelsWidget.setDocumentMode(True) + self.channelsWidget.setTabsClosable(True) + self.channelsWidget.setMovable(True) + self.channelsWidget.setObjectName("channelsWidget") + self.verticalLayout.addWidget(self.channelsWidget) + self.groupBox_2 = QtWidgets.QGroupBox(parent=self.splitter) + self.groupBox_2.setObjectName("groupBox_2") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.networkWidget = IrcNetworkWidget(parent=self.groupBox_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(2) + sizePolicy.setHeightForWidth(self.networkWidget.sizePolicy().hasHeightForWidth()) + self.networkWidget.setSizePolicy(sizePolicy) + self.networkWidget.setFocusPolicy(QtCore.Qt.FocusPolicy.TabFocus) + self.networkWidget.setObjectName("networkWidget") + self.verticalLayout_2.addWidget(self.networkWidget) + self.verticalLayout_3.addWidget(self.splitter) + + self.retranslateUi(IrcWidget) + QtCore.QMetaObject.connectSlotsByName(IrcWidget) + IrcWidget.setTabOrder(self.networkWidget, self.channelsWidget) + + def retranslateUi(self, IrcWidget): + _translate = QtCore.QCoreApplication.translate + self.groupBox.setTitle(_translate("IrcWidget", "Channels")) + self.groupBox_2.setTitle(_translate("IrcWidget", "Network")) +from ExtensionIrc.IrcNetworkWidget import IrcNetworkWidget
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/__init__.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package containing the IRC modules. +"""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/i18n/irc_de.ts Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2061 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="de_DE"> + <context> + <name>IrcChannelEditDialog</name> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>IRC Channel</source> + <translation>IRC Kanal</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Name:</source> + <translation>Name:</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel name</source> + <translation>Gib den Kanalnamen ein</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Key:</source> + <translation>Schlüssel:</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel key/password</source> + <translation>Gib den Kanalschlüssel/das Kanalkennwort ein</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Select to join this channel automatically</source> + <translation>Auswählen, um diesem Kanal automatisch zu betreten</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Join channel automatically</source> + <translation>Dem Kanal automatisch betreten</translation> + </message> + </context> + <context> + <name>IrcChannelWidget</name> + <message> + <location filename="../IrcChannelWidget.py" line="1685" /> + <location filename="../IrcChannelWidget.py" line="1620" /> + <location filename="../IrcChannelWidget.py" line="453" /> + <source>Send Message</source> + <translation>Nachricht senden</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="454" /> + <source>Messages starting with a '/' are not allowed in private chats.</source> + <translation>Nachrichten, die mit „/“ beginnen, sind in privaten Unterhaltungen nicht zugelassen.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="570" /> + <source>Leave IRC channel</source> + <translation>IRC-Kanal verlassen</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="571" /> + <source>Do you really want to leave the IRC channel <b>{0}</b>?</source> + <translation>Soll der IRC-Kanal <b>{0}</b> wirklich verlassen werden?</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="740" /> + <source>Channel Message</source> + <translation>Kanalnachricht</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="747" /> + <source>Nick mentioned</source> + <translation>Nick erwähnt</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="778" /> + <source>{0} has joined the channel {1} ({2}).</source> + <translation>{0} hat den Kanal {1} betreten ({2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="783" /> + <source>You have joined the channel {0} ({1}).</source> + <translation>Sie sind dem Kanal {0} betreten.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="791" /> + <source>Join Channel</source> + <translation>Kanal betreten</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="811" /> + <source>{0} has left {1}.</source> + <translation>{0} hat den Kanal {1} verlassen.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="818" /> + <location filename="../IrcChannelWidget.py" line="815" /> + <source>{0} has left {1}: {2}.</source> + <translation>{0} hat den Kanal {1} verlassen: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="826" /> + <source>Leave Channel</source> + <translation>Kanal verlassen</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="846" /> + <source>{0} has quit {1}.</source> + <translation>{0} hat den Server verlassen.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="849" /> + <source>{0} has quit {1}: {2}.</source> + <translation>{0} hat den Server verlassen: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="857" /> + <source>Quit</source> + <translation>Server verlassen</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="878" /> + <source>You are now known as {0}.</source> + <translation>Sie sind jetzt als {0} bekannt.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="884" /> + <source>User {0} is now known as {1}.</source> + <translation>Nutzer {0} ist nun als {1} bekannt.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="929" /> + <source>Away</source> + <translation>Abwesend</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="930" /> + <source>{0} is away: {1}</source> + <translation>{0} ist abwesend: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="950" /> + <source>The channel topic is: "{0}".</source> + <translation>Das Kanalthema ist: „{0}“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="969" /> + <source>The topic was set by {0} on {1}.</source> + <translation>Das Thema wurde am {0} durch {1} gesetzt.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="992" /> + <source>Channel URL: {0}</source> + <translation>Kanal-URL: {0}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1017" /> + <source>password protected ({0})</source> + <translation>Kennwortgeschützt ({0})</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1020" /> + <source>limited to %n user(s)</source> + <translation> + <numerusform>auf einen Nutzer begrenzt</numerusform> + <numerusform>auf %n Nutzer begrenzt</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1028" /> + <source>Channel modes: {0}.</source> + <translation>Kanalmodi: {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1047" /> + <source>This channel was created on {0}.</source> + <translation>Dieser Kanal wurde am {0} erstellt.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1084" /> + <source>{0} sets the channel mode to 'anonymous'.</source> + <translation>{0} setzt den Kanalmodus „anonym“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1088" /> + <source>{0} removes the 'anonymous' mode from the channel.</source> + <translation>{0} entfernt den Kanalmodus „anonym“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1093" /> + <source>{0} sets a ban on {1}.</source> + <translation>{0} verhängt einen Bann auf {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1097" /> + <source>{0} removes the ban on {1}.</source> + <translation>{0} entfernt den Bann von {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1102" /> + <source>{0} sets the channel mode to 'no colors allowed'.</source> + <translation>{0} setzt den Kanalmodus „keine Farben zugelassen“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1106" /> + <source>{0} sets the channel mode to 'allow color codes'.</source> + <translation>{0} setzt den Kanalmodus „Farben zugelassen“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1111" /> + <source>{0} sets a ban exception on {1}.</source> + <translation>{0} setzt eine Bannausnahme auf {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1115" /> + <source>{0} removes the ban exception on {1}.</source> + <translation>{0} entfernt die Bannausnahme auf {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1120" /> + <source>{0} sets the channel mode to 'invite only'.</source> + <translation>{0} setzt den Kanalmodus „Einladung erforderlich“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1124" /> + <source>{0} removes the 'invite only' mode from the channel.</source> + <translation>{0} entfernt den Kanalmodus „Einladung erforderlich“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1129" /> + <source>{0} sets the channel key to '{1}'.</source> + <translation>{0} setzt den Kanalschlüssel „{1}“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1133" /> + <source>{0} removes the channel key.</source> + <translation>{0} entfernt den Kanalschlüssel.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1136" /> + <source>{0} sets the channel limit to %n nick(s).</source> + <translation> + <numerusform>{0} setzt die Kanalbegrenzung auf einen Nutzer.</numerusform> + <numerusform>{0} setzt die Kanalbegrenzung auf %n Nutzer.</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1142" /> + <source>{0} removes the channel limit.</source> + <translation>{0} entfernt die Kanalbegrenzung.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1145" /> + <source>{0} sets the channel mode to 'moderated'.</source> + <translation>{0} setzt den Kanalmodus „modereriert“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1149" /> + <source>{0} sets the channel mode to 'unmoderated'.</source> + <translation>{0} setzt den Kanalmodus „unmoderiert“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1154" /> + <source>{0} sets the channel mode to 'no messages from outside'.</source> + <translation>{0} setzt den Kanalmodus „keine Nachrichten von außerhalb“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1159" /> + <source>{0} sets the channel mode to 'allow messages from outside'.</source> + <translation>{0} setzt den Kanalmodus „Nachrichten von außerhalb zugelassen“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1165" /> + <source>{0} sets the channel mode to 'private'.</source> + <translation>{0} setzt den Kanalmodus „privat“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1169" /> + <source>{0} sets the channel mode to 'public'.</source> + <translation>{0} setzt den Kanalmodus „öffentlich“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1174" /> + <source>{0} sets the channel mode to 'quiet'.</source> + <translation>{0} setzt den Kanalmodus „schweigend“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1178" /> + <source>{0} removes the 'quiet' mode from the channel.</source> + <translation>{0} entfernt den Kanalmodus „schweigend“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1185" /> + <source>{0} sets the channel mode to 'secret'.</source> + <translation>{0} setzt den Kanalmodus „unsichtbar“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1189" /> + <source>{0} sets the channel mode to 'visible'.</source> + <translation>{0} setzt den Kanalmodus „sichtbar“.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1194" /> + <source>{0} switches on 'topic protection'.</source> + <translation>{0} schaltet den „Themenschutz“ an.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1198" /> + <source>{0} switches off 'topic protection'.</source> + <translation>{0} schaltet den „Themenschutz“ aus.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1203" /> + <source>{0} sets invitation mask {1}.</source> + <translation>{0} setzt die Einladungsmaske {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1207" /> + <source>{0} removes the invitation mask {1}.</source> + <translation>{0} entfernt die Einladungsmaske {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1211" /> + <source>Mode</source> + <translation>Modus</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1233" /> + <source>{0} sets mode for {1}: {2}.</source> + <translation>{0} setzt den Modus für {1}: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1265" /> + <source>Help</source> + <translation>Hilfe</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1318" /> + <location filename="../IrcChannelWidget.py" line="1308" /> + <location filename="../IrcChannelWidget.py" line="1300" /> + <location filename="../IrcChannelWidget.py" line="1292" /> + <source>CTCP</source> + <translation>CTCP</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1293" /> + <source>Received Version request from {0}.</source> + <translation>Versionsanfrage von {0} empfangen.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1301" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation>CTCP-PING-Anfrage von {0} empfangen, Antwort wird gesendet.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1309" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation>CTCP-CLIENTINFO-Anfrage von {0} empfangen, Antwort wird gesendet.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1319" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation>Unbekannte CTCP-{0}-Anfrage von {1} empfangen.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1419" /> + <source>--- New From Here ---</source> + <translation>--- Neu ab hier ---</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1503" /> + <location filename="../IrcChannelWidget.py" line="1486" /> + <source>Save Messages</source> + <translation>Nachrichten speichern</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1488" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation>HTML-Dateien (*.{0});;Textdateien (*.txt);;Alle Dateien (*)</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1504" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>Die Datei <b>{0}</b> existiert bereits. Überschreiben?</p></translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1524" /> + <source>Error saving Messages</source> + <translation>Fehler beim Speichern der Nachrichten</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1525" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation><p>Der Nachrichteninhalt konnte nicht nach <b>{0}</b> gespeichert werden.</p><p>Ursache: {1}</p></translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1537" /> + <source>Copy</source> + <translation>Kopieren</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1542" /> + <source>Cut all</source> + <translation>Alles ausschneiden</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1547" /> + <source>Copy all</source> + <translation>Alles kopieren</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1553" /> + <source>Clear</source> + <translation>Löschen</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1558" /> + <source>Save</source> + <translation>Speichern</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1562" /> + <source>Mark Current Position</source> + <translation>Aktuellen Position markieren</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1565" /> + <source>Remove Position Marker</source> + <translation>Positionsmarke entfernen</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1653" /> + <location filename="../IrcChannelWidget.py" line="1637" /> + <location filename="../IrcChannelWidget.py" line="1621" /> + <source>Enter the message to be sent:</source> + <translation>Gib die zu sendende Mitteilung ein:</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1688" /> + <location filename="../IrcChannelWidget.py" line="1636" /> + <source>Send Query</source> + <translation>Query senden</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1691" /> + <location filename="../IrcChannelWidget.py" line="1652" /> + <source>Send Notice</source> + <translation>Notice senden</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1678" /> + <source>Who Is</source> + <translation>Who Is</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1681" /> + <source>Private Chat</source> + <translation>Private Unterhaltung</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1695" /> + <source>Send Ping</source> + <translation>Ping senden</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1698" /> + <source>Ignore User</source> + <translation>Nutzer ignorieren</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1702" /> + <source>Refresh</source> + <translation>Aktualisieren</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1826" /> + <location filename="../IrcChannelWidget.py" line="1800" /> + <source>Who</source> + <translation>Who</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1801" /> + <source>End of WHO list for {0}.</source> + <translation>Ende der WHO-Liste für {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1824" /> + <source> (Away)</source> + <translation> (Abwesend)</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1827" /> + <source>{0} is {1}@{2} ({3}){4}</source> + <translation>{0} ist {1}@{2} ({3}){4}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2216" /> + <location filename="../IrcChannelWidget.py" line="2195" /> + <location filename="../IrcChannelWidget.py" line="2174" /> + <location filename="../IrcChannelWidget.py" line="2151" /> + <location filename="../IrcChannelWidget.py" line="2131" /> + <location filename="../IrcChannelWidget.py" line="2111" /> + <location filename="../IrcChannelWidget.py" line="2091" /> + <location filename="../IrcChannelWidget.py" line="2068" /> + <location filename="../IrcChannelWidget.py" line="2060" /> + <location filename="../IrcChannelWidget.py" line="2052" /> + <location filename="../IrcChannelWidget.py" line="2041" /> + <location filename="../IrcChannelWidget.py" line="2022" /> + <location filename="../IrcChannelWidget.py" line="1988" /> + <location filename="../IrcChannelWidget.py" line="1983" /> + <location filename="../IrcChannelWidget.py" line="1960" /> + <location filename="../IrcChannelWidget.py" line="1937" /> + <location filename="../IrcChannelWidget.py" line="1930" /> + <location filename="../IrcChannelWidget.py" line="1923" /> + <location filename="../IrcChannelWidget.py" line="1916" /> + <location filename="../IrcChannelWidget.py" line="1909" /> + <location filename="../IrcChannelWidget.py" line="1902" /> + <location filename="../IrcChannelWidget.py" line="1851" /> + <source>Whois</source> + <translation>Whois</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1852" /> + <source>{0} is {1}@{2} ({3}).</source> + <translation>{0} ist {1}@{2} ({3}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1903" /> + <source>{0} is a user on channels: {1}</source> + <translation>{0} ist ein Nutzer der Kanäle: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1910" /> + <source>{0} has voice on channels: {1}</source> + <translation>{0} hat Erlaubnis zu schreiben in den Kanälen: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1917" /> + <source>{0} is a halfop on channels: {1}</source> + <translation>{0} hat HalfOp-Status in den Kanälen: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1924" /> + <source>{0} is an operator on channels: {1}</source> + <translation>{0} hat Operator-Status in den Kanälen: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1931" /> + <source>{0} is owner of channels: {1}</source> + <translation>{0} hat Besitzer-Status in den Kanälen: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1938" /> + <source>{0} is admin on channels: {1}</source> + <translation>{0} hat Administrator-Status in den Kanälen: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1961" /> + <source>{0} is online via {1} ({2}).</source> + <translation>{0} ist auf dem Server {1} ({2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1984" /> + <source>{0} is an IRC Operator.</source> + <translation>{0} ist ein IRC-Operator.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2017" /> + <source>%n day(s)</source> + <translation> + <numerusform>%n Tag</numerusform> + <numerusform>%n Tage</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2037" /> + <location filename="../IrcChannelWidget.py" line="2018" /> + <source>%n hour(s)</source> + <translation> + <numerusform>%n Stunde</numerusform> + <numerusform>%n Stunden</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2049" /> + <location filename="../IrcChannelWidget.py" line="2038" /> + <location filename="../IrcChannelWidget.py" line="2019" /> + <source>%n minute(s)</source> + <translation> + <numerusform>%n Minute</numerusform> + <numerusform>%n Minuten</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2050" /> + <location filename="../IrcChannelWidget.py" line="2039" /> + <location filename="../IrcChannelWidget.py" line="2020" /> + <source>%n second(s)</source> + <translation> + <numerusform>%n Sekunde</numerusform> + <numerusform>%n Sekunden</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2023" /> + <source>{0} has been idle for {1}, {2}, {3}, and {4}.</source> + <comment>{0} = name of person, {1} = (x days), {2} = (x hours), {3} = (x minutes), {4} = (x seconds)</comment> + <translation>{0} ist seit {1}, {2}, {3} und {4} untätig.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2042" /> + <source>{0} has been idle for {1}, {2}, and {3}.</source> + <comment>{0} = name of person, {1} = (x hours), {2} = (x minutes), {3} = (x seconds)</comment> + <translation>{0} ist seit {1}, {2} und {3} untätig.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2053" /> + <source>{0} has been idle for {1} and {2}.</source> + <comment>{0} = name of person, {1} = (x minutes), {3} = (x seconds)</comment> + <translation>{0} ist seit {1} und {2} untätig.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2061" /> + <source>{0} has been idle for %n second(s).</source> + <translation> + <numerusform>{0} ist seit %n Sekunde untätig.</numerusform> + <numerusform>{0} ist seit %n Sekunden untätig.</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2069" /> + <source>{0} has been online since {1}.</source> + <translation>{0} is seit dem {1} online.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2092" /> + <source>End of WHOIS list for {0}.</source> + <translation>Ende der WHOIS Liste für {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2112" /> + <source>{0} is an identified user.</source> + <translation>{0} wurde identifiziert.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2132" /> + <source>{0} is available for help.</source> + <translation>{0} steht für Hilfe bereit.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2152" /> + <source>{0} is logged in as {1}.</source> + <translation>{0} ist angemeldet als {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2175" /> + <source>{0} is actually using the host {1} (IP: {2}).</source> + <translation>{0} verwendet den Host {1} (IP: {2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2196" /> + <source>{0} is using a secure connection.</source> + <translation>{0} verwendet eine sichere Verbindung.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2217" /> + <source>{0} is connecting from {1} (IP: {2}).</source> + <translation>{0} ist verbunden von {1} (IP: {2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2240" /> + <source>Edit Channel Topic</source> + <translation>Kanalthema bearbeiten</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2241" /> + <source>Enter the topic for this channel:</source> + <translation>Gib das Thema für diesen Kanal ein:</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Press to change the topic</source> + <translation>Drücken, um das Thema zu ändern</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the list of users</source> + <translation>Zeigt die Liste der Teilnehmer</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the channel messages</source> + <translation>Zeigt die Kanalnachrichten</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Enter a message, send by pressing Return or Enter</source> + <translation>Gib eine Nachricht ein, Senden durch Drücken von Return oder Enter</translation> + </message> + </context> + <context> + <name>IrcExtensionPlugin</name> + <message> + <location filename="../../PluginExtensionIrc.py" line="190" /> + <location filename="../../PluginExtensionIrc.py" line="186" /> + <location filename="../../PluginExtensionIrc.py" line="71" /> + <source>IRC</source> + <translation>IRC</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="191" /> + <source>&IRC</source> + <translation>&IRC</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="192" /> + <source>Ctrl+Alt+Shift+I</source> + <translation>Ctrl+Alt+Shift+I</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="198" /> + <source>Switch the input focus to the IRC window.</source> + <translation>Schalte den Eingabefokus auf das IRC-Fenster um.</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="201" /> + <source><b>Activate IRC</b><p>This switches the input focus to the IRC window.</p></source> + <translation><b>IRC aktivieren</b><p>Dies schaltet den Eingabefokus auf das IRC-Fenster um.</p></translation> + </message> + </context> + <context> + <name>IrcIdentitiesEditDialog</name> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>IRC Identities</source> + <translation>IRC Identitäten</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation>Identität:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select the identity to work on</source> + <translation>Wähle die zu bearbeitende Identität</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add a new identity</source> + <translation>Drücken, um eine neue Identität hinzuzufügen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to copy the selected identity</source> + <translation>Drücken, um die ausgewählte Identität zu kopieren</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to rename the selected identity</source> + <translation>Drücken, um die ausgewählte Identität umzubenennen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected identity</source> + <translation>Drücken, um die ausgewählte Identität zu löschen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>General</source> + <translation>Allgemein</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Real Name:</source> + <translation>Realer Name:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the real name</source> + <translation>Gib den realen Namen ein</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Nick Names</source> + <translation>Spitznamen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a nick name to add</source> + <translation>Gib einen hinzuzufügenden Spitznamen ein</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add the entered nick name</source> + <translation>Drücken, um den eingegebenen Spitznamen hinzuzufügen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected nick name</source> + <translation>Drücken, um den ausgewählten Spitznamen zu löschen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name up</source> + <translation>Drücken, um den ausgewählten Spitznamen nach oben zu schieben</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name down</source> + <translation>Drücken, um den ausgewählten Spitznamen nach unten zu schieben</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Auto Identify</source> + <translation>Automatisch identifizieren</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service:</source> + <translation>Dienst:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the name of the service to identify against</source> + <translation>Gib den Namen des Dienstes ein, bei dem identifiziert werden soll</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service name can be <b><i>nickserv</i></b> or a network-dependent name such as <b><i>nickserv@services.dal.net</i></b></source> + <translation>Der Dienstname kann <b><i>nickserv</i></b> oder ein Netzwerk abhängiger Name wie <b><i>nickserv@services.dal.net</i></b> sein</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Password:</source> + <translation>Kennwort:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the password</source> + <translation>Gib das Kennwort ein</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="506" /> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to show the password</source> + <translation>Drücken, um das Kennwort anzuzeigen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away</source> + <translation>Abwesend</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select to mark the current position in the chat, when you send an AWAY command.</source> + <translation>Auswählen, um die aktuelle Position im Kanalfenster zu markieren, wenn ein AWAY Befehl geschickt wird.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Mark the current position in chat windows when going away</source> + <translation>Aktuelle Position in den Kanalfenstern markieren, wenn Status „Abwesend“ gesetzt wird</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away Message:</source> + <translation>Abwesenhaitsnachricht:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the message to be sent when going away</source> + <translation>Gib die Nachricht ein, die gesendet wird, wenn Sie abwesend sind</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Advanced</source> + <translation>Erweitert</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Ident:</source> + <translation>Ident:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the identity to be used to log-on to the server</source> + <translation>Gib die Identität ein, die zum Anmelden am Server verwendet werden soll</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Quit:</source> + <translation>Grund für Quit:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a message to be sent when quitting</source> + <translation>Gib eine Nachricht ein, die beim Verlassen des Servers geschickt wird</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Part:</source> + <translation>Grund für Verlassen:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter message to be sent when leaving a channel</source> + <translation>Gib eine Nachricht ein, die beim Verlassen eines Kanals geschickt wird</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="206" /> + <location filename="../IrcIdentitiesEditDialog.py" line="188" /> + <source>Edit Identity</source> + <translation>Identität bearbeiten</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="189" /> + <source>The identity must contain at least one nick name.</source> + <translation>Die Identität muss mindestens einen Spitznamen enthalten.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="207" /> + <source>The identity must have a real name.</source> + <translation>Die Identität muss einen realen namen enthalten.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="259" /> + <location filename="../IrcIdentitiesEditDialog.py" line="240" /> + <location filename="../IrcIdentitiesEditDialog.py" line="230" /> + <source>Add Identity</source> + <translation>Identität hinzufügen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="315" /> + <location filename="../IrcIdentitiesEditDialog.py" line="273" /> + <location filename="../IrcIdentitiesEditDialog.py" line="231" /> + <source>Identity Name:</source> + <translation>Name der Identität:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="326" /> + <location filename="../IrcIdentitiesEditDialog.py" line="284" /> + <location filename="../IrcIdentitiesEditDialog.py" line="241" /> + <source>An identity named <b>{0}</b> already exists. You must provide a different name.</source> + <translation>Eine Identität mit Namen <b>{0}</b> existiert bereits. Sie müssen einen anderen Namen angeben.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="343" /> + <location filename="../IrcIdentitiesEditDialog.py" line="302" /> + <location filename="../IrcIdentitiesEditDialog.py" line="260" /> + <source>The identity has to have a name.</source> + <translation>Die Identität muss einen Namen haben.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="342" /> + <location filename="../IrcIdentitiesEditDialog.py" line="301" /> + <location filename="../IrcIdentitiesEditDialog.py" line="283" /> + <location filename="../IrcIdentitiesEditDialog.py" line="272" /> + <source>Copy Identity</source> + <translation>Identität kopieren</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="325" /> + <location filename="../IrcIdentitiesEditDialog.py" line="314" /> + <source>Rename Identity</source> + <translation>Identität umbenennen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="366" /> + <source>This identity is in use. If you remove it, the network settings using it will fall back to the default identity. Should it be deleted anyway?</source> + <translation>Diese Identität wird genutzt. Wenn Sie sie löschen, werden alle Netzwerkeinstellungen, die diese Identität verwenden auf die Standardidentität wechseln. Soll sie trotzdem gelöscht werden?</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="372" /> + <source>Do you really want to delete all information for this identity?</source> + <translation>Sollen wirklich alle Informationen dieser Identität gelöscht werden?</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="377" /> + <source>Delete Identity</source> + <translation>Identität löschen</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="502" /> + <source>Press to hide the password</source> + <translation>Drücken, um das Kennwort auszublenden</translation> + </message> + </context> + <context> + <name>IrcIdentity</name> + <message> + <location filename="../IrcNetworkManager.py" line="26" /> + <source>Default Identity</source> + <translation>Standardidentität</translation> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="30" /> + <source>Gone away for now.</source> + <translation>Bin bis auf weiteres weg.</translation> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="32" /> + <location filename="../IrcNetworkManager.py" line="31" /> + <source>IRC for eric IDE</source> + <translation>IRC Client der eric IDE</translation> + </message> + </context> + <context> + <name>IrcNetworkEditDialog</name> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>IRC Network</source> + <translation>IRC Netzwerk</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Network Name:</source> + <translation>Netzwerkname:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Enter the name of the IRC network</source> + <translation>Gib den Namen des IRC Netzwerkes ein</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation>Identität:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Select the identity to be used for the IRC network</source> + <translation>Wähle die Identität uas, die für das IRC Netzwerk verwendet werden soll</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation>Drücken, um die Identitäten zu bearbeiten</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Server:</source> + <translation>Server:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the server configuration</source> + <translation>Drücken, um die Server Konfiguration zu bearbeiten</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channels:</source> + <translation>Kanäle:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channel</source> + <translation>Kanal</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Join Automatically</source> + <translation>Automatisch betreten</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to add a new channel</source> + <translation>Drücken, um einen neuen Kanal hinzuzufügen</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the selected channel</source> + <translation>Drücken, um den ausgewählten Kanal zu bearbeiten</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to delete the selected channel</source> + <translation>Drücken, um den ausgewählten Kanal zu löschen</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Shows the name of the server</source> + <translation>Zeigt den Namen des Server</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="261" /> + <location filename="../IrcNetworkEditDialog.py" line="255" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>Yes</source> + <translation>Ja</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="263" /> + <location filename="../IrcNetworkEditDialog.py" line="257" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>No</source> + <translation>Nein</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="192" /> + <source>Delete Channel</source> + <translation>Kanal löschen</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="193" /> + <source>Do you really want to delete channel <b>{0}</b>?</source> + <translation>Soll der Kanal <b>{0}</b> wirklich gelöscht werden?</translation> + </message> + </context> + <context> + <name>IrcNetworkListDialog</name> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>IRC Networks</source> + <translation>IRC Netzwerke</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to define a new network</source> + <translation>Drücken, um ein neues Netzwerk zu definieren</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&New...</source> + <translation>&Neu...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the selected network</source> + <translation>Drücken, um das ausgewählte Netzwerk zu bearbeiten</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Edit...</source> + <translation>&Bearbeiten...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to delete the selected network</source> + <translation>Drücken, um das ausgewählte Netzwerk zu löschen</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Delete</source> + <translation>&Löschen</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to toggle the auto-connect flag of the selected network</source> + <translation>Drücken, um die automatische Verbindung zum ausgewählten Netzwerk umzuschalten</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Auto-Connect</source> + <translation>&Automatisch Verbinden</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation>Drücken, um die Identitäten zu bearbeiten</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Edit &Identities...</source> + <translation>&Identitäten bearbeiten...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>Yes</source> + <translation>Ja</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>No</source> + <translation>Nein</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="91" /> + <source>Identity</source> + <translation>Identität</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="94" /> + <source>Server</source> + <translation>Server</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="97" /> + <source>Channels</source> + <translation>Kanäle</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="252" /> + <location filename="../IrcNetworkListDialog.py" line="99" /> + <source>Auto-Connect</source> + <translation>Automatisch Verbinden</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="170" /> + <source>Delete Irc Network</source> + <translation>IRC Netzwerk löschen</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="171" /> + <source>Do you really want to delete IRC network <b>{0}</b>?</source> + <translation>Soll das IRC Netzwerk <b>{0}</b> wirklich gelöscht werden?</translation> + </message> + </context> + <context> + <name>IrcNetworkWidget</name> + <message> + <location filename="../IrcNetworkWidget.py" line="354" /> + <source>Press to disconnect from the network</source> + <translation>Drücken, um die Verbindung zum Netzwerk zu beenden</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="359" /> + <source>Press to connect to the selected network</source> + <translation>Drücken, um zum ausgewählten Netzwerk zu verbinden</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="450" /> + <location filename="../IrcNetworkWidget.py" line="433" /> + <source>Save Messages</source> + <translation>Nachrichten speichern</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="435" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation>HTML-Dateien (*.{0});;Textdateien (*.txt);;Alle Dateien (*)</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="451" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>Die Datei <b>{0}</b> existiert bereits. Überschreiben?</p></translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="471" /> + <source>Error saving Messages</source> + <translation>Fehler beim Speichern der Nachrichten</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="472" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation><p>Der Nachrichteninhalt konnte nicht nach <b>{0}</b> gespeichert werden.</p><p>Ursache: {1}</p></translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="484" /> + <source>Copy</source> + <translation>Kopieren</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="489" /> + <source>Cut all</source> + <translation>Alles ausschneiden</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="494" /> + <source>Copy all</source> + <translation>Alles kopieren</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="500" /> + <source>Clear</source> + <translation>Löschen</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="505" /> + <source>Save</source> + <translation>Speichern</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Shows the network messages</source> + <translation>Zeigt Netzwerkmeldungen an</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a network to connect to</source> + <translation>Wähle ein zu verbindendes Netzwerk aus</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to set the user status to AWAY</source> + <translation>Drücken, um den Nutzerstatus auf „Abwesend“ zu setzen</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to edit the networks</source> + <translation>Drücken, um die Netzwerke zu bearbeiten</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a nick name for the channel</source> + <translation>Wähle einen Spitznamen für das Netzwerk</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Enter the channel to join</source> + <translation>Wählen den zu betretenden Kanal</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to join the channel</source> + <translation>Drücken, um den Kanal zu betreten</translation> + </message> + </context> + <context> + <name>IrcPage</name> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source><b>Configure IRC</b></source> + <translation><b>IRC-Einstellungen</b></translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show timestamps</source> + <translation>Auswählen, um Zeitstempel anzuzeigen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Timestamps</source> + <translation>Zeitstempel anzeigen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Time Format:</source> + <translation>Zeitformat:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the time format to use</source> + <translation>Wähle das zu verwendende Zeitformat</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Date Format</source> + <translation>Datumsformat</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the date format to use</source> + <translation>Wähle das zu verwendende Datumsformat</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show the date in timestamps</source> + <translation>Auswählen, um das Datum im Zeitstempel anzuzeigen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Date</source> + <translation>Datum anzeigen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Colors</source> + <translation>Farben</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Network Messages:</source> + <translation>Netzwerkmeldungen:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for network messages</source> + <translation>Wähle die Farbe für Netzwerkmeldungen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Nick Names:</source> + <translation>Spitznamen:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for nick names</source> + <translation>Wähle die Farbe für Spitznamen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Server Messages:</source> + <translation>Servermeldungen:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for server messages</source> + <translation>Wähle die Farbe für Servermeldungen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Own Nick Name:</source> + <translation>Eigener Spitzname:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for own nick name</source> + <translation>Wähle die Farbe für den eigenen Spitznamen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Messages:</source> + <translation>Kanalnachrichten:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel messages</source> + <translation>Wähle die Farbe für Kanalmeldungen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join Channel:</source> + <translation>Kanal betreten:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for join channel messages</source> + <translation>Wähle die Farbe für Meldungen zum Betreten eines Kanals</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Error Messages:</source> + <translation>Fehlermeldungen:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for error messages</source> + <translation>Wähle die Farbe für Fehlermeldungen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Leave Channel:</source> + <translation>Kanal verlassen:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for leave channel messages</source> + <translation>Wähle die Farbe für Meldungen zum Verlassen eines Kanals</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Timestamp:</source> + <translation>Zeitstempel:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for timestamps</source> + <translation>Wähle die Farbe für den Zeitstempel</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Info:</source> + <translation>Kanalinformationen:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel info messages</source> + <translation>Wähle die Farbe für Kanalinformationsmeldungen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Hyperlink:</source> + <translation>Hyperlink:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for hyperlinks</source> + <translation>Wähle die Farbe für Hyperlinks</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to allow colored text in IRC messages</source> + <translation>Auswählen, um farbigen Text in IRC-Nachrichten zuzulassen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Allow Colored Text in IRC Messages</source> + <translation>Farbigen Text in IRC-Nachrichten zulassen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show notifications</source> + <translation>Auswählen, um Benachrichtigungen anzuzeigen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Notifications</source> + <translation>Benachrichtigungen anzeigen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for join and leave events</source> + <translation>Auswählen, um eine Benachrichtigung für Betreten- und Verlassen-Nachrichten anzuzeigen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join/Leave Event</source> + <translation>Ereignis bei Betreten/Verlassen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every message</source> + <translation>Auswählen, um eine Benachrichtigung für jede Nachricht anzuzeigen</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Every Message</source> + <translation>Jede Nachricht</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every mentioning of your nick</source> + <translation>Auswählen, um eine Benachrichtigung anzuzeigen, wann immer der eigene Spitzname erwähnt wird</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mentioning of Own Nick</source> + <translation>Erwähnung des eigenen Spitznamens</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select this to enable the automatic lookup of user information for joined channels</source> + <translation>Auswählen, um das automatische Nachschlagen von Nutzerinformationen für alle betretenen Kanäle zu aktivieren</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable Automatic User Information Lookup (/WHO)</source> + <translation>Nutzerinformationen automatische ermitteln (/WHO)</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Max. Number of Users in Channel:</source> + <translation>Max. Anzahl Nutzer im Kanal:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the maximum numbers of users in a channel allowed for this function</source> + <translation>Gib die maximal zulässige Anzahl an Nutzern im Kanal an</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Update Interval:</source> + <translation>Aktualisierungsintervall:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the user information update interval</source> + <translation>Gib das Aktualisierungsintervall für die Nutzerinformationen ein</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source> s</source> + <translation> s</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker</source> + <translation>Markierung</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to mark the current position, when the chat window is hidden</source> + <translation>Auswählen, um die aktuelle Position im Kanalfenster zu markieren, wenn das Fenster verdeckt wird</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mark Current Position When Hidden</source> + <translation>Aktuelle Position markieren wenn nicht sichtbar</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Foreground:</source> + <translation>Vordergrundfarbe der Markierung:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the foreground color for the marker</source> + <translation>Wähle die Textfarbe der Markierung aus</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the background color for the marker</source> + <translation>Wähle die Hintergrundfarbe der Markierung aus</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Background:</source> + <translation>Hintergrundfarbe der Markierung:</translation> + </message> + </context> + <context> + <name>IrcServerEditDialog</name> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>IRC Server</source> + <translation>IRC Server</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Server:</source> + <translation>Server:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the host name of the IRC server</source> + <translation>Gib den Hostnamen des IRC Servers ein</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Port:</source> + <translation>Port:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the port number</source> + <translation>Gib die Portnummer ein</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Password:</source> + <translation>Kennwort:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the server password</source> + <translation>Gib das Serverkennwort ein</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Select to use an SSL encrypted connection</source> + <translation>Auswählen, um eine SSL verschlüsselte Verbindung zu verwenden</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Use Encrypted Connection (SSL)</source> + <translation>Verschlüsselte Verbindung benutzen (SSL)</translation> + </message> + </context> + <context> + <name>IrcUserItem</name> + <message> + <location filename="../IrcChannelWidget.py" line="136" /> + <source>{0} (ignored)</source> + <translation>{0} (ignoriert)</translation> + </message> + </context> + <context> + <name>IrcUtilities</name> + <message> + <location filename="../IrcUtilities.py" line="162" /> + <source>anonymous</source> + <translation>anonym</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="163" /> + <source>ban mask</source> + <translation>Bann Maske</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="164" /> + <source>no colors allowed</source> + <translation>keine Farben erlaubt</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="165" /> + <source>ban exception mask</source> + <translation>Bannausnahme Maske</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="166" /> + <source>invite only</source> + <translation>Einladung erforderlich</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="167" /> + <source>password protected</source> + <translation>Kennwort geschützt</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="168" /> + <source>user limit</source> + <translation>Nutzerbegrenzung</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="169" /> + <source>moderated</source> + <translation>moderiert</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="170" /> + <source>no messages from outside</source> + <translation>keine Meldung von außerhalb</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="171" /> + <source>private</source> + <translation>privat</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="172" /> + <source>quiet</source> + <translation>schweigend</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="173" /> + <source>reop channel</source> + <translation>Kanal übernehmen</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="174" /> + <source>secret</source> + <translation>unsichtbar</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="175" /> + <source>topic protection</source> + <translation>Themenschutz</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="176" /> + <source>invitation mask</source> + <translation>Einladungsmaske</translation> + </message> + </context> + <context> + <name>IrcWidget</name> + <message> + <location filename="../IrcWidget.py" line="86" /> + <source>Press to leave the current channel</source> + <translation>Drücken, um den aktuellen Kanal zu verlassen</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="225" /> + <source>SSL Connection</source> + <translation>SSL Verbindung</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="226" /> + <source>An encrypted connection to the IRC network was requested but SSL is not available. Please change the server configuration.</source> + <translation>Eine verschlüsselte Verbindung zum IRC-Netzwerk wurde angefragt, SSL steht jedoch nicht zur Verfügung. Bitte ändern Sie die Serverkonfiguration.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <location filename="../IrcWidget.py" line="572" /> + <location filename="../IrcWidget.py" line="563" /> + <location filename="../IrcWidget.py" line="302" /> + <location filename="../IrcWidget.py" line="297" /> + <location filename="../IrcWidget.py" line="290" /> + <location filename="../IrcWidget.py" line="266" /> + <location filename="../IrcWidget.py" line="252" /> + <source>Info</source> + <translation>Info</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="253" /> + <source>Looking for server {0} (port {1}) using an SSL encrypted connection...</source> + <translation>Suche nach Server {0} (Port {1}) über eine SSL verschlüsselte Verbindung...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="267" /> + <source>Looking for server {0} (port {1})...</source> + <translation>Suche nach Server {0} (Port {1})...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="280" /> + <source>Disconnect from Server</source> + <translation>Verbindung zum Server beenden</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="281" /> + <source><p>Do you really want to disconnect from <b>{0}</b>?</p><p>All channels will be closed.</p></source> + <translation><p>Soll die Verbindung zu <b>{0}</b> wirklich unterbrochen werden?</p><p>Alle Kanäle werden geschlossen.</p></translation> + </message> + <message> + <location filename="../IrcWidget.py" line="291" /> + <source>Disconnecting from server {0}...</source> + <translation>Verbindung zum Server {0} wird unterbrochen...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="298" /> + <source>Disconnecting from network {0}...</source> + <translation>Verbindung zum Netzwerk {0} wird unterbrochen...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="302" /> + <source>Disconnecting from server.</source> + <translation>Verbindung zum Server wird unterbrochen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="563" /> + <source>Server found,connecting...</source> + <translation>Server gefunden, Verbindung wird hergesteltl...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="572" /> + <source>Connected,logging in...</source> + <translation>Verbunden, Anmeldung läuft...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <source>Server disconnected.</source> + <translation>Serververbindung unterbrochen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="651" /> + <source>Message Error</source> + <translation>Nachrichtenfehler</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="652" /> + <source>Unknown message received from server:<br/>{0}</source> + <translation>Unbekannte Nachricht vom Server empfangen:<br/>{0}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1093" /> + <location filename="../IrcWidget.py" line="1083" /> + <location filename="../IrcWidget.py" line="1075" /> + <location filename="../IrcWidget.py" line="1067" /> + <location filename="../IrcWidget.py" line="695" /> + <location filename="../IrcWidget.py" line="687" /> + <source>CTCP</source> + <translation>CTCP</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="688" /> + <source>Received CTCP-PING response from {0} with latency of {1} ms.</source> + <translation>CTCP-PING-Antwort von {0} mit einer Latenz von {1} ms empfangen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="696" /> + <source>Received unknown CTCP-{0} response from {1}.</source> + <translation>Unbekannte CTCP-{0}-Antwort von {1} empfangen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="724" /> + <source>Notice</source> + <translation>Notiz</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="734" /> + <source>You have set your personal modes to <b>[{0}]</b>.</source> + <translation>Sie haben Ihre persönlichen Modi auf <b>[{0}]</b> gesetzt.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="738" /> + <source>{0} has changed your personal modes to <b>[{1}]</b>.</source> + <translation>{0} hat Ihre persönlichen Modi auf <b>[{0}]</b> geändert.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="742" /> + <source>Mode</source> + <translation>Modus</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="750" /> + <source>You have left channel {0}.</source> + <translation>Sie haben den Kanal {0} verlassen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="762" /> + <source>You are now known as {0}.</source> + <translation>Sie sind jetzt als {0} bekannt.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="768" /> + <source>User {0} is now known as {1}.</source> + <translation>Nutzer {0} ist nun als {1} bekannt.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="774" /> + <source>Received PONG from {0}</source> + <translation>PONG von {0} empfangen</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="779" /> + <source>Server Error</source> + <translation>Server Fehler</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="817" /> + <source>Error</source> + <translation>Fehler</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="836" /> + <source>Welcome</source> + <translation>Willkommen</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="838" /> + <source>Support</source> + <translation>Support</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="840" /> + <source>User</source> + <translation>Nutzer</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="842" /> + <source>MOTD</source> + <translation>MOTD</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="844" /> + <source>Away</source> + <translation>Abwesend</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="846" /> + <source>Info ({0})</source> + <translation>Info ({0})</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="850" /> + <source>Message of the day</source> + <translation>Nachricht des Tages</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="852" /> + <source>End of message of the day</source> + <translation>Ende der Nachricht des Tages</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="855" /> + <source>Server {0} (Version {1}), User-Modes: {2}, Channel-Modes: {3}</source> + <translation>Server {0} (Version {1}), Benutzermodi: {2}, Kanalmodi: {3}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="860" /> + <source>Current users on {0}: {1}, max. {2}</source> + <translation>Anzahl der Benutzer auf {0}: {1}, max. {2}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="865" /> + <source>Current users on the network: {0}, max. {1}</source> + <translation>Anzahl der Benutzer im Netzwerk: {0}, max. {1}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="869" /> + <source>You are no longer marked as being away.</source> + <translation>Sie sind nicht länger als „abwesend“ gekennzeichnet.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="871" /> + <source>You have been marked as being away.</source> + <translation>Sie sind als „abwesend“ gekennzeichnet.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1002" /> + <location filename="../IrcWidget.py" line="986" /> + <location filename="../IrcWidget.py" line="934" /> + <source>SSL Error</source> + <translation>SSL Fehler</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="935" /> + <source>Connection to server {0} (port {1}) lost while waiting for user response to an SSL error.</source> + <translation>Die Verbindung zum Server {0} (Port {1}) wurde während des Wartens auf eine Benutzerantwort auf einen SSL Fehler verloren.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <location filename="../IrcWidget.py" line="964" /> + <location filename="../IrcWidget.py" line="959" /> + <location filename="../IrcWidget.py" line="951" /> + <location filename="../IrcWidget.py" line="943" /> + <source>Socket Error</source> + <translation>Socker Fehler</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="944" /> + <source>The host was not found. Please check the host name and port settings.</source> + <translation>Der Server wurde nicht gefunden. Bitte prüfen Sie den Servernamen und die Porteinstellungen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="952" /> + <source>The connection was refused by the peer. Please check the host name and port settings.</source> + <translation>Die Verbindung wurde von der Gegenseite abgelehnt. Bitte prüfen Sie den Servernamen und die Porteinstellungen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="959" /> + <source>The SSL handshake failed.</source> + <translation>Der SSL Handshake schlug fehl.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="965" /> + <source>The following network error occurred:<br/>{0}</source> + <translation>Der folgende Netzwerkfehler trat auf:<br/>{0}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <source>A network error occurred.</source> + <translation>Ein Netzwerkfehler trat auf.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="987" /> + <source>Could not connect to {0} (port {1}) using an SSL encrypted connection. Either the server does not support SSL (did you use the correct port?) or you rejected the certificate.</source> + <translation>Es konnte keine SSL-verschlüsselte Verbindung zum Server {0} (Port {1}) aufgebaut werden. Entweder unterstützt der Server kein SSL (haben Sie den richtigen Port verwendet?) oder Sie haben das Zertifikat abgelehnt.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1003" /> + <source>The SSL certificate for the server {0} (port {1}) failed the authenticity check. SSL errors were accepted by you.</source> + <translation>Das SSL-Zertifikat für den Server {0} (Port {1}) hat die Authentizitätsprüfung nicht bestanden. Die SSL-Fehler wurden von Ihnen akzeptiert.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1068" /> + <source>Received Version request from {0}.</source> + <translation>Versionsanfrage von {0} empfangen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1076" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation>CTCP-PING-Anfrage von {0} empfangen, Antwort wird gesendet.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1084" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation>CTCP-CLIENTINFO-Anfrage von {0} empfangen, Antwort wird gesendet.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1094" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation>Unbekannte CTCP-{0}-Anfrage von {1} empfangen.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1110" /> + <source>{0} ({1})</source> + <comment>channel name, users count</comment> + <translation>{0} ({1})</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <location filename="../IrcWidget.py" line="1132" /> + <source>Critical</source> + <translation>Kritischer Fehler</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1133" /> + <source>No nickname acceptable to the server configured for <b>{0}</b>. Disconnecting...</source> + <translation>Es ist kein für den Server <b>{0}</b> akzeptabler Spitzname konfiguriert. Verbindungsabbruch...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <source>The given nickname is already in use.</source> + <translation>Der übergebene Spitzname wird bereits verwendet.</translation> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Channels</source> + <translation>Kanäle</translation> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Network</source> + <translation>Netzwerk</translation> + </message> + </context> +</TS>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/i18n/irc_empty.ts Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2054 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0"> + <context> + <name>IrcChannelEditDialog</name> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>IRC Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Key:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel key/password</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Select to join this channel automatically</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Join channel automatically</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcChannelWidget</name> + <message> + <location filename="../IrcChannelWidget.py" line="1685" /> + <location filename="../IrcChannelWidget.py" line="1620" /> + <location filename="../IrcChannelWidget.py" line="453" /> + <source>Send Message</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="454" /> + <source>Messages starting with a '/' are not allowed in private chats.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="570" /> + <source>Leave IRC channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="571" /> + <source>Do you really want to leave the IRC channel <b>{0}</b>?</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="740" /> + <source>Channel Message</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="747" /> + <source>Nick mentioned</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="778" /> + <source>{0} has joined the channel {1} ({2}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="783" /> + <source>You have joined the channel {0} ({1}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="791" /> + <source>Join Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="811" /> + <source>{0} has left {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="818" /> + <location filename="../IrcChannelWidget.py" line="815" /> + <source>{0} has left {1}: {2}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="826" /> + <source>Leave Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="846" /> + <source>{0} has quit {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="849" /> + <source>{0} has quit {1}: {2}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="857" /> + <source>Quit</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="878" /> + <source>You are now known as {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="884" /> + <source>User {0} is now known as {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="929" /> + <source>Away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="930" /> + <source>{0} is away: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="950" /> + <source>The channel topic is: "{0}".</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="969" /> + <source>The topic was set by {0} on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="992" /> + <source>Channel URL: {0}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1017" /> + <source>password protected ({0})</source> + <translation type="unfinished" /> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1020" /> + <source>limited to %n user(s)</source> + <translation type="unfinished"> + <numerusform /> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1028" /> + <source>Channel modes: {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1047" /> + <source>This channel was created on {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1084" /> + <source>{0} sets the channel mode to 'anonymous'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1088" /> + <source>{0} removes the 'anonymous' mode from the channel.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1093" /> + <source>{0} sets a ban on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1097" /> + <source>{0} removes the ban on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1102" /> + <source>{0} sets the channel mode to 'no colors allowed'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1106" /> + <source>{0} sets the channel mode to 'allow color codes'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1111" /> + <source>{0} sets a ban exception on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1115" /> + <source>{0} removes the ban exception on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1120" /> + <source>{0} sets the channel mode to 'invite only'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1124" /> + <source>{0} removes the 'invite only' mode from the channel.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1129" /> + <source>{0} sets the channel key to '{1}'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1133" /> + <source>{0} removes the channel key.</source> + <translation type="unfinished" /> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1136" /> + <source>{0} sets the channel limit to %n nick(s).</source> + <translation type="unfinished"> + <numerusform /> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1142" /> + <source>{0} removes the channel limit.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1145" /> + <source>{0} sets the channel mode to 'moderated'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1149" /> + <source>{0} sets the channel mode to 'unmoderated'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1154" /> + <source>{0} sets the channel mode to 'no messages from outside'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1159" /> + <source>{0} sets the channel mode to 'allow messages from outside'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1165" /> + <source>{0} sets the channel mode to 'private'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1169" /> + <source>{0} sets the channel mode to 'public'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1174" /> + <source>{0} sets the channel mode to 'quiet'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1178" /> + <source>{0} removes the 'quiet' mode from the channel.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1185" /> + <source>{0} sets the channel mode to 'secret'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1189" /> + <source>{0} sets the channel mode to 'visible'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1194" /> + <source>{0} switches on 'topic protection'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1198" /> + <source>{0} switches off 'topic protection'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1203" /> + <source>{0} sets invitation mask {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1207" /> + <source>{0} removes the invitation mask {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1211" /> + <source>Mode</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1233" /> + <source>{0} sets mode for {1}: {2}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1265" /> + <source>Help</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1318" /> + <location filename="../IrcChannelWidget.py" line="1308" /> + <location filename="../IrcChannelWidget.py" line="1300" /> + <location filename="../IrcChannelWidget.py" line="1292" /> + <source>CTCP</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1293" /> + <source>Received Version request from {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1301" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1309" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1319" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1419" /> + <source>--- New From Here ---</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1503" /> + <location filename="../IrcChannelWidget.py" line="1486" /> + <source>Save Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1488" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1504" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1524" /> + <source>Error saving Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1525" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1537" /> + <source>Copy</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1542" /> + <source>Cut all</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1547" /> + <source>Copy all</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1553" /> + <source>Clear</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1558" /> + <source>Save</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1562" /> + <source>Mark Current Position</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1565" /> + <source>Remove Position Marker</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1653" /> + <location filename="../IrcChannelWidget.py" line="1637" /> + <location filename="../IrcChannelWidget.py" line="1621" /> + <source>Enter the message to be sent:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1688" /> + <location filename="../IrcChannelWidget.py" line="1636" /> + <source>Send Query</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1691" /> + <location filename="../IrcChannelWidget.py" line="1652" /> + <source>Send Notice</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1678" /> + <source>Who Is</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1681" /> + <source>Private Chat</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1695" /> + <source>Send Ping</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1698" /> + <source>Ignore User</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1702" /> + <source>Refresh</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1826" /> + <location filename="../IrcChannelWidget.py" line="1800" /> + <source>Who</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1801" /> + <source>End of WHO list for {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1824" /> + <source> (Away)</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1827" /> + <source>{0} is {1}@{2} ({3}){4}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2216" /> + <location filename="../IrcChannelWidget.py" line="2195" /> + <location filename="../IrcChannelWidget.py" line="2174" /> + <location filename="../IrcChannelWidget.py" line="2151" /> + <location filename="../IrcChannelWidget.py" line="2131" /> + <location filename="../IrcChannelWidget.py" line="2111" /> + <location filename="../IrcChannelWidget.py" line="2091" /> + <location filename="../IrcChannelWidget.py" line="2068" /> + <location filename="../IrcChannelWidget.py" line="2060" /> + <location filename="../IrcChannelWidget.py" line="2052" /> + <location filename="../IrcChannelWidget.py" line="2041" /> + <location filename="../IrcChannelWidget.py" line="2022" /> + <location filename="../IrcChannelWidget.py" line="1988" /> + <location filename="../IrcChannelWidget.py" line="1983" /> + <location filename="../IrcChannelWidget.py" line="1960" /> + <location filename="../IrcChannelWidget.py" line="1937" /> + <location filename="../IrcChannelWidget.py" line="1930" /> + <location filename="../IrcChannelWidget.py" line="1923" /> + <location filename="../IrcChannelWidget.py" line="1916" /> + <location filename="../IrcChannelWidget.py" line="1909" /> + <location filename="../IrcChannelWidget.py" line="1902" /> + <location filename="../IrcChannelWidget.py" line="1851" /> + <source>Whois</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1852" /> + <source>{0} is {1}@{2} ({3}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1903" /> + <source>{0} is a user on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1910" /> + <source>{0} has voice on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1917" /> + <source>{0} is a halfop on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1924" /> + <source>{0} is an operator on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1931" /> + <source>{0} is owner of channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1938" /> + <source>{0} is admin on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1961" /> + <source>{0} is online via {1} ({2}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1984" /> + <source>{0} is an IRC Operator.</source> + <translation type="unfinished" /> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2017" /> + <source>%n day(s)</source> + <translation type="unfinished"> + <numerusform /> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2037" /> + <location filename="../IrcChannelWidget.py" line="2018" /> + <source>%n hour(s)</source> + <translation type="unfinished"> + <numerusform /> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2049" /> + <location filename="../IrcChannelWidget.py" line="2038" /> + <location filename="../IrcChannelWidget.py" line="2019" /> + <source>%n minute(s)</source> + <translation type="unfinished"> + <numerusform /> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2050" /> + <location filename="../IrcChannelWidget.py" line="2039" /> + <location filename="../IrcChannelWidget.py" line="2020" /> + <source>%n second(s)</source> + <translation type="unfinished"> + <numerusform /> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2023" /> + <source>{0} has been idle for {1}, {2}, {3}, and {4}.</source> + <comment>{0} = name of person, {1} = (x days), {2} = (x hours), {3} = (x minutes), {4} = (x seconds)</comment> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2042" /> + <source>{0} has been idle for {1}, {2}, and {3}.</source> + <comment>{0} = name of person, {1} = (x hours), {2} = (x minutes), {3} = (x seconds)</comment> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2053" /> + <source>{0} has been idle for {1} and {2}.</source> + <comment>{0} = name of person, {1} = (x minutes), {3} = (x seconds)</comment> + <translation type="unfinished" /> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2061" /> + <source>{0} has been idle for %n second(s).</source> + <translation type="unfinished"> + <numerusform /> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2069" /> + <source>{0} has been online since {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2092" /> + <source>End of WHOIS list for {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2112" /> + <source>{0} is an identified user.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2132" /> + <source>{0} is available for help.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2152" /> + <source>{0} is logged in as {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2175" /> + <source>{0} is actually using the host {1} (IP: {2}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2196" /> + <source>{0} is using a secure connection.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2217" /> + <source>{0} is connecting from {1} (IP: {2}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2240" /> + <source>Edit Channel Topic</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2241" /> + <source>Enter the topic for this channel:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Press to change the topic</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the list of users</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the channel messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Enter a message, send by pressing Return or Enter</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcExtensionPlugin</name> + <message> + <location filename="../../PluginExtensionIrc.py" line="190" /> + <location filename="../../PluginExtensionIrc.py" line="186" /> + <location filename="../../PluginExtensionIrc.py" line="71" /> + <source>IRC</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="191" /> + <source>&IRC</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="192" /> + <source>Ctrl+Alt+Shift+I</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="198" /> + <source>Switch the input focus to the IRC window.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="201" /> + <source><b>Activate IRC</b><p>This switches the input focus to the IRC window.</p></source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcIdentitiesEditDialog</name> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>IRC Identities</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select the identity to work on</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add a new identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to copy the selected identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to rename the selected identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>General</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Real Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the real name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Nick Names</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a nick name to add</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add the entered nick name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected nick name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name up</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name down</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Auto Identify</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the name of the service to identify against</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service name can be <b><i>nickserv</i></b> or a network-dependent name such as <b><i>nickserv@services.dal.net</i></b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Password:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the password</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="506" /> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to show the password</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select to mark the current position in the chat, when you send an AWAY command.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Mark the current position in chat windows when going away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away Message:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the message to be sent when going away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Advanced</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Ident:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the identity to be used to log-on to the server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Quit:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a message to be sent when quitting</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Part:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter message to be sent when leaving a channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="206" /> + <location filename="../IrcIdentitiesEditDialog.py" line="188" /> + <source>Edit Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="189" /> + <source>The identity must contain at least one nick name.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="207" /> + <source>The identity must have a real name.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="259" /> + <location filename="../IrcIdentitiesEditDialog.py" line="240" /> + <location filename="../IrcIdentitiesEditDialog.py" line="230" /> + <source>Add Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="315" /> + <location filename="../IrcIdentitiesEditDialog.py" line="273" /> + <location filename="../IrcIdentitiesEditDialog.py" line="231" /> + <source>Identity Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="326" /> + <location filename="../IrcIdentitiesEditDialog.py" line="284" /> + <location filename="../IrcIdentitiesEditDialog.py" line="241" /> + <source>An identity named <b>{0}</b> already exists. You must provide a different name.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="343" /> + <location filename="../IrcIdentitiesEditDialog.py" line="302" /> + <location filename="../IrcIdentitiesEditDialog.py" line="260" /> + <source>The identity has to have a name.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="342" /> + <location filename="../IrcIdentitiesEditDialog.py" line="301" /> + <location filename="../IrcIdentitiesEditDialog.py" line="283" /> + <location filename="../IrcIdentitiesEditDialog.py" line="272" /> + <source>Copy Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="325" /> + <location filename="../IrcIdentitiesEditDialog.py" line="314" /> + <source>Rename Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="366" /> + <source>This identity is in use. If you remove it, the network settings using it will fall back to the default identity. Should it be deleted anyway?</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="372" /> + <source>Do you really want to delete all information for this identity?</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="377" /> + <source>Delete Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="502" /> + <source>Press to hide the password</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcIdentity</name> + <message> + <location filename="../IrcNetworkManager.py" line="26" /> + <source>Default Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="30" /> + <source>Gone away for now.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="32" /> + <location filename="../IrcNetworkManager.py" line="31" /> + <source>IRC for eric IDE</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcNetworkEditDialog</name> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>IRC Network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Network Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Enter the name of the IRC network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Select the identity to be used for the IRC network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Server:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the server configuration</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channels:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Join Automatically</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to add a new channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the selected channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to delete the selected channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Shows the name of the server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="261" /> + <location filename="../IrcNetworkEditDialog.py" line="255" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>Yes</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="263" /> + <location filename="../IrcNetworkEditDialog.py" line="257" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>No</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="192" /> + <source>Delete Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="193" /> + <source>Do you really want to delete channel <b>{0}</b>?</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcNetworkListDialog</name> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>IRC Networks</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to define a new network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&New...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the selected network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Edit...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to delete the selected network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Delete</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to toggle the auto-connect flag of the selected network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Auto-Connect</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Edit &Identities...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>Yes</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>No</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="91" /> + <source>Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="94" /> + <source>Server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="97" /> + <source>Channels</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="252" /> + <location filename="../IrcNetworkListDialog.py" line="99" /> + <source>Auto-Connect</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="170" /> + <source>Delete Irc Network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="171" /> + <source>Do you really want to delete IRC network <b>{0}</b>?</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcNetworkWidget</name> + <message> + <location filename="../IrcNetworkWidget.py" line="354" /> + <source>Press to disconnect from the network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="359" /> + <source>Press to connect to the selected network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="450" /> + <location filename="../IrcNetworkWidget.py" line="433" /> + <source>Save Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="435" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="451" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="471" /> + <source>Error saving Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="472" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="484" /> + <source>Copy</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="489" /> + <source>Cut all</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="494" /> + <source>Copy all</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="500" /> + <source>Clear</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="505" /> + <source>Save</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Shows the network messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a network to connect to</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to set the user status to AWAY</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to edit the networks</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a nick name for the channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Enter the channel to join</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to join the channel</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcPage</name> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source><b>Configure IRC</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show timestamps</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Timestamps</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Time Format:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the time format to use</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Date Format</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the date format to use</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show the date in timestamps</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Date</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Colors</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Network Messages:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for network messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Nick Names:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for nick names</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Server Messages:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for server messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Own Nick Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for own nick name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Messages:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join Channel:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for join channel messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Error Messages:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for error messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Leave Channel:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for leave channel messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Timestamp:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for timestamps</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Info:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel info messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Hyperlink:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for hyperlinks</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to allow colored text in IRC messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Allow Colored Text in IRC Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show notifications</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Notifications</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for join and leave events</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join/Leave Event</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every message</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Every Message</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every mentioning of your nick</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mentioning of Own Nick</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select this to enable the automatic lookup of user information for joined channels</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable Automatic User Information Lookup (/WHO)</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Max. Number of Users in Channel:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the maximum numbers of users in a channel allowed for this function</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Update Interval:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the user information update interval</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source> s</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to mark the current position, when the chat window is hidden</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mark Current Position When Hidden</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Foreground:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the foreground color for the marker</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the background color for the marker</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Background:</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcServerEditDialog</name> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>IRC Server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Server:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the host name of the IRC server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Port:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the port number</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Password:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the server password</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Select to use an SSL encrypted connection</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Use Encrypted Connection (SSL)</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcUserItem</name> + <message> + <location filename="../IrcChannelWidget.py" line="136" /> + <source>{0} (ignored)</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcUtilities</name> + <message> + <location filename="../IrcUtilities.py" line="162" /> + <source>anonymous</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="163" /> + <source>ban mask</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="164" /> + <source>no colors allowed</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="165" /> + <source>ban exception mask</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="166" /> + <source>invite only</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="167" /> + <source>password protected</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="168" /> + <source>user limit</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="169" /> + <source>moderated</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="170" /> + <source>no messages from outside</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="171" /> + <source>private</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="172" /> + <source>quiet</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="173" /> + <source>reop channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="174" /> + <source>secret</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="175" /> + <source>topic protection</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="176" /> + <source>invitation mask</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcWidget</name> + <message> + <location filename="../IrcWidget.py" line="86" /> + <source>Press to leave the current channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="225" /> + <source>SSL Connection</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="226" /> + <source>An encrypted connection to the IRC network was requested but SSL is not available. Please change the server configuration.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <location filename="../IrcWidget.py" line="572" /> + <location filename="../IrcWidget.py" line="563" /> + <location filename="../IrcWidget.py" line="302" /> + <location filename="../IrcWidget.py" line="297" /> + <location filename="../IrcWidget.py" line="290" /> + <location filename="../IrcWidget.py" line="266" /> + <location filename="../IrcWidget.py" line="252" /> + <source>Info</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="253" /> + <source>Looking for server {0} (port {1}) using an SSL encrypted connection...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="267" /> + <source>Looking for server {0} (port {1})...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="280" /> + <source>Disconnect from Server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="281" /> + <source><p>Do you really want to disconnect from <b>{0}</b>?</p><p>All channels will be closed.</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="291" /> + <source>Disconnecting from server {0}...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="298" /> + <source>Disconnecting from network {0}...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="302" /> + <source>Disconnecting from server.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="563" /> + <source>Server found,connecting...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="572" /> + <source>Connected,logging in...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <source>Server disconnected.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="651" /> + <source>Message Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="652" /> + <source>Unknown message received from server:<br/>{0}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1093" /> + <location filename="../IrcWidget.py" line="1083" /> + <location filename="../IrcWidget.py" line="1075" /> + <location filename="../IrcWidget.py" line="1067" /> + <location filename="../IrcWidget.py" line="695" /> + <location filename="../IrcWidget.py" line="687" /> + <source>CTCP</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="688" /> + <source>Received CTCP-PING response from {0} with latency of {1} ms.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="696" /> + <source>Received unknown CTCP-{0} response from {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="724" /> + <source>Notice</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="734" /> + <source>You have set your personal modes to <b>[{0}]</b>.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="738" /> + <source>{0} has changed your personal modes to <b>[{1}]</b>.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="742" /> + <source>Mode</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="750" /> + <source>You have left channel {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="762" /> + <source>You are now known as {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="768" /> + <source>User {0} is now known as {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="774" /> + <source>Received PONG from {0}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="779" /> + <source>Server Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="817" /> + <source>Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="836" /> + <source>Welcome</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="838" /> + <source>Support</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="840" /> + <source>User</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="842" /> + <source>MOTD</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="844" /> + <source>Away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="846" /> + <source>Info ({0})</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="850" /> + <source>Message of the day</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="852" /> + <source>End of message of the day</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="855" /> + <source>Server {0} (Version {1}), User-Modes: {2}, Channel-Modes: {3}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="860" /> + <source>Current users on {0}: {1}, max. {2}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="865" /> + <source>Current users on the network: {0}, max. {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="869" /> + <source>You are no longer marked as being away.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="871" /> + <source>You have been marked as being away.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1002" /> + <location filename="../IrcWidget.py" line="986" /> + <location filename="../IrcWidget.py" line="934" /> + <source>SSL Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="935" /> + <source>Connection to server {0} (port {1}) lost while waiting for user response to an SSL error.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <location filename="../IrcWidget.py" line="964" /> + <location filename="../IrcWidget.py" line="959" /> + <location filename="../IrcWidget.py" line="951" /> + <location filename="../IrcWidget.py" line="943" /> + <source>Socket Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="944" /> + <source>The host was not found. Please check the host name and port settings.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="952" /> + <source>The connection was refused by the peer. Please check the host name and port settings.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="959" /> + <source>The SSL handshake failed.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="965" /> + <source>The following network error occurred:<br/>{0}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <source>A network error occurred.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="987" /> + <source>Could not connect to {0} (port {1}) using an SSL encrypted connection. Either the server does not support SSL (did you use the correct port?) or you rejected the certificate.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1003" /> + <source>The SSL certificate for the server {0} (port {1}) failed the authenticity check. SSL errors were accepted by you.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1068" /> + <source>Received Version request from {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1076" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1084" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1094" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1110" /> + <source>{0} ({1})</source> + <comment>channel name, users count</comment> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <location filename="../IrcWidget.py" line="1132" /> + <source>Critical</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1133" /> + <source>No nickname acceptable to the server configured for <b>{0}</b>. Disconnecting...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <source>The given nickname is already in use.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Channels</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Network</source> + <translation type="unfinished" /> + </message> + </context> +</TS>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/i18n/irc_en.ts Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2061 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="en_US"> + <context> + <name>IrcChannelEditDialog</name> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>IRC Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Key:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel key/password</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Select to join this channel automatically</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Join channel automatically</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcChannelWidget</name> + <message> + <location filename="../IrcChannelWidget.py" line="1685" /> + <location filename="../IrcChannelWidget.py" line="1620" /> + <location filename="../IrcChannelWidget.py" line="453" /> + <source>Send Message</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="454" /> + <source>Messages starting with a '/' are not allowed in private chats.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="570" /> + <source>Leave IRC channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="571" /> + <source>Do you really want to leave the IRC channel <b>{0}</b>?</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="740" /> + <source>Channel Message</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="747" /> + <source>Nick mentioned</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="778" /> + <source>{0} has joined the channel {1} ({2}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="783" /> + <source>You have joined the channel {0} ({1}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="791" /> + <source>Join Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="811" /> + <source>{0} has left {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="818" /> + <location filename="../IrcChannelWidget.py" line="815" /> + <source>{0} has left {1}: {2}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="826" /> + <source>Leave Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="846" /> + <source>{0} has quit {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="849" /> + <source>{0} has quit {1}: {2}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="857" /> + <source>Quit</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="878" /> + <source>You are now known as {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="884" /> + <source>User {0} is now known as {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="929" /> + <source>Away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="930" /> + <source>{0} is away: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="950" /> + <source>The channel topic is: "{0}".</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="969" /> + <source>The topic was set by {0} on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="992" /> + <source>Channel URL: {0}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1017" /> + <source>password protected ({0})</source> + <translation type="unfinished" /> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1020" /> + <source>limited to %n user(s)</source> + <translation> + <numerusform>limited to one user</numerusform> + <numerusform>limited to %n users</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1028" /> + <source>Channel modes: {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1047" /> + <source>This channel was created on {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1084" /> + <source>{0} sets the channel mode to 'anonymous'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1088" /> + <source>{0} removes the 'anonymous' mode from the channel.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1093" /> + <source>{0} sets a ban on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1097" /> + <source>{0} removes the ban on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1102" /> + <source>{0} sets the channel mode to 'no colors allowed'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1106" /> + <source>{0} sets the channel mode to 'allow color codes'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1111" /> + <source>{0} sets a ban exception on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1115" /> + <source>{0} removes the ban exception on {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1120" /> + <source>{0} sets the channel mode to 'invite only'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1124" /> + <source>{0} removes the 'invite only' mode from the channel.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1129" /> + <source>{0} sets the channel key to '{1}'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1133" /> + <source>{0} removes the channel key.</source> + <translation type="unfinished" /> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1136" /> + <source>{0} sets the channel limit to %n nick(s).</source> + <translation> + <numerusform>{0} sets the channel limit to one nick.</numerusform> + <numerusform>{0} sets the channel limit to %n nicks.</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1142" /> + <source>{0} removes the channel limit.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1145" /> + <source>{0} sets the channel mode to 'moderated'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1149" /> + <source>{0} sets the channel mode to 'unmoderated'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1154" /> + <source>{0} sets the channel mode to 'no messages from outside'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1159" /> + <source>{0} sets the channel mode to 'allow messages from outside'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1165" /> + <source>{0} sets the channel mode to 'private'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1169" /> + <source>{0} sets the channel mode to 'public'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1174" /> + <source>{0} sets the channel mode to 'quiet'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1178" /> + <source>{0} removes the 'quiet' mode from the channel.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1185" /> + <source>{0} sets the channel mode to 'secret'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1189" /> + <source>{0} sets the channel mode to 'visible'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1194" /> + <source>{0} switches on 'topic protection'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1198" /> + <source>{0} switches off 'topic protection'.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1203" /> + <source>{0} sets invitation mask {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1207" /> + <source>{0} removes the invitation mask {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1211" /> + <source>Mode</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1233" /> + <source>{0} sets mode for {1}: {2}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1265" /> + <source>Help</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1318" /> + <location filename="../IrcChannelWidget.py" line="1308" /> + <location filename="../IrcChannelWidget.py" line="1300" /> + <location filename="../IrcChannelWidget.py" line="1292" /> + <source>CTCP</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1293" /> + <source>Received Version request from {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1301" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1309" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1319" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1419" /> + <source>--- New From Here ---</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1503" /> + <location filename="../IrcChannelWidget.py" line="1486" /> + <source>Save Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1488" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1504" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1524" /> + <source>Error saving Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1525" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1537" /> + <source>Copy</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1542" /> + <source>Cut all</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1547" /> + <source>Copy all</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1553" /> + <source>Clear</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1558" /> + <source>Save</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1562" /> + <source>Mark Current Position</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1565" /> + <source>Remove Position Marker</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1653" /> + <location filename="../IrcChannelWidget.py" line="1637" /> + <location filename="../IrcChannelWidget.py" line="1621" /> + <source>Enter the message to be sent:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1688" /> + <location filename="../IrcChannelWidget.py" line="1636" /> + <source>Send Query</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1691" /> + <location filename="../IrcChannelWidget.py" line="1652" /> + <source>Send Notice</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1678" /> + <source>Who Is</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1681" /> + <source>Private Chat</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1695" /> + <source>Send Ping</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1698" /> + <source>Ignore User</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1702" /> + <source>Refresh</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1826" /> + <location filename="../IrcChannelWidget.py" line="1800" /> + <source>Who</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1801" /> + <source>End of WHO list for {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1824" /> + <source> (Away)</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1827" /> + <source>{0} is {1}@{2} ({3}){4}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2216" /> + <location filename="../IrcChannelWidget.py" line="2195" /> + <location filename="../IrcChannelWidget.py" line="2174" /> + <location filename="../IrcChannelWidget.py" line="2151" /> + <location filename="../IrcChannelWidget.py" line="2131" /> + <location filename="../IrcChannelWidget.py" line="2111" /> + <location filename="../IrcChannelWidget.py" line="2091" /> + <location filename="../IrcChannelWidget.py" line="2068" /> + <location filename="../IrcChannelWidget.py" line="2060" /> + <location filename="../IrcChannelWidget.py" line="2052" /> + <location filename="../IrcChannelWidget.py" line="2041" /> + <location filename="../IrcChannelWidget.py" line="2022" /> + <location filename="../IrcChannelWidget.py" line="1988" /> + <location filename="../IrcChannelWidget.py" line="1983" /> + <location filename="../IrcChannelWidget.py" line="1960" /> + <location filename="../IrcChannelWidget.py" line="1937" /> + <location filename="../IrcChannelWidget.py" line="1930" /> + <location filename="../IrcChannelWidget.py" line="1923" /> + <location filename="../IrcChannelWidget.py" line="1916" /> + <location filename="../IrcChannelWidget.py" line="1909" /> + <location filename="../IrcChannelWidget.py" line="1902" /> + <location filename="../IrcChannelWidget.py" line="1851" /> + <source>Whois</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1852" /> + <source>{0} is {1}@{2} ({3}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1903" /> + <source>{0} is a user on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1910" /> + <source>{0} has voice on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1917" /> + <source>{0} is a halfop on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1924" /> + <source>{0} is an operator on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1931" /> + <source>{0} is owner of channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1938" /> + <source>{0} is admin on channels: {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1961" /> + <source>{0} is online via {1} ({2}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1984" /> + <source>{0} is an IRC Operator.</source> + <translation type="unfinished" /> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2017" /> + <source>%n day(s)</source> + <translation> + <numerusform>1 day</numerusform> + <numerusform>%n days</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2037" /> + <location filename="../IrcChannelWidget.py" line="2018" /> + <source>%n hour(s)</source> + <translation> + <numerusform>1 hour</numerusform> + <numerusform>%n hours</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2049" /> + <location filename="../IrcChannelWidget.py" line="2038" /> + <location filename="../IrcChannelWidget.py" line="2019" /> + <source>%n minute(s)</source> + <translation> + <numerusform>1 minute</numerusform> + <numerusform>%n minutes</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2050" /> + <location filename="../IrcChannelWidget.py" line="2039" /> + <location filename="../IrcChannelWidget.py" line="2020" /> + <source>%n second(s)</source> + <translation> + <numerusform>1 seconds</numerusform> + <numerusform>%n seconds</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2023" /> + <source>{0} has been idle for {1}, {2}, {3}, and {4}.</source> + <comment>{0} = name of person, {1} = (x days), {2} = (x hours), {3} = (x minutes), {4} = (x seconds)</comment> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2042" /> + <source>{0} has been idle for {1}, {2}, and {3}.</source> + <comment>{0} = name of person, {1} = (x hours), {2} = (x minutes), {3} = (x seconds)</comment> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2053" /> + <source>{0} has been idle for {1} and {2}.</source> + <comment>{0} = name of person, {1} = (x minutes), {3} = (x seconds)</comment> + <translation type="unfinished" /> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2061" /> + <source>{0} has been idle for %n second(s).</source> + <translation> + <numerusform>{0} has been idle for 1 second.</numerusform> + <numerusform>{0} has been idle for %n seconds.</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2069" /> + <source>{0} has been online since {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2092" /> + <source>End of WHOIS list for {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2112" /> + <source>{0} is an identified user.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2132" /> + <source>{0} is available for help.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2152" /> + <source>{0} is logged in as {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2175" /> + <source>{0} is actually using the host {1} (IP: {2}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2196" /> + <source>{0} is using a secure connection.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2217" /> + <source>{0} is connecting from {1} (IP: {2}).</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2240" /> + <source>Edit Channel Topic</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2241" /> + <source>Enter the topic for this channel:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Press to change the topic</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the list of users</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the channel messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Enter a message, send by pressing Return or Enter</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcExtensionPlugin</name> + <message> + <location filename="../../PluginExtensionIrc.py" line="190" /> + <location filename="../../PluginExtensionIrc.py" line="186" /> + <location filename="../../PluginExtensionIrc.py" line="71" /> + <source>IRC</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="191" /> + <source>&IRC</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="192" /> + <source>Ctrl+Alt+Shift+I</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="198" /> + <source>Switch the input focus to the IRC window.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="201" /> + <source><b>Activate IRC</b><p>This switches the input focus to the IRC window.</p></source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcIdentitiesEditDialog</name> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>IRC Identities</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select the identity to work on</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add a new identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to copy the selected identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to rename the selected identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>General</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Real Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the real name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Nick Names</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a nick name to add</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add the entered nick name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected nick name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name up</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name down</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Auto Identify</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the name of the service to identify against</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service name can be <b><i>nickserv</i></b> or a network-dependent name such as <b><i>nickserv@services.dal.net</i></b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Password:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the password</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="506" /> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to show the password</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select to mark the current position in the chat, when you send an AWAY command.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Mark the current position in chat windows when going away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away Message:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the message to be sent when going away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Advanced</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Ident:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the identity to be used to log-on to the server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Quit:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a message to be sent when quitting</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Part:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter message to be sent when leaving a channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="206" /> + <location filename="../IrcIdentitiesEditDialog.py" line="188" /> + <source>Edit Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="189" /> + <source>The identity must contain at least one nick name.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="207" /> + <source>The identity must have a real name.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="259" /> + <location filename="../IrcIdentitiesEditDialog.py" line="240" /> + <location filename="../IrcIdentitiesEditDialog.py" line="230" /> + <source>Add Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="315" /> + <location filename="../IrcIdentitiesEditDialog.py" line="273" /> + <location filename="../IrcIdentitiesEditDialog.py" line="231" /> + <source>Identity Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="326" /> + <location filename="../IrcIdentitiesEditDialog.py" line="284" /> + <location filename="../IrcIdentitiesEditDialog.py" line="241" /> + <source>An identity named <b>{0}</b> already exists. You must provide a different name.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="343" /> + <location filename="../IrcIdentitiesEditDialog.py" line="302" /> + <location filename="../IrcIdentitiesEditDialog.py" line="260" /> + <source>The identity has to have a name.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="342" /> + <location filename="../IrcIdentitiesEditDialog.py" line="301" /> + <location filename="../IrcIdentitiesEditDialog.py" line="283" /> + <location filename="../IrcIdentitiesEditDialog.py" line="272" /> + <source>Copy Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="325" /> + <location filename="../IrcIdentitiesEditDialog.py" line="314" /> + <source>Rename Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="366" /> + <source>This identity is in use. If you remove it, the network settings using it will fall back to the default identity. Should it be deleted anyway?</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="372" /> + <source>Do you really want to delete all information for this identity?</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="377" /> + <source>Delete Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="502" /> + <source>Press to hide the password</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcIdentity</name> + <message> + <location filename="../IrcNetworkManager.py" line="26" /> + <source>Default Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="30" /> + <source>Gone away for now.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="32" /> + <location filename="../IrcNetworkManager.py" line="31" /> + <source>IRC for eric IDE</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcNetworkEditDialog</name> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>IRC Network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Network Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Enter the name of the IRC network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Select the identity to be used for the IRC network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Server:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the server configuration</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channels:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Join Automatically</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to add a new channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the selected channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to delete the selected channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Shows the name of the server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="261" /> + <location filename="../IrcNetworkEditDialog.py" line="255" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>Yes</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="263" /> + <location filename="../IrcNetworkEditDialog.py" line="257" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>No</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="192" /> + <source>Delete Channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="193" /> + <source>Do you really want to delete channel <b>{0}</b>?</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcNetworkListDialog</name> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>IRC Networks</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to define a new network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&New...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the selected network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Edit...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to delete the selected network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Delete</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to toggle the auto-connect flag of the selected network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Auto-Connect</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Edit &Identities...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>Yes</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>No</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="91" /> + <source>Identity</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="94" /> + <source>Server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="97" /> + <source>Channels</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="252" /> + <location filename="../IrcNetworkListDialog.py" line="99" /> + <source>Auto-Connect</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="170" /> + <source>Delete Irc Network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="171" /> + <source>Do you really want to delete IRC network <b>{0}</b>?</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcNetworkWidget</name> + <message> + <location filename="../IrcNetworkWidget.py" line="354" /> + <source>Press to disconnect from the network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="359" /> + <source>Press to connect to the selected network</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="450" /> + <location filename="../IrcNetworkWidget.py" line="433" /> + <source>Save Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="435" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="451" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="471" /> + <source>Error saving Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="472" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="484" /> + <source>Copy</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="489" /> + <source>Cut all</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="494" /> + <source>Copy all</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="500" /> + <source>Clear</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="505" /> + <source>Save</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Shows the network messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a network to connect to</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to set the user status to AWAY</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to edit the networks</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a nick name for the channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Enter the channel to join</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to join the channel</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcPage</name> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source><b>Configure IRC</b></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show timestamps</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Timestamps</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Time Format:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the time format to use</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Date Format</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the date format to use</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show the date in timestamps</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Date</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Colors</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Network Messages:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for network messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Nick Names:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for nick names</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Server Messages:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for server messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Own Nick Name:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for own nick name</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Messages:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join Channel:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for join channel messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Error Messages:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for error messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Leave Channel:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for leave channel messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Timestamp:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for timestamps</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Info:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel info messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Hyperlink:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for hyperlinks</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to allow colored text in IRC messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Allow Colored Text in IRC Messages</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show notifications</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Notifications</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for join and leave events</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join/Leave Event</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every message</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Every Message</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every mentioning of your nick</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mentioning of Own Nick</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select this to enable the automatic lookup of user information for joined channels</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable Automatic User Information Lookup (/WHO)</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Max. Number of Users in Channel:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the maximum numbers of users in a channel allowed for this function</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Update Interval:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the user information update interval</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source> s</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to mark the current position, when the chat window is hidden</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mark Current Position When Hidden</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Foreground:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the foreground color for the marker</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the background color for the marker</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Background:</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcServerEditDialog</name> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>IRC Server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Server:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the host name of the IRC server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Port:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the port number</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Password:</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the server password</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Select to use an SSL encrypted connection</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Use Encrypted Connection (SSL)</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcUserItem</name> + <message> + <location filename="../IrcChannelWidget.py" line="136" /> + <source>{0} (ignored)</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcUtilities</name> + <message> + <location filename="../IrcUtilities.py" line="162" /> + <source>anonymous</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="163" /> + <source>ban mask</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="164" /> + <source>no colors allowed</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="165" /> + <source>ban exception mask</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="166" /> + <source>invite only</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="167" /> + <source>password protected</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="168" /> + <source>user limit</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="169" /> + <source>moderated</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="170" /> + <source>no messages from outside</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="171" /> + <source>private</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="172" /> + <source>quiet</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="173" /> + <source>reop channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="174" /> + <source>secret</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="175" /> + <source>topic protection</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcUtilities.py" line="176" /> + <source>invitation mask</source> + <translation type="unfinished" /> + </message> + </context> + <context> + <name>IrcWidget</name> + <message> + <location filename="../IrcWidget.py" line="86" /> + <source>Press to leave the current channel</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="225" /> + <source>SSL Connection</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="226" /> + <source>An encrypted connection to the IRC network was requested but SSL is not available. Please change the server configuration.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <location filename="../IrcWidget.py" line="572" /> + <location filename="../IrcWidget.py" line="563" /> + <location filename="../IrcWidget.py" line="302" /> + <location filename="../IrcWidget.py" line="297" /> + <location filename="../IrcWidget.py" line="290" /> + <location filename="../IrcWidget.py" line="266" /> + <location filename="../IrcWidget.py" line="252" /> + <source>Info</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="253" /> + <source>Looking for server {0} (port {1}) using an SSL encrypted connection...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="267" /> + <source>Looking for server {0} (port {1})...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="280" /> + <source>Disconnect from Server</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="281" /> + <source><p>Do you really want to disconnect from <b>{0}</b>?</p><p>All channels will be closed.</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="291" /> + <source>Disconnecting from server {0}...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="298" /> + <source>Disconnecting from network {0}...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="302" /> + <source>Disconnecting from server.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="563" /> + <source>Server found,connecting...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="572" /> + <source>Connected,logging in...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <source>Server disconnected.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="651" /> + <source>Message Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="652" /> + <source>Unknown message received from server:<br/>{0}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1093" /> + <location filename="../IrcWidget.py" line="1083" /> + <location filename="../IrcWidget.py" line="1075" /> + <location filename="../IrcWidget.py" line="1067" /> + <location filename="../IrcWidget.py" line="695" /> + <location filename="../IrcWidget.py" line="687" /> + <source>CTCP</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="688" /> + <source>Received CTCP-PING response from {0} with latency of {1} ms.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="696" /> + <source>Received unknown CTCP-{0} response from {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="724" /> + <source>Notice</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="734" /> + <source>You have set your personal modes to <b>[{0}]</b>.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="738" /> + <source>{0} has changed your personal modes to <b>[{1}]</b>.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="742" /> + <source>Mode</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="750" /> + <source>You have left channel {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="762" /> + <source>You are now known as {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="768" /> + <source>User {0} is now known as {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="774" /> + <source>Received PONG from {0}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="779" /> + <source>Server Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="817" /> + <source>Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="836" /> + <source>Welcome</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="838" /> + <source>Support</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="840" /> + <source>User</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="842" /> + <source>MOTD</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="844" /> + <source>Away</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="846" /> + <source>Info ({0})</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="850" /> + <source>Message of the day</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="852" /> + <source>End of message of the day</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="855" /> + <source>Server {0} (Version {1}), User-Modes: {2}, Channel-Modes: {3}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="860" /> + <source>Current users on {0}: {1}, max. {2}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="865" /> + <source>Current users on the network: {0}, max. {1}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="869" /> + <source>You are no longer marked as being away.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="871" /> + <source>You have been marked as being away.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1002" /> + <location filename="../IrcWidget.py" line="986" /> + <location filename="../IrcWidget.py" line="934" /> + <source>SSL Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="935" /> + <source>Connection to server {0} (port {1}) lost while waiting for user response to an SSL error.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <location filename="../IrcWidget.py" line="964" /> + <location filename="../IrcWidget.py" line="959" /> + <location filename="../IrcWidget.py" line="951" /> + <location filename="../IrcWidget.py" line="943" /> + <source>Socket Error</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="944" /> + <source>The host was not found. Please check the host name and port settings.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="952" /> + <source>The connection was refused by the peer. Please check the host name and port settings.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="959" /> + <source>The SSL handshake failed.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="965" /> + <source>The following network error occurred:<br/>{0}</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <source>A network error occurred.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="987" /> + <source>Could not connect to {0} (port {1}) using an SSL encrypted connection. Either the server does not support SSL (did you use the correct port?) or you rejected the certificate.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1003" /> + <source>The SSL certificate for the server {0} (port {1}) failed the authenticity check. SSL errors were accepted by you.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1068" /> + <source>Received Version request from {0}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1076" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1084" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1094" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1110" /> + <source>{0} ({1})</source> + <comment>channel name, users count</comment> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <location filename="../IrcWidget.py" line="1132" /> + <source>Critical</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1133" /> + <source>No nickname acceptable to the server configured for <b>{0}</b>. Disconnecting...</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <source>The given nickname is already in use.</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Channels</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Network</source> + <translation type="unfinished" /> + </message> + </context> +</TS>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/i18n/irc_es.ts Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2061 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="es_ES"> + <context> + <name>IrcChannelEditDialog</name> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>IRC Channel</source> + <translation>Canal IRC</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Name:</source> + <translation>Nombre:</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel name</source> + <translation>Introduzca el nombre del canal</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Key:</source> + <translation>Clave:</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel key/password</source> + <translation>Introducir la clave/contraseña del canal</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Select to join this channel automatically</source> + <translation>Seleccionar para unirse al canal automáticamente</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Join channel automatically</source> + <translation>Unirse al canal automáticamente</translation> + </message> + </context> + <context> + <name>IrcChannelWidget</name> + <message> + <location filename="../IrcChannelWidget.py" line="1685" /> + <location filename="../IrcChannelWidget.py" line="1620" /> + <location filename="../IrcChannelWidget.py" line="453" /> + <source>Send Message</source> + <translation>Enviar Mensaje</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="454" /> + <source>Messages starting with a '/' are not allowed in private chats.</source> + <translation>Los mensajes que comienzan con un carácter '/' no están permitidos en chats privados.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="570" /> + <source>Leave IRC channel</source> + <translation>Abandonar el canal IRC</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="571" /> + <source>Do you really want to leave the IRC channel <b>{0}</b>?</source> + <translation>¿Desea realmente abandonar el canal IRC <b>{0}</b>?</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="740" /> + <source>Channel Message</source> + <translation>Mensaje en el Canal</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="747" /> + <source>Nick mentioned</source> + <translation>Nick mencionado</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="778" /> + <source>{0} has joined the channel {1} ({2}).</source> + <translation>{0} se ha unido al canal {1} ({2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="783" /> + <source>You have joined the channel {0} ({1}).</source> + <translation>Usted se ha unido al canal {0} ({1}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="791" /> + <source>Join Channel</source> + <translation>Unirse al Canal</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="811" /> + <source>{0} has left {1}.</source> + <translation>{0} ha abandonado {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="818" /> + <location filename="../IrcChannelWidget.py" line="815" /> + <source>{0} has left {1}: {2}.</source> + <translation>{0} ha abandonado {1}: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="826" /> + <source>Leave Channel</source> + <translation>Abandonar el Canal</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="846" /> + <source>{0} has quit {1}.</source> + <translation>{0} ha salido de {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="849" /> + <source>{0} has quit {1}: {2}.</source> + <translation>{0} ha salido de {1}: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="857" /> + <source>Quit</source> + <translation>SalirSalir</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="878" /> + <source>You are now known as {0}.</source> + <translation>Usted es conocido como {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="884" /> + <source>User {0} is now known as {1}.</source> + <translation>Usuario {0} es conocido ahora como {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="929" /> + <source>Away</source> + <translation>Ausente</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="930" /> + <source>{0} is away: {1}</source> + <translation>{0} está ausente: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="950" /> + <source>The channel topic is: "{0}".</source> + <translation>El tema del canal es: "{0}".</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="969" /> + <source>The topic was set by {0} on {1}.</source> + <translation>El tema ha sido establecido por {0} en {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="992" /> + <source>Channel URL: {0}</source> + <translation>URL del Canal: {0}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1017" /> + <source>password protected ({0})</source> + <translation>protegido por contraseña ({0})</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1020" /> + <source>limited to %n user(s)</source> + <translation> + <numerusform>limitado a %n usuario</numerusform> + <numerusform>limitado a %n usuarios</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1028" /> + <source>Channel modes: {0}.</source> + <translation>Modos de canal: {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1047" /> + <source>This channel was created on {0}.</source> + <translation>Este canal se creó en {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1084" /> + <source>{0} sets the channel mode to 'anonymous'.</source> + <translation>{0} establece el modo de canal a 'anónimo'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1088" /> + <source>{0} removes the 'anonymous' mode from the channel.</source> + <translation>{0} elimina el modo 'anónimo' del canal.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1093" /> + <source>{0} sets a ban on {1}.</source> + <translation>{0} establece un ban a {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1097" /> + <source>{0} removes the ban on {1}.</source> + <translation>{0} elimina el ban a {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1102" /> + <source>{0} sets the channel mode to 'no colors allowed'.</source> + <translation>{0} establece el modo de canal a 'no se permiten colores'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1106" /> + <source>{0} sets the channel mode to 'allow color codes'.</source> + <translation>{0} establece el modo de canal a 'permitir códigos de color'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1111" /> + <source>{0} sets a ban exception on {1}.</source> + <translation>{0} establece una excepción de ban a {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1115" /> + <source>{0} removes the ban exception on {1}.</source> + <translation>{0} elimina la excepción de ban a {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1120" /> + <source>{0} sets the channel mode to 'invite only'.</source> + <translation>{0} establece el modo de canal a 'invitar solamente'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1124" /> + <source>{0} removes the 'invite only' mode from the channel.</source> + <translation>{0} elimina el modo 'invitar solamente' del canal.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1129" /> + <source>{0} sets the channel key to '{1}'.</source> + <translation>{0} establece la clave de canal a '{1}'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1133" /> + <source>{0} removes the channel key.</source> + <translation>{0} elimina la clave del canal.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1136" /> + <source>{0} sets the channel limit to %n nick(s).</source> + <translation> + <numerusform>{0} establece el límite del canal a %n nick.</numerusform> + <numerusform>{0} establece el límite del canal a %n nicks.</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1142" /> + <source>{0} removes the channel limit.</source> + <translation>{0} elimina el límite del canal.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1145" /> + <source>{0} sets the channel mode to 'moderated'.</source> + <translation>{0} establece el modo de canal a 'moderado'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1149" /> + <source>{0} sets the channel mode to 'unmoderated'.</source> + <translation>{0} establece el modo de canal a 'no moderado'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1154" /> + <source>{0} sets the channel mode to 'no messages from outside'.</source> + <translation>{0} establece el modo de canal a 'sin mensajes del exterior'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1159" /> + <source>{0} sets the channel mode to 'allow messages from outside'.</source> + <translation>{0} establece el modo de canal a 'permitir mensajes del exterior'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1165" /> + <source>{0} sets the channel mode to 'private'.</source> + <translation>{0} establece el modo de canal a 'privado'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1169" /> + <source>{0} sets the channel mode to 'public'.</source> + <translation>{0} establece el modo de canal a 'público'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1174" /> + <source>{0} sets the channel mode to 'quiet'.</source> + <translation>{0} establece el modo de canal a 'silencioso'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1178" /> + <source>{0} removes the 'quiet' mode from the channel.</source> + <translation>{0} elimina el modo 'silencioso' del canal.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1185" /> + <source>{0} sets the channel mode to 'secret'.</source> + <translation>{0} establece el modo de canal a 'secreto'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1189" /> + <source>{0} sets the channel mode to 'visible'.</source> + <translation>{0} establece el modo de canal a 'visible'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1194" /> + <source>{0} switches on 'topic protection'.</source> + <translation>{0} activa 'tema protegido'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1198" /> + <source>{0} switches off 'topic protection'.</source> + <translation>{0} desactiva 'tema protegido'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1203" /> + <source>{0} sets invitation mask {1}.</source> + <translation>{0} establece máscara de invitación {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1207" /> + <source>{0} removes the invitation mask {1}.</source> + <translation>{0} elimina la máscara de invitación {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1211" /> + <source>Mode</source> + <translation>Modo</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1233" /> + <source>{0} sets mode for {1}: {2}.</source> + <translation>{0} establece el modo para {1}: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1265" /> + <source>Help</source> + <translation>Ayuda</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1318" /> + <location filename="../IrcChannelWidget.py" line="1308" /> + <location filename="../IrcChannelWidget.py" line="1300" /> + <location filename="../IrcChannelWidget.py" line="1292" /> + <source>CTCP</source> + <translation>CTCP</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1293" /> + <source>Received Version request from {0}.</source> + <translation>Recibida Solicitud de Versión desde {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1301" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation>Recibida solicitud CTCP-PING desde {0}, enviando respuesta.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1309" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation>Recibida solicitud CTCP-CLIENTINFO desde {0}, enviando respuesta.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1319" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation>Recibida solicitud CTCP desconocida desde {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1419" /> + <source>--- New From Here ---</source> + <translation>--- Nuevo a partir de Aquí ---</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1503" /> + <location filename="../IrcChannelWidget.py" line="1486" /> + <source>Save Messages</source> + <translation>Guardar Mensajes</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1488" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation>Archivos HTML (*.{0});;Archivos de Texto (*.txt);;Todos los Archivos (*)</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1504" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>El archivo <b>{0}</b> ya existe. ¿Desea sobreescribirlo?</p></translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1524" /> + <source>Error saving Messages</source> + <translation>Error al guardar Mensajes</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1525" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation><p>Los contenidos de mensajes no se han podido guardar en <b>{0}</b></p><p>Razón: {1}</p></translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1537" /> + <source>Copy</source> + <translation>Copiar</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1542" /> + <source>Cut all</source> + <translation>Cortar todo</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1547" /> + <source>Copy all</source> + <translation>Copiar todo</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1553" /> + <source>Clear</source> + <translation>Limpiar</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1558" /> + <source>Save</source> + <translation>Guardar</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1562" /> + <source>Mark Current Position</source> + <translation>Marcar Posición Actual</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1565" /> + <source>Remove Position Marker</source> + <translation>Eliminar Posición del Marcador</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1653" /> + <location filename="../IrcChannelWidget.py" line="1637" /> + <location filename="../IrcChannelWidget.py" line="1621" /> + <source>Enter the message to be sent:</source> + <translation>Introducir el mensaje a enviar:</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1688" /> + <location filename="../IrcChannelWidget.py" line="1636" /> + <source>Send Query</source> + <translation>Enviar Consulta</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1691" /> + <location filename="../IrcChannelWidget.py" line="1652" /> + <source>Send Notice</source> + <translation>Enviar Aviso</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1678" /> + <source>Who Is</source> + <translation>Quien Es</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1681" /> + <source>Private Chat</source> + <translation>Chat Privado</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1695" /> + <source>Send Ping</source> + <translation>Enviar Ping</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1698" /> + <source>Ignore User</source> + <translation>Ignorar Usuario</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1702" /> + <source>Refresh</source> + <translation>Actualizar</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1826" /> + <location filename="../IrcChannelWidget.py" line="1800" /> + <source>Who</source> + <translation>Quien</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1801" /> + <source>End of WHO list for {0}.</source> + <translation>Fin de lista WHO para {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1824" /> + <source> (Away)</source> + <translation> (No está)</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1827" /> + <source>{0} is {1}@{2} ({3}){4}</source> + <translation>{0} es {1}@{2} ({3}){4}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2216" /> + <location filename="../IrcChannelWidget.py" line="2195" /> + <location filename="../IrcChannelWidget.py" line="2174" /> + <location filename="../IrcChannelWidget.py" line="2151" /> + <location filename="../IrcChannelWidget.py" line="2131" /> + <location filename="../IrcChannelWidget.py" line="2111" /> + <location filename="../IrcChannelWidget.py" line="2091" /> + <location filename="../IrcChannelWidget.py" line="2068" /> + <location filename="../IrcChannelWidget.py" line="2060" /> + <location filename="../IrcChannelWidget.py" line="2052" /> + <location filename="../IrcChannelWidget.py" line="2041" /> + <location filename="../IrcChannelWidget.py" line="2022" /> + <location filename="../IrcChannelWidget.py" line="1988" /> + <location filename="../IrcChannelWidget.py" line="1983" /> + <location filename="../IrcChannelWidget.py" line="1960" /> + <location filename="../IrcChannelWidget.py" line="1937" /> + <location filename="../IrcChannelWidget.py" line="1930" /> + <location filename="../IrcChannelWidget.py" line="1923" /> + <location filename="../IrcChannelWidget.py" line="1916" /> + <location filename="../IrcChannelWidget.py" line="1909" /> + <location filename="../IrcChannelWidget.py" line="1902" /> + <location filename="../IrcChannelWidget.py" line="1851" /> + <source>Whois</source> + <translation>Whois</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1852" /> + <source>{0} is {1}@{2} ({3}).</source> + <translation>{0} es {1}@{2} ({3}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1903" /> + <source>{0} is a user on channels: {1}</source> + <translation>{0} es un usuario en los canales: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1910" /> + <source>{0} has voice on channels: {1}</source> + <translation>{0} tiene voz en los canales: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1917" /> + <source>{0} is a halfop on channels: {1}</source> + <translation>{0} es un halfop en los canales: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1924" /> + <source>{0} is an operator on channels: {1}</source> + <translation>{0} is un operador en los canales: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1931" /> + <source>{0} is owner of channels: {1}</source> + <translation>{0} es propietario de los canales: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1938" /> + <source>{0} is admin on channels: {1}</source> + <translation>{0} es un admin en los canales: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1961" /> + <source>{0} is online via {1} ({2}).</source> + <translation>{0} está online vía {1} ({2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1984" /> + <source>{0} is an IRC Operator.</source> + <translation>{0} es un Operador IRC.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2017" /> + <source>%n day(s)</source> + <translation> + <numerusform>%n día</numerusform> + <numerusform>%n días</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2037" /> + <location filename="../IrcChannelWidget.py" line="2018" /> + <source>%n hour(s)</source> + <translation> + <numerusform>%n hora</numerusform> + <numerusform>%n horas</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2049" /> + <location filename="../IrcChannelWidget.py" line="2038" /> + <location filename="../IrcChannelWidget.py" line="2019" /> + <source>%n minute(s)</source> + <translation> + <numerusform>%n minuto</numerusform> + <numerusform>%n minutos</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2050" /> + <location filename="../IrcChannelWidget.py" line="2039" /> + <location filename="../IrcChannelWidget.py" line="2020" /> + <source>%n second(s)</source> + <translation> + <numerusform>%n segundo</numerusform> + <numerusform>%n segundos</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2023" /> + <source>{0} has been idle for {1}, {2}, {3}, and {4}.</source> + <comment>{0} = name of person, {1} = (x days), {2} = (x hours), {3} = (x minutes), {4} = (x seconds)</comment> + <translation>{0} no ha mostrado actividad durante {1}, {2}, {3}, y {4}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2042" /> + <source>{0} has been idle for {1}, {2}, and {3}.</source> + <comment>{0} = name of person, {1} = (x hours), {2} = (x minutes), {3} = (x seconds)</comment> + <translation>{0} no ha mostrado actividad durante {1}, {2}, y {3}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2053" /> + <source>{0} has been idle for {1} and {2}.</source> + <comment>{0} = name of person, {1} = (x minutes), {3} = (x seconds)</comment> + <translation>{0} no ha mostrado actividad durante {1}, y {2}.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2061" /> + <source>{0} has been idle for %n second(s).</source> + <translation> + <numerusform>{0} no ha mostrado actividad durante %n segundo.</numerusform> + <numerusform>{0} no ha mostrado actividad durante %n segundos.</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2069" /> + <source>{0} has been online since {1}.</source> + <translation>{0} ha estado online desde {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2092" /> + <source>End of WHOIS list for {0}.</source> + <translation>Fin de lista WHOIS para {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2112" /> + <source>{0} is an identified user.</source> + <translation>{0} is an usuario identificado.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2132" /> + <source>{0} is available for help.</source> + <translation>{0} está disponible para ayudar.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2152" /> + <source>{0} is logged in as {1}.</source> + <translation>{0} está conectado como {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2175" /> + <source>{0} is actually using the host {1} (IP: {2}).</source> + <translation>{0} está utilizando en realidad el host {1} (IP: {2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2196" /> + <source>{0} is using a secure connection.</source> + <translation>{0} está utilizando una conexión segura.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2217" /> + <source>{0} is connecting from {1} (IP: {2}).</source> + <translation>{0} está conectando desde {1} (IP: {2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2240" /> + <source>Edit Channel Topic</source> + <translation>Editar Tema del Canal</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2241" /> + <source>Enter the topic for this channel:</source> + <translation>Introducir el tema para este canal:</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Press to change the topic</source> + <translation>Pulsar para cambiar el tema</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the list of users</source> + <translation>Muestra la lista de usuarios</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the channel messages</source> + <translation>Muestra los mensajes del canal</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Enter a message, send by pressing Return or Enter</source> + <translation>Introducir un mensaje, enviar pulsando Return o Enter</translation> + </message> + </context> + <context> + <name>IrcExtensionPlugin</name> + <message> + <location filename="../../PluginExtensionIrc.py" line="190" /> + <location filename="../../PluginExtensionIrc.py" line="186" /> + <location filename="../../PluginExtensionIrc.py" line="71" /> + <source>IRC</source> + <translation>IRC</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="191" /> + <source>&IRC</source> + <translation>&IRC</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="192" /> + <source>Ctrl+Alt+Shift+I</source> + <translation>Ctrl+Alt+Shift+I</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="198" /> + <source>Switch the input focus to the IRC window.</source> + <translation>Cambiar el foco de input a la ventana de IRC.</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="201" /> + <source><b>Activate IRC</b><p>This switches the input focus to the IRC window.</p></source> + <translation><b>Activar IRC</b><p>Cambia el foco de input a la ventana de IRC.</p></translation> + </message> + </context> + <context> + <name>IrcIdentitiesEditDialog</name> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>IRC Identities</source> + <translation>Identidades IRC</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation>Identidad:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select the identity to work on</source> + <translation>Seleccionar la identidad con la que trabajar</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add a new identity</source> + <translation>Pulsar para añadir una identidad nueva</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to copy the selected identity</source> + <translation>Pulsar para copiar la identidad seleccionada</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to rename the selected identity</source> + <translation>Pulsar para renombrar la identidad seleccionada</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected identity</source> + <translation>Pulsar para borrar la identidad seleccionada</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>General</source> + <translation>General</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Real Name:</source> + <translation>Nombre Real:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the real name</source> + <translation>Introduzca el nombre real</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Nick Names</source> + <translation>Sobrenombres (nicknames)</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a nick name to add</source> + <translation>Seleccionar un sobrenombre para añadir</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add the entered nick name</source> + <translation>Pulsar para añadir el sobrenombre introducido</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected nick name</source> + <translation>Pulsar para borrar el sobrenombre seleccionado</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name up</source> + <translation>Pulsar para mover hacia arriba el sobrenombre seleccionado</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name down</source> + <translation>Pulsar para mover hacia abajo el sobrenombre seleccionado</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Auto Identify</source> + <translation>Autoidentificar</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service:</source> + <translation>Servicio:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the name of the service to identify against</source> + <translation>IIntroducir el nombre del servicio contra el que identificarse</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service name can be <b><i>nickserv</i></b> or a network-dependent name such as <b><i>nickserv@services.dal.net</i></b></source> + <translation>El nombre de Servicio puede ser <b><i>nickserv</i></b> or un nombre dependiente de red tal como <b><i>nickserv@services.dal.net</i></b></translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Password:</source> + <translation>Contraseña:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the password</source> + <translation>Introducir la contraseña</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="506" /> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to show the password</source> + <translation>Pulsar para mostrar la contraseña</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away</source> + <translation>Ausente</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select to mark the current position in the chat, when you send an AWAY command.</source> + <translation>Seleccionar para marcar la posición actual en el chat cuando se envíe un comando AWAY.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Mark the current position in chat windows when going away</source> + <translation>Marcar la posición actual en la ventana de chat al ausentarse</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away Message:</source> + <translation>Mensaje de Ausencia:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the message to be sent when going away</source> + <translation>Introducir el mensaje para enviar al ausentarse</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Advanced</source> + <translation>Avanzado</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Ident:</source> + <translation>Ident:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the identity to be used to log-on to the server</source> + <translation>Introducir la identidad para usar al conectarse al servidor</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Quit:</source> + <translation>Razón para Salir:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a message to be sent when quitting</source> + <translation>Introducir un mensaje para enviar al salir</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Part:</source> + <translation>Razón para Irse:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter message to be sent when leaving a channel</source> + <translation>Introducir el mensaje para enviar al abandonar un canal</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="206" /> + <location filename="../IrcIdentitiesEditDialog.py" line="188" /> + <source>Edit Identity</source> + <translation>Editar Identidad</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="189" /> + <source>The identity must contain at least one nick name.</source> + <translation>La identidad debe contener al menos un sobrenombre.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="207" /> + <source>The identity must have a real name.</source> + <translation>La identidad debe tener un nombre real.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="259" /> + <location filename="../IrcIdentitiesEditDialog.py" line="240" /> + <location filename="../IrcIdentitiesEditDialog.py" line="230" /> + <source>Add Identity</source> + <translation>Añadir Identidad</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="315" /> + <location filename="../IrcIdentitiesEditDialog.py" line="273" /> + <location filename="../IrcIdentitiesEditDialog.py" line="231" /> + <source>Identity Name:</source> + <translation>Nombre de Identidad:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="326" /> + <location filename="../IrcIdentitiesEditDialog.py" line="284" /> + <location filename="../IrcIdentitiesEditDialog.py" line="241" /> + <source>An identity named <b>{0}</b> already exists. You must provide a different name.</source> + <translation>Una identidad nombrada <b>{0}</b> ya existe. Debe proporcionarse un nombre distinto.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="343" /> + <location filename="../IrcIdentitiesEditDialog.py" line="302" /> + <location filename="../IrcIdentitiesEditDialog.py" line="260" /> + <source>The identity has to have a name.</source> + <translation>La identidad tiene que tener un nombre.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="342" /> + <location filename="../IrcIdentitiesEditDialog.py" line="301" /> + <location filename="../IrcIdentitiesEditDialog.py" line="283" /> + <location filename="../IrcIdentitiesEditDialog.py" line="272" /> + <source>Copy Identity</source> + <translation>Copiar Identidad</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="325" /> + <location filename="../IrcIdentitiesEditDialog.py" line="314" /> + <source>Rename Identity</source> + <translation>Renombrar Identidad</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="366" /> + <source>This identity is in use. If you remove it, the network settings using it will fall back to the default identity. Should it be deleted anyway?</source> + <translation>Esta identidad está en uso. Si es eliminada, los ajustes de red que la están utilizando recurrirán a la identidad por defecto. ¿Borrarla de todos modos?</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="372" /> + <source>Do you really want to delete all information for this identity?</source> + <translation>¿Realmente quiere borrar estas toda la información para esta identidad?</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="377" /> + <source>Delete Identity</source> + <translation>Borrar Identidad</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="502" /> + <source>Press to hide the password</source> + <translation>Pulsar para ocultar la contraseña</translation> + </message> + </context> + <context> + <name>IrcIdentity</name> + <message> + <location filename="../IrcNetworkManager.py" line="26" /> + <source>Default Identity</source> + <translation>Identidad por Defecto</translation> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="30" /> + <source>Gone away for now.</source> + <translation>Ausente por ahora.</translation> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="32" /> + <location filename="../IrcNetworkManager.py" line="31" /> + <source>IRC for eric IDE</source> + <translation>IRC para eric IDE</translation> + </message> + </context> + <context> + <name>IrcNetworkEditDialog</name> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>IRC Network</source> + <translation>Red IRC</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Network Name:</source> + <translation>Nombre de Red:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Enter the name of the IRC network</source> + <translation>Introducir el nombre de la red IRC</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation>Identidad:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Select the identity to be used for the IRC network</source> + <translation>Seleccionar la identidad a utilizar para la erd IRC</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation>Pulsar para editar las identidades</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Server:</source> + <translation>Servidor:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the server configuration</source> + <translation>Pulsar para editar la configuración del servidor</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channels:</source> + <translation>Canales:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channel</source> + <translation>Canal</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Join Automatically</source> + <translation>Unirse Automáticamente</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to add a new channel</source> + <translation>Pulsar para añadir un nuevo canal</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the selected channel</source> + <translation>Pulsar para editar el canal seleccionado</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to delete the selected channel</source> + <translation>Pulsar para borrar el canal seleccionado</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Shows the name of the server</source> + <translation>Muestra el nombre del servidor</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="261" /> + <location filename="../IrcNetworkEditDialog.py" line="255" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>Yes</source> + <translation>Si</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="263" /> + <location filename="../IrcNetworkEditDialog.py" line="257" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>No</source> + <translation>No</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="192" /> + <source>Delete Channel</source> + <translation>Borrar Canal</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="193" /> + <source>Do you really want to delete channel <b>{0}</b>?</source> + <translation>¿Desea realmente borrar el canal <b>{0}</b>?</translation> + </message> + </context> + <context> + <name>IrcNetworkListDialog</name> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>IRC Networks</source> + <translation>Redes IRC</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to define a new network</source> + <translation>Pulsar para definir una nueva red</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&New...</source> + <translation>&Nuevo...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the selected network</source> + <translation>Pulsar para editar la red seleccionada</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Edit...</source> + <translation>&Editar...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to delete the selected network</source> + <translation>Pulsar para borrar la red seleccionada</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Delete</source> + <translation>&Borrar</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to toggle the auto-connect flag of the selected network</source> + <translation>Pulsar para conmutar el flag de autoconexión de la red seleccionada</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Auto-Connect</source> + <translation>&Autoconectar</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation>Pulsar para editar las identidades</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Edit &Identities...</source> + <translation>Editar &Identidades...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>Yes</source> + <translation>Si</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>No</source> + <translation>No</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="91" /> + <source>Identity</source> + <translation>Identidad</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="94" /> + <source>Server</source> + <translation>Servidor</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="97" /> + <source>Channels</source> + <translation>Canales</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="252" /> + <location filename="../IrcNetworkListDialog.py" line="99" /> + <source>Auto-Connect</source> + <translation>Autoconectar</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="170" /> + <source>Delete Irc Network</source> + <translation>Borrar Red IRC</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="171" /> + <source>Do you really want to delete IRC network <b>{0}</b>?</source> + <translation>¿Desea realmente borrar la red IRC <b>{0}</b>?</translation> + </message> + </context> + <context> + <name>IrcNetworkWidget</name> + <message> + <location filename="../IrcNetworkWidget.py" line="354" /> + <source>Press to disconnect from the network</source> + <translation>Pulsar para desconectar de la red</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="359" /> + <source>Press to connect to the selected network</source> + <translation>Pulsar para conectar a la red seleccionada</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="450" /> + <location filename="../IrcNetworkWidget.py" line="433" /> + <source>Save Messages</source> + <translation>Guardar Mensajes</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="435" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation>Archivos HTML (*.{0});;Archivos de Texto (*.txt);;Todos los Archivos (*)</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="451" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>El archivo <b>{0}</b> ya existe. ¿Desea sobreescribirlo?</p></translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="471" /> + <source>Error saving Messages</source> + <translation>Error al guardar Mensajes</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="472" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation><p>Los contenidos de mensajes no se han podido guardar en <b>{0}</b></p><p>Razón: {1}</p></translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="484" /> + <source>Copy</source> + <translation>Copiar</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="489" /> + <source>Cut all</source> + <translation>Cortar todo</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="494" /> + <source>Copy all</source> + <translation>Copiar todo</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="500" /> + <source>Clear</source> + <translation>Limpiar</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="505" /> + <source>Save</source> + <translation>Guardar</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Shows the network messages</source> + <translation>Muestra los mensajes de red</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a network to connect to</source> + <translation>Seleccionar una red para conectarse</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to set the user status to AWAY</source> + <translation>Pulsar para establecer el status de usuario como AWAY (ausente)</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to edit the networks</source> + <translation>Pulsar para editar las redes</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a nick name for the channel</source> + <translation>Seleccionar un sobrenombre para el canal</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Enter the channel to join</source> + <translation>Introducir el canal al que unirse</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to join the channel</source> + <translation>Pulsar para unirse al canal</translation> + </message> + </context> + <context> + <name>IrcPage</name> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source><b>Configure IRC</b></source> + <translation><b>Configurar IRC</b></translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show timestamps</source> + <translation>Habilitar para mostrar indicadores de tiempo</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Timestamps</source> + <translation>Mostrar Indicadores de Tiempo</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Time Format:</source> + <translation>Formato de Tiempo:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the time format to use</source> + <translation>Seleccionar el formato de tiempo a utilizar</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Date Format</source> + <translation>Formato de Fecha</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the date format to use</source> + <translation>Seleccionar el formato de fecha a utilizar</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show the date in timestamps</source> + <translation>Seleccionar para mostrar la fecha en los indicadores de tiempo</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Date</source> + <translation>Mostrar Fecha</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Colors</source> + <translation>Colores</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Network Messages:</source> + <translation>Mensajes de Red:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for network messages</source> + <translation>Seleccionar el color para mensajes de red</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Nick Names:</source> + <translation>Sobrenombres (Nick Names):</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for nick names</source> + <translation>Seleccionar el color para los sobrenombres</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Server Messages:</source> + <translation>Mensajes del Servidor:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for server messages</source> + <translation>Seleccionar el color para mensajes del servidor</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Own Nick Name:</source> + <translation>Sombrenombre Propio:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for own nick name</source> + <translation>Seleccionar el color para el sobrenombre propio</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Messages:</source> + <translation>Mensajes del Canal:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel messages</source> + <translation>Seleccionar el color para mensajes del canal</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join Channel:</source> + <translation>Unirse al Canal:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for join channel messages</source> + <translation>Seleccionar el color para mensajes de unión al canal</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Error Messages:</source> + <translation>Mensajes de Error:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for error messages</source> + <translation>Seleccionar el color para mensajes de error</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Leave Channel:</source> + <translation>Abandonar Canal:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for leave channel messages</source> + <translation>Seleccionar el color para mensajes de abandonar el canal</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Timestamp:</source> + <translation>Indicador de Tiempo:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for timestamps</source> + <translation>Seleccionar el color para los indicadores de tiempo</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Info:</source> + <translation>Info del Canal:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel info messages</source> + <translation>Seleccionar el color para mensajes de info del canal</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Hyperlink:</source> + <translation>Hiperenlace:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for hyperlinks</source> + <translation>Seleccionar el color para hiperenlaces</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to allow colored text in IRC messages</source> + <translation>Habilitar para permitir texto coloreado en mensajes IRC</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Allow Colored Text in IRC Messages</source> + <translation>Permitir texto coloreado en mensajes IRC</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show notifications</source> + <translation>Habilitar para mostrar notificaciones</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Notifications</source> + <translation>Mostrar notificaciones</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for join and leave events</source> + <translation>Seleccionar para mostrar una notificación para los eventos de unirse y abandonar</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join/Leave Event</source> + <translation>Evento Unirse/Abandonar</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every message</source> + <translation>Seleccionar para mostrar una notificación para cada mensaje</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Every Message</source> + <translation>Todos los Mensajes</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every mentioning of your nick</source> + <translation>Seleccionar para mostrar una notificación cada vez que su sobrenombre es mencionado</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mentioning of Own Nick</source> + <translation>Mencion de Nick Propio</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select this to enable the automatic lookup of user information for joined channels</source> + <translation>Seleccionar para habilitar la búsqueda automática de información de usuario para los canales a los que se une</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable Automatic User Information Lookup (/WHO)</source> + <translation>Habilitar Búsqueda Automática de Información del Usuario (/WHO)</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Max. Number of Users in Channel:</source> + <translation>Máx. Número de Usuarios en el Canal:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the maximum numbers of users in a channel allowed for this function</source> + <translation>Introducir el máximo número de usuarios en un canal permitidos para esta función</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Update Interval:</source> + <translation>Intervalo de Actualización:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the user information update interval</source> + <translation>Introducir el intervalo de actualización de información de usuario</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source> s</source> + <translation> s</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker</source> + <translation>Marcador</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to mark the current position, when the chat window is hidden</source> + <translation>Seleccionar para marcar la posición actual cuando la ventana de chat es ocultada</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mark Current Position When Hidden</source> + <translation>Marcar Posición Actual al Ocultar</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Foreground:</source> + <translation>Color de Primer Plano para el Marcador:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the foreground color for the marker</source> + <translation>Seleccionar el color de primer plano para el marcador</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the background color for the marker</source> + <translation>Seleccionar el color de fondo para el marcador</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Background:</source> + <translation>Color Fondo para el Marcador:</translation> + </message> + </context> + <context> + <name>IrcServerEditDialog</name> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>IRC Server</source> + <translation>Servidor IRC</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Server:</source> + <translation>Servidor:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the host name of the IRC server</source> + <translation>Introduzca el nombre de host del servidor IRC</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Port:</source> + <translation>Puerto:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the port number</source> + <translation>Introduzca el número de puerto</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Password:</source> + <translation>Contraseña:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the server password</source> + <translation>Introducir la contraseña del servidor</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Select to use an SSL encrypted connection</source> + <translation>Seleccionar para utilizar una conexión encriptada con SSL</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Use Encrypted Connection (SSL)</source> + <translation>Usar Conexión Encriptada (SSL)</translation> + </message> + </context> + <context> + <name>IrcUserItem</name> + <message> + <location filename="../IrcChannelWidget.py" line="136" /> + <source>{0} (ignored)</source> + <translation>{0} (ignorado)</translation> + </message> + </context> + <context> + <name>IrcUtilities</name> + <message> + <location filename="../IrcUtilities.py" line="162" /> + <source>anonymous</source> + <translation>anónimo</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="163" /> + <source>ban mask</source> + <translation>mascara de ban</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="164" /> + <source>no colors allowed</source> + <translation>no se permiten colores</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="165" /> + <source>ban exception mask</source> + <translation>máscara de excepción de mask</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="166" /> + <source>invite only</source> + <translation>invitar solo</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="167" /> + <source>password protected</source> + <translation>protegido por contraseña</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="168" /> + <source>user limit</source> + <translation>límite de usuarios</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="169" /> + <source>moderated</source> + <translation>moderado</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="170" /> + <source>no messages from outside</source> + <translation>no mensajes desde afuera</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="171" /> + <source>private</source> + <translation>privado</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="172" /> + <source>quiet</source> + <translation>silencioso</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="173" /> + <source>reop channel</source> + <translation>reop de canal</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="174" /> + <source>secret</source> + <translation>secreto</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="175" /> + <source>topic protection</source> + <translation>protección de tema</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="176" /> + <source>invitation mask</source> + <translation>máscara de invitación</translation> + </message> + </context> + <context> + <name>IrcWidget</name> + <message> + <location filename="../IrcWidget.py" line="86" /> + <source>Press to leave the current channel</source> + <translation>Pulsar para abandonar el canal actual</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="225" /> + <source>SSL Connection</source> + <translation>Conexión SSL</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="226" /> + <source>An encrypted connection to the IRC network was requested but SSL is not available. Please change the server configuration.</source> + <translation>Se ha solicitado una conexión encriptada pero SSL no está disponible. Por favor, cambie la configuración del servidor.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <location filename="../IrcWidget.py" line="572" /> + <location filename="../IrcWidget.py" line="563" /> + <location filename="../IrcWidget.py" line="302" /> + <location filename="../IrcWidget.py" line="297" /> + <location filename="../IrcWidget.py" line="290" /> + <location filename="../IrcWidget.py" line="266" /> + <location filename="../IrcWidget.py" line="252" /> + <source>Info</source> + <translation>Info</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="253" /> + <source>Looking for server {0} (port {1}) using an SSL encrypted connection...</source> + <translation>Buscando el servidor {0} (puerto {1}) utilizando una conexión encriptada a través de SSL...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="267" /> + <source>Looking for server {0} (port {1})...</source> + <translation>Buscando servidor {0} (puerto {1})...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="280" /> + <source>Disconnect from Server</source> + <translation>Desconectar del Servidor</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="281" /> + <source><p>Do you really want to disconnect from <b>{0}</b>?</p><p>All channels will be closed.</p></source> + <translation><p>¿Desea realmente desconectar de <b>{0}</b>?</p><p>Se cerrarán todos los canales.</p></translation> + </message> + <message> + <location filename="../IrcWidget.py" line="291" /> + <source>Disconnecting from server {0}...</source> + <translation>Desconectando del servidor {0}...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="298" /> + <source>Disconnecting from network {0}...</source> + <translation>Desconectando de la red {0}...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="302" /> + <source>Disconnecting from server.</source> + <translation>Desconectando del servidor.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="563" /> + <source>Server found,connecting...</source> + <translation>Servidor encontrado, conectando...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="572" /> + <source>Connected,logging in...</source> + <translation>Conectado, validándose...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <source>Server disconnected.</source> + <translation>Servidor desconectado.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="651" /> + <source>Message Error</source> + <translation>Error de Mensaje</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="652" /> + <source>Unknown message received from server:<br/>{0}</source> + <translation>Mensaje desconocido recibido del servidor: </br>{0}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1093" /> + <location filename="../IrcWidget.py" line="1083" /> + <location filename="../IrcWidget.py" line="1075" /> + <location filename="../IrcWidget.py" line="1067" /> + <location filename="../IrcWidget.py" line="695" /> + <location filename="../IrcWidget.py" line="687" /> + <source>CTCP</source> + <translation>CTCP</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="688" /> + <source>Received CTCP-PING response from {0} with latency of {1} ms.</source> + <translation>Recibida respuesta CTCP-PING desde {0} con una latencia de {1} ms.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="696" /> + <source>Received unknown CTCP-{0} response from {1}.</source> + <translation>Recibida respuesta CTCP-{0} desconocida desde {1}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="724" /> + <source>Notice</source> + <translation>Aviso</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="734" /> + <source>You have set your personal modes to <b>[{0}]</b>.</source> + <translation>Usted ha establecido sus modos personales a <b>[{0}]</b>.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="738" /> + <source>{0} has changed your personal modes to <b>[{1}]</b>.</source> + <translation>{0} ha cambiado los modos personales de usted a <b>[{1}]</b>.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="742" /> + <source>Mode</source> + <translation>Modo</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="750" /> + <source>You have left channel {0}.</source> + <translation>Ha dejado el canal {0}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="762" /> + <source>You are now known as {0}.</source> + <translation>Usted es conocido como {0}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="768" /> + <source>User {0} is now known as {1}.</source> + <translation>Usuario {0} es conocido ahora como {1}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="774" /> + <source>Received PONG from {0}</source> + <translation>Recibido PONG desde {0}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="779" /> + <source>Server Error</source> + <translation>Error de Servidor</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="817" /> + <source>Error</source> + <translation>Error</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="836" /> + <source>Welcome</source> + <translation>Bienvenido</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="838" /> + <source>Support</source> + <translation>Soporte</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="840" /> + <source>User</source> + <translation>Usuario</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="842" /> + <source>MOTD</source> + <translation>MOTD</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="844" /> + <source>Away</source> + <translation>Ausente</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="846" /> + <source>Info ({0})</source> + <translation>Info ({0})</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="850" /> + <source>Message of the day</source> + <translation>Mensaje del día</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="852" /> + <source>End of message of the day</source> + <translation>Fin de mensaje del día</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="855" /> + <source>Server {0} (Version {1}), User-Modes: {2}, Channel-Modes: {3}</source> + <translation>Servidor {0} (Versión {1}), Modos de Usuario: {2}, Modos de Canal: {3}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="860" /> + <source>Current users on {0}: {1}, max. {2}</source> + <translation>Usuarios actuales en {0}: {1}, máx. {2}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="865" /> + <source>Current users on the network: {0}, max. {1}</source> + <translation>Usuarios actuales en la red: {0}, máx. {1}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="869" /> + <source>You are no longer marked as being away.</source> + <translation>Usted ya no está marcado como ausente.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="871" /> + <source>You have been marked as being away.</source> + <translation>Usted ha sido marcado como ausente.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1002" /> + <location filename="../IrcWidget.py" line="986" /> + <location filename="../IrcWidget.py" line="934" /> + <source>SSL Error</source> + <translation>Error de SSL</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="935" /> + <source>Connection to server {0} (port {1}) lost while waiting for user response to an SSL error.</source> + <translation>Conexión al servidor {0} (puerto {1}) perdida mientras se esperaba respuesta de usuario a un error SSL.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <location filename="../IrcWidget.py" line="964" /> + <location filename="../IrcWidget.py" line="959" /> + <location filename="../IrcWidget.py" line="951" /> + <location filename="../IrcWidget.py" line="943" /> + <source>Socket Error</source> + <translation>Error de Socket</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="944" /> + <source>The host was not found. Please check the host name and port settings.</source> + <translation>El host no ha sido encontrado. Por favor, compruebe los ajustes de nombre de host y puerto.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="952" /> + <source>The connection was refused by the peer. Please check the host name and port settings.</source> + <translation>La conexión ha sido rechazada por el otro extremo. Por favor, compruebe los ajustes de nombre de host y puerto.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="959" /> + <source>The SSL handshake failed.</source> + <translation>Ha fallado el SSL handshake.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="965" /> + <source>The following network error occurred:<br/>{0}</source> + <translation>Ha ocurrido el siguiente error de red: <br/>{0}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <source>A network error occurred.</source> + <translation>Ha ocurrido un error de red.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="987" /> + <source>Could not connect to {0} (port {1}) using an SSL encrypted connection. Either the server does not support SSL (did you use the correct port?) or you rejected the certificate.</source> + <translation>No se ha podido conectar a {0} (puerto {1}) utilizando una conexión encriptada sobre SSL. O bien el servidor no soporta SSL (¿se ha utilizado el puerto correcto?) o bien usted ha rechazado el certificado.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1003" /> + <source>The SSL certificate for the server {0} (port {1}) failed the authenticity check. SSL errors were accepted by you.</source> + <translation>El certificado SSL para el servidor {0} (puerto {1}) ha fallado la comprobación de autenticidad. Los errores SSL han sido aceptados por usted.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1068" /> + <source>Received Version request from {0}.</source> + <translation>Se ha recibido una solicitud de Versión de {0}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1076" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation>Recibida solicitud CTCP-PING desde {0}, enviando respuesta.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1084" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation>Recibida solicitud CTCP-CLIENTINFO desde {0}, enviando respuesta.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1094" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation>Recibida solicitud CTCP desconocida desde {1}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1110" /> + <source>{0} ({1})</source> + <comment>channel name, users count</comment> + <translation>{0} ({1})</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <location filename="../IrcWidget.py" line="1132" /> + <source>Critical</source> + <translation>Crítico</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1133" /> + <source>No nickname acceptable to the server configured for <b>{0}</b>. Disconnecting...</source> + <translation>No hay un sobrenombre que el servidor acepte configurado para <b>{0}</b>. Desconectando...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <source>The given nickname is already in use.</source> + <translation>El sobrenombre proporcionado ya está en uso.</translation> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Channels</source> + <translation>Canales</translation> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Network</source> + <translation>Red</translation> + </message> + </context> +</TS>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/i18n/irc_ru.ts Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2068 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ru_RU"> + <context> + <name>IrcChannelEditDialog</name> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>IRC Channel</source> + <translation>IRC канал</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Name:</source> + <translation>Имя:</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel name</source> + <translation>Введите имя канала</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Key:</source> + <translation>Ключ:</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Enter the channel key/password</source> + <translation>Введите ключ/пароль для канала</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Select to join this channel automatically</source> + <translation>Разрешить автоматическое подключение к каналу</translation> + </message> + <message> + <location filename="../IrcChannelEditDialog.ui" line="0" /> + <source>Join channel automatically</source> + <translation>Автоматически подключиться к каналу</translation> + </message> + </context> + <context> + <name>IrcChannelWidget</name> + <message> + <location filename="../IrcChannelWidget.py" line="1685" /> + <location filename="../IrcChannelWidget.py" line="1620" /> + <location filename="../IrcChannelWidget.py" line="453" /> + <source>Send Message</source> + <translation>Отправить сообщение</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="454" /> + <source>Messages starting with a '/' are not allowed in private chats.</source> + <translation>В приватных разговорах сообщения, начинающиеся с '/', не разрешаются.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="570" /> + <source>Leave IRC channel</source> + <translation>Уйти с IRC канала</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="571" /> + <source>Do you really want to leave the IRC channel <b>{0}</b>?</source> + <translation>Вы действительно хотите уйти с канала <b>{0}</b>?</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="740" /> + <source>Channel Message</source> + <translation>Сообщение в канале</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="747" /> + <source>Nick mentioned</source> + <translation>Упомянутый ник</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="778" /> + <source>{0} has joined the channel {1} ({2}).</source> + <translation>{0} присоединился к каналу {1} ({2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="783" /> + <source>You have joined the channel {0} ({1}).</source> + <translation>Вы присоединились к каналу {0} ({1}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="791" /> + <source>Join Channel</source> + <translation>Подключиться к каналу</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="811" /> + <source>{0} has left {1}.</source> + <translation>{0} отсоединился {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="818" /> + <location filename="../IrcChannelWidget.py" line="815" /> + <source>{0} has left {1}: {2}.</source> + <translation>{0} отсоединился {1}: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="826" /> + <source>Leave Channel</source> + <translation>Уйти с канала</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="846" /> + <source>{0} has quit {1}.</source> + <translation>{0} отсоединился {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="849" /> + <source>{0} has quit {1}: {2}.</source> + <translation>{0} отсоединился {1}: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="857" /> + <source>Quit</source> + <translation>Выйти</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="878" /> + <source>You are now known as {0}.</source> + <translation>Вы теперь {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="884" /> + <source>User {0} is now known as {1}.</source> + <translation>Пользователь {0} сменил псевдоним на {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="929" /> + <source>Away</source> + <translation>Отошел</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="930" /> + <source>{0} is away: {1}</source> + <translation>{0} вдали: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="950" /> + <source>The channel topic is: "{0}".</source> + <translation>Тема канала: "{0}".</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="969" /> + <source>The topic was set by {0} on {1}.</source> + <translation>Тему отрыл {0} {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="992" /> + <source>Channel URL: {0}</source> + <translation>URL канала: {0}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1017" /> + <source>password protected ({0})</source> + <translation>защищён паролем ({0})</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1020" /> + <source>limited to %n user(s)</source> + <translation> + <numerusform>ограничивается %n пользователем</numerusform> + <numerusform>ограничивается %n пользователями</numerusform> + <numerusform>ограничивается %n пользователями</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1028" /> + <source>Channel modes: {0}.</source> + <translation>Режимы канала: {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1047" /> + <source>This channel was created on {0}.</source> + <translation>Этот канал был открыт {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1084" /> + <source>{0} sets the channel mode to 'anonymous'.</source> + <translation>{0} устанавливает 'анонимный' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1088" /> + <source>{0} removes the 'anonymous' mode from the channel.</source> + <translation>{0} отменяет 'анонимный' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1093" /> + <source>{0} sets a ban on {1}.</source> + <translation>{0} устанавливает запрет на {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1097" /> + <source>{0} removes the ban on {1}.</source> + <translation>{0} снимает запрет на {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1102" /> + <source>{0} sets the channel mode to 'no colors allowed'.</source> + <translation>{0} устанавливает 'цвета запрещены' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1106" /> + <source>{0} sets the channel mode to 'allow color codes'.</source> + <translation>{0} устанавливает 'цвета разрешены' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1111" /> + <source>{0} sets a ban exception on {1}.</source> + <translation>{0} устанавливает ислючение на запрет на {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1115" /> + <source>{0} removes the ban exception on {1}.</source> + <translation>{0} отменяет ислючение на запрет на {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1120" /> + <source>{0} sets the channel mode to 'invite only'.</source> + <translation>{0} устанавливает 'только по приглашению' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1124" /> + <source>{0} removes the 'invite only' mode from the channel.</source> + <translation>{0} отменяет 'только по приглашению' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1129" /> + <source>{0} sets the channel key to '{1}'.</source> + <translation>{0} устанавливает ключ '{1}' для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1133" /> + <source>{0} removes the channel key.</source> + <translation>{0} удаляет ключ для канала.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="1136" /> + <source>{0} sets the channel limit to %n nick(s).</source> + <translation> + <numerusform>{0} устанавливает ограничение канала в %n ник.</numerusform> + <numerusform>{0} устанавливает ограничение канала в %n ника.</numerusform> + <numerusform>{0} устанавливает ограничение канала в %n ников.</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1142" /> + <source>{0} removes the channel limit.</source> + <translation>{0} снимает ограничение на число пользователей канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1145" /> + <source>{0} sets the channel mode to 'moderated'.</source> + <translation>{0} устанавливает 'контролируемый' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1149" /> + <source>{0} sets the channel mode to 'unmoderated'.</source> + <translation>{0} устанавливает 'неконтролируемый' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1154" /> + <source>{0} sets the channel mode to 'no messages from outside'.</source> + <translation>{0} устанавливает 'внешние сообщения запрещены' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1159" /> + <source>{0} sets the channel mode to 'allow messages from outside'.</source> + <translation>{0} устанавливает режим 'внешние сообщения разрешены' для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1165" /> + <source>{0} sets the channel mode to 'private'.</source> + <translation>{0} устанавливает 'приватный' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1169" /> + <source>{0} sets the channel mode to 'public'.</source> + <translation>{0} устанавливает ''public' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1174" /> + <source>{0} sets the channel mode to 'quiet'.</source> + <translation>{0} устанавливает 'тихий' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1178" /> + <source>{0} removes the 'quiet' mode from the channel.</source> + <translation>{0} отменяет 'тихий' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1185" /> + <source>{0} sets the channel mode to 'secret'.</source> + <translation>{0} устанавливает 'секретный' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1189" /> + <source>{0} sets the channel mode to 'visible'.</source> + <translation>{0} устанавливает 'открытый' режим для канала.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1194" /> + <source>{0} switches on 'topic protection'.</source> + <translation>{0} включает 'тема защищена'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1198" /> + <source>{0} switches off 'topic protection'.</source> + <translation>{0} выключает 'тема защищена'.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1203" /> + <source>{0} sets invitation mask {1}.</source> + <translation>{0} устанавливает шаблон для приглашений {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1207" /> + <source>{0} removes the invitation mask {1}.</source> + <translation>{0} отменяет шаблон для приглашений {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1211" /> + <source>Mode</source> + <translation>Режим</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1233" /> + <source>{0} sets mode for {1}: {2}.</source> + <translation>{0} устанавливает режим для {1}: {2}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1265" /> + <source>Help</source> + <translation>Справка</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1318" /> + <location filename="../IrcChannelWidget.py" line="1308" /> + <location filename="../IrcChannelWidget.py" line="1300" /> + <location filename="../IrcChannelWidget.py" line="1292" /> + <source>CTCP</source> + <translation>CTCP (Клиент-клиент протокол)</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1293" /> + <source>Received Version request from {0}.</source> + <translation>Получен запрос версии от {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1301" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation>CTCP-PING запрос от {0}, отправление ответа.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1309" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation>CTCP-CLIENTINFO запрос от {0}, отправление ответа.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1319" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation>Неизвестный CTCP-{0} запрос от {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1419" /> + <source>--- New From Here ---</source> + <translation>--- Здесь новые сообщения ---</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1503" /> + <location filename="../IrcChannelWidget.py" line="1486" /> + <source>Save Messages</source> + <translation>Сохранить сообщения</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1488" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation>Файлы HTML (*.{0});;Файлы текстовые (*.txt);;Все файлы (*)</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1504" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>Файл <b>{0}</b> уже существует. Переписать?</p></translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1524" /> + <source>Error saving Messages</source> + <translation>Ошибка при сохранении сообщений</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1525" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation><p>Невозможно записать сообщения в файл <b>{0}</b>:<br>Причина: {1}.</p></translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1537" /> + <source>Copy</source> + <translation>Копировать</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1542" /> + <source>Cut all</source> + <translation>Вырезать всё</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1547" /> + <source>Copy all</source> + <translation>Копировать всё</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1553" /> + <source>Clear</source> + <translation>Очистить</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1558" /> + <source>Save</source> + <translation>Сохранить</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1562" /> + <source>Mark Current Position</source> + <translation>Пометить текущую позицию</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1565" /> + <source>Remove Position Marker</source> + <translation>Удалить маркер позиции</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1653" /> + <location filename="../IrcChannelWidget.py" line="1637" /> + <location filename="../IrcChannelWidget.py" line="1621" /> + <source>Enter the message to be sent:</source> + <translation>Введите сообщение для отправки:</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1688" /> + <location filename="../IrcChannelWidget.py" line="1636" /> + <source>Send Query</source> + <translation>Отправить запрос</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1691" /> + <location filename="../IrcChannelWidget.py" line="1652" /> + <source>Send Notice</source> + <translation>Отправить уведомление</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1678" /> + <source>Who Is</source> + <translation>Кто это</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1681" /> + <source>Private Chat</source> + <translation>Приватный чат</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1695" /> + <source>Send Ping</source> + <translation>Отправить Ping</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1698" /> + <source>Ignore User</source> + <translation>Игнорировать пользователя</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1702" /> + <source>Refresh</source> + <translation>Освежить</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1826" /> + <location filename="../IrcChannelWidget.py" line="1800" /> + <source>Who</source> + <translation>Кто</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1801" /> + <source>End of WHO list for {0}.</source> + <translation>Конец списка для {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1824" /> + <source> (Away)</source> + <translation> (отсутствует)</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1827" /> + <source>{0} is {1}@{2} ({3}){4}</source> + <translation>{0} это {1}@{2} ({3}){4}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2216" /> + <location filename="../IrcChannelWidget.py" line="2195" /> + <location filename="../IrcChannelWidget.py" line="2174" /> + <location filename="../IrcChannelWidget.py" line="2151" /> + <location filename="../IrcChannelWidget.py" line="2131" /> + <location filename="../IrcChannelWidget.py" line="2111" /> + <location filename="../IrcChannelWidget.py" line="2091" /> + <location filename="../IrcChannelWidget.py" line="2068" /> + <location filename="../IrcChannelWidget.py" line="2060" /> + <location filename="../IrcChannelWidget.py" line="2052" /> + <location filename="../IrcChannelWidget.py" line="2041" /> + <location filename="../IrcChannelWidget.py" line="2022" /> + <location filename="../IrcChannelWidget.py" line="1988" /> + <location filename="../IrcChannelWidget.py" line="1983" /> + <location filename="../IrcChannelWidget.py" line="1960" /> + <location filename="../IrcChannelWidget.py" line="1937" /> + <location filename="../IrcChannelWidget.py" line="1930" /> + <location filename="../IrcChannelWidget.py" line="1923" /> + <location filename="../IrcChannelWidget.py" line="1916" /> + <location filename="../IrcChannelWidget.py" line="1909" /> + <location filename="../IrcChannelWidget.py" line="1902" /> + <location filename="../IrcChannelWidget.py" line="1851" /> + <source>Whois</source> + <translation>Whois</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1852" /> + <source>{0} is {1}@{2} ({3}).</source> + <translation>{0} это {1}@{2} ({3}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1903" /> + <source>{0} is a user on channels: {1}</source> + <translation>{0} это пользователь в каналах: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1910" /> + <source>{0} has voice on channels: {1}</source> + <translation>{0} обладает голосом в каналах: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1917" /> + <source>{0} is a halfop on channels: {1}</source> + <translation>{0} это помощник оператора в каналах: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1924" /> + <source>{0} is an operator on channels: {1}</source> + <translation>{0} это оператор в каналах: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1931" /> + <source>{0} is owner of channels: {1}</source> + <translation>{0} это владелец каналов: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1938" /> + <source>{0} is admin on channels: {1}</source> + <translation>{0} это администратор в каналах: {1}</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1961" /> + <source>{0} is online via {1} ({2}).</source> + <translation>{0} в режиме онлайн через {1} ({2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="1984" /> + <source>{0} is an IRC Operator.</source> + <translation>{0} это IRC оператор.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2017" /> + <source>%n day(s)</source> + <translation> + <numerusform>%n день</numerusform> + <numerusform>%n дня</numerusform> + <numerusform>%n дней</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2037" /> + <location filename="../IrcChannelWidget.py" line="2018" /> + <source>%n hour(s)</source> + <translation> + <numerusform>%n час</numerusform> + <numerusform>%n часа</numerusform> + <numerusform>%n часов</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2049" /> + <location filename="../IrcChannelWidget.py" line="2038" /> + <location filename="../IrcChannelWidget.py" line="2019" /> + <source>%n minute(s)</source> + <translation> + <numerusform>%n минуту</numerusform> + <numerusform>%n минуты</numerusform> + <numerusform>%n минут</numerusform> + </translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2050" /> + <location filename="../IrcChannelWidget.py" line="2039" /> + <location filename="../IrcChannelWidget.py" line="2020" /> + <source>%n second(s)</source> + <translation> + <numerusform>%n секунду</numerusform> + <numerusform>%n секунды</numerusform> + <numerusform>%n секунд</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2023" /> + <source>{0} has been idle for {1}, {2}, {3}, and {4}.</source> + <comment>{0} = name of person, {1} = (x days), {2} = (x hours), {3} = (x minutes), {4} = (x seconds)</comment> + <translation>{0} не появлялся {1}, {2}, {3}, и {4}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2042" /> + <source>{0} has been idle for {1}, {2}, and {3}.</source> + <comment>{0} = name of person, {1} = (x hours), {2} = (x minutes), {3} = (x seconds)</comment> + <translation>{0} не появлялся {1}, {2}, и {3}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2053" /> + <source>{0} has been idle for {1} and {2}.</source> + <comment>{0} = name of person, {1} = (x minutes), {3} = (x seconds)</comment> + <translation>{0} не появлялся {1} и {2}.</translation> + </message> + <message numerus="yes"> + <location filename="../IrcChannelWidget.py" line="2061" /> + <source>{0} has been idle for %n second(s).</source> + <translation> + <numerusform>{0} бездействует %n секунду.</numerusform> + <numerusform>{0} бездействует %n секунды.</numerusform> + <numerusform>{0} бездействует %n секунд.</numerusform> + </translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2069" /> + <source>{0} has been online since {1}.</source> + <translation>{0} присутствует с {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2092" /> + <source>End of WHOIS list for {0}.</source> + <translation>Конец WHOIS списка для {0}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2112" /> + <source>{0} is an identified user.</source> + <translation>{0} является реальным пользователем.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2132" /> + <source>{0} is available for help.</source> + <translation>{0} готов помочь.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2152" /> + <source>{0} is logged in as {1}.</source> + <translation>{0} вошёл как {1}.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2175" /> + <source>{0} is actually using the host {1} (IP: {2}).</source> + <translation>{0} использует компьютер {1} (IP: {2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2196" /> + <source>{0} is using a secure connection.</source> + <translation>{0} использует безопасное соединение.</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2217" /> + <source>{0} is connecting from {1} (IP: {2}).</source> + <translation>{0} подсоединился с {1} (IP: {2}).</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2240" /> + <source>Edit Channel Topic</source> + <translation>Изменить тему канала</translation> + </message> + <message> + <location filename="../IrcChannelWidget.py" line="2241" /> + <source>Enter the topic for this channel:</source> + <translation>Введите тему для канала:</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Press to change the topic</source> + <translation>Сменить тему</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the list of users</source> + <translation>Отображение списка пользователей</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Shows the channel messages</source> + <translation>Отображение сообщений в канале</translation> + </message> + <message> + <location filename="../IrcChannelWidget.ui" line="0" /> + <location filename="../IrcChannelWidget.ui" line="0" /> + <source>Enter a message, send by pressing Return or Enter</source> + <translation>Введите сообщение. Для его отправки нажмите Return или Enter</translation> + </message> + </context> + <context> + <name>IrcExtensionPlugin</name> + <message> + <location filename="../../PluginExtensionIrc.py" line="190" /> + <location filename="../../PluginExtensionIrc.py" line="186" /> + <location filename="../../PluginExtensionIrc.py" line="71" /> + <source>IRC</source> + <translation>IRC</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="191" /> + <source>&IRC</source> + <translation>&IRC</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="192" /> + <source>Ctrl+Alt+Shift+I</source> + <translation>Ctrl+Alt+Shift+I</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="198" /> + <source>Switch the input focus to the IRC window.</source> + <translation>Переключить фокус ввода в окно IRC.</translation> + </message> + <message> + <location filename="../../PluginExtensionIrc.py" line="201" /> + <source><b>Activate IRC</b><p>This switches the input focus to the IRC window.</p></source> + <translation><b>Активировать IRC</b><p>Переключить фокус ввода в окно IRC.</p></translation> + </message> + </context> + <context> + <name>IrcIdentitiesEditDialog</name> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>IRC Identities</source> + <translation>IRC пользователи</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation>Пользователь:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select the identity to work on</source> + <translation>Выберите пользователя для работы</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add a new identity</source> + <translation>Добавить нового пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to copy the selected identity</source> + <translation>Копировать выбранного пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to rename the selected identity</source> + <translation>Переименовать выбранного пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected identity</source> + <translation>Удалить выбранного пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>General</source> + <translation>Основные</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Real Name:</source> + <translation>Действительное имя:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the real name</source> + <translation>Введите действительное имя пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Nick Names</source> + <translation>Псевдонимы</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a nick name to add</source> + <translation>Введите псевдоним для добавления</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to add the entered nick name</source> + <translation>Добавить введенный псевдоним</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to delete the selected nick name</source> + <translation>Удалить выбранный псевдоним</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name up</source> + <translation>Выбранный псевдоним вверх</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to move the selected nick name down</source> + <translation>Выбранный псевдоним вниз</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Auto Identify</source> + <translation>Автоидентификация</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service:</source> + <translation>Сервис:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the name of the service to identify against</source> + <translation>Введите еще раз имя сервиса для идентификации</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Service name can be <b><i>nickserv</i></b> or a network-dependent name such as <b><i>nickserv@services.dal.net</i></b></source> + <translation>Имя сервиса может быть или <b><i>nickserv</i></b> или сетевое имя, например <b><i>nickserv@services.dal.net</i></b></translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Password:</source> + <translation>Пароль:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the password</source> + <translation>Введите пароль</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="506" /> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Press to show the password</source> + <translation>Показать пароль</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away</source> + <translation>Отошел</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Select to mark the current position in the chat, when you send an AWAY command.</source> + <translation>Разрешить отмечать текущую позицию в чате при посылке команды AWAY.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Mark the current position in chat windows when going away</source> + <translation>Отмечать текущую позицию в окне чата когда собираетесь уходить</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Away Message:</source> + <translation>Сообщение об отсутствии:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the message to be sent when going away</source> + <translation>Создайте сообщение о вашем отсутствии</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Advanced</source> + <translation>Расширенные</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Ident:</source> + <translation>Пользователь:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter the identity to be used to log-on to the server</source> + <translation>Задайте пользователя для входа на сервер</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Quit:</source> + <translation>Причина для выхода:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter a message to be sent when quitting</source> + <translation>Создайте сообщение которое будет отправлено при выходе</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Reason for Part:</source> + <translation>Причина для расставания:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.ui" line="0" /> + <source>Enter message to be sent when leaving a channel</source> + <translation>Создайте сообщение, которое будет отправлено при выходе из канала</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="206" /> + <location filename="../IrcIdentitiesEditDialog.py" line="188" /> + <source>Edit Identity</source> + <translation>Редактировать пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="189" /> + <source>The identity must contain at least one nick name.</source> + <translation>У пользователя должен быть по крайней мере один псевдоним.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="207" /> + <source>The identity must have a real name.</source> + <translation>У пользователя должно быть реальное имя.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="259" /> + <location filename="../IrcIdentitiesEditDialog.py" line="240" /> + <location filename="../IrcIdentitiesEditDialog.py" line="230" /> + <source>Add Identity</source> + <translation>Добавить пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="315" /> + <location filename="../IrcIdentitiesEditDialog.py" line="273" /> + <location filename="../IrcIdentitiesEditDialog.py" line="231" /> + <source>Identity Name:</source> + <translation>Имя для идентификации:</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="326" /> + <location filename="../IrcIdentitiesEditDialog.py" line="284" /> + <location filename="../IrcIdentitiesEditDialog.py" line="241" /> + <source>An identity named <b>{0}</b> already exists. You must provide a different name.</source> + <translation>Пользователь с именем <b>{0}</b> уже существует. Выберите другое имя.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="343" /> + <location filename="../IrcIdentitiesEditDialog.py" line="302" /> + <location filename="../IrcIdentitiesEditDialog.py" line="260" /> + <source>The identity has to have a name.</source> + <translation>У пользователя должно быть имя.</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="342" /> + <location filename="../IrcIdentitiesEditDialog.py" line="301" /> + <location filename="../IrcIdentitiesEditDialog.py" line="283" /> + <location filename="../IrcIdentitiesEditDialog.py" line="272" /> + <source>Copy Identity</source> + <translation>Копировать пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="325" /> + <location filename="../IrcIdentitiesEditDialog.py" line="314" /> + <source>Rename Identity</source> + <translation>Переименовать пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="366" /> + <source>This identity is in use. If you remove it, the network settings using it will fall back to the default identity. Should it be deleted anyway?</source> + <translation>Данный пользователь уже используется. Если Вы удалите его, то использующая его сеть перейдёт на пользователя по умолчанию. Удалить?</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="372" /> + <source>Do you really want to delete all information for this identity?</source> + <translation>Вы действительно хотите удалить всю информацию о этом пользователе?</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="377" /> + <source>Delete Identity</source> + <translation>Удалить пользователя</translation> + </message> + <message> + <location filename="../IrcIdentitiesEditDialog.py" line="502" /> + <source>Press to hide the password</source> + <translation>Скрыть пароль</translation> + </message> + </context> + <context> + <name>IrcIdentity</name> + <message> + <location filename="../IrcNetworkManager.py" line="26" /> + <source>Default Identity</source> + <translation>Пользователь по умолчанию</translation> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="30" /> + <source>Gone away for now.</source> + <translation>Отошел.</translation> + </message> + <message> + <location filename="../IrcNetworkManager.py" line="32" /> + <location filename="../IrcNetworkManager.py" line="31" /> + <source>IRC for eric IDE</source> + <translation>IRC для eric IDE</translation> + </message> + </context> + <context> + <name>IrcNetworkEditDialog</name> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>IRC Network</source> + <translation>Сеть IRC</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Network Name:</source> + <translation>Сетевое имя:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Enter the name of the IRC network</source> + <translation>Задайте имя сети IRC</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Identity:</source> + <translation>Пользователь:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Select the identity to be used for the IRC network</source> + <translation>Задайте пользователя для сети IRC</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation>Редактировать пользователей</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Server:</source> + <translation>Сервер:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the server configuration</source> + <translation>Редактировать конфигурацию сервера</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channels:</source> + <translation>Каналы:</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Channel</source> + <translation>Канал</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Join Automatically</source> + <translation>Автоматическое подключение</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to add a new channel</source> + <translation>Добавить новый канал</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to edit the selected channel</source> + <translation>Редактировать выбранный канал</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Press to delete the selected channel</source> + <translation>Удалить выбранный канал</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.ui" line="0" /> + <source>Shows the name of the server</source> + <translation>Отображение имени сервера</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="261" /> + <location filename="../IrcNetworkEditDialog.py" line="255" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>Yes</source> + <translation>Да</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="263" /> + <location filename="../IrcNetworkEditDialog.py" line="257" /> + <location filename="../IrcNetworkEditDialog.py" line="70" /> + <source>No</source> + <translation>Нет</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="192" /> + <source>Delete Channel</source> + <translation>Удалить канал</translation> + </message> + <message> + <location filename="../IrcNetworkEditDialog.py" line="193" /> + <source>Do you really want to delete channel <b>{0}</b>?</source> + <translation>Вы действительно хотите удалить канал <b>{0}</b>?</translation> + </message> + </context> + <context> + <name>IrcNetworkListDialog</name> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>IRC Networks</source> + <translation>Сети IRC</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to define a new network</source> + <translation>Добавить новую сеть</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&New...</source> + <translation>&Новый...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the selected network</source> + <translation>Редактировать выбранную сеть</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Edit...</source> + <translation>&Правка...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to delete the selected network</source> + <translation>Удалить выбранную сеть</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Delete</source> + <translation>&Удалить</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to toggle the auto-connect flag of the selected network</source> + <translation>Включить/Выключить флаг автоподключения выбранной сети</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>&Auto-Connect</source> + <translation>&Автосоединение</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Press to edit the identities</source> + <translation>Редактировать пользователей</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.ui" line="0" /> + <source>Edit &Identities...</source> + <translation>Правка п&ользователя...</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>Yes</source> + <translation>Да</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="249" /> + <location filename="../IrcNetworkListDialog.py" line="89" /> + <source>No</source> + <translation>Нет</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="91" /> + <source>Identity</source> + <translation>Идентичность</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="94" /> + <source>Server</source> + <translation>Сервер</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="97" /> + <source>Channels</source> + <translation>Каналы</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="252" /> + <location filename="../IrcNetworkListDialog.py" line="99" /> + <source>Auto-Connect</source> + <translation>Автосоединение</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="170" /> + <source>Delete Irc Network</source> + <translation>Удалить сеть IRC</translation> + </message> + <message> + <location filename="../IrcNetworkListDialog.py" line="171" /> + <source>Do you really want to delete IRC network <b>{0}</b>?</source> + <translation>Вы действительно хотите удалить IRC сеть <b>{0}</b>?</translation> + </message> + </context> + <context> + <name>IrcNetworkWidget</name> + <message> + <location filename="../IrcNetworkWidget.py" line="354" /> + <source>Press to disconnect from the network</source> + <translation>Отсоединиться от сети</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="359" /> + <source>Press to connect to the selected network</source> + <translation>Подключиться к выбранной сети</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="450" /> + <location filename="../IrcNetworkWidget.py" line="433" /> + <source>Save Messages</source> + <translation>Сохранить сообщения</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="435" /> + <source>HTML Files (*.{0});;Text Files (*.txt);;All Files (*)</source> + <translation>Файлы HTML (*.{0});;Файлы текстовые (*.txt);;Все файлы (*)</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="451" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>Файл <b>{0}</b> уже существует. Переписать?</p></translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="471" /> + <source>Error saving Messages</source> + <translation>Ошибка при сохранении сообщений</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="472" /> + <source><p>The messages contents could not be written to <b>{0}</b></p><p>Reason: {1}</p></source> + <translation><p>Невозможно записать сообщения в файл <b>{0}</b>:<br>Причина: {1}.</p></translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="484" /> + <source>Copy</source> + <translation>Копировать</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="489" /> + <source>Cut all</source> + <translation>Вырезать всё</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="494" /> + <source>Copy all</source> + <translation>Копировать всё</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="500" /> + <source>Clear</source> + <translation>Очистить</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.py" line="505" /> + <source>Save</source> + <translation>Сохранить</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Shows the network messages</source> + <translation>Отображение сетевых сообщений</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a network to connect to</source> + <translation>Выберите сеть для подключения</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to set the user status to AWAY</source> + <translation>Установить статус пользователя - ОТСУТСТВУЕТ</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to edit the networks</source> + <translation>Редактировать сети</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Select a nick name for the channel</source> + <translation>Выберите псевдоним для канала</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Enter the channel to join</source> + <translation>Введите канал для подсоединения</translation> + </message> + <message> + <location filename="../IrcNetworkWidget.ui" line="0" /> + <source>Press to join the channel</source> + <translation>Подсоединиться к каналу</translation> + </message> + </context> + <context> + <name>IrcPage</name> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source><b>Configure IRC</b></source> + <translation><b>Настроить IRC</b></translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show timestamps</source> + <translation>Разрешить показывать временную метку</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Timestamps</source> + <translation>Показывать временную метку</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Time Format:</source> + <translation>Формат времени:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the time format to use</source> + <translation>Выберите формат времени</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Date Format</source> + <translation>Формат даты</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the date format to use</source> + <translation>Выберите формат даты</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show the date in timestamps</source> + <translation>Разрешить показывать дату во временной метке</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Date</source> + <translation>Показывать дату</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Colors</source> + <translation>Цвет</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Network Messages:</source> + <translation>Сетевые сообщения:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for network messages</source> + <translation>Выберите цвет для отображения сетевых сообщений</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Nick Names:</source> + <translation>Псевдоним:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for nick names</source> + <translation>Выберите цвет для отображения псевдонима</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Server Messages:</source> + <translation>Серверные сообщения:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for server messages</source> + <translation>Выберите цвет для отображения сообщений сервера</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Own Nick Name:</source> + <translation>Свой псевдоним:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for own nick name</source> + <translation>Выберите цвет для отображения собственного псевдонима</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Messages:</source> + <translation>Сообщение в канале:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel messages</source> + <translation>Задайте цвет для отображения сообщений в канале</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join Channel:</source> + <translation>Зайти на канал:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for join channel messages</source> + <translation>Выберите цвет для отображения сообщений о присоединении канала</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Error Messages:</source> + <translation>Сообщение об ошибке:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for error messages</source> + <translation>Выберите цвет для отображения сообщений об ошибке</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Leave Channel:</source> + <translation>Уйти с канала:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for leave channel messages</source> + <translation>Выберите цвет для отображения сообщений об отключении канала</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Timestamp:</source> + <translation>Временная метка:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for timestamps</source> + <translation>Выберите цвет для временных меток</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Channel Info:</source> + <translation>Информация о канале:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for channel info messages</source> + <translation>Задайте цвет для отображения информационных сообщений в канале</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Hyperlink:</source> + <translation>Гиперссылка:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the color for hyperlinks</source> + <translation>Выберите цвет для отображения гиперссылок</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to allow colored text in IRC messages</source> + <translation>Разрешить использование цветного текста в IRC сообщениях</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Allow Colored Text in IRC Messages</source> + <translation>Разрешить цвет</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable to show notifications</source> + <translation>Разрешить показ уведомлений</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Show Notifications</source> + <translation>Показывать уведомления</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for join and leave events</source> + <translation>Показывать уведомления о подсоединении или отсоединении пользователей</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Join/Leave Event</source> + <translation>Подсоединение/отсоединение</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every message</source> + <translation>Показывать уведомления о каждом сообщении</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Every Message</source> + <translation>Каждое сообщение</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to show a notification for every mentioning of your nick</source> + <translation>Показывать уведомления о каждом упоминании вашего псевдонима</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mentioning of Own Nick</source> + <translation>Упоминание вашего псевдонима</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select this to enable the automatic lookup of user information for joined channels</source> + <translation>Разрешить автоматический поиск информации о пользователях подключившихся каналов</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enable Automatic User Information Lookup (/WHO)</source> + <translation>Разрешать автоматический поиск информации пользователей (/WHO)</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Max. Number of Users in Channel:</source> + <translation>Максимальное количество пользователей в канале:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the maximum numbers of users in a channel allowed for this function</source> + <translation>Задайте максимальное количество пользователей в канале</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Update Interval:</source> + <translation>Интервал обновления:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Enter the user information update interval</source> + <translation>Задайте интервал обновления информации о пользователях</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source> s</source> + <translation> сек</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker</source> + <translation>Маркер</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select to mark the current position, when the chat window is hidden</source> + <translation>Пометить текущую позицию, когда окно разговора скрыто</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Mark Current Position When Hidden</source> + <translation>Помечать текущую позицию</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Foreground:</source> + <translation>Цвет маркера:</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the foreground color for the marker</source> + <translation>Выберите цвет маркера</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Select the background color for the marker</source> + <translation>Задайте цвет фона маркера</translation> + </message> + <message> + <location filename="../ConfigurationPage/IrcPage.ui" line="0" /> + <source>Marker Background:</source> + <translation>Фон маркера:</translation> + </message> + </context> + <context> + <name>IrcServerEditDialog</name> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>IRC Server</source> + <translation>IRC cервер</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Server:</source> + <translation>Сервер:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the host name of the IRC server</source> + <translation>Введите имя хоста IRC сервера</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Port:</source> + <translation>Порт:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the port number</source> + <translation>Введите номер порта</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Password:</source> + <translation>Пароль:</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Enter the server password</source> + <translation>Введите пароль</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Select to use an SSL encrypted connection</source> + <translation>Разрешить использовать шифрованное SSL соединение</translation> + </message> + <message> + <location filename="../IrcServerEditDialog.ui" line="0" /> + <source>Use Encrypted Connection (SSL)</source> + <translation>Использовать SSL</translation> + </message> + </context> + <context> + <name>IrcUserItem</name> + <message> + <location filename="../IrcChannelWidget.py" line="136" /> + <source>{0} (ignored)</source> + <translation>{0} (проигнорировано)</translation> + </message> + </context> + <context> + <name>IrcUtilities</name> + <message> + <location filename="../IrcUtilities.py" line="162" /> + <source>anonymous</source> + <translation>анонимный</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="163" /> + <source>ban mask</source> + <translation>шаблон запрета</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="164" /> + <source>no colors allowed</source> + <translation>цвета запрещены</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="165" /> + <source>ban exception mask</source> + <translation>маска исключений из запрета</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="166" /> + <source>invite only</source> + <translation>только по приглашению</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="167" /> + <source>password protected</source> + <translation>защищён паролем</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="168" /> + <source>user limit</source> + <translation>ограниченное число пользователей</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="169" /> + <source>moderated</source> + <translation>контролируемый</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="170" /> + <source>no messages from outside</source> + <translation>внешние сообщения запрещены</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="171" /> + <source>private</source> + <translation>приватный</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="172" /> + <source>quiet</source> + <translation>тихий</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="173" /> + <source>reop channel</source> + <translation>повторно открыть канал</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="174" /> + <source>secret</source> + <translation>секретный</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="175" /> + <source>topic protection</source> + <translation>защита темы</translation> + </message> + <message> + <location filename="../IrcUtilities.py" line="176" /> + <source>invitation mask</source> + <translation>шаблон приглашения</translation> + </message> + </context> + <context> + <name>IrcWidget</name> + <message> + <location filename="../IrcWidget.py" line="86" /> + <source>Press to leave the current channel</source> + <translation>Отключиться от текущего канала</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="225" /> + <source>SSL Connection</source> + <translation>SSL соединение</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="226" /> + <source>An encrypted connection to the IRC network was requested but SSL is not available. Please change the server configuration.</source> + <translation>Было запрошено шифрованное соединение к IRC сети, но SSL не доступен. Пожалуйста, измените настройки сервера.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <location filename="../IrcWidget.py" line="572" /> + <location filename="../IrcWidget.py" line="563" /> + <location filename="../IrcWidget.py" line="302" /> + <location filename="../IrcWidget.py" line="297" /> + <location filename="../IrcWidget.py" line="290" /> + <location filename="../IrcWidget.py" line="266" /> + <location filename="../IrcWidget.py" line="252" /> + <source>Info</source> + <translation>Информация</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="253" /> + <source>Looking for server {0} (port {1}) using an SSL encrypted connection...</source> + <translation>Поиск сервера {0} (порт {1}) используя шифрованное SSL соединение...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="267" /> + <source>Looking for server {0} (port {1})...</source> + <translation>Поиск сервера {0} (порт {1})...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="280" /> + <source>Disconnect from Server</source> + <translation>Отключение от сервера</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="281" /> + <source><p>Do you really want to disconnect from <b>{0}</b>?</p><p>All channels will be closed.</p></source> + <translation><p>Вы действительно хотите отключиться от <b>{0}</b>?</p><p>Все каналы будут закрыты.</p></translation> + </message> + <message> + <location filename="../IrcWidget.py" line="291" /> + <source>Disconnecting from server {0}...</source> + <translation>Отключение от сервера {0}...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="298" /> + <source>Disconnecting from network {0}...</source> + <translation>Отключение от сети {0}...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="302" /> + <source>Disconnecting from server.</source> + <translation>Отключение от сервера.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="563" /> + <source>Server found,connecting...</source> + <translation>Сервер найден, соединение...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="572" /> + <source>Connected,logging in...</source> + <translation>Соединение выполнено, вход...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="607" /> + <source>Server disconnected.</source> + <translation>Сервер отсоединился.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="651" /> + <source>Message Error</source> + <translation>Ошибка сообщения</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="652" /> + <source>Unknown message received from server:<br/>{0}</source> + <translation>Неизвестное сообщение от сервера:<br/>{0}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1093" /> + <location filename="../IrcWidget.py" line="1083" /> + <location filename="../IrcWidget.py" line="1075" /> + <location filename="../IrcWidget.py" line="1067" /> + <location filename="../IrcWidget.py" line="695" /> + <location filename="../IrcWidget.py" line="687" /> + <source>CTCP</source> + <translation>CTCP (Клиент-клиент протокол)</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="688" /> + <source>Received CTCP-PING response from {0} with latency of {1} ms.</source> + <translation>Получен CTCP-PING ответ от {0} с задержкой {1} мс.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="696" /> + <source>Received unknown CTCP-{0} response from {1}.</source> + <translation>Получен неизвестный CTCP- {0} ответ от {1}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="724" /> + <source>Notice</source> + <translation>Уведомление</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="734" /> + <source>You have set your personal modes to <b>[{0}]</b>.</source> + <translation>Ваши персональные режимы установлены: <b>[{0}]</b>.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="738" /> + <source>{0} has changed your personal modes to <b>[{1}]</b>.</source> + <translation>{0} изменил ваши персональные режимы на: <b>[{1}]</b>.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="742" /> + <source>Mode</source> + <translation>Режим</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="750" /> + <source>You have left channel {0}.</source> + <translation>Вы отключились от канала {0}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="762" /> + <source>You are now known as {0}.</source> + <translation>Вы теперь {0}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="768" /> + <source>User {0} is now known as {1}.</source> + <translation>Пользователь {0} сменил псевдоним на {1}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="774" /> + <source>Received PONG from {0}</source> + <translation>Получен PONG из {0}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="779" /> + <source>Server Error</source> + <translation>Ошибка сервера</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="817" /> + <source>Error</source> + <translation>Ошибка</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="836" /> + <source>Welcome</source> + <translation>Добро пожаловать</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="838" /> + <source>Support</source> + <translation>Поддержка</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="840" /> + <source>User</source> + <translation>Пользователь</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="842" /> + <source>MOTD</source> + <translation>MOTD</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="844" /> + <source>Away</source> + <translation>Отсутствует</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="846" /> + <source>Info ({0})</source> + <translation>Инфо ({0})</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="850" /> + <source>Message of the day</source> + <translation>Сообщение дня</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="852" /> + <source>End of message of the day</source> + <translation>Конец сообщения дня</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="855" /> + <source>Server {0} (Version {1}), User-Modes: {2}, Channel-Modes: {3}</source> + <translation>Сервер {0} (Версия {1}), Пользовательские режимы: {2}, Режимы каналов: {3}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="860" /> + <source>Current users on {0}: {1}, max. {2}</source> + <translation>Текущее число пользователей на {0}: {1}, максимум: {2}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="865" /> + <source>Current users on the network: {0}, max. {1}</source> + <translation>Текущее число пользователей в сети {0}, максимум: {1}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="869" /> + <source>You are no longer marked as being away.</source> + <translation>Вы больше не отмечены как отсутствующий.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="871" /> + <source>You have been marked as being away.</source> + <translation>Вы отмечены как отсутствующий.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1002" /> + <location filename="../IrcWidget.py" line="986" /> + <location filename="../IrcWidget.py" line="934" /> + <source>SSL Error</source> + <translation>Ошибка SSL</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="935" /> + <source>Connection to server {0} (port {1}) lost while waiting for user response to an SSL error.</source> + <translation>Соединение с сервером {0} (порт {1}) потеряно.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <location filename="../IrcWidget.py" line="964" /> + <location filename="../IrcWidget.py" line="959" /> + <location filename="../IrcWidget.py" line="951" /> + <location filename="../IrcWidget.py" line="943" /> + <source>Socket Error</source> + <translation>Ошибка соединения</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="944" /> + <source>The host was not found. Please check the host name and port settings.</source> + <translation>Хост не найден. Пожалуйста проверьте имя хоста и парамеры порта.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="952" /> + <source>The connection was refused by the peer. Please check the host name and port settings.</source> + <translation>Сервер отказал в подключении. Пожалуйста проверьте имя хоста и парамеры порта.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="959" /> + <source>The SSL handshake failed.</source> + <translation>Неудачное SSL соединение.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="965" /> + <source>The following network error occurred:<br/>{0}</source> + <translation>Сетевая ошибка:<br/>{0}</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="971" /> + <source>A network error occurred.</source> + <translation>Сетевая ошибка.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="987" /> + <source>Could not connect to {0} (port {1}) using an SSL encrypted connection. Either the server does not support SSL (did you use the correct port?) or you rejected the certificate.</source> + <translation>Ошибка подключения к {0} (порт {1}) с использованием SSL. Либо сервер не поддерживает SSL (Вы выбрали правильный порт?), либо неправильный сертификат.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1003" /> + <source>The SSL certificate for the server {0} (port {1}) failed the authenticity check. SSL errors were accepted by you.</source> + <translation>SSL сертификат сервера {0} (порт {1}) не прошел проверку на подлинность. Возможно Вы приняли ошибки SSL.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1068" /> + <source>Received Version request from {0}.</source> + <translation>Получен запрос версии от {0}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1076" /> + <source>Received CTCP-PING request from {0}, sending answer.</source> + <translation>CTCP-PING запрос от {0}, отправление ответа.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1084" /> + <source>Received CTCP-CLIENTINFO request from {0}, sending answer.</source> + <translation>CTCP-CLIENTINFO запрос от {0}, отправление ответа.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1094" /> + <source>Received unknown CTCP-{0} request from {1}.</source> + <translation>Неизвестный CTCP-{0} запрос от {1}.</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1110" /> + <source>{0} ({1})</source> + <comment>channel name, users count</comment> + <translation>{0} ({1})</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <location filename="../IrcWidget.py" line="1132" /> + <source>Critical</source> + <translation>Критическая</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1133" /> + <source>No nickname acceptable to the server configured for <b>{0}</b>. Disconnecting...</source> + <translation>На сервере нет приемлимых псевдонимов, сконфигурированных для <b>{0}</b>. Отключение...</translation> + </message> + <message> + <location filename="../IrcWidget.py" line="1152" /> + <source>The given nickname is already in use.</source> + <translation>Данный псевдоним уже используется.</translation> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Channels</source> + <translation>Каналы</translation> + </message> + <message> + <location filename="../IrcWidget.ui" line="0" /> + <source>Network</source> + <translation>Сеть</translation> + </message> + </context> +</TS>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircAdmin.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m10.999 1a5.0449 5 0 0 0-5.045 5 5.0449 5 0 0 0 5.045 5 5.0449 5 0 0 0 5.045-5 5.0449 5 0 0 0-5.045-5zm0 1.25a3.7837 3.75 0 0 1 3.7837 3.75 3.7837 3.75 0 0 1-3.7837 3.75 3.7837 3.75 0 0 1-3.7837-3.75 3.7837 3.75 0 0 1 3.7837-3.75zm0 10a10.09 10 0 0 0-9.9988 8.75h1.2711a8.8286 8.75 0 0 1 8.7277-7.5 8.8286 8.75 0 0 1 8.7301 7.5h1.2711a10.09 10 0 0 0-10.001-8.75z" color="#eff0f1" fill="#b380ff"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircAway.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path d="m12 9.375c1.4542 0 2.625 1.1708 2.625 2.625s-1.1708 2.625-2.625 2.625-2.625-1.1708-2.625-2.625 1.1708-2.625 2.625-2.625m0-0.375c-1.662 0-3 1.338-3 3s1.338 3 3 3 3-1.338 3-3-1.338-3-3-3" color="#eff0f1" fill="currentColor"/><path d="m11.625 9.75v2.625h2.25v-0.375h-1.875v-2.25h-0.375" color="#eff0f1"/><path d="m11.676 14.609c-0.98596-0.11724-1.8391-0.81419-2.1675-1.7707-0.085023-0.24762-0.10104-0.34997-0.11494-0.7343-0.013821-0.38222-0.00604-0.48655 0.053982-0.72391 0.31598-1.2495 1.451-2.0848 2.7166-1.9992 0.95688 0.064746 1.761 0.60101 2.183 1.4558 0.18682 0.37842 0.24603 0.60733 0.26894 1.0397 0.04233 0.79897-0.2394 1.4823-0.84592 2.0517-0.54678 0.51333-1.3385 0.77073-2.0941 0.68088zm2.218-2.4292 0.0098-0.20599h-1.8818v-2.2443l-0.41198 0.01962-0.0086 1.2853c-0.0047 0.70691-0.0014 1.3041 0.0074 1.327 0.01257 0.03275 0.25855 0.03985 1.1457 0.03304l1.1297-0.0087z" fill="#fff" stroke="#232629" stroke-width=".032958"/><path d="m11.703 14.574c-0.98355-0.090547-1.8772-0.8374-2.1839-1.8252-0.10396-0.33484-0.12883-0.9398-0.052908-1.2873 0.16507-0.75558 0.69558-1.4375 1.3916-1.7888 0.60674-0.30625 1.3231-0.34421 2.0134-0.10672 0.34839 0.11985 0.58439 0.26258 0.87099 0.52673 0.26792 0.24695 0.44825 0.50058 0.6203 0.87247 0.17382 0.37573 0.2126 0.56642 0.21191 1.0421-7.15e-4 0.49575-0.05105 0.71329-0.26692 1.1535-0.13267 0.27058-0.19874 0.35838-0.48646 0.64649-0.29947 0.29988-0.36768 0.35016-0.67864 0.50024-0.48668 0.23488-0.917 0.31454-1.4394 0.26645zm2.1154-2.1671c0.09672-0.02057 0.09909-0.02589 0.10862-0.24329l0.0097-0.22226h-1.8816v-2.2442l-0.44494 0.0195-0.02228 0.14831c-0.03041 0.20249-0.03216 2.446-0.0019 2.4933 0.01332 0.02083 0.06129 0.04477 0.10661 0.05319 0.12597 0.02341 2.0134 0.01938 2.1258-0.0045z" fill="#fff" stroke="#232629" stroke-width=".032958"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircCloseChannel.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-NegativeText { + color:#da4453; + }</style></defs><g class="ColorScheme-NegativeText" transform="matrix(1.25 0 0 1.25 -2.75 -2.75)" color="#da4453" fill="currentColor"><path d="m11 3c4.432 0 8 3.568 8 8 0 1.442-0.383 2.79-1.045 3.955l-0.738-0.738a6.985 6.985 0 0 0 0.783-3.217c0-3.878-3.122-7-7-7a6.985 6.985 0 0 0-3.217 0.783l-0.738-0.738a7.982 7.982 0 0 1 3.955-1.045m-6.955 4.045 0.738 0.738a6.985 6.985 0 0 0-0.783 3.217c0 3.878 3.122 7 7 7a6.985 6.985 0 0 0 3.217-0.783l0.738 0.738a7.982 7.982 0 0 1-3.955 1.045c-4.432 0-8-3.568-8-8 0-1.442 0.383-2.79 1.045-3.955"/><path d="m7.5 9.998h7v2h-7z"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircConfigure.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg fill="none" version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><path d="m3.5818 21c-0.3372-0.004723-0.66996-0.077708-0.97823-0.21466-0.30829-0.13696-0.5857-0.33502-0.81556-0.58217-0.44726-0.40814-0.72464-0.96999-0.7769-1.5738-0.059321-0.6241 0.12134-1.2473 0.50511-1.7425 1.7235-1.8209 5.1228-5.2262 7.5954-7.6513-0.52611-1.4252-0.50153-2.996 0.068943-4.404 0.4691-1.1715 1.3033-2.16 2.3785-2.8183 0.84344-0.55957 1.8129-0.89962 2.8206-0.98937 1.0077-0.08974 2.0217 0.073644 2.9506 0.47539l0.88157 0.3825-4.094 4.2234 1.7924 1.8009 4.2054-4.1172 0.38186 0.88586c0.32186 0.74686 0.49257 1.5503 0.50214 2.3638 0.0096 0.81344-0.14214 1.6207-0.44643 2.3749-0.30171 0.7458-0.74986 1.4233-1.3179 1.9922-0.32186 0.31551-0.67757 0.59434-1.0607 0.8314-0.79271 0.53032-1.6997 0.86463-2.6464 0.97546-0.94686 0.11082-1.9064-5e-3 -2.7998-0.33796-1.5684 1.5937-5.4834 5.5423-7.598 7.5197-0.42419 0.38596-0.97553 0.60163-1.5485 0.60564zm11.339-18.672c-0.93972-0.00236-1.8589 0.275-2.6409 0.79687-0.30499 0.18654-0.58824 0.4066-0.84451 0.65608-0.68156 0.68825-1.1367 1.5688-1.3045 2.5236-0.16777 0.95476-0.04011 1.9381 0.36586 2.8181l0.19357 0.42499-0.33277 0.32539c-2.4832 2.4278-6.0986 6.039-7.8367 7.8771-0.15476 0.23083-0.22096 0.5099-0.18634 0.78567 0.0346 0.27591 0.16766 0.52993 0.3746 0.71511 0.11926 0.13309 0.26457 0.24028 0.42691 0.3147 0.14309 0.06483 0.29774 0.10003 0.45474 0.10361 0.23844-6e-3 0.46673-0.09803 0.643-0.25888 2.2472-2.1011 6.5891-6.4945 7.8632-7.7855l0.32747-0.33071 0.4216 0.19258c0.73393 0.34273 1.5438 0.48946 2.3511 0.42592 0.80728-0.06353 1.5844-0.33516 2.256-0.7885 0.30557-0.18872 0.58886-0.41148 0.84443-0.66405 0.44257-0.44209 0.79229-0.96843 1.0287-1.548 0.23628-0.57958 0.35443-1.2007 0.34757-1.8267 0-0.30863-0.03057-0.61651-0.09157-0.91906l-3.6817 3.5992-3.6445-3.6457 3.5928-3.7054c-0.30571-0.059533-0.61657-0.088455-0.928-0.086323z" fill="#eff0f1" stroke-width="1.4298"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircConnect.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m20.116 1-4.375 4.375-1.875-1.875-9.1162 9.1162 1.875 1.875-5.625 5.625 0.88379 0.88379 5.625-5.625 1.875 1.875 9.1162-9.1162-1.875-1.875 4.375-4.375z" color="#eff0f1" fill="currentColor"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircDisconnect.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + } + .ColorScheme-NegativeText { + color:#da4453; + }</style></defs><path class="ColorScheme-Text" d="m20.116 1-4.375 4.375-1.875-1.875-4.7412 4.7412 4.6338 4.6338 4.7412-4.7412-1.875-1.875 4.375-4.375zm-11.875 8.125-3.4912 3.4912 1.875 1.875-5.625 5.625 0.88379 0.88379 5.625-5.625 1.875 1.875 3.4912-3.4912-2.7588-2.7588z" color="#eff0f1" fill="currentColor"/><path class="ColorScheme-NegativeText" d="m14.834 14-0.83398 0.83398 1.666 1.666-1.666 1.666 0.83398 0.83398 1.666-1.666 1.666 1.666 0.83398-0.83398-1.666-1.666 1.666-1.666-0.83398-0.83398-1.666 1.666-1.666-1.666z" fill="currentColor"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircEditTopic.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m6 1v5h-5v1.25h5v7.5h-5v1.25h5v5h1.25v-5h3.75v-1.25h-3.75v-7.5h7.5v3.75h1.25v-3.75h5v-1.25h-5v-5h-1.25v5h-7.5v-5z" color="#eff0f1" fill="currentColor"/><path class="ColorScheme-Text" d="m18.374 12.25-6.1239 6.1239v2.6261h2.6261l6.1239-6.1239zm-1.4939 2.545 1.5751 1.5751-2.3142 2.3157v-0.49276l-0.73914 0.01566h-0.7548v-1.182l1.051-1.0496zm-2.9722 2.9708v1.182h1.4783l0.01566 0.47567-0.78756 0.78898h-1.051l-0.52551-0.52551v-1.051z" color="#eff0f1" fill="currentColor"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircHalfOp.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path d="m10.998 1a5.0449 5 0 0 0-5.0449 5 5.0449 5 0 0 0 5.0449 5 5.0449 5 0 0 0 5.0449-5 5.0449 5 0 0 0-5.0449-5zm0 1.25a3.7837 3.75 0 0 1 3.7852 3.75 3.7837 3.75 0 0 1-3.7852 3.75 3.7837 3.75 0 0 1-3.7832-3.75 3.7837 3.75 0 0 1 3.7832-3.75zm0 10a10.09 10 0 0 0-9.998 8.75h1.2715a8.8286 8.75 0 0 1 8.7266-7.5 8.8286 8.75 0 0 1 3.877 0.9043h2.3555a10.09 10 0 0 0-6.2324-2.1543z" color="#eff0f1" fill="#87de87"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircJoinChannel.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m6 1v5h-5v1.25h5v7.5h-5v1.25h5v5h1.25v-5h3.75v-1.25h-3.75v-7.5h7.5v3.75h1.25v-3.75h5v-1.25h-5v-5h-1.25v5h-7.5v-5z" color="#eff0f1" fill="currentColor"/><path d="m16.625 12.25c-2.4238 0-4.375 1.9512-4.375 4.375s1.9512 4.375 4.375 4.375 4.375-1.9512 4.375-4.375-1.9512-4.375-4.375-4.375z" fill="#2ecc71"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircNormal.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m10.999 1a5.0449 5 0 0 0-5.045 5 5.0449 5 0 0 0 5.045 5 5.0449 5 0 0 0 5.045-5 5.0449 5 0 0 0-5.045-5zm0 1.25a3.7837 3.75 0 0 1 3.7837 3.75 3.7837 3.75 0 0 1-3.7837 3.75 3.7837 3.75 0 0 1-3.7837-3.75 3.7837 3.75 0 0 1 3.7837-3.75zm0 10a10.09 10 0 0 0-9.9988 8.75h1.2711a8.8286 8.75 0 0 1 8.7277-7.5 8.8286 8.75 0 0 1 8.7301 7.5h1.2711a10.09 10 0 0 0-10.001-8.75z" color="#eff0f1" fill="currentColor"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircOp.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m10.999 1a5.0449 5 0 0 0-5.045 5 5.0449 5 0 0 0 5.045 5 5.0449 5 0 0 0 5.045-5 5.0449 5 0 0 0-5.045-5zm0 1.25a3.7837 3.75 0 0 1 3.7837 3.75 3.7837 3.75 0 0 1-3.7837 3.75 3.7837 3.75 0 0 1-3.7837-3.75 3.7837 3.75 0 0 1 3.7837-3.75zm0 10a10.09 10 0 0 0-9.9988 8.75h1.2711a8.8286 8.75 0 0 1 8.7277-7.5 8.8286 8.75 0 0 1 8.7301 7.5h1.2711a10.09 10 0 0 0-10.001-8.75z" color="#eff0f1" fill="#87de87"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircOwner.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m10.999 1a5.0449 5 0 0 0-5.045 5 5.0449 5 0 0 0 5.045 5 5.0449 5 0 0 0 5.045-5 5.0449 5 0 0 0-5.045-5zm0 1.25a3.7837 3.75 0 0 1 3.7837 3.75 3.7837 3.75 0 0 1-3.7837 3.75 3.7837 3.75 0 0 1-3.7837-3.75 3.7837 3.75 0 0 1 3.7837-3.75zm0 10a10.09 10 0 0 0-9.9988 8.75h1.2711a8.8286 8.75 0 0 1 8.7277-7.5 8.8286 8.75 0 0 1 8.7301 7.5h1.2711a10.09 10 0 0 0-10.001-8.75z" color="#eff0f1" fill="#de8787"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircUserAway.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.2557 0 0 1.25 -532.39 -659.97)" fill="#fdbc4b"><path d="m432.71 528.79a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 1a3 3 0 0 1 3 3 3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3"/><path transform="translate(420.71 524.79)" d="m12 13a8 8 0 0 0-7.9277 7h1.0078a7 7 0 0 1 6.9199-6 7 7 0 0 1 1 0.08008v-1.0098a8 8 0 0 0-1-0.07031"/><path d="m440.71 536.79-8 4 2 1 1 3 1-2 2 1z" fill-rule="evenodd"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircUserPresent.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.2557 0 0 1.25 -532.39 -659.97)"><g fill="#43be80"><path d="m432.71 528.79a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 1a3 3 0 0 1 3 3 3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3"/><path transform="translate(421.71 525.79)" d="m11 12a8 8 0 0 0-7.9277 7h1.0078a7 7 0 0 1 6.9199-6 7 7 0 0 1 1 0.08008v-1.0098a8 8 0 0 0-1-0.07031"/><circle cx="437.21" cy="541.29" r="3.5"/></g><path d="m438.71 539.79 1 1-3 3-2-2 1-1 1 1z" fill="#fff" fill-rule="evenodd"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/dark/ircVoice.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m15 4-12 3.418v6.1641l1 0.28516v2.4336l6 1.6992v-2.4238l5 1.4238v-13zm4.0293 0.42773-0.77148 0.63086c1.1373 1.7722 1.7419 3.8337 1.7422 5.9395-4e-3 2.1039-0.61142 4.1625-1.75 5.9316l0.7832 0.64258c1.2816-1.9532 1.9651-4.2381 1.9668-6.5742-4e-3 -2.3352-0.6885-4.6186-1.9707-6.5703zm-5.0293 0.90039v10.344l-10-2.8477v-4.6484l10-2.8477zm2.6895 1.0156-0.78125 0.63867c0.71179 1.2188 1.0885 2.6042 1.0918 4.0156-2e-3 1.4119-0.3784 2.798-1.0898 4.0176l0.78125 0.64062c0.85323-1.4042 1.3058-3.0151 1.3086-4.6582-4e-3 -1.6419-0.45732-3.2515-1.3105-4.6543zm-14.689 1.3594-1 0.28516v5.0234l1 0.28516v-5.5937zm3 6.4492 4 1.1387v1.4258l-4-1.1328v-1.4316z" fill="currentColor"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/irc.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient id="i" x2="0" y1="34" y2="4" gradientUnits="userSpaceOnUse"><stop stop-color="#7cbaf8" offset="0"/><stop stop-color="#f4fcff" offset="1"/></linearGradient><linearGradient id="e" x1="405.57" x2="427.57" y1="509.8" y2="533.8" gradientUnits="userSpaceOnUse"><stop stop-opacity=".286" offset="0"/><stop stop-opacity="0" offset="1"/></linearGradient><linearGradient id="h" x1="412.57" x2="425.57" y1="514.8" y2="527.8" gradientUnits="userSpaceOnUse" xlink:href="#e"/><linearGradient id="g" x2="0" y1="44" y2="4" gradientTransform="matrix(-1,0,0,1,432.57,499.8)" gradientUnits="userSpaceOnUse"><stop stop-color="#2f74c8" offset="0"/><stop stop-color="#4699d7" offset="1"/></linearGradient><linearGradient id="f" x1="405.57" x2="427.57" y1="509.8" y2="533.8" gradientUnits="userSpaceOnUse" xlink:href="#e"/></defs><g transform="matrix(.5 0 0 .5 -193.28 -250.9)" fill-rule="evenodd"><path d="m428.57 503.8v30h-20l-11 10v-10h-9v-30z" fill="url(#g)"/><path d="m402.57 534.8-6-6v-3l-3-3v-9h4l1 1v-1l20-6 10 7.461v18.539h-26z" fill="url(#f)" opacity=".2"/><path d="m419.57 521.8 9 9v-11l-5-5h-4z" fill="url(#h)" opacity=".2"/><path transform="translate(384.57,499.8)" d="m34 8-20 6v9l20 6v-15zm-25 6v9h4v-9zm26 1v7h4v-7zm-23 9v5h3v-5z" fill="url(#i)"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/irc128.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient id="i" x2="0" y1="34" y2="4" gradientUnits="userSpaceOnUse"><stop stop-color="#7cbaf8" offset="0"/><stop stop-color="#f4fcff" offset="1"/></linearGradient><linearGradient id="e" x1="405.57" x2="427.57" y1="509.8" y2="533.8" gradientUnits="userSpaceOnUse"><stop stop-opacity=".286" offset="0"/><stop stop-opacity="0" offset="1"/></linearGradient><linearGradient id="h" x1="412.57" x2="425.57" y1="514.8" y2="527.8" gradientUnits="userSpaceOnUse" xlink:href="#e"/><linearGradient id="g" x2="0" y1="44" y2="4" gradientTransform="matrix(-1,0,0,1,432.57,499.8)" gradientUnits="userSpaceOnUse"><stop stop-color="#2f74c8" offset="0"/><stop stop-color="#4699d7" offset="1"/></linearGradient><linearGradient id="f" x1="405.57" x2="427.57" y1="509.8" y2="533.8" gradientUnits="userSpaceOnUse" xlink:href="#e"/></defs><g transform="matrix(3 0 0 3 -1161.7 -1507.4)" fill-rule="evenodd"><path d="m428.57 503.8v30h-20l-11 10v-10h-9v-30z" fill="url(#g)"/><path d="m402.57 534.8-6-6v-3l-3-3v-9h4l1 1v-1l20-6 10 7.461v18.539h-26z" fill="url(#f)" opacity=".2"/><path d="m419.57 521.8 9 9v-11l-5-5h-4z" fill="url(#h)" opacity=".2"/><path transform="translate(384.57,499.8)" d="m34 8-20 6v9l20 6v-15zm-25 6v9h4v-9zm26 1v7h4v-7zm-23 9v5h3v-5z" fill="url(#i)"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/irc48.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><linearGradient id="i" x2="0" y1="34" y2="4" gradientUnits="userSpaceOnUse"><stop stop-color="#7cbaf8" offset="0"/><stop stop-color="#f4fcff" offset="1"/></linearGradient><linearGradient id="e" x1="405.57" x2="427.57" y1="509.8" y2="533.8" gradientUnits="userSpaceOnUse"><stop stop-opacity=".286" offset="0"/><stop stop-opacity="0" offset="1"/></linearGradient><linearGradient id="h" x1="412.57" x2="425.57" y1="514.8" y2="527.8" gradientUnits="userSpaceOnUse" xlink:href="#e"/><linearGradient id="g" x2="0" y1="44" y2="4" gradientTransform="matrix(-1,0,0,1,432.57,499.8)" gradientUnits="userSpaceOnUse"><stop stop-color="#2f74c8" offset="0"/><stop stop-color="#4699d7" offset="1"/></linearGradient><linearGradient id="f" x1="405.57" x2="427.57" y1="509.8" y2="533.8" gradientUnits="userSpaceOnUse" xlink:href="#e"/></defs><g transform="matrix(1.1 0 0 1.1 -425.43 -552.18)" fill-rule="evenodd"><path d="m428.57 503.8v30h-20l-11 10v-10h-9v-30z" fill="url(#g)"/><path d="m402.57 534.8-6-6v-3l-3-3v-9h4l1 1v-1l20-6 10 7.461v18.539h-26z" fill="url(#f)" opacity=".2"/><path d="m419.57 521.8 9 9v-11l-5-5h-4z" fill="url(#h)" opacity=".2"/><path transform="translate(384.57,499.8)" d="m34 8-20 6v9l20 6v-15zm-25 6v9h4v-9zm26 1v7h4v-7zm-23 9v5h3v-5z" fill="url(#i)"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircAdmin.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m10.999 1a5.0449 5 0 0 0-5.045 5 5.0449 5 0 0 0 5.045 5 5.0449 5 0 0 0 5.045-5 5.0449 5 0 0 0-5.045-5zm0 1.25a3.7837 3.75 0 0 1 3.7837 3.75 3.7837 3.75 0 0 1-3.7837 3.75 3.7837 3.75 0 0 1-3.7837-3.75 3.7837 3.75 0 0 1 3.7837-3.75zm0 10a10.09 10 0 0 0-9.9988 8.75h1.2711a8.8286 8.75 0 0 1 8.7277-7.5 8.8286 8.75 0 0 1 8.7301 7.5h1.2711a10.09 10 0 0 0-10.001-8.75z" color="#eff0f1" fill="#95f"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircAway.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path d="m12 9.375c1.4542 0 2.625 1.1708 2.625 2.625s-1.1708 2.625-2.625 2.625-2.625-1.1708-2.625-2.625 1.1708-2.625 2.625-2.625m0-0.375c-1.662 0-3 1.338-3 3s1.338 3 3 3 3-1.338 3-3-1.338-3-3-3" color="#eff0f1" fill="#232629"/><path d="m11.625 9.75v2.625h2.25v-0.375h-1.875v-2.25h-0.375" color="#eff0f1"/><path d="m11.676 14.609c-0.98596-0.11724-1.8391-0.81419-2.1675-1.7707-0.085023-0.24762-0.10104-0.34997-0.11494-0.7343-0.013821-0.38222-0.00604-0.48655 0.053982-0.72391 0.31598-1.2495 1.451-2.0848 2.7166-1.9992 0.95688 0.064746 1.761 0.60101 2.183 1.4558 0.18682 0.37842 0.24603 0.60733 0.26894 1.0397 0.04233 0.79897-0.2394 1.4823-0.84592 2.0517-0.54678 0.51333-1.3385 0.77073-2.0941 0.68088zm2.218-2.4292 0.0098-0.20599h-1.8818v-2.2443l-0.41198 0.01962-0.0086 1.2853c-0.0047 0.70691-0.0014 1.3041 0.0074 1.327 0.01257 0.03275 0.25855 0.03985 1.1457 0.03304l1.1297-0.0087z" fill="#fff" stroke="#232629" stroke-width=".032958"/><path d="m11.703 14.574c-0.98355-0.090547-1.8772-0.8374-2.1839-1.8252-0.10396-0.33484-0.12883-0.9398-0.052908-1.2873 0.16507-0.75558 0.69558-1.4375 1.3916-1.7888 0.60674-0.30625 1.3231-0.34421 2.0134-0.10672 0.34839 0.11985 0.58439 0.26258 0.87099 0.52673 0.26792 0.24695 0.44825 0.50058 0.6203 0.87247 0.17382 0.37573 0.2126 0.56642 0.21191 1.0421-7.15e-4 0.49575-0.05105 0.71329-0.26692 1.1535-0.13267 0.27058-0.19874 0.35838-0.48646 0.64649-0.29947 0.29988-0.36768 0.35016-0.67864 0.50024-0.48668 0.23488-0.917 0.31454-1.4394 0.26645zm2.1154-2.1671c0.09672-0.02057 0.09909-0.02589 0.10862-0.24329l0.0097-0.22226h-1.8816v-2.2442l-0.44494 0.0195-0.02228 0.14831c-0.03041 0.20249-0.03216 2.446-0.0019 2.4933 0.01332 0.02083 0.06129 0.04477 0.10661 0.05319 0.12597 0.02341 2.0134 0.01938 2.1258-0.0045z" fill="#fff" stroke="#232629" stroke-width=".032958"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircCloseChannel.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-NegativeText { + color:#da4453; + }</style></defs><g class="ColorScheme-NegativeText" transform="matrix(1.25 0 0 1.25 -2.75 -2.75)" color="#da4453" fill="currentColor"><path d="m11 3c4.432 0 8 3.568 8 8 0 1.442-0.383 2.79-1.045 3.955l-0.738-0.738a6.985 6.985 0 0 0 0.783-3.217c0-3.878-3.122-7-7-7a6.985 6.985 0 0 0-3.217 0.783l-0.738-0.738a7.982 7.982 0 0 1 3.955-1.045m-6.955 4.045 0.738 0.738a6.985 6.985 0 0 0-0.783 3.217c0 3.878 3.122 7 7 7a6.985 6.985 0 0 0 3.217-0.783l0.738 0.738a7.982 7.982 0 0 1-3.955 1.045c-4.432 0-8-3.568-8-8 0-1.442 0.383-2.79 1.045-3.955"/><path d="m7.5 9.998h7v2h-7z"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircConfigure.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg fill="none" version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><path d="m3.5818 21c-0.3372-0.004723-0.66996-0.077708-0.97823-0.21466-0.30829-0.13696-0.5857-0.33502-0.81556-0.58217-0.44726-0.40814-0.72464-0.96999-0.7769-1.5738-0.059321-0.6241 0.12134-1.2473 0.50511-1.7425 1.7235-1.8209 5.1228-5.2262 7.5954-7.6513-0.52611-1.4252-0.50153-2.996 0.068943-4.404 0.4691-1.1715 1.3033-2.16 2.3785-2.8183 0.84344-0.55957 1.8129-0.89962 2.8206-0.98937 1.0077-0.08974 2.0217 0.073644 2.9506 0.47539l0.88157 0.3825-4.094 4.2234 1.7924 1.8009 4.2054-4.1172 0.38186 0.88586c0.32186 0.74686 0.49257 1.5503 0.50214 2.3638 0.0096 0.81344-0.14214 1.6207-0.44643 2.3749-0.30171 0.7458-0.74986 1.4233-1.3179 1.9922-0.32186 0.31551-0.67757 0.59434-1.0607 0.8314-0.79271 0.53032-1.6997 0.86463-2.6464 0.97546-0.94686 0.11082-1.9064-5e-3 -2.7998-0.33796-1.5684 1.5937-5.4834 5.5423-7.598 7.5197-0.42419 0.38596-0.97553 0.60163-1.5485 0.60564zm11.339-18.672c-0.93972-0.00236-1.8589 0.275-2.6409 0.79687-0.30499 0.18654-0.58824 0.4066-0.84451 0.65608-0.68156 0.68825-1.1367 1.5688-1.3045 2.5236-0.16777 0.95476-0.04011 1.9381 0.36586 2.8181l0.19357 0.42499-0.33277 0.32539c-2.4832 2.4278-6.0986 6.039-7.8367 7.8771-0.15476 0.23083-0.22096 0.5099-0.18634 0.78567 0.0346 0.27591 0.16766 0.52993 0.3746 0.71511 0.11926 0.13309 0.26457 0.24028 0.42691 0.3147 0.14309 0.06483 0.29774 0.10003 0.45474 0.10361 0.23844-6e-3 0.46673-0.09803 0.643-0.25888 2.2472-2.1011 6.5891-6.4945 7.8632-7.7855l0.32747-0.33071 0.4216 0.19258c0.73393 0.34273 1.5438 0.48946 2.3511 0.42592 0.80728-0.06353 1.5844-0.33516 2.256-0.7885 0.30557-0.18872 0.58886-0.41148 0.84443-0.66405 0.44257-0.44209 0.79229-0.96843 1.0287-1.548 0.23628-0.57958 0.35443-1.2007 0.34757-1.8267 0-0.30863-0.03057-0.61651-0.09157-0.91906l-3.6817 3.5992-3.6445-3.6457 3.5928-3.7054c-0.30571-0.059533-0.61657-0.088455-0.928-0.086323z" fill="#232629" stroke-width="1.4298"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircConnect.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m20.116 1-4.375 4.375-1.875-1.875-9.1162 9.1162 1.875 1.875-5.625 5.625 0.88379 0.88379 5.625-5.625 1.875 1.875 9.1162-9.1162-1.875-1.875 4.375-4.375z" color="#eff0f1" fill="#232629"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircDisconnect.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + } + .ColorScheme-NegativeText { + color:#da4453; + }</style></defs><path class="ColorScheme-Text" d="m20.116 1-4.375 4.375-1.875-1.875-4.7412 4.7412 4.6338 4.6338 4.7412-4.7412-1.875-1.875 4.375-4.375zm-11.875 8.125-3.4912 3.4912 1.875 1.875-5.625 5.625 0.88379 0.88379 5.625-5.625 1.875 1.875 3.4912-3.4912-2.7588-2.7588z" color="#eff0f1" fill="#232629"/><path class="ColorScheme-NegativeText" d="M 14.334374,13 13,14.334374 15.665626,17 13,19.665626 14.334374,21 17,18.334374 19.665626,21 21,19.665626 18.334374,17 21,14.334374 19.665626,13 17,15.665626 Z" color="#da4453" fill="currentColor"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircEditTopic.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m6 1v5h-5v1.25h5v7.5h-5v1.25h5v5h1.25v-5h3.75v-1.25h-3.75v-7.5h7.5v3.75h1.25v-3.75h5v-1.25h-5v-5h-1.25v5h-7.5v-5z" color="#eff0f1" fill="#232629"/><path class="ColorScheme-Text" d="m18.374 12.25-6.1239 6.1239v2.6261h2.6261l6.1239-6.1239zm-1.4939 2.545 1.5751 1.5751-2.3142 2.3157v-0.49276l-0.73914 0.01566h-0.7548v-1.182l1.051-1.0496zm-2.9722 2.9708v1.182h1.4783l0.01566 0.47567-0.78756 0.78898h-1.051l-0.52551-0.52551v-1.051z" color="#eff0f1" fill="#232629"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircHalfOp.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path d="m10.998 1a5.0449 5 0 0 0-5.0449 5 5.0449 5 0 0 0 5.0449 5 5.0449 5 0 0 0 5.0449-5 5.0449 5 0 0 0-5.0449-5zm0 1.25a3.7837 3.75 0 0 1 3.7852 3.75 3.7837 3.75 0 0 1-3.7852 3.75 3.7837 3.75 0 0 1-3.7832-3.75 3.7837 3.75 0 0 1 3.7832-3.75zm0 10a10.09 10 0 0 0-9.998 8.75h1.2715a8.8286 8.75 0 0 1 8.7266-7.5 8.8286 8.75 0 0 1 3.9805 0.95312h2.3125a10.09 10 0 0 0-6.293-2.2031z" color="#eff0f1" fill="#2ca05a"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircJoinChannel.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m6 1v5h-5v1.25h5v7.5h-5v1.25h5v5h1.25v-5h3.75v-1.25h-3.75v-7.5h7.5v3.75h1.25v-3.75h5v-1.25h-5v-5h-1.25v5h-7.5v-5z" color="#eff0f1" fill="#232629"/><path d="m16.625 12.25c-2.4238 0-4.375 1.9512-4.375 4.375s1.9512 4.375 4.375 4.375 4.375-1.9512 4.375-4.375-1.9512-4.375-4.375-4.375z" fill="#2ecc71"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircNormal.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m10.999 1a5.0449 5 0 0 0-5.045 5 5.0449 5 0 0 0 5.045 5 5.0449 5 0 0 0 5.045-5 5.0449 5 0 0 0-5.045-5zm0 1.25a3.7837 3.75 0 0 1 3.7837 3.75 3.7837 3.75 0 0 1-3.7837 3.75 3.7837 3.75 0 0 1-3.7837-3.75 3.7837 3.75 0 0 1 3.7837-3.75zm0 10a10.09 10 0 0 0-9.9988 8.75h1.2711a8.8286 8.75 0 0 1 8.7277-7.5 8.8286 8.75 0 0 1 8.7301 7.5h1.2711a10.09 10 0 0 0-10.001-8.75z" color="#eff0f1" fill="#232629"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircOp.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m10.999 1a5.0449 5 0 0 0-5.045 5 5.0449 5 0 0 0 5.045 5 5.0449 5 0 0 0 5.045-5 5.0449 5 0 0 0-5.045-5zm0 1.25a3.7837 3.75 0 0 1 3.7837 3.75 3.7837 3.75 0 0 1-3.7837 3.75 3.7837 3.75 0 0 1-3.7837-3.75 3.7837 3.75 0 0 1 3.7837-3.75zm0 10a10.09 10 0 0 0-9.9988 8.75h1.2711a8.8286 8.75 0 0 1 8.7277-7.5 8.8286 8.75 0 0 1 8.7301 7.5h1.2711a10.09 10 0 0 0-10.001-8.75z" color="#eff0f1" fill="#2ca05a"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircOwner.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m10.999 1a5.0449 5 0 0 0-5.045 5 5.0449 5 0 0 0 5.045 5 5.0449 5 0 0 0 5.045-5 5.0449 5 0 0 0-5.045-5zm0 1.25a3.7837 3.75 0 0 1 3.7837 3.75 3.7837 3.75 0 0 1-3.7837 3.75 3.7837 3.75 0 0 1-3.7837-3.75 3.7837 3.75 0 0 1 3.7837-3.75zm0 10a10.09 10 0 0 0-9.9988 8.75h1.2711a8.8286 8.75 0 0 1 8.7277-7.5 8.8286 8.75 0 0 1 8.7301 7.5h1.2711a10.09 10 0 0 0-10.001-8.75z" color="#eff0f1" fill="#c83737"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircUserAway.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.2557 0 0 1.25 -532.39 -659.97)" fill="#ff9000"><path d="m432.71 528.79a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 1a3 3 0 0 1 3 3 3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3"/><path transform="translate(420.71 524.79)" d="m12 13a8 8 0 0 0-7.9277 7h1.0078a7 7 0 0 1 6.9199-6 7 7 0 0 1 1 0.08008v-1.0098a8 8 0 0 0-1-0.07031"/><path d="m440.71 536.79-8 4 2 1 1 3 1-2 2 1z" fill-rule="evenodd"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircUserPresent.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.2557 0 0 1.25 -532.39 -659.97)"><g fill="#43be80"><path d="m432.71 528.79a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 1a3 3 0 0 1 3 3 3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3"/><path transform="translate(421.71 525.79)" d="m11 12a8 8 0 0 0-7.9277 7h1.0078a7 7 0 0 1 6.9199-6 7 7 0 0 1 1 0.08008v-1.0098a8 8 0 0 0-1-0.07031"/><circle cx="437.21" cy="541.29" r="3.5"/></g><path d="m438.71 539.79 1 1-3 3-2-2 1-1 1 1z" fill="#fff" fill-rule="evenodd"/></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/light/ircVoice.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg version="1.1" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css">.ColorScheme-Text { + color:#eff0f1; + }</style></defs><path class="ColorScheme-Text" d="m15 4-12 3.418v6.1641l1 0.28516v2.4336l6 1.6992v-2.4238l5 1.4238v-13zm4.0293 0.42773-0.77148 0.63086c1.1373 1.7722 1.7419 3.8337 1.7422 5.9395-4e-3 2.1039-0.61142 4.1625-1.75 5.9316l0.7832 0.64258c1.2816-1.9532 1.9651-4.2381 1.9668-6.5742-4e-3 -2.3352-0.6885-4.6186-1.9707-6.5703zm-5.0293 0.90039v10.344l-10-2.8477v-4.6484l10-2.8477zm2.6895 1.0156-0.78125 0.63867c0.71179 1.2188 1.0885 2.6042 1.0918 4.0156-2e-3 1.4119-0.3784 2.798-1.0898 4.0176l0.78125 0.64062c0.85323-1.4042 1.3058-3.0151 1.3086-4.6582-4e-3 -1.6419-0.45732-3.2515-1.3105-4.6543zm-14.689 1.3594-1 0.28516v5.0234l1 0.28516v-5.5937zm3 6.4492 4 1.1387v1.4258l-4-1.1328v-1.4316z" fill="#232629"/></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/sbIrc48.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + viewBox="0 0 48 48" + id="svg31" + sodipodi:docname="sbIrc48.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <metadata + id="metadata35"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1650" + inkscape:window-height="1051" + id="namedview33" + showgrid="false" + inkscape:zoom="14.895833" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg31" /> + <defs + id="defs19"> + <linearGradient + id="i" + x2="0" + y1="34" + y2="4" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#7cbaf8" + offset="0" + id="stop2" /> + <stop + stop-color="#f4fcff" + offset="1" + id="stop4" /> + </linearGradient> + <linearGradient + id="e" + x1="405.57" + x2="427.57" + y1="509.8" + y2="533.8" + gradientUnits="userSpaceOnUse"> + <stop + stop-opacity=".286" + offset="0" + id="stop7" /> + <stop + stop-opacity="0" + offset="1" + id="stop9" /> + </linearGradient> + <linearGradient + id="h" + x1="412.57" + x2="425.57" + y1="514.8" + y2="527.8" + gradientUnits="userSpaceOnUse" + xlink:href="#e" /> + <linearGradient + id="g" + x2="0" + y1="44" + y2="4" + gradientTransform="matrix(-1,0,0,1,432.57,499.8)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#2f74c8" + offset="0" + id="stop13" /> + <stop + stop-color="#4699d7" + offset="1" + id="stop15" /> + </linearGradient> + <linearGradient + id="f" + x1="405.57" + x2="427.57" + y1="509.8" + y2="533.8" + gradientUnits="userSpaceOnUse" + xlink:href="#e" /> + </defs> + <g + transform="translate(-384.57,-499.8)" + fill-rule="evenodd" + id="g29"> + <path + d="m 428.57,503.8 v 30 h -20 l -11,10 v -10 h -9 v -30 z" + fill="url(#g)" + id="path21" + style="fill:url(#g)" /> + <path + d="m 402.57,534.8 -6,-6 v -3 l -3,-3 v -9 h 4 l 1,1 v -1 l 20,-6 10,7.461 V 533.8 h -26 z" + fill="url(#f)" + opacity="0.2" + id="path23" + style="fill:url(#f)" /> + <path + d="m 419.57,521.8 9,9 v -11 l -5,-5 h -4 z" + fill="url(#h)" + opacity="0.2" + id="path25" + style="fill:url(#h)" /> + <path + transform="translate(384.57,499.8)" + d="m 34,8 -20,6 v 9 l 20,6 V 14 Z M 9,14 v 9 h 4 v -9 z m 26,1 v 7 h 4 v -7 z m -23,9 v 5 h 3 v -5 z" + fill="url(#i)" + id="path27" + style="fill:url(#i)" /> + </g> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ExtensionIrc/icons/sbIrc96.svg Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + version="1.1" + viewBox="0 0 96 96" + id="svg31" + sodipodi:docname="sbIrc96.svg" + inkscape:version="0.92.0 r15299" + width="96" + height="96"> + <metadata + id="metadata35"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1650" + inkscape:window-height="1051" + id="namedview33" + showgrid="false" + inkscape:zoom="14.895833" + inkscape:cx="24" + inkscape:cy="24" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="0" + inkscape:current-layer="svg31" /> + <defs + id="defs19"> + <linearGradient + id="i" + x2="0" + y1="34" + y2="4" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#7cbaf8" + offset="0" + id="stop2" /> + <stop + stop-color="#f4fcff" + offset="1" + id="stop4" /> + </linearGradient> + <linearGradient + id="e" + x1="405.57001" + x2="427.57001" + y1="509.79999" + y2="533.79999" + gradientUnits="userSpaceOnUse"> + <stop + stop-opacity=".286" + offset="0" + id="stop7" /> + <stop + stop-opacity="0" + offset="1" + id="stop9" /> + </linearGradient> + <linearGradient + id="h" + x1="412.57001" + x2="425.57001" + y1="514.79999" + y2="527.79999" + gradientUnits="userSpaceOnUse" + xlink:href="#e" /> + <linearGradient + id="g" + x2="0" + y1="44" + y2="4" + gradientTransform="matrix(-1,0,0,1,432.57,499.8)" + gradientUnits="userSpaceOnUse"> + <stop + stop-color="#2f74c8" + offset="0" + id="stop13" /> + <stop + stop-color="#4699d7" + offset="1" + id="stop15" /> + </linearGradient> + <linearGradient + id="f" + x1="405.57001" + x2="427.57001" + y1="509.79999" + y2="533.79999" + gradientUnits="userSpaceOnUse" + xlink:href="#e" /> + </defs> + <g + transform="matrix(2.1,0,0,2.1,-809.997,-1051.98)" + id="g29" + style="fill-rule:evenodd"> + <path + d="m 428.57,503.8 v 30 h -20 l -11,10 v -10 h -9 v -30 z" + id="path21" + style="fill:url(#g)" + inkscape:connector-curvature="0" /> + <path + d="m 402.57,534.8 -6,-6 v -3 l -3,-3 v -9 h 4 l 1,1 v -1 l 20,-6 10,7.461 V 533.8 h -26 z" + id="path23" + style="opacity:0.2;fill:url(#f)" + inkscape:connector-curvature="0" /> + <path + d="m 419.57,521.8 9,9 v -11 l -5,-5 h -4 z" + id="path25" + style="opacity:0.2;fill:url(#h)" + inkscape:connector-curvature="0" /> + <path + transform="translate(384.57,499.8)" + d="m 34,8 -20,6 v 9 l 20,6 V 14 Z M 9,14 v 9 h 4 v -9 z m 26,1 v 7 h 4 v -7 z m -23,9 v 5 h 3 v -5 z" + id="path27" + style="fill:url(#i)" + inkscape:connector-curvature="0" /> + </g> +</svg>
--- a/PluginExtensionIrc.py Fri Apr 18 12:57:19 2025 +0200 +++ b/PluginExtensionIrc.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,360 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a plug-in providing IRC communication capability. +""" + +import logging +import os + +from PyQt6.QtCore import QCoreApplication, QObject, Qt, QTranslator +from PyQt6.QtGui import QIcon, QKeySequence, QPixmap + +from eric7 import EricUtilities, Preferences +from eric7.EricGui import EricPixmapCache +from eric7.EricGui.EricAction import EricAction +from eric7.EricWidgets.EricApplication import ericApp +from eric7.UI.UserInterface import UserInterfaceSide + +# Start-Of-Header +__header__ = { + "name": "IRC Extension Plugin", + "author": "Detlev Offenbach <detlev@die-offenbachs.de>", + "autoactivate": True, + "deactivateable": True, + "version": "10.x", + "className": "IrcExtensionPlugin", + "packageName": "ExtensionIrc", + "shortDescription": "This plug-in adds a widget to communicate via IRC messa", + "longDescription": ( + "This plug-in adds a widget to communicate via IRC messages. It replaces" + " the formerly integrated variant." + ), + "needsRestart": False, + "hasCompiledForms": True, + "pyqtApi": 2, +} +# End-Of-Header + +error = "" # noqa: U-200 + +ircExtensionPluginObject = None + + +def createIrcPage(configDlg): # noqa: U-100 + """ + Function to create the IRC configuration page. + + @param configDlg reference to the configuration dialog + @type ConfigurationWidget + @return reference to the configuration page + @rtype TranslatorPage + """ + global ircExtensionPluginObject + from ExtensionIrc.ConfigurationPage.IrcPage import IrcPage # noqa: I-101, I-102 + + page = IrcPage(ircExtensionPluginObject) + return page + + +def getConfigData(): + """ + Function returning data as required by the configuration dialog. + + @return dictionary containing the relevant data + @rtype dict + """ + return { + "ircPage": [ + QCoreApplication.translate("IrcExtensionPlugin", "IRC"), + os.path.join("ExtensionIrc", "icons", "irc"), + createIrcPage, + None, + None, + ], + } + + +def prepareUninstall(): + """ + Function to prepare for an un-installation. + """ + Preferences.getSettings().remove(IrcExtensionPlugin.PreferencesKey) + + +class IrcExtensionPlugin(QObject): + """ + Class documentation goes here. + """ + + PreferencesKey = "IRC" + + def __init__(self, ui): + """ + Constructor + + @param ui reference to the user interface object + @type UI.UserInterface + """ + super().__init__(ui) + self.__ui = ui + self.__initialize() + + self.__defaults = { + "ShowTimestamps": True, + "TimestampIncludeDate": False, + "TimeFormat": "hh:mm", + "DateFormat": "yyyy-MM-dd", + "NetworkMessageColour": "#000055", + "ServerMessageColour": "#91640A", + "ErrorMessageColour": "#FF0000", + "TimestampColour": "#709070", + "HyperlinkColour": "#0000FF", + "ChannelMessageColour": "#000000", + "OwnNickColour": "#000000", + "NickColour": "#18B33C", + "JoinChannelColour": "#72D672", + "LeaveChannelColour": "#B00000", + "ChannelInfoColour": "#9E54B3", + "EnableIrcColours": True, + "IrcColor0": "#FFFF00", + "IrcColor1": "#000000", + "IrcColor2": "#000080", + "IrcColor3": "#008000", + "IrcColor4": "#FF0000", + "IrcColor5": "#A52A2A", + "IrcColor6": "#800080", + "IrcColor7": "#FF8000", + "IrcColor8": "#808000", + "IrcColor9": "#00FF00", + "IrcColor10": "#008080", + "IrcColor11": "#00FFFF", + "IrcColor12": "#0000FF", + "IrcColor13": "#FFC0CB", + "IrcColor14": "#A0A0A0", + "IrcColor15": "#C0C0C0", + "ShowNotifications": True, + "NotifyJoinPart": True, + "NotifyMessage": False, + "NotifyNick": False, + "AutoUserInfoLookup": True, + "AutoUserInfoMax": 200, + "AutoUserInfoInterval": 90, + "MarkPositionWhenHidden": True, + "MarkerLineForegroundColour": "#000000", # Black on + "MarkerLineBackgroundColour": "#ffff00", # Yellow + } + + self.__translator = None + self.__loadTranslator() + + def __initialize(self): + """ + Private slot to (re)initialize the plugin. + """ + self.__irc = None + + def activate(self): + """ + Public method to activate this plug-in. + + @return tuple of None and activation status + @rtype bool + """ + global error, ircExtensionPluginObject + error = "" # clear previous error + ircExtensionPluginObject = self + + # Create the IRC user interface + logging.getLogger(__name__).debug("Creating IRC Widget...") + from ExtensionIrc.IrcWidget import IrcWidget # noqa: I-101, I-102 + + usesDarkPalette = ericApp().usesDarkPalette() + self.__iconType = "dark" if usesDarkPalette else "light" + + self.__irc = IrcWidget(plugin=self) + iconName = "sbIrc96" if self.__ui.getLayoutType() == "Sidebars" else "irc" + self.__ui.addSideWidget( + UserInterfaceSide.Right, + self.__irc, + self.getIcon(iconName), + self.tr("IRC"), + ) + + self.__activateAct = EricAction( + self.tr("IRC"), + self.tr("&IRC"), + QKeySequence(self.tr("Ctrl+Alt+Shift+I")), + 0, + self, + "irc_widget_activate", + ) + self.__activateAct.setStatusTip( + self.tr("Switch the input focus to the IRC window.") + ) + self.__activateAct.setWhatsThis( + self.tr( + """<b>Activate IRC</b>""" + """<p>This switches the input focus to the IRC window.</p>""" + ) + ) + self.__activateAct.triggered.connect(self.__activateWidget) + + self.__ui.addEricActions([self.__activateAct], "ui") + menu = self.__ui.getMenu("subwindow") + menu.addAction(self.__activateAct) + + ericApp().getObject("PluginManager").shutdown.connect(self.__irc.shutdown) + + self.__irc.autoConnected.connect(self.__activateWidget) + self.__irc.autoConnect() + + return None, True + + def deactivate(self): + """ + Public method to deactivate this plug-in. + """ + menu = self.__ui.getMenu("subwindow") + menu.removeAction(self.__activateAct) + self.__ui.removeEricActions([self.__activateAct], "ui") + self.__ui.removeSideWidget(self.__irc) + + self.__initialize() + + def __getIconPaths(self, iconName): + """ + Private method to generate a list of paths to check for the requested icon name. + + @param iconName name of the icon + @type str + @return list of icon path names + @rtype list of str + """ + return [ + os.path.join("ExtensionIrc", "icons", self.__iconType, iconName), + os.path.join("ExtensionIrc", "icons", iconName), # without icon type + ] + + def getIcon(self, iconName): + """ + Public method to get a named icon. + + @param iconName name of the icon + @type str + @return requested icon + @rtype QIcon + """ + icon = QIcon() + + for iconPath in self.__getIconPaths(iconName): + icon = EricPixmapCache.getIcon(iconPath) + if not icon.isNull(): + break + + return icon + + def getPixmap(self, pixmapName): + """ + Public method to get a named pixmap. + + @param pixmapName name of the pixmap + @type str + @return requested pixmap + @rtype QPixmap + """ + pixmap = QPixmap() + + for pixPath in self.__getIconPaths(pixmapName): + pixmap = EricPixmapCache.getPixmap(pixPath) + if not pixmap.isNull(): + break + + return pixmap + + def __loadTranslator(self): + """ + Private method to load the translation file. + """ + if self.__ui is not None: + loc = self.__ui.getLocale() + if loc and loc != "C": + locale_dir = os.path.join( + os.path.dirname(__file__), "ExtensionIrc", "i18n" + ) + translation = "icr_{0}".format(loc) + translator = QTranslator(None) + loaded = translator.load(translation, locale_dir) + if loaded: + self.__translator = translator + ericApp().installTranslator(self.__translator) + else: + print( # noqa: M-801 + "Warning: translation file '{0}' could not be" + " loaded.".format(translation) + ) + print("Using default.") # noqa: M-801 + + def __activateWidget(self): + """ + Private slot to handle the activation of the MQTT Monitor. + """ + uiLayoutType = self.__ui.getLayoutType() + + if uiLayoutType == "Toolboxes": + self.__ui.rToolboxDock.show() + self.__ui.rToolbox.setCurrentWidget(self.irc) + elif uiLayoutType == "Sidebars": + self.__ui.activateLeftRightSidebarWidget(self.__irc) + self.__irc.setFocus(Qt.FocusReason.ActiveWindowFocusReason) + + def getPreferences(self, key): + """ + Public method to retrieve the various settings values. + + @param key the key of the value to get + @type str + @return the requested setting value + @rtype Any + """ + if key in [ + "TimestampIncludeDate", + "ShowTimestamps", + "ShowNotifications", + "NotifyJoinPart", + "NotifyMessage", + "NotifyNick", + "EnableIrcColours", + "AutoUserInfoLookup", + "MarkPositionWhenHidden", + ]: + return EricUtilities.toBool( + Preferences.Prefs.settings.value( + self.PreferencesKey + "/" + key, self.__defaults[key] + ) + ) + elif key in ["AutoUserInfoMax", "AutoUserInfoInterval"]: + return int( + Preferences.Prefs.settings.value( + self.PreferencesKey + "/" + key, self.__defaults[key] + ) + ) + else: + return Preferences.Prefs.settings.value( + self.PreferencesKey + "/" + key, self.__defaults[key] + ) + return None + + def setPreferences(self, key, value): + """ + Public method to store the various settings values. + + @param key the key of the setting to be set + @type str + @param value the value to be set + @type Any + """ + Preferences.Prefs.settings.setValue(self.PreferencesKey + "/" + key, value)
--- a/PluginIrc.epj Fri Apr 18 12:57:19 2025 +0200 +++ b/PluginIrc.epj Fri Apr 18 18:36:48 2025 +0200 @@ -5,7 +5,149 @@ }, "project": { "AUTHOR": "Detlev Offenbach", - "CHECKERSPARMS": {}, + "CHECKERSPARMS": { + "Pep8Checker": { + "AnnotationsChecker": { + "AllowStarArgAny": false, + "AllowUntypedDefs": false, + "AllowUntypedNested": false, + "CheckFutureAnnotations": false, + "DispatchDecorators": [ + "singledispatch", + "singledispatchmethod" + ], + "ExemptedTypingSymbols": [ + "" + ], + "ForceFutureAnnotations": false, + "MaximumComplexity": 3, + "MaximumLength": 7, + "MinimumCoverage": 75, + "MypyInitReturn": false, + "OverloadDecorators": [ + "overload" + ], + "RespectTypeIgnore": false, + "SuppressDummyArgs": false, + "SuppressNoneReturning": true + }, + "BlankLines": [ + 2, + 1 + ], + "BuiltinsChecker": { + "bytes": [ + "unicode" + ], + "chr": [ + "unichr" + ], + "str": [ + "unicode" + ] + }, + "CommentedCodeChecker": { + "Aggressive": false, + "WhiteList": [ + "pylint", + "pyright", + "noqa", + "type:\\s*ignore", + "fmt:\\s*(on|off)", + "TODO", + "FIXME", + "WARNING", + "NOTE", + "TEST", + "DOCU", + "XXX", + "- " + ] + }, + "CopyrightAuthor": "", + "CopyrightMinFileSize": 0, + "DocstringType": "eric_black", + "EnabledCheckerCategories": "PYD, C, D, E, I, L, M, NO, N, Y, U, W", + "ExcludeFiles": "*/Ui_*.py", + "ExcludeMessages": "M-201,C-101,E-203,E-265,E-266,E-305,E-402,M-251,M-701,M-702,M-811,M-834,M-852,N-802,N-803,N-807,N-808,N-821,U-101,W-293,W-503,Y-119,Y-401,Y-402", + "FixCodes": "", + "FixIssues": false, + "FutureChecker": "", + "HangClosing": false, + "ImportsChecker": { + "ApplicationPackageNames": [ + "PluginExtensionIrc", + "eric7" + ], + "BanRelativeImports": "", + "BannedModules": [] + }, + "IncludeMessages": "", + "LineComplexity": 25, + "LineComplexityScore": 10, + "MaxCodeComplexity": 10, + "MaxDocLineLength": 88, + "MaxLineLength": 88, + "NameOrderChecker": { + "ApplicationPackageNames": [ + "PluginExtensionIrc", + "eric7" + ], + "CombinedAsImports": true, + "SortCaseSensitive": false, + "SortFromFirst": false, + "SortIgnoringStyle": false, + "SortOrder": "natural" + }, + "NoFixCodes": "E-501", + "RepeatMessages": true, + "SecurityChecker": { + "CheckTypedException": false, + "HardcodedTmpDirectories": [ + "/tmp", + "/var/tmp", + "/dev/shm", + "~/tmp" + ], + "InsecureHashes": [ + "md4", + "md5", + "sha", + "sha1" + ], + "InsecureSslProtocolVersions": [ + "PROTOCOL_SSLv2", + "SSLv2_METHOD", + "SSLv23_METHOD", + "PROTOCOL_SSLv3", + "PROTOCOL_TLSv1", + "SSLv3_METHOD", + "TLSv1_METHOD" + ], + "WeakKeySizeDsaHigh": "1024", + "WeakKeySizeDsaMedium": "2048", + "WeakKeySizeEcHigh": "160", + "WeakKeySizeEcMedium": "224", + "WeakKeySizeRsaHigh": "1024", + "WeakKeySizeRsaMedium": "2048" + }, + "ShowIgnored": false, + "UnusedChecker": { + "IgnoreAbstract": true, + "IgnoreDunderGlobals": true, + "IgnoreDunderMethods": true, + "IgnoreEventHandlerMethods": true, + "IgnoreLambdas": false, + "IgnoreNestedFunctions": false, + "IgnoreOverload": true, + "IgnoreOverride": true, + "IgnoreSlotMethods": true, + "IgnoreStubs": true, + "IgnoreVariadicNames": false + }, + "ValidEncodings": "latin-1, utf-8" + } + }, "DESCRIPTION": "This plug-in adds a widget to communicate via IRC messages.", "DOCSTRING": "ericdoc", "DOCUMENTATIONPARMS": {}, @@ -38,7 +180,17 @@ "README.*": "OTHERS", "makefile": "OTHERS" }, - "FORMS": [], + "FORMS": [ + "ExtensionIrc/ConfigurationPage/IrcPage.ui", + "ExtensionIrc/IrcChannelEditDialog.ui", + "ExtensionIrc/IrcChannelWidget.ui", + "ExtensionIrc/IrcIdentitiesEditDialog.ui", + "ExtensionIrc/IrcNetworkEditDialog.ui", + "ExtensionIrc/IrcNetworkListDialog.ui", + "ExtensionIrc/IrcNetworkWidget.ui", + "ExtensionIrc/IrcServerEditDialog.ui", + "ExtensionIrc/IrcWidget.ui" + ], "HASH": "aa5424fb92d673ccba3f71c16dd4d2538a19154f", "IDLPARAMS": { "DefinedNames": [], @@ -60,9 +212,45 @@ "MIXEDLANGUAGE": false, "OTHERS": [ ".hgignore", - "PluginIrc.epj" + "PluginIrc.epj", + "pyproject.toml" ], - "OTHERTOOLSPARMS": {}, + "OTHERTOOLSPARMS": { + "Black": { + "exclude": "/(\\.direnv|\\.eggs|\\.git|\\.hg|\\.ipynb_checkpoints|\\.mypy_cache|\\.nox|\\.pytest_cache|\\.ruff_cache|\\.tox|\\.svn|\\.venv|\\.vscode|__pypackages__|_build|buck-out|build|dist|venv)/", + "extend-exclude": "/(\n Ui_.*\\.py\n)", + "force-exclude": "", + "line-length": 88, + "skip-magic-trailing-comma": false, + "skip-string-normalization": false, + "source": "project", + "target-version": [ + "py313", + "py312", + "py311", + "py310", + "py39" + ] + }, + "isort": { + "config_source": "project", + "extend_skip_glob": [ + "*/Ui_*.py" + ], + "known_first_party": [ + "ExtensionIrc", + "eric7" + ], + "profile": "black", + "sort_order": "natural", + "supported_extensions": [ + "pyi", + "pxd", + "pyx", + "py" + ] + } + }, "PACKAGERSPARMS": {}, "PROGLANGUAGE": "Python3", "PROJECTTYPE": "E7Plugin", @@ -76,6 +264,29 @@ }, "RESOURCES": [], "SOURCES": [ + "ExtensionIrc/ConfigurationPage/IrcPage.py", + "ExtensionIrc/ConfigurationPage/Ui_IrcPage.py", + "ExtensionIrc/ConfigurationPage/__init__.py", + "ExtensionIrc/IrcChannelEditDialog.py", + "ExtensionIrc/IrcChannelWidget.py", + "ExtensionIrc/IrcIdentitiesEditDialog.py", + "ExtensionIrc/IrcMessageEdit.py", + "ExtensionIrc/IrcNetworkEditDialog.py", + "ExtensionIrc/IrcNetworkListDialog.py", + "ExtensionIrc/IrcNetworkManager.py", + "ExtensionIrc/IrcNetworkWidget.py", + "ExtensionIrc/IrcServerEditDialog.py", + "ExtensionIrc/IrcUtilities.py", + "ExtensionIrc/IrcWidget.py", + "ExtensionIrc/Ui_IrcChannelEditDialog.py", + "ExtensionIrc/Ui_IrcChannelWidget.py", + "ExtensionIrc/Ui_IrcIdentitiesEditDialog.py", + "ExtensionIrc/Ui_IrcNetworkEditDialog.py", + "ExtensionIrc/Ui_IrcNetworkListDialog.py", + "ExtensionIrc/Ui_IrcNetworkWidget.py", + "ExtensionIrc/Ui_IrcServerEditDialog.py", + "ExtensionIrc/Ui_IrcWidget.py", + "ExtensionIrc/__init__.py", "PluginExtensionIrc.py", "__init__.py" ], @@ -86,7 +297,13 @@ "TESTING_FRAMEWORK": "", "TRANSLATIONEXCEPTIONS": [], "TRANSLATIONPATTERN": "ExtensionIrc/i18n/irc_%language%.ts", - "TRANSLATIONS": [], + "TRANSLATIONS": [ + "ExtensionIrc/i18n/irc_de.ts", + "ExtensionIrc/i18n/irc_empty.ts", + "ExtensionIrc/i18n/irc_en.ts", + "ExtensionIrc/i18n/irc_es.ts", + "ExtensionIrc/i18n/irc_ru.ts" + ], "TRANSLATIONSBINPATH": "", "TRANSLATIONSOURCESTARTPATH": "", "UICPARAMS": {
--- a/__init__.py Fri Apr 18 12:57:19 2025 +0200 +++ b/__init__.py Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2025 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Package implementing the IRC plug-in. +"""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pyproject.toml Fri Apr 18 18:36:48 2025 +0200 @@ -0,0 +1,17 @@ + +[tool.isort] +profile = "black" +sort_order = "natural" +supported_extensions = ["pyi", "pxd", "pyx", "py"] +combine_as_imports = true +extend_skip_glob = ["*/Ui_*.py"] +known_first_party = ["ExtensionIrc", "eric7"] + +[tool.black] +target-version = ["py313", "py312", "py311", "py310", "py39"] +line-length = 88 +extend-exclude = ''' +/( + Ui_.*\.py +) +'''