From 4e89d5d8053697cb882e659a88156eacec15dcfe Mon Sep 17 00:00:00 2001 From: Carmina16 Date: Sat, 6 Mar 2021 22:32:26 +0700 Subject: Implement interface translation --- src/browsertab.cpp | 100 +- src/dialogs/certificateiodialog.cpp | 4 +- src/dialogs/certificatemanagementdialog.cpp | 38 +- src/dialogs/settingsdialog.cpp | 44 +- src/ioutil.cpp | 6 +- src/kristall.pro | 5 +- src/main.cpp | 13 +- src/mainwindow.cpp | 40 +- src/protocols/abouthandler.cpp | 2 +- src/trustedhostcollection.cpp | 10 +- src/widgets/favouritepopup.cpp | 8 +- translations/kristall_en_US.ts | 2040 ++++++++++++++++++++++++++ translations/kristall_ru.ts | 2079 +++++++++++++++++++++++++++ 13 files changed, 4260 insertions(+), 129 deletions(-) create mode 100644 translations/kristall_en_US.ts create mode 100644 translations/kristall_ru.ts diff --git a/src/browsertab.cpp b/src/browsertab.cpp index 0db9797..cb508be 100644 --- a/src/browsertab.cpp +++ b/src/browsertab.cpp @@ -174,13 +174,13 @@ void BrowserTab::navigateTo(const QUrl &url, PushToHistory mode, RequestFlags fl { if (kristall::protocols.isSchemeSupported(url.scheme()) != ProtocolSetup::Enabled) { - QMessageBox::warning(this, "Kristall", "URI scheme not supported or disabled: " + url.scheme()); + QMessageBox::warning(this, tr("Kristall"), tr("URI scheme not supported or disabled: ") + url.scheme()); return; } if ((this->current_handler != nullptr) and not this->current_handler->cancelRequest()) { - QMessageBox::warning(this, "Kristall", "Failed to cancel running request!"); + QMessageBox::warning(this, tr("Kristall"), tr("Failed to cancel running request!")); return; } @@ -288,13 +288,13 @@ void BrowserTab::openSourceView() monospace_font.setStyleHint(QFont::Monospace); auto dialog = std::make_unique(this); - dialog->setWindowTitle(QString("Source of %0").arg(this->current_location.toString())); + dialog->setWindowTitle(QString(tr("Source of %0")).arg(this->current_location.toString())); auto layout = new QVBoxLayout(dialog.get()); dialog->setLayout(layout); auto hint = new QLabel(dialog.get()); - hint->setText(QString("Mime type: %0").arg(current_mime.toString())); + hint->setText(QString(tr("Mime type: %0")).arg(current_mime.toString())); layout->addWidget(hint); auto text = new QPlainTextEdit(dialog.get()); @@ -343,10 +343,10 @@ void BrowserTab::on_url_bar_returnPressed() !kristall::options.search_engine.contains("%1")) { QMessageBox::warning(this, - "Kristall", - "No search engine is configured.\n" + tr("Kristall"), + tr("No search engine is configured.\n" "Please configure one in the settings to allow searching via the URL bar.\n\n" - "See the Help menu for additional information." + "See the Help menu for additional information.") ); return; } @@ -436,7 +436,7 @@ void BrowserTab::on_networkTimeout() if(this->current_handler != nullptr) { this->current_handler->cancelRequest(); } - on_networkError(ProtocolHandler::Timeout, "The server didn't respond in time."); + on_networkError(ProtocolHandler::Timeout, tr("The server didn't respond in time.")); } void BrowserTab::on_focusSearchbar() @@ -450,7 +450,7 @@ void BrowserTab::on_certificateRequired(const QString &reason) if (not trySetClientCertificate(reason)) { - setErrorMessage(QString("The page requested a authorized client certificate, but none was provided.\r\nOriginal query was: %1").arg(reason)); + setErrorMessage(QString(tr("The page requested a authorized client certificate, but none was provided.\r\nOriginal query was: %1")).arg(reason)); } else { @@ -557,12 +557,12 @@ void BrowserTab::on_requestComplete(const QByteArray &ref_data, const MimeType & } else { auto response = QMessageBox::question( this, - "Kristall", - QString("Failed to convert input charset %1 to UTF-8. Cannot display the file.\r\nDo you want to display unconverted data anyways?").arg(charset) + tr("Kristall"), + QString(tr("Failed to convert input charset %1 to UTF-8. Cannot display the file.\r\nDo you want to display unconverted data anyways?")).arg(charset) ); if(response != QMessageBox::Yes) { - setErrorMessage(QString("Failed to convert input charset %1 to UTF-8.").arg(charset)); + setErrorMessage(QString(tr("Failed to convert input charset %1 to UTF-8.")).arg(charset)); return; } } @@ -725,7 +725,7 @@ void BrowserTab::renderPage(const QByteArray &data, const MimeType &mime) } else { - this->graphics_scene.addText(QString("Failed to load picture:\r\n%1").arg(reader.errorString())); + this->graphics_scene.addText(QString(tr("Failed to load picture:\r\n%1")).arg(reader.errorString())); } this->ui->graphics_browser->setScene(&graphics_scene); @@ -754,13 +754,13 @@ void BrowserTab::renderPage(const QByteArray &data, const MimeType &mime) document->setDefaultStyleSheet(doc_style.toStyleSheet()); QString plain_data = QString( - "Unsupported Media Type!\n" + tr("Unsupported Media Type!\n" "\n" "Kristall cannot display the requested document\n" "To view this media, use the File menu to save it to your local drive, then open the saved file in another program that can display the document for you.\n\n" "Details:\n" "- MIME type: %1/%2\n" - "- Size: %3\n" + "- Size: %3\n") ).arg(mime.type, mime.subtype, IoUtil::size_human(data.size())); document->setPlainText(plain_data); @@ -770,7 +770,7 @@ void BrowserTab::renderPage(const QByteArray &data, const MimeType &mime) else { QString page_data = QString( - "# Unsupported Media Type!\n" + tr("# Unsupported Media Type!\n" "\n" "Kristall cannot display the requested document.\n" "\n" @@ -780,7 +780,7 @@ void BrowserTab::renderPage(const QByteArray &data, const MimeType &mime) "Details:\n" "- MIME type: %1/%2\n" "- Size: %3\n" - "```\n" + "```\n") ).arg(mime.type, mime.subtype, IoUtil::size_human(data.size())); document = GeminiRenderer::render( @@ -874,7 +874,7 @@ void BrowserTab::on_inputRequired(const QString &query, const bool is_sensitive) { if (dialog.exec() != QDialog::Accepted) { - setErrorMessage(QString("Site requires input:\n%1").arg(query)); + setErrorMessage(QString(tr("Site requires input:\n%1")).arg(query)); return; } @@ -885,7 +885,7 @@ void BrowserTab::on_inputRequired(const QString &query, const bool is_sensitive) if(len >= 1020) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("Your input message is too long. Your input is %1 bytes, but a maximum of %2 bytes are allowed.\r\nPlease cancel or shorten your input.").arg(len).arg(1020) ); } else { @@ -910,7 +910,7 @@ void BrowserTab::on_redirected(QUrl uri, bool is_permanent) if (redirection_count >= kristall::options.max_redirections) { - setErrorMessage(QString("Too many consecutive redirections. The last redirection would have redirected you to:\r\n%1").arg(uri.toString(QUrl::FullyEncoded))); + setErrorMessage(QString(tr("Too many consecutive redirections. The last redirection would have redirected you to:\r\n%1")).arg(uri.toString(QUrl::FullyEncoded))); return; } else @@ -922,34 +922,34 @@ void BrowserTab::on_redirected(QUrl uri, bool is_permanent) if(kristall::options.redirection_policy == GenericSettings::WarnAlways) { question = QString( - "The location you visited wants to redirect you to another location:\r\n" + tr("The location you visited wants to redirect you to another location:\r\n" "%1\r\n" - "Do you want to allow the redirection?" + "Do you want to allow the redirection?") ).arg(uri.toString(QUrl::FullyEncoded)); } else if((kristall::options.redirection_policy & (GenericSettings::WarnOnHostChange | GenericSettings::WarnOnSchemeChange)) and is_cross_protocol and is_cross_host) { question = QString( - "The location you visited wants to redirect you to another host and switch the protocol.\r\n" + tr("The location you visited wants to redirect you to another host and switch the protocol.\r\n" "Protocol: %1\r\n" "New Host: %2\r\n" - "Do you want to allow the redirection?" + "Do you want to allow the redirection?") ).arg(uri.scheme()).arg(uri.host()); } else if((kristall::options.redirection_policy & GenericSettings::WarnOnSchemeChange) and is_cross_protocol) { question = QString( - "The location you visited wants to switch the protocol.\r\n" + tr("The location you visited wants to switch the protocol.\r\n" "Protocol: %1\r\n" - "Do you want to allow the redirection?" + "Do you want to allow the redirection?") ).arg(uri.scheme()); } else if((kristall::options.redirection_policy & GenericSettings::WarnOnHostChange) and is_cross_host) { question = QString( - "The location you visited wants to redirect you to another host.\r\n" + tr("The location you visited wants to redirect you to another host.\r\n" "New Host: %1\r\n" - "Do you want to allow the redirection?" + "Do you want to allow the redirection?") ).arg(uri.host()); } @@ -957,11 +957,11 @@ void BrowserTab::on_redirected(QUrl uri, bool is_permanent) { auto answer = QMessageBox::question( this, - "Kristall", + tr("Kristall"), question ); if(answer != QMessageBox::Yes) { - setErrorMessage(QString("Redirection to %1 cancelled by user").arg(uri.toString())); + setErrorMessage(QString(tr("Redirection to %1 cancelled by user")).arg(uri.toString())); return; } } @@ -975,7 +975,7 @@ void BrowserTab::on_redirected(QUrl uri, bool is_permanent) } else { - setErrorMessage(QString("Redirection to %1 failed").arg(uri.toString())); + setErrorMessage(QString(tr("Redirection to %1 failed")).arg(uri.toString())); } } } @@ -984,7 +984,7 @@ void BrowserTab::setErrorMessage(const QString &msg) { this->is_internal_location = true; this->on_requestComplete( - QString("An error happened:\r\n%0").arg(msg).toUtf8(), + QString(tr("An error happened:\r\n%0")).arg(msg).toUtf8(), "text/plain charset=utf-8"); this->updateUI(); @@ -1062,7 +1062,7 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url, bool open_in_new if(not is_theme_preview and opt == "ignore-tls") { auto response = QMessageBox::question( this, - "Kristall", + tr("Kristall"), tr("This sites certificate could not be verified! This may be a man-in-the-middle attack on the server to send you malicious content (or the server admin made a configuration mistake).\r\nAre you sure you want to continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No @@ -1079,7 +1079,7 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url, bool open_in_new else if(not is_theme_preview and opt == "add-fingerprint") { auto answer = QMessageBox::question( this, - "Kristall", + tr("Kristall"), tr("Do you really want to add the server certificate to your list of trusted hosts?\r\nHost: %1") .arg(this->current_location.host()), QMessageBox::Yes | QMessageBox::No, @@ -1138,7 +1138,7 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url, bool open_in_new auto answer = QMessageBox::question( this, - "Kristall", + tr("Kristall"), tr("Do you want to add the style %1 to your collection?").arg(name) ); if(answer != QMessageBox::Yes) @@ -1169,7 +1169,7 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url, bool open_in_new QMessageBox::information( this, - "Kristall", + tr("Kristall"), tr("The theme %1 was successfully added to your theme collection!").arg(name) ); } @@ -1181,7 +1181,7 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url, bool open_in_new } else { QMessageBox::critical( this, - "Kristall", + tr("Kristall"), tr("Malicious site detected! This site tries to use the Kristall control scheme!\r\nA trustworthy site does not do this!").arg(this->current_location.host()) ); } @@ -1208,16 +1208,16 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url, bool open_in_new { if (not QDesktopServices::openUrl(url)) { - QMessageBox::warning(this, "Kristall", QString("Failed to start system URL handler for\r\n%1").arg(real_url.toString())); + QMessageBox::warning(this, "Kristall", QString(tr("Failed to start system URL handler for\r\n%1")).arg(real_url.toString())); } } else if (support == ProtocolSetup::Disabled) { - QMessageBox::warning(this, "Kristall", QString("The requested url uses a scheme that has been disabled in the settings:\r\n%1").arg(real_url.toString())); + QMessageBox::warning(this, "Kristall", QString(tr("The requested url uses a scheme that has been disabled in the settings:\r\n%1")).arg(real_url.toString())); } else { - QMessageBox::warning(this, "Kristall", QString("The requested url cannot be processed by Kristall:\r\n%1").arg(real_url.toString())); + QMessageBox::warning(this, "Kristall", QString(tr("The requested url cannot be processed by Kristall:\r\n%1")).arg(real_url.toString())); } } } @@ -1470,7 +1470,7 @@ void BrowserTab::resetClientCertificate() { if (this->current_identity.isValid() and not this->current_identity.is_persistent) { - auto respo = QMessageBox::question(this, "Kristall", "You currently have a transient session active!\r\nIf you disable the session, you will not be able to restore it. Continue?"); + auto respo = QMessageBox::question(this, "Kristall", tr("You currently have a transient session active!\r\nIf you disable the session, you will not be able to restore it. Continue?")); if (respo != QMessageBox::Yes) { this->ui->enable_client_cert_button->setChecked(true); @@ -1644,7 +1644,7 @@ bool BrowserTab::enableClientCertificate(const CryptoIdentity &ident) { if (not ident.isValid()) { - QMessageBox::warning(this, "Kristall", "Failed to generate temporary crypto-identitiy"); + QMessageBox::warning(this, "Kristall", tr("Failed to generate temporary crypto-identitiy")); this->disableClientCertificate(); return false; } @@ -1697,26 +1697,26 @@ void BrowserTab::on_text_browser_customContextMenuRequested(const QPoint pos) if (real_url.isRelative()) real_url = this->current_location.resolved(real_url); - connect(menu.addAction("Open in new tab"), &QAction::triggered, [this, real_url]() { + connect(menu.addAction(tr("Open in new tab")), &QAction::triggered, [this, real_url]() { mainWindow->addNewTab(false, real_url); }); // "open in default browser" for HTTP/S links if (real_url.scheme().startsWith("http", Qt::CaseInsensitive)) { - connect(menu.addAction("Open with external web browser"), &QAction::triggered, [this, real_url]() { + connect(menu.addAction(tr("Open with external web browser")), &QAction::triggered, [this, real_url]() { if (!QDesktopServices::openUrl(real_url)) { QMessageBox::warning(this, "Kristall", - QString("Failed to start system URL handler for\r\n%1").arg(real_url.toString())); + QString(tr("Failed to start system URL handler for\r\n%1")).arg(real_url.toString())); } }); } - connect(menu.addAction("Follow link"), &QAction::triggered, [this, real_url]() { + connect(menu.addAction(tr("Follow link")), &QAction::triggered, [this, real_url]() { this->navigateTo(real_url, PushImmediate); }); - connect(menu.addAction("Copy link"), &QAction::triggered, [real_url]() { + connect(menu.addAction(tr("Copy link")), &QAction::triggered, [real_url]() { kristall::clipboard->setText(real_url.toString(QUrl::FullyEncoded)); }); @@ -1746,18 +1746,18 @@ void BrowserTab::on_text_browser_customContextMenuRequested(const QPoint pos) menu.addSeparator(); } else { - menu.addAction("Copy to clipboard", [this]() { + menu.addAction(tr("Copy to clipboard"), [this]() { this->ui->text_browser->betterCopy(); }, QKeySequence("Ctrl+C")); } - connect(menu.addAction("Select all"), &QAction::triggered, [this]() { + connect(menu.addAction(tr("Select all")), &QAction::triggered, [this]() { this->ui->text_browser->selectAll(); }); menu.addSeparator(); - QAction * viewsrc = menu.addAction("View document source"); + QAction * viewsrc = menu.addAction(tr("View document source")); viewsrc->setShortcut(QKeySequence("Ctrl+U")); connect(viewsrc, &QAction::triggered, [this]() { mainWindow->viewPageSource(); diff --git a/src/dialogs/certificateiodialog.cpp b/src/dialogs/certificateiodialog.cpp index 079d793..75b9775 100644 --- a/src/dialogs/certificateiodialog.cpp +++ b/src/dialogs/certificateiodialog.cpp @@ -65,7 +65,7 @@ void CertificateIoDialog::on_select_certificate_file_button_clicked() { QFileDialog dialog { this }; - dialog.setNameFilter("Certificate File(*.pem *.der)"); + dialog.setNameFilter(tr("Certificate File(*.pem *.der)")); dialog.setAcceptMode((this->current_mode == Export) ? QFileDialog::AcceptSave : QFileDialog::AcceptOpen); dialog.selectFile(this->ui->certificate_file_name->text()); @@ -81,7 +81,7 @@ void CertificateIoDialog::on_select_key_file_button_clicked() { QFileDialog dialog { this }; - dialog.setNameFilter("Certificate File(*.pem *.der)"); + dialog.setNameFilter(tr("Certificate File(*.pem *.der)")); dialog.setAcceptMode((this->current_mode == Export) ? QFileDialog::AcceptSave : QFileDialog::AcceptOpen); dialog.selectFile(this->ui->key_file_name->text()); diff --git a/src/dialogs/certificatemanagementdialog.cpp b/src/dialogs/certificatemanagementdialog.cpp index 9600378..4734b01 100644 --- a/src/dialogs/certificatemanagementdialog.cpp +++ b/src/dialogs/certificatemanagementdialog.cpp @@ -61,7 +61,8 @@ void CertificateManagementDialog::on_certificates_selected(QModelIndex const& in this->ui->cert_display_name->setText(cert.display_name); this->ui->cert_common_name->setText(cert.certificate.subjectInfo(QSslCertificate::CommonName).join(", ")); this->ui->cert_expiration_date->setDateTime(cert.certificate.expiryDate()); - this->ui->cert_livetime->setText(QString("%1 days").arg(QDateTime::currentDateTime().daysTo(cert.certificate.expiryDate()))); + auto days = QDateTime::currentDateTime().daysTo(cert.certificate.expiryDate()); + this->ui->cert_livetime->setText(QString(tr("%1 day","%1 days",days)).arg(days)); this->ui->cert_fingerprint->setPlainText(toFingerprintString(cert.certificate)); this->ui->cert_notes->setPlainText(cert.user_notes); @@ -113,29 +114,29 @@ void CertificateManagementDialog::on_delete_cert_button_clicked() { auto answer = QMessageBox::question( this, - "Kristall", - "Do you really want to delete this certificate?\r\n\r\nYou will not be able to restore the identity after this!", + tr("Kristall"), + tr("Do you really want to delete this certificate?\r\n\r\nYou will not be able to restore the identity after this!"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ); if(answer != QMessageBox::Yes) return; if(not identity_set.destroyIdentity(index)) { - QMessageBox::warning(this, "Kristall", "Could not destroy identity!"); + QMessageBox::warning(this, tr("Kristall"), tr("Could not destroy identity!")); } } else if(auto group_name = identity_set.group(index); not group_name.isEmpty()) { auto answer = QMessageBox::question( this, - "Kristall", - QString("Do you want to delete the group '%1'").arg(group_name) + tr("Kristall"), + QString(tr("Do you want to delete the group '%1'")).arg(group_name) ); if(answer != QMessageBox::Yes) return; if(not identity_set.deleteGroup(group_name)) { - QMessageBox::warning(this, "Kristall", "Could not delete group!"); + QMessageBox::warning(this, tr("Kristall"), tr("Could not delete group!")); } } } @@ -157,7 +158,7 @@ void CertificateManagementDialog::on_export_cert_button_clicked() if(not cert_file.open(QFile::WriteOnly)) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("The file %1 could not be found!").arg(dialog.certificateFileName()) ); return; @@ -173,7 +174,7 @@ void CertificateManagementDialog::on_export_cert_button_clicked() if(not IoUtil::writeAll(cert_file, cert_blob)) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("The file %1 could not be created found!").arg(dialog.certificateFileName()) ); return; @@ -185,7 +186,7 @@ void CertificateManagementDialog::on_export_cert_button_clicked() if(not key_file.open(QFile::WriteOnly)) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("The file %1 could not be found!").arg(dialog.keyFileName()) ); return; @@ -201,8 +202,8 @@ void CertificateManagementDialog::on_export_cert_button_clicked() if(not IoUtil::writeAll(key_file, key_blob)) { QMessageBox::warning( this, - "Kristall", - tr("The file %1 could not be created found!").arg(dialog.keyFileName()) + tr("Kristall"), + tr("The file %1 could not be created!").arg(dialog.keyFileName()) ); return; } @@ -222,7 +223,7 @@ void CertificateManagementDialog::on_import_cert_button_clicked() if(not cert_file.open(QFile::ReadOnly)) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("The file %1 could not be found!").arg(dialog.certificateFileName()) ); return; @@ -232,7 +233,7 @@ void CertificateManagementDialog::on_import_cert_button_clicked() if(not key_file.open(QFile::ReadOnly)) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("The file %1 could not be found!").arg(dialog.keyFileName()) ); return; @@ -250,7 +251,8 @@ void CertificateManagementDialog::on_import_cert_button_clicked() dialog.keyFileName().endsWith(".der") ? QSsl::Der : QSsl::Pem, }; ident.user_notes = tr("Imported from:\r\nkey: %1\r\n:cert: %2").arg(dialog.keyFileName(), dialog.certificateFileName()); - ident.display_name = "Imported Certificate"; + //: Default name + ident.display_name = tr("Imported Certificate"); ident.auto_enable = false; ident.host_filter = ""; ident.is_persistent = true; @@ -258,7 +260,7 @@ void CertificateManagementDialog::on_import_cert_button_clicked() if(ident.private_key.isNull()) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("The key file %1 could not be loaded. Please verify your key file.").arg(dialog.keyFileName()) ); return; @@ -267,7 +269,7 @@ void CertificateManagementDialog::on_import_cert_button_clicked() if(ident.certificate.isNull()) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("The certificate file %1 could not be loaded. Please verify your certificate.").arg(dialog.keyFileName()) ); return; @@ -276,7 +278,7 @@ void CertificateManagementDialog::on_import_cert_button_clicked() if(not identity_set.addCertificate(tr("Imported Certificates"), ident)) { QMessageBox::warning( this, - "Kristall", + tr("Kristall"), tr("Failed to import the certificate.") ); } diff --git a/src/dialogs/settingsdialog.cpp b/src/dialogs/settingsdialog.cpp index b883970..8072b43 100644 --- a/src/dialogs/settingsdialog.cpp +++ b/src/dialogs/settingsdialog.cpp @@ -45,9 +45,9 @@ SettingsDialog::SettingsDialog(QWidget *parent) : this->ui->ui_density->addItem(tr("Classic"), QVariant::fromValue(int(UIDensity::classic))); this->ui->list_symbol->clear(); - this->ui->list_symbol->addItem("Filled circle", QVariant::fromValue(int(QTextListFormat::Style::ListDisc))); - this->ui->list_symbol->addItem("Circle", QVariant::fromValue(int(QTextListFormat::Style::ListCircle))); - this->ui->list_symbol->addItem("Square", QVariant::fromValue(int(QTextListFormat::Style::ListSquare))); + this->ui->list_symbol->addItem(tr("Filled circle"), QVariant::fromValue(int(QTextListFormat::Style::ListDisc))); + this->ui->list_symbol->addItem(tr("Circle"), QVariant::fromValue(int(QTextListFormat::Style::ListCircle))); + this->ui->list_symbol->addItem(tr("Square"), QVariant::fromValue(int(QTextListFormat::Style::ListSquare))); setGeminiStyle(DocumentStyle { }); @@ -80,11 +80,11 @@ SettingsDialog::SettingsDialog(QWidget *parent) : } this->ui->redirection_mode->clear(); - this->ui->redirection_mode->addItem("Ask for cross-scheme or cross-host redirection", int(GenericSettings::WarnOnHostChange | GenericSettings::WarnOnSchemeChange)); - this->ui->redirection_mode->addItem("Ask for cross-scheme redirection", int(GenericSettings::WarnOnSchemeChange)); - this->ui->redirection_mode->addItem("Ask for cross-host redirection", int(GenericSettings::WarnOnHostChange)); - this->ui->redirection_mode->addItem("Ask for all redirection", int(GenericSettings::WarnAlways)); - this->ui->redirection_mode->addItem("Silently redirect everything", int(GenericSettings::WarnNever)); + this->ui->redirection_mode->addItem(tr("Ask for cross-scheme or cross-host redirection"), int(GenericSettings::WarnOnHostChange | GenericSettings::WarnOnSchemeChange)); + this->ui->redirection_mode->addItem(tr("Ask for cross-scheme redirection"), int(GenericSettings::WarnOnSchemeChange)); + this->ui->redirection_mode->addItem(tr("Ask for cross-host redirection"), int(GenericSettings::WarnOnHostChange)); + this->ui->redirection_mode->addItem(tr("Ask for all redirection"), int(GenericSettings::WarnAlways)); + this->ui->redirection_mode->addItem(tr("Silently redirect everything"), int(GenericSettings::WarnNever)); connect(this->ui->tabWidget, &QTabWidget::currentChanged, this, [this] (int index) { if (index != 1) /* Style tab */ @@ -260,7 +260,7 @@ void SettingsDialog::setOptions(const GenericSettings &options) this->ui->search_engine->clear(); QString search = this->current_options.search_engine; - this->ui->search_engine->lineEdit()->setPlaceholderText("URL with '%1' in place of query"); + this->ui->search_engine->lineEdit()->setPlaceholderText(tr("URL with '%1' in place of query")); this->ui->search_engine->addItem("gemini://geminispace.info/search?%1"); this->ui->search_engine->addItem("gemini://gus.guru/search?%1"); this->ui->search_engine->addItem("gemini://houston.coder.town/search?%1"); @@ -317,7 +317,7 @@ void SettingsDialog::setOptions(const GenericSettings &options) this->ui->emojis_on->setEnabled(false); this->ui->emojis_off->setEnabled(false); this->ui->emojis_label->setToolTip( - this->ui->emojis_label->toolTip() + " (not supported in this build)"); + this->ui->emojis_label->toolTip() + tr(" (not supported in this build)")); } } @@ -615,9 +615,9 @@ void SettingsDialog::on_preset_new_clicked() { QInputDialog dlg { this }; dlg.setInputMode(QInputDialog::TextInput); - dlg.setOkButtonText("Save"); - dlg.setCancelButtonText("Cancel"); - dlg.setLabelText("Enter the name of your new preset:"); + dlg.setOkButtonText(tr("Save")); + dlg.setCancelButtonText(tr("Cancel")); + dlg.setLabelText(tr("Enter the name of your new preset:")); if(dlg.exec() != QInputDialog::Accepted) return; @@ -626,7 +626,7 @@ void SettingsDialog::on_preset_new_clicked() bool override = false; if(this->predefined_styles.contains(name)) { - auto response = QMessageBox::question(this, "Kristall", QString("A style with the name '%1' already exists! Replace?").arg(name)); + auto response = QMessageBox::question(this, "Kristall", QString(tr("A style with the name '%1' already exists! Replace?")).arg(name)); if(response != QMessageBox::Yes) return; override = true; @@ -646,7 +646,7 @@ void SettingsDialog::on_preset_save_clicked() if(name.isEmpty()) return; - auto response = QMessageBox::question(this, "Kristall", QString("Do you want to override the style '%1'?").arg(name)); + auto response = QMessageBox::question(this, "Kristall", QString(tr("Do you want to override the style '%1'?")).arg(name)); if(response != QMessageBox::Yes) return; @@ -660,7 +660,7 @@ void SettingsDialog::on_preset_load_clicked() if(name.isEmpty()) return; - auto response = QMessageBox::question(this, "Kristall", QString("Do you want to load the style '%1'?\r\nThis will discard all currently set up values!").arg(name)); + auto response = QMessageBox::question(this, "Kristall", QString(tr("Do you want to load the style '%1'?\r\nThis will discard all currently set up values!")).arg(name)); if(response != QMessageBox::Yes) return; @@ -698,7 +698,7 @@ void SettingsDialog::on_preset_import_clicked() { QFileDialog dialog { this }; dialog.setAcceptMode(QFileDialog::AcceptOpen); - dialog.selectNameFilter("Kristall Theme (*.kthm)"); + dialog.selectNameFilter(tr("Kristall Theme (*.kthm)")); if(dialog.exec() !=QFileDialog::Accepted) return; @@ -715,9 +715,9 @@ void SettingsDialog::on_preset_import_clicked() { QInputDialog dlg { this }; dlg.setInputMode(QInputDialog::TextInput); - dlg.setOkButtonText("Save"); - dlg.setCancelButtonText("Cancel"); - dlg.setLabelText("Imported preset has no name.\r\nPlease enter a name for the preset:"); + dlg.setOkButtonText(tr("Save")); + dlg.setCancelButtonText(tr("Cancel")); + dlg.setLabelText(tr("Imported preset has no name.\r\nPlease enter a name for the preset:")); if(dlg.exec() != QDialog::Accepted) return; name = dlg.textValue(); @@ -726,7 +726,7 @@ void SettingsDialog::on_preset_import_clicked() bool override = false; if(this->predefined_styles.contains(name)) { - auto response = QMessageBox::question(this, "Kristall", QString("Do you want to override the style '%1'?").arg(name)); + auto response = QMessageBox::question(this, "Kristall", QString(tr("Do you want to override the style '%1'?")).arg(name)); if(response != QMessageBox::Yes) return; override = true; @@ -751,7 +751,7 @@ void SettingsDialog::on_preset_export_clicked() QFileDialog dialog { this }; dialog.setAcceptMode(QFileDialog::AcceptSave); - dialog.selectNameFilter("Kristall Theme (*.kthm)"); + dialog.selectNameFilter(tr("Kristall Theme (*.kthm)")); dialog.selectFile(QString("%1.kthm").arg(name)); if(dialog.exec() !=QFileDialog::Accepted) diff --git a/src/ioutil.cpp b/src/ioutil.cpp index 6257877..8e07367 100644 --- a/src/ioutil.cpp +++ b/src/ioutil.cpp @@ -18,14 +18,14 @@ bool IoUtil::writeAll(QIODevice &dst, QByteArray const & src) QString IoUtil::size_human(qint64 size) { if(size < 1024) - return QString("%1 B").arg(size); + return QString(QObject::tr("%1 B")).arg(size); float num = size; QStringList list; - list << "KB" << "MB" << "GB" << "TB"; + list << QObject::tr("KB") << QObject::tr("MB") << QObject::tr("GB") << QObject::tr("TB"); QStringListIterator i(list); - QString unit("B"); + QString unit(QObject::tr("B")); while(num >= 1024.0 && i.hasNext()) { diff --git a/src/kristall.pro b/src/kristall.pro index 6a8efed..e2b80bf 100644 --- a/src/kristall.pro +++ b/src/kristall.pro @@ -192,8 +192,11 @@ FORMS += \ widgets/mediaplayer.ui \ widgets/ssltrusteditor.ui +CONFIG += lrelease embed_translations + TRANSLATIONS += \ - kristall_en_US.ts + ../translations/kristall_en_US.ts \ + ../translations/kristall_ru.ts # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin diff --git a/src/main.cpp b/src/main.cpp index e1098bd..bb81072 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include "kristall.hpp" #include +#include #include #include #include @@ -384,6 +385,12 @@ int main(int argc, char *argv[]) } }); + QTranslator trans, qttrans; + qttrans.load(QLocale(), QLatin1String("qt"), "_", "/usr/local/share/qt5/translations"); + trans.load(QLocale(), QLatin1String("kristall"), QLatin1String("_"), QLatin1String(":/i18n")); + app.installTranslator(&qttrans); + app.installTranslator(&trans); + { // Initialise default fonts #ifdef Q_OS_WIN32 @@ -406,12 +413,12 @@ int main(int argc, char *argv[]) QCommandLineOption newWindowOption { { "w", "new-window" }, - app.tr("Opens the provided links in a new window instead of tabs."), + QApplication::tr("Opens the provided links in a new window instead of tabs."), }; QCommandLineOption isolatedOption { { "i", "isolated" }, - app.tr("Starts the instance of kristall as a isolated session that cannot communicate with other windows."), + QApplication::tr("Starts the instance of kristall as a isolated session that cannot communicate with other windows."), }; cli_parser.addVersionOption(); @@ -419,7 +426,7 @@ int main(int argc, char *argv[]) cli_parser.addOption(newWindowOption); cli_parser.addOption(isolatedOption); - cli_parser.addPositionalArgument("urls", app.tr("The urls that should be opened instead of the start page"), "[urls...]"); + cli_parser.addPositionalArgument("urls", QApplication::tr("The urls that should be opened instead of the start page"), "[urls...]"); cli_parser.process(app); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8d78baf..005953e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -464,12 +464,12 @@ void MainWindow::on_actionQuit_triggered() void MainWindow::on_actionAbout_triggered() { QMessageBox::about(this, - "Kristall", -R"about(Kristall, an OpenSource Gemini browser. + tr("Kristall"), +tr(R"about(Kristall, an OpenSource Gemini browser. Made by Felix "xq" Queißner This is free software. You can get the source code at -https://github.com/MasterQ32/Kristall)about" +https://github.com/MasterQ32/Kristall)about") ); } @@ -530,9 +530,9 @@ void MainWindow::setFileStatus(const DocumentStats &stats) { if(stats.isValid()) { this->file_size->setText(IoUtil::size_human(stats.file_size)); - this->file_cached->setText(stats.loaded_from_cache ? "(cached)" : ""); + this->file_cached->setText(stats.loaded_from_cache ? tr("(cached)") : ""); this->file_mime->setText(stats.mime_type.toString(false)); - this->load_time->setText(QString("%1 ms").arg(stats.loading_time)); + this->load_time->setText(QString(tr("%1 ms")).arg(stats.loading_time)); } else { this->file_size->setText(""); this->file_cached->setText(""); @@ -562,7 +562,7 @@ void MainWindow::on_actionSave_as_triggered() } else { - QMessageBox::warning(this, "Kristall", QString("Could not save file:\r\n%1").arg(file.errorString())); + QMessageBox::warning(this, tr("Kristall"), QString("Could not save file:\r\n%1").arg(file.errorString())); } } } @@ -629,12 +629,12 @@ void MainWindow::on_history_view_customContextMenuRequested(const QPoint pos) if(QUrl url = tab->history.get(idx); url.isValid()) { QMenu menu; - connect(menu.addAction("Open here"), &QAction::triggered, [tab, idx]() { + connect(menu.addAction(tr("Open here")), &QAction::triggered, [tab, idx]() { // We do the same thing as a double click here tab->navigateBack(idx); }); - connect(menu.addAction("Open in new tab"), &QAction::triggered, [this, url]() { + connect(menu.addAction(tr("Open in new tab")), &QAction::triggered, [this, url]() { addNewTab(true, url); }); @@ -652,18 +652,18 @@ void MainWindow::on_favourites_view_customContextMenuRequested(const QPoint pos) BrowserTab * tab = this->curTab(); if(tab != nullptr) { - connect(menu.addAction("Open here"), &QAction::triggered, [tab, url]() { + connect(menu.addAction(tr("Open here")), &QAction::triggered, [tab, url]() { tab->navigateTo(url, BrowserTab::PushImmediate); }); } - connect(menu.addAction("Open in new tab"), &QAction::triggered, [this, url]() { + connect(menu.addAction(tr("Open in new tab")), &QAction::triggered, [this, url]() { addNewTab(true, url); }); menu.addSeparator(); - connect(menu.addAction("Relocate"), &QAction::triggered, [this, idx]() { + connect(menu.addAction(tr("Relocate")), &QAction::triggered, [this, idx]() { QInputDialog dialog { this }; dialog.setInputMode(QInputDialog::TextInput); @@ -676,7 +676,7 @@ void MainWindow::on_favourites_view_customContextMenuRequested(const QPoint pos) kristall::favourites.editFavouriteDest(idx, QUrl(dialog.textValue())); }); - connect(menu.addAction("Rename"), &QAction::triggered, [this, idx]() { + connect(menu.addAction(tr("Rename")), &QAction::triggered, [this, idx]() { QInputDialog dialog { this }; dialog.setInputMode(QInputDialog::TextInput); @@ -691,7 +691,7 @@ void MainWindow::on_favourites_view_customContextMenuRequested(const QPoint pos) menu.addSeparator(); - connect(menu.addAction("Delete"), &QAction::triggered, [idx]() { + connect(menu.addAction(tr("Delete")), &QAction::triggered, [idx]() { kristall::favourites.destroyFavourite(idx); }); @@ -700,7 +700,7 @@ void MainWindow::on_favourites_view_customContextMenuRequested(const QPoint pos) else if(QString group = kristall::favourites.group(idx); not group.isEmpty()) { QMenu menu; - connect(menu.addAction("Rename group"), &QAction::triggered, [this, group]() { + connect(menu.addAction(tr("Rename group")), &QAction::triggered, [this, group]() { QInputDialog dialog { this }; dialog.setInputMode(QInputDialog::TextInput); @@ -711,18 +711,18 @@ void MainWindow::on_favourites_view_customContextMenuRequested(const QPoint pos) return; if (!kristall::favourites.renameGroup(group, dialog.textValue())) - QMessageBox::information(this, "Kristall", "Rename failed: group name already in use."); + QMessageBox::information(this, tr("Kristall"), tr("Rename failed: group name already in use.")); }); menu.addSeparator(); - connect(menu.addAction("Delete group"), &QAction::triggered, [this, idx]() { + connect(menu.addAction(tr("Delete group")), &QAction::triggered, [this, idx]() { if (QMessageBox::question( this, - "Kristall", - "Are you sure you want to delete this Favourite Group?\n" + tr("Kristall"), + tr("Are you sure you want to delete this Favourite Group?\n" "All favourites in this group will be lost.\n\n" - "This action cannot be undone!" + "This action cannot be undone!") ) != QMessageBox::Yes) { return; @@ -736,7 +736,7 @@ void MainWindow::on_favourites_view_customContextMenuRequested(const QPoint pos) else { QMenu menu; - connect(menu.addAction("Create new group..."), &QAction::triggered, [this]() { + connect(menu.addAction(tr("Create new group...")), &QAction::triggered, [this]() { this->newGroupDialog(); }); diff --git a/src/protocols/abouthandler.cpp b/src/protocols/abouthandler.cpp index 8c90f5f..8a60962 100644 --- a/src/protocols/abouthandler.cpp +++ b/src/protocols/abouthandler.cpp @@ -26,7 +26,7 @@ bool AboutHandler::startRequest(const QUrl &url, ProtocolHandler::RequestOptions { QByteArray document; - document.append("# Favourites\n"); + document.append(tr("# Favourites\n")); QString current_group; diff --git a/src/trustedhostcollection.cpp b/src/trustedhostcollection.cpp index bbc7720..a3d6c1a 100644 --- a/src/trustedhostcollection.cpp +++ b/src/trustedhostcollection.cpp @@ -28,9 +28,9 @@ QVariant TrustedHostCollection::headerData(int section, Qt::Orientation orientat { switch(section) { - case 0: return "Host Name"; - case 1: return "First Seen"; - case 2: return "Key Type"; + case 0: return QObject::tr("Host Name"); + case 1: return QObject::tr("First Seen"); + case 2: return QObject::tr("Key Type"); } } return QVariant { }; @@ -71,8 +71,8 @@ QVariant TrustedHostCollection::data(const QModelIndex &index, int role) const case QSsl::Ec: return "EC"; // case QSsl::Dh: return "DH"; case QSsl::Dsa: return "DSA"; - case QSsl::Opaque: return "Opaque"; - default: return "Unforseen"; + case QSsl::Opaque: return QObject::tr("Opaque"); + default: return QObject::tr("Unforseen"); } } } diff --git a/src/widgets/favouritepopup.cpp b/src/widgets/favouritepopup.cpp index 2039115..7395445 100644 --- a/src/widgets/favouritepopup.cpp +++ b/src/widgets/favouritepopup.cpp @@ -18,13 +18,13 @@ FavouritePopup::FavouritePopup(QToolButton *button, QWidget *parent) auto layout = new QGridLayout(); // Title - auto title_lab = new QLabel("Title:"); + auto title_lab = new QLabel(tr("Title:")); this->fav_title = new QLineEdit(); layout->addWidget(title_lab, 0, 0); layout->addWidget(this->fav_title, 0, 1); // Group - auto group_lab = new QLabel("Group:"); + auto group_lab = new QLabel(tr("Group:")); layout->addWidget(group_lab); { this->fav_group = new QComboBox(); @@ -42,7 +42,7 @@ FavouritePopup::FavouritePopup(QToolButton *button, QWidget *parent) } // Unfavourite - auto unfav_btn = new QPushButton("Unfavourite"); + auto unfav_btn = new QPushButton(tr("Unfavourite")); layout->addWidget(unfav_btn); connect(unfav_btn, &QPushButton::clicked, this, [this]() { this->setVisible(false); @@ -50,7 +50,7 @@ FavouritePopup::FavouritePopup(QToolButton *button, QWidget *parent) }); // Confirm - this->confirm_btn = new QPushButton("Confirm"); + this->confirm_btn = new QPushButton(tr("Confirm")); layout->addWidget(this->confirm_btn); connect(confirm_btn, &QPushButton::clicked, this, [this]() { this->confirmPressed(); diff --git a/translations/kristall_en_US.ts b/translations/kristall_en_US.ts new file mode 100644 index 0000000..88b0719 --- /dev/null +++ b/translations/kristall_en_US.ts @@ -0,0 +1,2040 @@ + + + + + AboutHandler + + + # Favourites + + + + + + BrowserTab + + + Form + + + + + Navigate back + + + + + + Back + + + + + Navigate forward + + + + + + Forward + + + + + Stop loading + + + + + + Stop + + + + + Refresh current location + + + + + Reload + + + + + Kristall Home Page + + + + + Home + + + + + Go the root path of current location + + + + + / + + + + + Go the parent path of current location + + + + + P + + + + + gemini:// + + + + + Add/remove from favourites + + + + + Favourite + + + + + Enable/disable client certificate for this tab + + + + + Client Certificate + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start surfin!</p></body></html> + + + + + Previous + + + + + + Next + + + + + Hide search + + + + + Hide + + + + + + + + + + + + + + + Kristall + + + + + URI scheme not supported or disabled: + + + + + Failed to cancel running request! + + + + + Source of %0 + + + + + Mime type: %0 + + + + + No search engine is configured. +Please configure one in the settings to allow searching via the URL bar. + +See the Help menu for additional information. + + + + + The server didn't respond in time. + + + + + The page requested a authorized client certificate, but none was provided. +Original query was: %1 + + + + + Failed to convert input charset %1 to UTF-8. Cannot display the file. +Do you want to display unconverted data anyways? + + + + + Failed to convert input charset %1 to UTF-8. + + + + + Failed to load picture: +%1 + + + + + Unsupported Media Type! + +Kristall cannot display the requested document +To view this media, use the File menu to save it to your local drive, then open the saved file in another program that can display the document for you. + +Details: +- MIME type: %1/%2 +- Size: %3 + + + + + + # Unsupported Media Type! + +Kristall cannot display the requested document. + +> To view this media, use the File menu to save it to your local drive, then open the saved file in another program that can display the document for you. + +``` +Details: +- MIME type: %1/%2 +- Size: %3 +``` + + + + + + Site requires input: +%1 + + + + + Your input message is too long. Your input is %1 bytes, but a maximum of %2 bytes are allowed. +Please cancel or shorten your input. + + + + + Too many consecutive redirections. The last redirection would have redirected you to: +%1 + + + + + The location you visited wants to redirect you to another location: +%1 +Do you want to allow the redirection? + + + + + The location you visited wants to redirect you to another host and switch the protocol. +Protocol: %1 +New Host: %2 +Do you want to allow the redirection? + + + + + The location you visited wants to switch the protocol. +Protocol: %1 +Do you want to allow the redirection? + + + + + The location you visited wants to redirect you to another host. +New Host: %1 +Do you want to allow the redirection? + + + + + Redirection to %1 cancelled by user + + + + + Redirection to %1 failed + + + + + An error happened: +%0 + + + + + This sites certificate could not be verified! This may be a man-in-the-middle attack on the server to send you malicious content (or the server admin made a configuration mistake). +Are you sure you want to continue? + + + + + Do you really want to add the server certificate to your list of trusted hosts? +Host: %1 + + + + + This style has no embedded name. Please enter a name for the preset: + + + + + Do you want to add the style %1 to your collection? + + + + + The theme %1 was successfully added to your theme collection! + + + + + Malicious site detected! This site tries to use the Kristall control scheme! +A trustworthy site does not do this! + + + + + + Failed to start system URL handler for +%1 + + + + + The requested url uses a scheme that has been disabled in the settings: +%1 + + + + + The requested url cannot be processed by Kristall: +%1 + + + + + You currently have a transient session active! +If you disable the session, you will not be able to restore it. Continue? + + + + + You requested a %1-URL with a client certificate, but these are not supported for this scheme. Continue? + + + + + You want to visit a new host, but have a client certificate enabled. This may be a risk to expose your identity to another host. +Do you want to keep the certificate enabled? + + + + + Your client certificate has a host filter enabled and this site does not match the host filter. +New URL: %1 +Host Filter: %2 +Do you want to keep the certificate enabled? + + + + + An automatic client certificate was detected for this site: +%1 +Do you want to enable that certificate? + + + + + Failed to generate temporary crypto-identitiy + + + + + Open in new tab + + + + + Open with external web browser + + + + + Follow link + + + + + Copy link + + + + + Refresh + + + + + Copy to clipboard + + + + + Select all + + + + + View document source + + + + + CertificateIoDialog + + + Dialog + + + + + Key Type + + + + + Key File + + + + + + ... + + + + + Certificate File + + + + + Export Certificate + + + + + Import Certificate + + + + + + Certificate File(*.pem *.der) + + + + + CertificateManagementDialog + + + Certificate Manager + + + + + Create new certificate + + + + + Create... + + + + + Import certificate + + + + + Import... + + + + + Export certificate + + + + + Export... + + + + + Delete certificate + + + + + Delete + + + + + Certificate + + + + + Display Name + + + + + Common Name + + + + + Expiration Date + + + + + Expires in + + + + + ??? days + + + + + Fingerprint + + + + + Notes + + + + + Host Filter + + + + + gemini://* + + + + + If this is checked, Kristall will automatically enable this certificate when visiting a URL matching the host filter + + + + + Auto-Enable Certificate + + + + + %1 day + %1 days + + + + + + + + + + + + + + + + + + + + Kristall + + + + + Do you really want to delete this certificate? + +You will not be able to restore the identity after this! + + + + + Could not destroy identity! + + + + + Do you want to delete the group '%1' + + + + + Could not delete group! + + + + + + + + The file %1 could not be found! + + + + + The file %1 could not be created found! + + + + + The file %1 could not be created! + + + + + Imported from: +key: %1 +:cert: %2 + + + + + Imported Certificate + Default name + + + + + The key file %1 could not be loaded. Please verify your key file. + + + + + The certificate file %1 could not be loaded. Please verify your certificate. + + + + + Imported Certificates + + + + + Failed to import the certificate. + + + + + CertificateSelectionDialog + + + Select client certificate + + + + + Select existing certificate: + + + + + TextLabel + + + + + Create new identity + + + + + Use + + + + + Create transient session certificate: + + + + + 30 Minutes + + + + + 1 Hour + + + + + 12 Hours + + + + + 24 Hours + + + + + 48 Hours + + + + + FavouriteCollection + + + Unsorted + + + + + FavouritePopup + + + Title: + + + + + Group: + + + + + Unfavourite + + + + + Confirm + + + + + GopherClient + + + Search: + + + + + MainWindow + + + Kristall Browser + + + + + Document Outline + + + + + Ctrl+M + + + + + Favourites + + + + + Ctrl+B + + + + + History + + + + + Ctrl+H + + + + + File + + + + + + Help + + + + + View + + + + + Navigation + + + + + About... + + + + + Quit + + + + + Ctrl+Q + + + + + New Tab + + + + + Ctrl+T + + + + + Close Tab + + + + + Ctrl+W + + + + + Settings + + + + + Ctrl+, + + + + + + Back + + + + + Alt+Left + + + + + + Forward + + + + + Alt+Right + + + + + Root + + + + + Go to the root directory (/) + + + + + Alt+/ + + + + + Parent + + + + + Go to the parent directory + + + + + Alt+Up + + + + + Refresh + + + + + F5 + + + + + About Qt... + + + + + Save as... + + + + + Ctrl+S + + + + + Add to favourites + + + + + Ctrl+D + + + + + Go to home + + + + + Alt+Home + + + + + F1 + + + + + Changelog + + + + + Manage Certificates… + + + + + View document source + + + + + Ctrl+U + + + + + New Window + + + + + Opens a new window + + + + + Ctrl+N + + + + + Close Window + + + + + Alt+F4 + + + + + Enter name of the new group: + + + + + + + + Kristall + + + + + Kristall, an OpenSource Gemini browser. +Made by Felix "xq" Queißner + +This is free software. You can get the source code at +https://github.com/MasterQ32/Kristall + + + + + (cached) + + + + + %1 ms + + + + + + Open here + + + + + + Open in new tab + + + + + Relocate + + + + + Enter new location of this favourite: + + + + + Rename + + + + + New name of this favourite: + + + + + Delete + + + + + Rename group + + + + + New name of this group: + + + + + Rename failed: group name already in use. + + + + + Delete group + + + + + Are you sure you want to delete this Favourite Group? +All favourites in this group will be lost. + +This action cannot be undone! + + + + + Create new group... + + + + + MediaPlayer + + + Form + + + + + Click to play/pause + + + + + + ... + + + + + 00:00:00 + + + + + Mute/unmute audio + + + + + NewIdentitiyDialog + + + Create new certificate + + + + + Display Name + + + + + Expiration Date + + + + + Common Name + + + + + Group + + + + + QApplication + + + Opens the provided links in a new window instead of tabs. + + + + + Starts the instance of kristall as a isolated session that cannot communicate with other windows. + + + + + The urls that should be opened instead of the start page + + + + + QObject + + + %1 B + + + + + KB + + + + + MB + + + + + GB + + + + + TB + + + + + B + + + + + Unsorted + + + + + Host Name + + + + + First Seen + + + + + Key Type + + + + + Opaque + + + + + Unforseen + + + + + SettingsDialog + + + Settings + + + + + Generic + + + + + UI Theme + + + + + Icon Theme + + + + + UI Density + + + + + Start Page: + + + + + about://blank + + + + + Search engine: + + + + + Enabled Protocols + + + + + Gemini + + + + + Gopher + + + + + Finger + + + + + HTTP + + + + + HTTPS + + + + + Text Rendering + + + + + + Fancy + + + + + Always plain text + + + + + Enable text highlights + + + + + On (Experimental) + + + + + + + Off + + + + + Gopher Map + + + + + Use icons + + + + + Use text only + + + + + Unknown Scheme + + + + + Use OS default handler + + + + + Display error message + + + + + Hidden files in file:// directories + + + + + Show + + + + + Hide + + + + + URL bar highlights + + + + + None + + + + + Use typographer's quotes + + + + + Replace single and double quotes with curly typographer quotes. + + + + + + On + + + + + Render emojis + + + + + Whether to render emojis in a page. + + + + + Max. Number of Redirections + + + + + Redirection Handling + + + + + Network Timeout + + + + + ms + + + + + Additional toolbar buttons + + + + + Home + + + + + New tab + + + + + Root (/) + + + + + Parent (..) + + + + + Total cache size limit + + + + + The total amount of memory that can be occupied by cached items. Set to zero to disable in-memory caching. + + + + + + KiB + + + + + Cached item size threshold + + + + + Items which are below this threshold are cached in memory. Any above are simply discarded. + + + + + Cached item life + + + + + How long cached items last before they are expired and require a reload. + + + + + minutes + + + + + Unlimited item life + + + + + Sets cached items to be unexpirable. Items will only be removed if the cache is full. + + + + + Style + + + + + Background Color + + + + + Standard Font + + + + + This text will be displayed for normal text. + + + + + Preformatted Font + + + + + This text will be displayed for preformatted text. + + + + + H1 Font + + + + + This text will be displayed for a level 1 heading. + + + + + H2 Font + + + + + This text will be displayed for a level 2 heading. + + + + + H3 Font + + + + + This text will be displayed for a level 3 heading. + + + + + Blockquote font + + + + + This font will be used in blockquotes. + + + + + Local Link Color + + + + + Foreign Link Color + + + + + Cross-Scheme-Color + + + + + Local Link Prefix + + + + + Extern Link Prefix + + + + + ⇒ + + + + + → + + + + + This is a local reference + + + + + This is a foreign reference + + + + + This reference is cross-scheme + + + + + Auto-Theme Generation + + + + + Left/right Page Margin + + + + + + + + + + px + + + + + Top/bottom Page Margin + + + + + Other options + + + + + Justify text + + + + + Justify text on the page, instead of left-aligning it. + + + + + Centre first H1 + + + + + Whether to centre the first top-level heading in the document. + + + + + Text width limit + + + + + Preferred width of formatted text on the page. + + + + + Enabled + + + + + Whether to limit the width of formatted text on the page or not. + + + + + Line height (paragraph) + + + + + Line height (header) + + + + + Indentation + + + + + Par: + + + + + Hea: + + + + + Quo: + + + + + Lst: + + + + + Indent size + + + + + List item marker + + + + + Block Quote Background + + + + + + + + + + ... + + + + + Presets + + + + + Save as new preset + + + + + Override current preset + + + + + Load preset + + + + + Imports preset… + + + + + Export preset… + + + + + host.name + + + + + Gemini TLS + + + + + HTTPS TLS + + + + + Disabled + + + + + Dark Theme + + + + + Light Theme + + + + + OS Default + + + + + + Light + + + + + + Dark + + + + + Automatic + + + + + Compact + + + + + Classic + + + + + Filled circle + + + + + Circle + + + + + Square + + + + + Ask for cross-scheme or cross-host redirection + + + + + Ask for cross-scheme redirection + + + + + Ask for cross-host redirection + + + + + Ask for all redirection + + + + + Silently redirect everything + + + + + URL with '%1' in place of query + + + + + (not supported in this build) + + + + + + Save + + + + + + Cancel + + + + + Enter the name of your new preset: + + + + + A style with the name '%1' already exists! Replace? + + + + + + Do you want to override the style '%1'? + + + + + Do you want to load the style '%1'? +This will discard all currently set up values! + + + + + + Kristall Theme (*.kthm) + + + + + Imported preset has no name. +Please enter a name for the preset: + + + + + SslTrustEditor + + + Form + + + + + Trust Level + + + + + Certificate Authorities + + + + + Use local certificate authorities + + + + + Don't use local certificate authorities + + + + + Trusted Hosts + + + + + Revoke trust + + + + diff --git a/translations/kristall_ru.ts b/translations/kristall_ru.ts new file mode 100644 index 0000000..a467a1d --- /dev/null +++ b/translations/kristall_ru.ts @@ -0,0 +1,2079 @@ + + + + + AboutHandler + + + # Favourites + + # Избранное + + + + + BrowserTab + + + Form + + + + + Navigate back + Перейти назад + + + + + Back + Назад + + + + Navigate forward + Перейти вперед + + + + + Forward + Вперёд + + + + Stop loading + Прервать загрузку + + + + + Stop + Остановить + + + + Refresh current location + Обновить текущую страницу + + + + Reload + Обновить + + + + Kristall Home Page + Домашняя страница Kristall + + + + Home + Домой + + + + Go the root path of current location + Перейти в корень + + + + / + / + + + + Go the parent path of current location + Перейти в родительский каталог + + + + P + P + + + + gemini:// + gemini:// + + + + Add/remove from favourites + Добавить или удалить из Избранного + + + + Favourite + Избранное + + + + Enable/disable client certificate for this tab + Использовать клиентский сертификат для данной вкладки + + + + Client Certificate + Сертификат клиента + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start surfin!</p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Можно начинать!</p></body></html> + + + + Previous + Предыдущий + + + + + Next + Далее + + + + Hide search + Скрыть поиск + + + + Hide + Скрыть + + + + + + + + + + + + + + Kristall + Kristall + + + + URI scheme not supported or disabled: + Схема адреса не поддерживается или отключена: + + + + Failed to cancel running request! + + + + + Source of %0 + Исходный текст %0 + + + + Mime type: %0 + Тип Mime: %0 + + + + No search engine is configured. +Please configure one in the settings to allow searching via the URL bar. + +See the Help menu for additional information. + + + + + The server didn't respond in time. + Сервер не ответил за отведенное время. + + + + The page requested a authorized client certificate, but none was provided. +Original query was: %1 + + + + + Failed to convert input charset %1 to UTF-8. Cannot display the file. +Do you want to display unconverted data anyways? + Не удалось преобразовать из кодировки %1 в UTF-8. Невозможно отобразить файл. +Вы хотите отобразить непреобразованные данные? + + + + Failed to convert input charset %1 to UTF-8. + Не удалось преобразовать из кодировки %1 в UTF-8. + + + + Failed to load picture: +%1 + Не удалось загрузить изображение: +%1 + + + + Unsupported Media Type! + +Kristall cannot display the requested document +To view this media, use the File menu to save it to your local drive, then open the saved file in another program that can display the document for you. + +Details: +- MIME type: %1/%2 +- Size: %3 + + Медиа-тип не поддерживается! + +Kristall не может отобразить запрошенный документ. +Чтобы просмотреть файл, используйте меню Файл чтобы сохранить его на диск, а затем откройте в программе, которая поддерживает этот формат. + +Подробности: +- MIME-тип: %1/%2 +- Размер: %3 + + + + + # Unsupported Media Type! + +Kristall cannot display the requested document. + +> To view this media, use the File menu to save it to your local drive, then open the saved file in another program that can display the document for you. + +``` +Details: +- MIME type: %1/%2 +- Size: %3 +``` + + # Медиа-тип не поддерживается! + +Kristall не может отобразить запрошенный документ. + +> Чтобы просмотреть файл, используйте меню Файл чтобы сохранить его на диск, а затем откройте в программе, которая поддерживает этот формат. + +``` +Подробности: +- MIME-тип: %1/%2 +- Размер: %3 +``` + + + + + Site requires input: +%1 + Сайт запрашивает ввод: +%1 + + + + Your input message is too long. Your input is %1 bytes, but a maximum of %2 bytes are allowed. +Please cancel or shorten your input. + + + + + Too many consecutive redirections. The last redirection would have redirected you to: +%1 + Слишком много перенаправлений. Последнее перенаправление вело на: +%1 + + + + The location you visited wants to redirect you to another location: +%1 +Do you want to allow the redirection? + + + + + The location you visited wants to redirect you to another host and switch the protocol. +Protocol: %1 +New Host: %2 +Do you want to allow the redirection? + + + + + The location you visited wants to switch the protocol. +Protocol: %1 +Do you want to allow the redirection? + + + + + The location you visited wants to redirect you to another host. +New Host: %1 +Do you want to allow the redirection? + + + + + Redirection to %1 cancelled by user + Перенаправление на %1 отменено пользователем + + + + Redirection to %1 failed + Перенаправление на %1 не удалось + + + + An error happened: +%0 + Произошла ошибка: +%0 + + + + This sites certificate could not be verified! This may be a man-in-the-middle attack on the server to send you malicious content (or the server admin made a configuration mistake). +Are you sure you want to continue? + Сертификат данного сайта не удалось проверить! Возможно, это атака man-in-the-middle на данный сервер, чтобы отправить вам вредоносное содержимое (или администратор сайта допустил ошибку в настройке). +Вы действительно хотите продолжить? + + + + Do you really want to add the server certificate to your list of trusted hosts? +Host: %1 + Вы действительно хотите добавить сертификат сервера в список доверенных? +Адрес: %1 + + + + This style has no embedded name. Please enter a name for the preset: + + + + + Do you want to add the style %1 to your collection? + + + + + The theme %1 was successfully added to your theme collection! + Тема %1 успешно добавлена в коллекцию! + + + + Malicious site detected! This site tries to use the Kristall control scheme! +A trustworthy site does not do this! + + + + + + Failed to start system URL handler for +%1 + Не удалось запустить системный обработчик для +%1 + + + + The requested url uses a scheme that has been disabled in the settings: +%1 + + + + + The requested url cannot be processed by Kristall: +%1 + Kristall не может обработать указанный адрес: +%1 + + + + You currently have a transient session active! +If you disable the session, you will not be able to restore it. Continue? + + + + + You requested a %1-URL with a client certificate, but these are not supported for this scheme. Continue? + Вы запросили адрес %1 с клиентским сертификатом, но они не поддерживаются для данной схемы. Продолжить? + + + + You want to visit a new host, but have a client certificate enabled. This may be a risk to expose your identity to another host. +Do you want to keep the certificate enabled? + + + + + Your client certificate has a host filter enabled and this site does not match the host filter. +New URL: %1 +Host Filter: %2 +Do you want to keep the certificate enabled? + + + + + An automatic client certificate was detected for this site: +%1 +Do you want to enable that certificate? + + + + + Failed to generate temporary crypto-identitiy + + + + + Open in new tab + Открыть в новой вкладке + + + + Open with external web browser + Открыть во внешнем браузере + + + + Follow link + Перейти по ссылке + + + + Copy link + Копировать ссылку + + + + Refresh + Обновить + + + + Copy to clipboard + Копировать в буфер обмена + + + + Select all + Выделить всё + + + + View document source + Просмотр источника + + + + CertificateIoDialog + + + Dialog + + + + + Key Type + Тип ключа + + + + Key File + Файл ключа + + + + + ... + ... + + + + Certificate File + Сертификат + + + + Export Certificate + Экспорт сертификата + + + + Import Certificate + Импорт сертификата + + + + + Certificate File(*.pem *.der) + Файл сертификата (*.pem *.der) + + + + CertificateManagementDialog + + + Certificate Manager + Управление сертификатами + + + + Create new certificate + Создать новый сертификат + + + + Create... + Создать... + + + + Import certificate + Импорт сертификата + + + + Import... + Импорт... + + + + Export certificate + Экспорт сертификата + + + + Export... + Экспорт... + + + + Delete certificate + Удалить сертификат + + + + Delete + Удалить + + + + Certificate + Сертификат + + + + Display Name + Отображаемое имя + + + + Common Name + Общее имя + + + + Expiration Date + Истекает + + + + Expires in + Истекает через + + + + ??? days + + + + + Fingerprint + Отпечаток + + + + Notes + Примечания + + + + Host Filter + + + + + gemini://* + gemini://* + + + + If this is checked, Kristall will automatically enable this certificate when visiting a URL matching the host filter + + + + + Auto-Enable Certificate + + + + + %1 day + %1 days + + %1 день + %1 дня + %1 дней + + + + + + + + + + + + + + + + + Kristall + Kristall + + + + Do you really want to delete this certificate? + +You will not be able to restore the identity after this! + + + + + Could not destroy identity! + + + + + Do you want to delete the group '%1' + + + + + Could not delete group! + Не удалось удалить группу! + + + + + + + The file %1 could not be found! + Файл %1 не найден! + + + + The file %1 could not be created found! + + + + + The file %1 could not be created! + Не удалось создать файл %1! + + + + Imported from: +key: %1 +:cert: %2 + + + + + Imported Certificate + Default name + Импортированный сертификат + + + + The key file %1 could not be loaded. Please verify your key file. + Не удалось загрузить файл ключа %1. Проверьте его. + + + + The certificate file %1 could not be loaded. Please verify your certificate. + Не удалось загрузить файл сертификата %1. Проверьте его. + + + + Imported Certificates + Импортированные сертификаты + + + + Failed to import the certificate. + Не удалось импортировать сертификат. + + + + CertificateSelectionDialog + + + Select client certificate + Выбор сертификата клиента + + + + Select existing certificate: + Выбрать существующий: + + + + TextLabel + + + + + Create new identity + + + + + Use + Использовать + + + + Create transient session certificate: + Создать временный сертификат сеанса: + + + + 30 Minutes + 30 минут + + + + 1 Hour + 1 час + + + + 12 Hours + 12 часов + + + + 24 Hours + 24 часа + + + + 48 Hours + 48 часов + + + + FavouriteCollection + + + Unsorted + Неотсортированное + + + + FavouritePopup + + + Title: + Название: + + + + Group: + Группа: + + + + Unfavourite + Удалить + + + + Confirm + Подтвердить + + + + GopherClient + + + Search: + Поиск: + + + + MainWindow + + + Kristall Browser + Браузер Kristal + + + + Document Outline + Структура документа + + + + Ctrl+M + Ctrl+M + + + + Favourites + Избранное + + + + Ctrl+B + Ctrl+B + + + + History + Журнал + + + + Ctrl+H + Ctrl+H + + + + File + Файл + + + + + Help + Справка + + + + View + Вид + + + + Navigation + Обзор + + + + About... + О программе... + + + + Quit + Выход + + + + Ctrl+Q + Ctrl+Q + + + + New Tab + Новая вкладка + + + + Ctrl+T + Ctrl+T + + + + Close Tab + Закрыть вкладку + + + + Ctrl+W + Ctrl+W + + + + Settings + Настройки + + + + Ctrl+, + Ctrl+, + + + + + Back + Назад + + + + Alt+Left + Alt+влево + + + + + Forward + Вперёд + + + + Alt+Right + Alt+вправо + + + + Root + В корень + + + + Go to the root directory (/) + В корневой каталог (/) + + + + Alt+/ + Alt+/ + + + + Parent + Наверх + + + + Go to the parent directory + Перейти в родительский каталог + + + + Alt+Up + Alt+вверх + + + + Refresh + Обновить + + + + F5 + F5 + + + + About Qt... + О Qt... + + + + Save as... + Сохранить как... + + + + Ctrl+S + Ctrl+S + + + + Add to favourites + Добавить в Избранное + + + + Ctrl+D + Ctrl+D + + + + Go to home + Домой + + + + Alt+Home + Alt+Home + + + + F1 + F1 + + + + Changelog + Журнал изменений + + + + Manage Certificates… + Управление сертификатами... + + + + View document source + Просмотр источника + + + + Ctrl+U + Ctrl+U + + + + New Window + Новое окно + + + + Opens a new window + Открыть новое окно + + + + Ctrl+N + Ctrl+N + + + + Close Window + Закрыть окно + + + + Alt+F4 + Alt+F4 + + + + Enter name of the new group: + Название новой группы: + + + + + + + Kristall + Kristall + + + + Kristall, an OpenSource Gemini browser. +Made by Felix "xq" Queißner + +This is free software. You can get the source code at +https://github.com/MasterQ32/Kristall + Kristall, открытый Gemini-браузер. +Создан Феликсом "xq" Кюснером + +Это свободное программное обеспечение. Исходный код: +https://github.com/MasterQ32/Kristall + + + + (cached) + (в кэше) + + + + %1 ms + %1 мс + + + + + Open here + Открыть здесь + + + + + Open in new tab + Открыть в новой вкладке + + + + Relocate + Переместить + + + + Enter new location of this favourite: + + + + + Rename + Переименовать + + + + New name of this favourite: + Новое название элемента: + + + + Delete + Удалить + + + + Rename group + Переименовать группу + + + + New name of this group: + Новое название группы: + + + + Rename failed: group name already in use. + Невозможно переименовать: название группы уже используется. + + + + Delete group + Удалить группу + + + + Are you sure you want to delete this Favourite Group? +All favourites in this group will be lost. + +This action cannot be undone! + + + + + Create new group... + Создать группу... + + + + MediaPlayer + + + Form + + + + + Click to play/pause + Пауза/воспроизведение + + + + + ... + ... + + + + 00:00:00 + 00:00:00 + + + + Mute/unmute audio + Вкл/выкл звук + + + + NewIdentitiyDialog + + + Create new certificate + Новый сертификат + + + + Display Name + Отображаемое имя + + + + Expiration Date + Истекает + + + + Common Name + Общее имя + + + + Group + Группа + + + + QApplication + + + Opens the provided links in a new window instead of tabs. + Открыть адреса в новых окнах вместо вкладок. + + + + Starts the instance of kristall as a isolated session that cannot communicate with other windows. + Запустить экземпляр kristall, изолированный от других окон. + + + + The urls that should be opened instead of the start page + Адреса для открытия + + + + QObject + + + Unsorted + Неотсортированное + + + + %1 B + %1 Б + + + + KB + КБ + + + + MB + ГБ + + + + GB + ГБ + + + + TB + ТБ + + + + B + Б + + + + Host Name + Имя компьютера + + + + First Seen + Впервые встречен + + + + Key Type + Тип ключа + + + + Opaque + Скрыто + + + + Unforseen + Неизвестно + + + + SettingsDialog + + + Settings + Настройки + + + + Generic + Общие + + + + UI Theme + Тема интерфейса: + + + + Icon Theme + Тема значков: + + + + UI Density + Плотность интерфейса: + + + + Start Page: + Начальная страница: + + + + about://blank + about://blank + + + + Search engine: + Поисковой движок: + + + + Enabled Protocols + Разрешенные протоколы + + + + Gemini + Gemini + + + + Gopher + Gopher + + + + Finger + Finger + + + + HTTP + HTTP + + + + HTTPS + HTTPS + + + + Text Rendering + Отображение текста + + + + + Fancy + Форматированный + + + + Always plain text + Простой текст + + + + Enable text highlights + + + + + On (Experimental) + + + + + + + Off + Выкл + + + + Gopher Map + Схема Gopher + + + + Use icons + Значки + + + + Use text only + Только текст + + + + Unknown Scheme + Неизвестные схемы + + + + Use OS default handler + Открывать через ОС + + + + Display error message + Отображать ошибку + + + + Hidden files in file:// directories + Скрытые файлы в каталогах + + + + Show + Показать + + + + Hide + Скрыть + + + + URL bar highlights + + + + + None + Нет + + + + Use typographer's quotes + Фигурные кавычки + + + + Replace single and double quotes with curly typographer quotes. + Заменять двойные и одинарные кавычки типографскими. + + + + + On + Вкл + + + + Render emojis + Отображать эмодзи + + + + Whether to render emojis in a page. + Отображение эмодзи на страницах. + + + + Max. Number of Redirections + Макс. кол-во перенаправлений + + + + Redirection Handling + Обработка перенаправлений + + + + Network Timeout + Время ожидания сети + + + + ms + мс + + + + Additional toolbar buttons + Дополнительные кнопки + + + + Home + Домой + + + + New tab + Новая вкладка + + + + Root (/) + В корень (/) + + + + Parent (..) + Наверх (..) + + + + Total cache size limit + Общий размер кэша + + + + The total amount of memory that can be occupied by cached items. Set to zero to disable in-memory caching. + + + + + + KiB + КиБ + + + + Cached item size threshold + Предел кэшируемого элемента + + + + Items which are below this threshold are cached in memory. Any above are simply discarded. + + + + + Cached item life + + + + + How long cached items last before they are expired and require a reload. + + + + + minutes + мин. + + + + Unlimited item life + Неограниченно + + + + Sets cached items to be unexpirable. Items will only be removed if the cache is full. + + + + + Style + Начертание + + + + Background Color + Цвет фона + + + + Standard Font + Обычный шрифт + + + + This text will be displayed for normal text. + Это образец обычного текста. + + + + Preformatted Font + Моноширинный шрифт + + + + This text will be displayed for preformatted text. + + + + + H1 Font + Шрифт для H1 + + + + This text will be displayed for a level 1 heading. + Это образец заголовка 1-го уровня. + + + + H2 Font + Шрифт для H2 + + + + This text will be displayed for a level 2 heading. + Это образец заголовка 2-го уровня. + + + + H3 Font + Шрифт для H3 + + + + This text will be displayed for a level 3 heading. + Это образец заголовка 3-го уровня. + + + + Blockquote font + Шрифт цитат + + + + This font will be used in blockquotes. + Это образец текста цитаты. + + + + Local Link Color + Цвет внутренних ссылок + + + + Foreign Link Color + Цвет внешних ссылок + + + + Cross-Scheme-Color + + + + + Local Link Prefix + Префикс внутр. ссылок + + + + Extern Link Prefix + Префикс внешн. ссылок + + + + ⇒ + + + + + → + + + + + This is a local reference + Внутренняя ссылка + + + + This is a foreign reference + Внешняя ссылка + + + + This reference is cross-scheme + + + + + Auto-Theme Generation + + + + + Left/right Page Margin + Отступ слева/справа + + + + + + + + + px + пикс + + + + Top/bottom Page Margin + Отступ сверху/снизу + + + + Other options + Прочее + + + + Justify text + Выравнивание по ширине + + + + Justify text on the page, instead of left-aligning it. + + + + + Centre first H1 + Центрировать первый H1 + + + + Whether to centre the first top-level heading in the document. + + + + + Text width limit + Предел ширины текста + + + + Preferred width of formatted text on the page. + Предпочтительная ширина форматированного текста. + + + + Enabled + Задействовать + + + + Whether to limit the width of formatted text on the page or not. + + + + + Line height (paragraph) + Высота строки (абзац) + + + + Line height (header) + Высота строки (заголовок) + + + + Indentation + Отступы + + + + Par: + Абз: + + + + Hea: + Заг: + + + + Quo: + Цит: + + + + Lst: + Спис: + + + + Indent size + Размер отступа + + + + List item marker + Маркер списка + + + + Block Quote Background + Фон цитаты + + + + + + + + + ... + ... + + + + Presets + Настройки + + + + Save as new preset + Сохранить настройки + + + + Override current preset + + + + + Load preset + Загрузить настройки + + + + Imports preset… + Импорт настроек... + + + + Export preset… + Экспорт настроек... + + + + host.name + + + + + Gemini TLS + TLS Gemini + + + + HTTPS TLS + TLS HTTPS + + + + Disabled + Отключено + + + + Dark Theme + Темная тема + + + + Light Theme + Светлая тема + + + + OS Default + По умолчанию ОС + + + + + Light + Светлая + + + + + Dark + Темная + + + + Automatic + Автоматически + + + + Compact + Компактнай + + + + Classic + Классический + + + + Filled circle + Заполненый кружок + + + + Circle + Кружок + + + + Square + Квадратик + + + + Ask for cross-scheme or cross-host redirection + Подтверждать между схемами или сайтами + + + + Ask for cross-scheme redirection + Подтверждать между схемами + + + + Ask for cross-host redirection + Подтверждать между сайтами + + + + Ask for all redirection + Подтверждать все + + + + Silently redirect everything + Переходить без подтверждения + + + + URL with '%1' in place of query + Адрес с %1 на месте запроса + + + + (not supported in this build) + (не поддерживается в этой сборке) + + + + + Save + Сохранить + + + + + Cancel + Отмена + + + + Enter the name of your new preset: + Название новых настроек: + + + + A style with the name '%1' already exists! Replace? + + + + + + Do you want to override the style '%1'? + + + + + Do you want to load the style '%1'? +This will discard all currently set up values! + + + + + + Kristall Theme (*.kthm) + Тема Kristall (*.kthm) + + + + Imported preset has no name. +Please enter a name for the preset: + Импортированные настройки не имеют названия. +Введите название настроек: + + + + SslTrustEditor + + + Form + + + + + Trust Level + Уровень доверия + + + + Certificate Authorities + Центры сертификации + + + + Use local certificate authorities + Использовать локальные + + + + Don't use local certificate authorities + Не использовать локальные + + + + Trusted Hosts + Доверенные адреса + + + + Revoke trust + Отозвать доверие + + + -- cgit v1.2.3