2 Commits

Author SHA1 Message Date
davide fe226c4bf5 ui: replace Bitcoin/Electrum branding with Bitcoin Purple/Electrum Purple in dialogs
Replace all user-visible "Bitcoin" and "Electrum" strings across Qt and QML
GUIs with "Bitcoin Purple" and "Electrum Purple" respectively. Update the
Help menu: replace the Bitcoin Paper link with the Bitcoin Purple whitepaper
and point the official website to bitcoinpurpleblockchain.com. Remove the
"Distributed by Electrum Technologies GmbH" attribution from the About dialog.
No code identifiers, class names or technical references were modified.
2026-05-08 10:58:55 +02:00
davide bb0c1f2bc9 build: increase pip download timeout to 120s in Windows and Linux builds
Large binary wheels (PyQt6 ~7-8 MB, cryptography ~3-4 MB) were timing out
with pip's default 15s socket timeout on slow connections, causing a
WinError 32 sharing violation on Wine temp files and an incomplete-download
error on Linux. Adding --timeout 120 to all pip install invocations in
both build-electrum-git.sh and make_appimage.sh fixes this
2026-05-08 10:17:43 +02:00
34 changed files with 87 additions and 112 deletions
@@ -132,9 +132,9 @@ info "Installing build dependencies."
# and I am not quite sure how to break the circular dependence there (I guess we could introduce
# "requirements-build-base-base.txt" with just wheel in it...)
"$python" -m pip install --no-build-isolation --no-dependencies --no-warn-script-location \
--cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements-build-base.txt"
--timeout 120 --cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements-build-base.txt"
"$python" -m pip install --no-build-isolation --no-dependencies --no-binary :all: --no-warn-script-location \
--cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements-build-appimage.txt"
--timeout 120 --cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements-build-appimage.txt"
# opt out of compiling C extensions
@@ -145,14 +145,14 @@ export ELECTRUM_ECC_DONT_COMPILE=1
info "installing electrum and its dependencies."
"$python" -m pip install --no-build-isolation --no-dependencies --no-binary :all: --no-warn-script-location \
--cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements.txt"
--timeout 120 --cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements.txt"
"$python" -m pip install --no-build-isolation --no-dependencies --no-binary :all: --only-binary PyQt6,PyQt6-Qt6,cryptography --no-warn-script-location \
--cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements-binaries.txt"
--timeout 120 --cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements-binaries.txt"
"$python" -m pip install --no-build-isolation --no-dependencies --no-binary :all: --no-warn-script-location \
--cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements-hw.txt"
--timeout 120 --cache-dir "$PIP_CACHE_DIR" -r "$CONTRIB/deterministic-build/requirements-hw.txt"
"$python" -m pip install --no-build-isolation --no-dependencies --no-warn-script-location \
--cache-dir "$PIP_CACHE_DIR" "$PROJECT_ROOT"
--timeout 120 --cache-dir "$PIP_CACHE_DIR" "$PROJECT_ROOT"
# was only needed during build time, not runtime
"$python" -m pip uninstall -y Cython
+3 -3
View File
@@ -37,15 +37,15 @@ export ELECTRUM_ECC_DONT_COMPILE=1
info "Installing requirements..."
$WINE_PYTHON -m pip install --no-build-isolation --no-dependencies --no-binary :all: --no-warn-script-location \
--cache-dir "$WINE_PIP_CACHE_DIR" -r "$CONTRIB"/deterministic-build/requirements.txt
--timeout 120 --cache-dir "$WINE_PIP_CACHE_DIR" -r "$CONTRIB"/deterministic-build/requirements.txt
info "Installing dependencies specific to binaries..."
# TODO tighten "--no-binary :all:" (but we don't have a C compiler...)
$WINE_PYTHON -m pip install --no-build-isolation --no-dependencies --no-warn-script-location \
--no-binary :all: --only-binary cffi,cryptography,PyQt6,PyQt6-Qt6,PyQt6-sip \
--timeout 120 --no-binary :all: --only-binary cffi,cryptography,PyQt6,PyQt6-Qt6,PyQt6-sip \
--cache-dir "$WINE_PIP_CACHE_DIR" -r "$CONTRIB"/deterministic-build/requirements-binaries.txt
info "Installing hardware wallet requirements..."
$WINE_PYTHON -m pip install --no-build-isolation --no-dependencies --no-warn-script-location \
--no-binary :all: --only-binary cffi,cryptography,hidapi \
--timeout 120 --no-binary :all: --only-binary cffi,cryptography,hidapi \
--cache-dir "$WINE_PIP_CACHE_DIR" -r "$CONTRIB"/deterministic-build/requirements-hw.txt
pushd "$PROJECT_ROOT"
+2 -7
View File
@@ -6,7 +6,7 @@ import QtQuick.Controls.Material
Pane {
objectName: 'About'
property string title: qsTr("About Electrum")
property string title: qsTr("About Electrum Purple")
Flickable {
anchors.fill: parent
@@ -72,7 +72,7 @@ Pane {
Layout.alignment: Qt.AlignRight
}
Label {
text: '<a href="https://electrum.org">https://electrum.org</a>'
text: '<a href="https://bitcoinpurpleblockchain.com/">https://bitcoinpurpleblockchain.com/</a>'
textFormat: Text.RichText
onLinkActivated: Qt.openUrlExternally(link)
}
@@ -88,11 +88,6 @@ Pane {
height: constants.paddingXLarge
Layout.columnSpan: 2
}
Label {
text: qsTr('Distributed by Electrum Technologies GmbH')
Layout.columnSpan: 2
Layout.alignment: Qt.AlignHCenter
}
}
}
@@ -41,7 +41,7 @@ Pane {
visible: Daemon.currentWallet.synchronizing || !Network.isConnected
text: Daemon.currentWallet.synchronizing
? qsTr('Your wallet is not synchronized. The displayed balance may be inaccurate.')
: qsTr('Your wallet is not connected to an Electrum server. The displayed balance may be outdated.')
: qsTr('Your wallet is not connected to an Electrum Purple server. The displayed balance may be outdated.')
iconStyle: InfoTextArea.IconStyle.Warn
}
@@ -122,7 +122,7 @@ ElDialog {
text_qr: dialog.channelBackup,
text_help: qsTr('The channel you created is not recoverable from seed.')
+ ' ' + qsTr('To prevent fund losses, please save this backup on another device.')
+ ' ' + qsTr('It may be imported in another Electrum wallet with the same seed.')
+ ' ' + qsTr('It may be imported in another Electrum Purple wallet with the same seed.')
})
sharedialog.open()
}
@@ -42,7 +42,7 @@ ElDialog
Label {
Layout.fillWidth: true
text: qsTr('Something went wrong while executing Electrum.')
text: qsTr('Something went wrong while executing Electrum Purple.')
}
Label {
Layout.fillWidth: true
@@ -45,7 +45,7 @@ ElDialog {
visible: !Daemon.currentWallet.lightningHasDeterministicNodeId
iconStyle: InfoTextArea.IconStyle.Warn
text: Daemon.currentWallet.seedType == 'segwit'
? [ qsTr('Your channels cannot be recovered from seed, because they were created with an old version of Electrum.'), ' ',
? [ qsTr('Your channels cannot be recovered from seed, because they were created with an old version of Electrum Purple.'), ' ',
qsTr('This means that you must save a backup of your wallet every time you create a new channel.'),
'\n\n',
qsTr('If you want this wallet to have recoverable channels, you must close your existing channels and restore this wallet from seed.')
@@ -53,7 +53,7 @@ ElDialog {
: [ qsTr('Your channels cannot be recovered from seed.'), ' ',
qsTr('This means that you must save a backup of your wallet every time you create a new channel.'),
'\n\n',
qsTr('If you want to have recoverable channels, you must create a new wallet with an Electrum seed')
qsTr('If you want to have recoverable channels, you must create a new wallet with an Electrum Purple seed')
].join('')
backgroundColor: constants.darkerDialogBackground
}
+2 -2
View File
@@ -55,7 +55,7 @@ Pane {
if (Config.language != currentValue) {
Config.language = currentValue
var dialog = app.messageDialog.createObject(app, {
text: qsTr('Please restart Electrum to activate the new GUI settings')
text: qsTr('Please restart Electrum Purple to activate the new GUI settings')
})
dialog.open()
}
@@ -407,7 +407,7 @@ Pane {
if (!checked) {
var dialog = app.messageDialog.createObject(app, {
title: qsTr('Are you sure?'),
text: qsTr('Electrum will have to download the Lightning Network graph, which is not recommended on mobile.'),
text: qsTr('Electrum Purple will have to download the Lightning Network graph, which is not recommended on mobile.'),
yesno: true
})
dialog.accepted.connect(function() {
+1 -1
View File
@@ -71,7 +71,7 @@ ElDialog {
HelpButton {
heading: qsTr('Sweep private keys')
helptext: qsTr('This will create a transaction sending all funds associated with the private keys to the current wallet') +
'<br/><br/>' + qsTr('WIF keys are typed in Electrum, based on script type.') + '<br/><br/>' +
'<br/><br/>' + qsTr('WIF keys are typed in Electrum Purple, based on script type.') + '<br/><br/>' +
qsTr('A few examples') + ':<br/>' +
'<tt><b>p2pkh</b>:KxZcY47uGp9a... \t-> 1DckmggQM...<br/>' +
'<b>p2wpkh-p2sh</b>:KxZcY47uGp9a... \t-> 3NhNeZQXF...<br/>' +
+1 -1
View File
@@ -616,7 +616,7 @@ ApplicationWindow
stack.pop()
} else {
var dialog = app.messageDialog.createObject(app, {
title: qsTr('Close Electrum?'),
title: qsTr('Close Electrum Purple?'),
yesno: true
})
dialog.accepted.connect(function() {
@@ -50,15 +50,15 @@ WizardComponent {
var t = {
'electrum': [
// not shown as electrum is the default seed type anyways and the name is self-explanatory
qsTr('Electrum seeds are the default seed type.'),
qsTr('If you are restoring from a seed previously created by Electrum, choose this option')
qsTr('Electrum Purple seeds are the default seed type.'),
qsTr('If you are restoring from a seed previously created by Electrum Purple, choose this option')
].join(' '),
'bip39': [
qsTr('BIP39 seeds can be imported in Electrum, so that users can access funds locked in other wallets.'),
qsTr('BIP39 seeds can be imported in Electrum Purple, so that users can access funds locked in other wallets.'),
qsTr('BIP39 seeds do not include a version number, which compromises compatibility with future software.'),
].join(' '),
'slip39': [
qsTr('SLIP39 seeds can be imported in Electrum, so that users can access funds locked in other wallets.'),
qsTr('SLIP39 seeds can be imported in Electrum Purple, so that users can access funds locked in other wallets.'),
].join(' ')
}
infotext.text = t[seed_variant_cb.currentValue]
@@ -31,7 +31,7 @@ WizardComponent {
InfoTextArea {
Layout.preferredWidth: parent.width
backgroundColor: constants.darkerDialogBackground
text: qsTr('Enter a list of Bitcoin addresses (this will create a watching-only wallet), or a list of private keys.')
text: qsTr('Enter a list of Bitcoin Purple addresses (this will create a watching-only wallet), or a list of private keys.')
}
RowLayout {
@@ -55,7 +55,7 @@ WizardComponent {
Layout.fillWidth: true
ButtonGroup.group: wallettypegroup
property string wallettype: 'imported'
text: qsTr('Import Bitcoin addresses or private keys')
text: qsTr('Import Bitcoin Purple addresses or private keys')
}
}
}
@@ -47,7 +47,7 @@ WizardComponent {
Label {
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: parent.width
text: qsTr("If you are unsure what this is, leave them unchecked and Electrum will automatically select servers.")
text: qsTr("If you are unsure what this is, leave them unchecked and Electrum Purple will automatically select servers.")
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHLeft
font.pixelSize: constants.fontSizeMedium
+1 -1
View File
@@ -1207,7 +1207,7 @@ class ConfirmTxDialog(TxEditor):
grid.addWidget(HelpLabel(_("Amount to be sent") + ": ", msg), 0, 0)
grid.addWidget(self.amount_label, 0, 1)
msg = _('Bitcoin transactions are in general not free. A transaction fee is paid by the sender of the funds.') + '\n\n'\
msg = _('Bitcoin Purple transactions are in general not free. A transaction fee is paid by the sender of the funds.') + '\n\n'\
+ _('The amount of fee can be decided freely by the sender. However, transactions with low fees take more time to be processed.') + '\n\n'\
+ _('A suggested fee is automatically added to this field. You may override it. The suggested fee increases with the size of the transaction.')
+1 -1
View File
@@ -52,7 +52,7 @@ class Exception_Window(BaseCrashReporter, QWidget, MessageBoxMixin, Logger):
self.config = config
QWidget.__init__(self)
self.setWindowTitle('Electrum - ' + _('An Error Occurred'))
self.setWindowTitle('Electrum Purple - ' + _('An Error Occurred'))
self.setMinimumSize(600, 300)
Logger.__init__(self)
+6 -6
View File
@@ -636,11 +636,11 @@ class HistoryList(MyTreeView, AcceptFileDragDrop):
grid.addWidget(QLabel(self.format_date(start_date)), 1, 1)
grid.addWidget(QLabel(self.format_date(end_date)), 1, 2)
#
grid.addWidget(QLabel(_("BTC balance")), 2, 0)
grid.addWidget(QLabel(_("BTCP balance")), 2, 0)
grid.addWidget(QLabel(format_amount(start['BTC_balance'])), 2, 1)
grid.addWidget(QLabel(format_amount(end['BTC_balance'])), 2, 2)
#
grid.addWidget(QLabel(_("BTC Fiat price")), 3, 0)
grid.addWidget(QLabel(_("BTCP Fiat price")), 3, 0)
grid.addWidget(QLabel(format_fiat(start.get('BTC_fiat_price'))), 3, 1)
grid.addWidget(QLabel(format_fiat(end.get('BTC_fiat_price'))), 3, 2)
#
@@ -657,11 +657,11 @@ class HistoryList(MyTreeView, AcceptFileDragDrop):
grid.addWidget(QLabel(format_fiat(end.get('unrealized_gains', ''))), 6, 2)
#
grid2 = QGridLayout()
grid2.addWidget(QLabel(_("BTC incoming")), 0, 0)
grid2.addWidget(QLabel(_("BTCP incoming")), 0, 0)
grid2.addWidget(QLabel(format_amount(flow['BTC_incoming'])), 0, 1)
grid2.addWidget(QLabel(_("Fiat incoming")), 1, 0)
grid2.addWidget(QLabel(format_fiat(flow.get('fiat_incoming'))), 1, 1)
grid2.addWidget(QLabel(_("BTC outgoing")), 2, 0)
grid2.addWidget(QLabel(_("BTCP outgoing")), 2, 0)
grid2.addWidget(QLabel(format_amount(flow['BTC_outgoing'])), 2, 1)
grid2.addWidget(QLabel(_("Fiat outgoing")), 3, 0)
grid2.addWidget(QLabel(format_fiat(flow.get('fiat_outgoing'))), 3, 1)
@@ -682,8 +682,8 @@ class HistoryList(MyTreeView, AcceptFileDragDrop):
_logger.error(f"could not import electrum.plot. This feature needs matplotlib to be installed. exc={e!r}")
self.main_window.show_message("\n\n".join([
_("This feature requires the 'matplotlib' Python library which is not "
"included in Electrum by default."),
_("If you run Electrum from source you can install matplotlib to use this feature."),
"included in Electrum Purple by default."),
_("If you run Electrum Purple from source you can install matplotlib to use this feature."),
_("It is not possible to install matplotlib inside the binary executables "
"(e.g. AppImage or Windows installation).")
]))
+1 -1
View File
@@ -179,7 +179,7 @@ class InvoiceList(MyTreeView):
copy_menu = self.add_copy_menu(menu, idx)
address = invoice.get_address()
if address:
copy_menu.addAction(_("Address"), lambda: self.main_window.do_copy(invoice.get_address(), title='Bitcoin Address'))
copy_menu.addAction(_("Address"), lambda: self.main_window.do_copy(invoice.get_address(), title='Bitcoin Purple Address'))
status = wallet.get_invoice_status(invoice)
if status == PR_UNPAID:
if bool(invoice.get_amount_sat()):
+19 -39
View File
@@ -708,7 +708,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
try:
new_path = self.wallet.save_backup(backup_dir)
except BaseException as reason:
self.show_critical(_("Electrum was unable to copy your wallet file to the specified location.") + "\n" + str(reason), title=_("Unable to create backup"))
self.show_critical(_("Electrum Purple was unable to copy your wallet file to the specified location.") + "\n" + str(reason), title=_("Unable to create backup"))
return
msg = _("A copy of your wallet file was created in")+" '%s'" % str(new_path)
self.show_message(msg, title=_("Wallet backup created"))
@@ -827,11 +827,11 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
about_action.setMenuRole(QAction.MenuRole.AboutRole) # make sure OS recognizes it as "About"
self.help_menu.addAction(about_action)
self.help_menu.addAction(_("&Changelog"), lambda: webopen(constants.RELEASE_NOTES_URL))
self.help_menu.addAction(_("&Official website"), lambda: webopen("https://electrum.org"))
self.help_menu.addAction(_("&Official website"), lambda: webopen("https://bitcoinpurpleblockchain.com/"))
self.help_menu.addSeparator()
self.help_menu.addAction(_("&Documentation"), lambda: webopen("http://docs.electrum.org/")).setShortcut(QKeySequence.StandardKey.HelpContents)
if not constants.net.TESTNET:
self.help_menu.addAction(_("&Bitcoin Paper"), self.show_bitcoin_paper)
self.help_menu.addAction(_("&Bitcoin Purple Whitepaper"), lambda: webopen("https://github.com/BitcoinPurpleBlockchain/purple-whitepaper/blob/main/whitepaper.pdf"))
self.help_menu.addAction(_("&Report Bug"), self.show_report_bug)
self.help_menu.addSeparator()
if self.network:
@@ -850,44 +850,24 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
self.show_error(_('No donation address for this server'))
def show_about(self):
QMessageBox.about(self, "Electrum",
QMessageBox.about(self, "Electrum Purple",
(_("Version")+" %s" % ELECTRUM_VERSION + "\n\n" +
_("Electrum's focus is speed, with low resource usage and simplifying Bitcoin.") + " " +
_("Electrum Purple's focus is speed, with low resource usage and simplifying Bitcoin Purple.") + " " +
_("You do not need to perform regular backups, because your wallet can be "
"recovered from a secret phrase that you can memorize or write on paper.") + " " +
_("Startup times are instant because it operates in conjunction with high-performance "
"servers that handle the most complicated parts of the Bitcoin system.") + "\n\n" +
"servers that handle the most complicated parts of the Bitcoin Purple system.") + "\n\n" +
_("Uses icons from the Icons8 icon pack (icons8.com).")))
def show_bitcoin_paper(self):
filename = os.path.join(self.config.path, 'bitcoin.pdf')
if not os.path.exists(filename):
def fetch_bitcoin_paper():
s = self._fetch_tx_from_network("54e48e5f5c656b26c3bca14a8c95aa583d07ebe84dde3b7dd4a78f4e4186e713")
if not s:
raise concurrent.futures.CancelledError
s = s.split("0100000000000000")[1:-1]
out = ''.join(x[6:136] + x[138:268] + x[270:400] if len(x) > 136 else x[6:] for x in s)[16:-20]
with open(filename, 'wb') as f:
f.write(bytes.fromhex(out))
WaitingDialog(
self,
_("Fetching Bitcoin Paper..."),
fetch_bitcoin_paper,
on_success=lambda _: webopen('file:///' + filename),
on_error=self.on_error,
)
return
webopen('file:///' + filename)
def show_report_bug(self):
msg = ' '.join([
_("Please report any bugs as issues on github:<br/>"),
f'''<a href="{constants.GIT_REPO_ISSUES_URL}">{constants.GIT_REPO_ISSUES_URL}</a><br/><br/>''',
_("Before reporting a bug, upgrade to the most recent version of Electrum (latest release or git HEAD), and include the version number in your report."),
_("Before reporting a bug, upgrade to the most recent version of Electrum Purple (latest release or git HEAD), and include the version number in your report."),
_("Try to explain not only what the bug is, but how it occurs.")
])
self.show_message(msg, title="Electrum - " + _("Reporting Bugs"), rich_text=True)
self.show_message(msg, title="Electrum Purple - " + _("Reporting Bugs"), rich_text=True)
def notify_transactions(self):
if self.tx_notification_queue.qsize() == 0:
@@ -912,7 +892,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
def notify(self, message):
if self.tray:
self.tray.showMessage("Electrum", message, read_QIcon("electrum_dark_icon"), 20000)
self.tray.showMessage("Electrum Purple", message, read_QIcon("electrum_dark_icon"), 20000)
def timer_actions(self):
# refresh invoices and requests because they show ETA
@@ -1276,7 +1256,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
if not self.config.SWAPSERVER_URL and not self.config.SWAPSERVER_NPUB:
if not self.question('\n'.join([
_('Electrum uses Nostr in order to find liquidity providers.'),
_('Electrum Purple uses Nostr in order to find liquidity providers.'),
_('Do you want to enable Nostr?'),
])):
return None
@@ -1975,7 +1955,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
line2 = QLineEdit()
line2.setFixedWidth(32 * char_width_in_lineedit())
address_label = QLabel(_("Address"))
address_label.setToolTip(_("Bitcoin- or Lightning address"))
address_label.setToolTip(_("Bitcoin Purple- or Lightning address"))
grid.addWidget(address_label, 1, 0)
grid.addWidget(line1, 1, 1)
grid.addWidget(QLabel(_("Name")), 2, 0)
@@ -1989,7 +1969,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
assert not self.wallet.has_lightning()
if self.wallet.can_have_deterministic_lightning():
msg = _(
"Lightning is not enabled because this wallet was created with an old version of Electrum. "
"Lightning is not enabled because this wallet was created with an old version of Electrum Purple. "
"Create lightning keys?")
else:
msg = _(
@@ -2096,7 +2076,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
"private key, and verifying with the corresponding public key. The "
"address you have entered does not have a unique public key, so these "
"operations cannot be performed.") + '\n\n' + \
_('The operation is undefined. Not just in Electrum, but in general.')
_('The operation is undefined. Not just in Electrum Purple, but in general.')
@protected
def do_sign(self, address, message, signature, password):
@@ -2258,7 +2238,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
try:
return tx_from_any(data)
except BaseException as e:
self.show_critical(_("Electrum was unable to parse your transaction") + ":\n" + repr(e))
self.show_critical(_("Electrum Purple was unable to parse your transaction") + ":\n" + repr(e))
return
def import_channel_backup(self, encrypted: str):
@@ -2321,7 +2301,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
with open(fileName, "rb") as f:
file_content = f.read() # type: bytes
except (ValueError, IOError, os.error) as reason:
self.show_critical(_("Electrum was unable to open your transaction file") + "\n" + str(reason),
self.show_critical(_("Electrum Purple was unable to open your transaction file") + "\n" + str(reason),
title=_("Unable to read file or no transaction found"))
if file_content is None:
return None
@@ -2480,7 +2460,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
self.do_export_privkeys(filename, private_keys, csv_button.isChecked())
except (IOError, os.error) as reason:
txt = "\n".join([
_("Electrum was unable to produce a private key-export."),
_("Electrum Purple was unable to produce a private key-export."),
str(reason)
])
self.show_critical(txt, title=_("Unable to create csv"))
@@ -2669,7 +2649,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
self.fx.trigger_update()
run_hook('close_settings_dialog')
if d.need_restart:
self.show_warning(_('Please restart Electrum to activate the new GUI settings'), title=_('Success'))
self.show_warning(_('Please restart Electrum Purple to activate the new GUI settings'), title=_('Success'))
else:
# Some values might need to be updated if settings have changed.
# For example 'Can send' in the lightning tab will change if the fees config is changed.
@@ -2685,7 +2665,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
for warning in list(warnings)[:3]:
warning = ''.join([
_("Are you sure you want to close Electrum?"),
_("Are you sure you want to close Electrum Purple?"),
'\n\n',
_("An ongoing operation requires you to stay online."),
'\n',
@@ -2930,7 +2910,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger, QtEventListener):
self.showing_cert_mismatch_error = True
self.show_critical(title=_("Certificate mismatch"),
msg=_("The SSL certificate provided by the main server did not match the fingerprint passed in with the --serverfingerprint option.") + "\n\n" +
_("Electrum will now exit."))
_("Electrum Purple will now exit."))
self.showing_cert_mismatch_error = False
self.close()
+1 -1
View File
@@ -243,7 +243,7 @@ class ProxyWidget(QWidget):
grid.addWidget(self.proxy_cb, 0, 0, 1, 4)
proxy_helpbutton = HelpButton(
_('Proxy settings apply to all connections: with Electrum servers, but also with third-party services.'))
_('Proxy settings apply to all connections: with Electrum Purple servers, but also with third-party services.'))
grid.addWidget(proxy_helpbutton, 0, 4, alignment=Qt.AlignmentFlag.AlignRight)
grid.addWidget(self.proxy_mode, 1, 0, 1, 1)
grid.addWidget(self.proxy_host, 1, 1, 1, 3)
+1 -1
View File
@@ -243,7 +243,7 @@ class ChangePasswordDialogForSW(ChangePasswordDialogBase):
msg += ' ' + _('Use this dialog to add a password to your wallet.')
else:
if not is_encrypted:
msg = _('Your bitcoins are password protected. However, your wallet file is not encrypted.')
msg = _('Your Bitcoin Purple coins are password protected. However, your wallet file is not encrypted.')
else:
msg = _('Your wallet is password protected and encrypted.')
msg += ' ' + _('Use this dialog to change your password.')
+2 -2
View File
@@ -100,7 +100,7 @@ class PluginDialog(WindowModalDialog):
if not self.plugins.is_available(self.name):
msg = "\n".join([
_('This plugin requires installation of additional dependencies.'),
_('For Electrum to recognize external packages, you need to run it from source.')
_('For Electrum Purple to recognize external packages, you need to run it from source.')
])
self.window.show_message(msg)
return
@@ -161,7 +161,7 @@ class PluginsDialog(WindowModalDialog, MessageBoxMixin):
_logger = get_logger(__name__)
def __init__(self, config: 'SimpleConfig', plugins: 'Plugins', *, gui_object: Optional['ElectrumGui'] = None):
WindowModalDialog.__init__(self, None, _('Electrum Plugins'))
WindowModalDialog.__init__(self, None, _('Electrum Purple Plugins'))
self.gui_object = gui_object
self.config = config
self.plugins = plugins
+1 -1
View File
@@ -36,7 +36,7 @@ class QR_Window(QWidget):
def __init__(self, win):
QWidget.__init__(self)
self.main_window = win
self.setWindowTitle('Electrum - '+_('Payment Request'))
self.setWindowTitle('Electrum Purple - '+_('Payment Request'))
self.setMinimumSize(800, 800)
self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
main_box = QHBoxLayout()
+3 -3
View File
@@ -193,8 +193,8 @@ class ReceiveTab(QWidget, MessageBoxMixin, Logger):
_('This information is seen by the recipient if you send them a signed payment request.'),
'\n\n',
_('For on-chain requests, the address gets reserved until expiration. After that, it might get reused.'), ' ',
_('The bitcoin address never expires and will always be part of this electrum wallet.'), ' ',
_('You can reuse a bitcoin address any number of times but it is not good for your privacy.'),
_('The Bitcoin Purple address never expires and will always be part of this Electrum Purple wallet.'), ' ',
_('You can reuse a Bitcoin Purple address any number of times but it is not good for your privacy.'),
'\n\n',
_('For Lightning requests, payments will not be accepted after the expiration.'),
])
@@ -284,7 +284,7 @@ class ReceiveTab(QWidget, MessageBoxMixin, Logger):
def get_tab_data(self):
if self.URI:
out = self.URI, self.URI, self.URI_help, _('Bitcoin URI')
out = self.URI, self.URI, self.URI_help, _('Bitcoin Purple URI')
elif self.addr:
out = self.addr, self.addr, self.address_help, _('Address')
else:
+2 -2
View File
@@ -200,9 +200,9 @@ class RequestList(MyTreeView):
menu = QMenu(self)
copy_menu = self.add_copy_menu(menu, idx)
if req.get_address():
copy_menu.addAction(_("Address"), lambda: self.main_window.do_copy(req.get_address(), title='Bitcoin Address'))
copy_menu.addAction(_("Address"), lambda: self.main_window.do_copy(req.get_address(), title='Bitcoin Purple Address'))
if URI := self.wallet.get_request_URI(req):
copy_menu.addAction(_("Bitcoin URI"), lambda: self.main_window.do_copy(URI, title='Bitcoin URI'))
copy_menu.addAction(_("Bitcoin Purple URI"), lambda: self.main_window.do_copy(URI, title='Bitcoin Purple URI'))
if req.is_lightning():
copy_menu.addAction(_("Lightning Request"), lambda: self.main_window.do_copy(self.wallet.get_bolt11_invoice(req), title='Lightning Request'))
#if 'view_url' in req:
+5 -5
View File
@@ -52,7 +52,7 @@ MSG_PASSPHRASE_WARN_ISSUE4566 = _("Warning") + ": "\
+ _("You have multiple consecutive whitespaces or leading/trailing "
"whitespaces in your passphrase.") + " " \
+ _("This is discouraged.") + " " \
+ _("Due to a bug, old versions of Electrum will NOT be creating the "
+ _("Due to a bug, old versions of Electrum Purple will NOT be creating the "
"same wallet as newer versions or other software.")
@@ -233,15 +233,15 @@ class SeedWidget(QWidget):
if self.seed_type == 'bip39':
message = ' '.join([
'<b>' + _('Warning') + ':</b> ',
_('BIP39 seeds can be imported in Electrum, so that users can access funds locked in other wallets.'),
_('BIP39 seeds can be imported in Electrum Purple, so that users can access funds locked in other wallets.'),
_('However, we do not generate BIP39 seeds, because they do not meet our safety standard.'),
_('BIP39 seeds do not include a version number, which compromises compatibility with future software.'),
_('We do not guarantee that BIP39 imports will always be supported in Electrum.'),
_('We do not guarantee that BIP39 imports will always be supported in Electrum Purple.'),
])
elif self.seed_type == 'slip39':
message = ' '.join([
'<b>' + _('Warning') + ':</b> ',
_('SLIP39 seeds can be imported in Electrum, so that users can access funds locked in other wallets.'),
_('SLIP39 seeds can be imported in Electrum Purple, so that users can access funds locked in other wallets.'),
_('However, we do not generate SLIP39 seeds.'),
])
else:
@@ -420,7 +420,7 @@ class KeysWidget(QWidget):
class SeedDialog(WindowModalDialog):
def __init__(self, parent, seed, passphrase, *, config: 'SimpleConfig'):
WindowModalDialog.__init__(self, parent, ('Electrum - ' + _('Seed')))
WindowModalDialog.__init__(self, parent, ('Electrum Purple - ' + _('Seed')))
self.setMinimumWidth(400)
vbox = QVBoxLayout(self)
title = _("Your wallet generation seed is:")
+2 -2
View File
@@ -73,7 +73,7 @@ class SendTab(QWidget, MessageBoxMixin, Logger):
msg = (_("Recipient of the funds.")
+ "\n\n"
+ _("This field can contain:") + "\n"
+ _("- a Bitcoin address or BIP21 URI") + "\n"
+ _("- a Bitcoin Purple address or BIP21 URI") + "\n"
+ _("- a Lightning invoice") + "\n"
+ _("- a label from your list of contacts") + "\n"
+ _("- an openalias") + "\n"
@@ -620,7 +620,7 @@ class SendTab(QWidget, MessageBoxMixin, Logger):
for o in outputs:
if o.scriptpubkey is None:
self.show_error(_('Bitcoin Address is None'))
self.show_error(_('Bitcoin Purple Address is None'))
return True
if o.value is None:
self.show_error(_('Invalid Amount'))
+1 -1
View File
@@ -122,7 +122,7 @@ class SettingsDialog(QDialog, QtEventListener):
if not use_trampoline:
if not window.question('\n'.join([
_("Are you sure you want to disable trampoline?"),
_("Without this option, Electrum will need to sync with the Lightning network on every start."),
_("Without this option, Electrum Purple will need to sync with the Lightning network on every start."),
_("This may impact the reliability of your payments."),
]), parent=self):
trampoline_cb.setCheckState(Qt.CheckState.Checked)
+1 -1
View File
@@ -449,7 +449,7 @@ def show_transaction(
d.broadcast_button.setVisible(False)
except SerializationError as e:
_logger.exception('unable to deserialize the transaction')
parent.show_critical(_("Electrum was unable to deserialize the transaction:") + "\n" + str(e))
parent.show_critical(_("Electrum Purple was unable to deserialize the transaction:") + "\n" + str(e))
except UserCancelled:
return
else:
+3 -3
View File
@@ -30,7 +30,7 @@ class UpdateCheck(QDialog, Logger):
def __init__(self, *, latest_version=None):
QDialog.__init__(self)
self.setWindowTitle('Electrum - ' + _('Update Check'))
self.setWindowTitle('Electrum Purple - ' + _('Update Check'))
self.content = QVBoxLayout()
self.content.setContentsMargins(*[10]*4)
@@ -88,10 +88,10 @@ class UpdateCheck(QDialog, Logger):
self.detail_label.setText(_("You can download the new version from {}.").format(url))
else:
self.heading_label.setText('<h2>' + _("Already up to date") + '</h2>')
self.detail_label.setText(_("You are already on the latest version of Electrum."))
self.detail_label.setText(_("You are already on the latest version of Electrum Purple."))
else:
self.heading_label.setText('<h2>' + _("Checking for updates...") + '</h2>')
self.detail_label.setText(_("Please wait while Electrum checks for available updates."))
self.detail_label.setText(_("Please wait while Electrum Purple checks for available updates."))
class UpdateCheckThread(QThread, Logger):
+2 -2
View File
@@ -82,13 +82,13 @@ class WalletInfoDialog(WindowModalDialog):
label.setIcon(read_QIcon('cloud_no'))
grid.addWidget(label, cur_row, 1)
if wallet.get_seed_type() == 'segwit':
msg = _("Your channels cannot be recovered from seed, because they were created with an old version of Electrum. "
msg = _("Your channels cannot be recovered from seed, because they were created with an old version of Electrum Purple. "
"This means that you must save a backup of your wallet every time you create a new channel.\n\n"
"If you want this wallet to have recoverable channels, you must close your existing channels and restore this wallet from seed")
else:
msg = _("Your channels cannot be recovered from seed. "
"This means that you must save a backup of your wallet every time you create a new channel.\n\n"
"If you want to have recoverable channels, you must create a new wallet with an Electrum seed")
"If you want to have recoverable channels, you must create a new wallet with an Electrum Purple seed")
grid.addWidget(HelpButton(msg), cur_row, 3)
cur_row += 1
grid.addWidget(WWLabel(_('Lightning Node ID:')), cur_row, 0)
+2 -2
View File
@@ -36,7 +36,7 @@ class QEServerConnectWizard(ServerConnectWizard, QEAbstractWizard):
class WCWelcome(WizardComponent):
def __init__(self, parent, wizard):
WizardComponent.__init__(self, parent, wizard, title='Network Configuration')
self.wizard_title = _('Electrum Bitcoin Wallet')
self.wizard_title = _('Electrum Purple Wallet')
self.first_help_label = QLabel()
self.first_help_label.setText(_("Optional settings to customize your network connection") + ":")
@@ -45,7 +45,7 @@ class WCWelcome(WizardComponent):
self.config_proxy_w = QCheckBox(_('Use Proxy'))
self.config_proxy_w.setChecked(False)
self.config_proxy_w.stateChanged.connect(self.on_updated)
self.config_server_w = QCheckBox(_('Select Electrum Server'))
self.config_server_w = QCheckBox(_('Select Electrum Purple Server'))
self.config_server_w.setChecked(False)
self.config_server_w.stateChanged.connect(self.on_updated)
options_w = QWidget()
+1 -1
View File
@@ -33,7 +33,7 @@ class QETermsOfUseWizard(TermsOfUseWizard, QEAbstractWizard):
class WCTermsOfUseScreen(WizardComponent):
def __init__(self, parent, wizard):
WizardComponent.__init__(self, parent, wizard, title='')
self.wizard_title = _('Electrum Terms of Use')
self.wizard_title = _('Electrum Purple Terms of Use')
self.img_label = QLabel()
pixmap = QPixmap(icon_path('electrum_darkblue_1.png'))
self.img_label.setPixmap(pixmap)
+5 -5
View File
@@ -37,7 +37,7 @@ if TYPE_CHECKING:
from electrum.plugin import Plugins, DeviceInfo
from electrum.gui.qt import QElectrumApplication
WIF_HELP_TEXT = (_('WIF keys are typed in Electrum, based on script type.') + '\n\n' +
WIF_HELP_TEXT = (_('WIF keys are typed in Electrum Purple, based on script type.') + '\n\n' +
_('A few examples') + ':\n' +
'p2pkh:KxZcY47uGp9a... \t-> 1DckmggQM...\n' +
'p2wpkh-p2sh:KxZcY47uGp9a... \t-> 3NhNeZQXF...\n' +
@@ -243,7 +243,7 @@ class WalletWizardComponent(WizardComponent, ABC):
class WCWalletName(WalletWizardComponent, Logger):
def __init__(self, parent, wizard):
WalletWizardComponent.__init__(self, parent, wizard, title=_('Electrum wallet'))
WalletWizardComponent.__init__(self, parent, wizard, title=_('Electrum Purple wallet'))
Logger.__init__(self)
path = wizard._path
@@ -393,7 +393,7 @@ class WCWalletType(WalletWizardComponent):
ChoiceItem(key='standard', label=_('Standard wallet')),
ChoiceItem(key='2fa', label=_('Wallet with two-factor authentication')),
ChoiceItem(key='multisig', label=_('Multi-signature wallet')),
ChoiceItem(key='imported', label=_('Import Bitcoin addresses or private keys')),
ChoiceItem(key='imported', label=_('Import Bitcoin Purple addresses or private keys')),
]
choices = [c for c in wallet_kinds if c.key in wallet_types]
@@ -962,9 +962,9 @@ class WCMultisig(WalletWizardComponent):
class WCImport(WalletWizardComponent):
def __init__(self, parent, wizard):
WalletWizardComponent.__init__(self, parent, wizard, title=_('Import Bitcoin Addresses or Private Keys'))
WalletWizardComponent.__init__(self, parent, wizard, title=_('Import Bitcoin Purple Addresses or Private Keys'))
message = _(
'Enter a list of Bitcoin addresses (this will create a watching-only wallet), or a list of private keys.')
'Enter a list of Bitcoin Purple addresses (this will create a watching-only wallet), or a list of private keys.')
header_layout = QHBoxLayout()
label = WWLabel(message)
label.setMinimumWidth(400)