mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-08 10:31:50 -05:00
Merge bitcoin-core/gui#771: Avoid error-prone leading whitespace in translatable strings
856325fac1
lint: Add `lint-qt-translation.py` (Hennadii Stepanov)294a018bf5
qt: Avoid error prone leading spaces in translatable strings (Hennadii Stepanov)d8298e7f06
qt, refactor: Drop superfluous type conversions (Hennadii Stepanov) Pull request description: While working on the GUI translation via Transifex web interface, I found it error-prone to have leading whitespace in translatable strings. This is because it is very easy to unintentionally drop them in translations unnoticed. Fixed all current cases. Added a linter to prevent similar cases in the future. ACKs for top commit: furszy: utACK856325f
Tree-SHA512: b1ca5effb2db6649e1e99382de79acf3a9f81cc9dad434db5623338489e597897e8addd60c1ab3dcc7506ae62753a7a4ad5a41d7a865f8fcdf94348b54baa7e7
This commit is contained in:
commit
64879f4c03
6 changed files with 36 additions and 11 deletions
|
@ -167,19 +167,20 @@ void PSBTOperationsDialog::saveTransaction() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PSBTOperationsDialog::updateTransactionDisplay() {
|
void PSBTOperationsDialog::updateTransactionDisplay() {
|
||||||
m_ui->transactionDescription->setText(QString::fromStdString(renderTransaction(m_transaction_data)));
|
m_ui->transactionDescription->setText(renderTransaction(m_transaction_data));
|
||||||
showTransactionStatus(m_transaction_data);
|
showTransactionStatus(m_transaction_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string PSBTOperationsDialog::renderTransaction(const PartiallySignedTransaction &psbtx)
|
QString PSBTOperationsDialog::renderTransaction(const PartiallySignedTransaction &psbtx)
|
||||||
{
|
{
|
||||||
QString tx_description = "";
|
QString tx_description;
|
||||||
|
QLatin1String bullet_point(" * ");
|
||||||
CAmount totalAmount = 0;
|
CAmount totalAmount = 0;
|
||||||
for (const CTxOut& out : psbtx.tx->vout) {
|
for (const CTxOut& out : psbtx.tx->vout) {
|
||||||
CTxDestination address;
|
CTxDestination address;
|
||||||
ExtractDestination(out.scriptPubKey, address);
|
ExtractDestination(out.scriptPubKey, address);
|
||||||
totalAmount += out.nValue;
|
totalAmount += out.nValue;
|
||||||
tx_description.append(tr(" * Sends %1 to %2")
|
tx_description.append(bullet_point).append(tr("Sends %1 to %2")
|
||||||
.arg(BitcoinUnits::formatWithUnit(BitcoinUnit::BTC, out.nValue))
|
.arg(BitcoinUnits::formatWithUnit(BitcoinUnit::BTC, out.nValue))
|
||||||
.arg(QString::fromStdString(EncodeDestination(address))));
|
.arg(QString::fromStdString(EncodeDestination(address))));
|
||||||
// Check if the address is one of ours
|
// Check if the address is one of ours
|
||||||
|
@ -188,7 +189,7 @@ std::string PSBTOperationsDialog::renderTransaction(const PartiallySignedTransac
|
||||||
}
|
}
|
||||||
|
|
||||||
PSBTAnalysis analysis = AnalyzePSBT(psbtx);
|
PSBTAnalysis analysis = AnalyzePSBT(psbtx);
|
||||||
tx_description.append(" * ");
|
tx_description.append(bullet_point);
|
||||||
if (!*analysis.fee) {
|
if (!*analysis.fee) {
|
||||||
// This happens if the transaction is missing input UTXO information.
|
// This happens if the transaction is missing input UTXO information.
|
||||||
tx_description.append(tr("Unable to calculate transaction fee or total transaction amount."));
|
tx_description.append(tr("Unable to calculate transaction fee or total transaction amount."));
|
||||||
|
@ -217,7 +218,7 @@ std::string PSBTOperationsDialog::renderTransaction(const PartiallySignedTransac
|
||||||
tx_description.append(tr("Transaction has %1 unsigned inputs.").arg(QString::number(num_unsigned)));
|
tx_description.append(tr("Transaction has %1 unsigned inputs.").arg(QString::number(num_unsigned)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return tx_description.toStdString();
|
return tx_description;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PSBTOperationsDialog::showStatus(const QString &msg, StatusLevel level) {
|
void PSBTOperationsDialog::showStatus(const QString &msg, StatusLevel level) {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#define BITCOIN_QT_PSBTOPERATIONSDIALOG_H
|
#define BITCOIN_QT_PSBTOPERATIONSDIALOG_H
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
#include <psbt.h>
|
#include <psbt.h>
|
||||||
#include <qt/clientmodel.h>
|
#include <qt/clientmodel.h>
|
||||||
|
@ -46,7 +47,7 @@ private:
|
||||||
|
|
||||||
size_t couldSignInputs(const PartiallySignedTransaction &psbtx);
|
size_t couldSignInputs(const PartiallySignedTransaction &psbtx);
|
||||||
void updateTransactionDisplay();
|
void updateTransactionDisplay();
|
||||||
std::string renderTransaction(const PartiallySignedTransaction &psbtx);
|
QString renderTransaction(const PartiallySignedTransaction &psbtx);
|
||||||
void showStatus(const QString &msg, StatusLevel level);
|
void showStatus(const QString &msg, StatusLevel level);
|
||||||
void showTransactionStatus(const PartiallySignedTransaction &psbtx);
|
void showTransactionStatus(const PartiallySignedTransaction &psbtx);
|
||||||
};
|
};
|
||||||
|
|
|
@ -302,7 +302,7 @@ bool SendCoinsDialog::PrepareSendText(QString& question_string, QString& informa
|
||||||
// generate amount string with wallet name in case of multiwallet
|
// generate amount string with wallet name in case of multiwallet
|
||||||
QString amount = BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), rcp.amount);
|
QString amount = BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), rcp.amount);
|
||||||
if (model->isMultiwallet()) {
|
if (model->isMultiwallet()) {
|
||||||
amount.append(tr(" from wallet '%1'").arg(GUIUtil::HtmlEscape(model->getWalletName())));
|
amount = tr("%1 from wallet '%2'").arg(amount, GUIUtil::HtmlEscape(model->getWalletName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate address string
|
// generate address string
|
||||||
|
|
|
@ -323,7 +323,7 @@ QString TransactionDesc::toHTML(interfaces::Node& node, interfaces::Wallet& wall
|
||||||
if (!GetPaymentRequestMerchant(r.second, merchant)) {
|
if (!GetPaymentRequestMerchant(r.second, merchant)) {
|
||||||
merchant.clear();
|
merchant.clear();
|
||||||
} else {
|
} else {
|
||||||
merchant += tr(" (Certificate was not verified)");
|
merchant = tr("%1 (Certificate was not verified)").arg(merchant);
|
||||||
}
|
}
|
||||||
if (!merchant.isNull()) {
|
if (!merchant.isNull()) {
|
||||||
strHTML += "<b>" + tr("Merchant") + ":</b> " + GUIUtil::HtmlEscape(merchant) + "<br>";
|
strHTML += "<b>" + tr("Merchant") + ":</b> " + GUIUtil::HtmlEscape(merchant) + "<br>";
|
||||||
|
|
|
@ -472,10 +472,10 @@ void MigrateWalletActivity::migrate(WalletModel* wallet_model)
|
||||||
if (res) {
|
if (res) {
|
||||||
m_success_message = tr("The wallet '%1' was migrated successfully.").arg(GUIUtil::HtmlEscape(res->wallet->getWalletName()));
|
m_success_message = tr("The wallet '%1' was migrated successfully.").arg(GUIUtil::HtmlEscape(res->wallet->getWalletName()));
|
||||||
if (res->watchonly_wallet_name) {
|
if (res->watchonly_wallet_name) {
|
||||||
m_success_message += tr(" Watchonly scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(res->watchonly_wallet_name.value()));
|
m_success_message += QChar(' ') + tr("Watchonly scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(res->watchonly_wallet_name.value()));
|
||||||
}
|
}
|
||||||
if (res->solvables_wallet_name) {
|
if (res->solvables_wallet_name) {
|
||||||
m_success_message += tr(" Solvable but not watched scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(res->solvables_wallet_name.value()));
|
m_success_message += QChar(' ') + tr("Solvable but not watched scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(res->solvables_wallet_name.value()));
|
||||||
}
|
}
|
||||||
m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(res->wallet));
|
m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(res->wallet));
|
||||||
} else {
|
} else {
|
||||||
|
|
23
test/lint/lint-qt-translation.py
Executable file
23
test/lint/lint-qt-translation.py
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
#
|
||||||
|
# Copyright (c) 2023-present The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or https://opensource.org/license/mit/.
|
||||||
|
#
|
||||||
|
# Check for leading whitespaces in the translatable strings.
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
tr_strings = subprocess.run(['git', 'grep', '-e', 'tr("[[:space:]]', '--', 'src/qt'], stdout=subprocess.PIPE, text=True).stdout
|
||||||
|
|
||||||
|
if tr_strings.strip():
|
||||||
|
print("Avoid leading whitespaces in:")
|
||||||
|
print(tr_strings)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Add table
Reference in a new issue