diff options
author | ubbo <ubbo@34ebc366-c3a9-4b3c-9f84-69acf7962910> | 2012-09-16 20:47:02 +0000 |
---|---|---|
committer | ubbo <ubbo@34ebc366-c3a9-4b3c-9f84-69acf7962910> | 2012-09-16 20:47:02 +0000 |
commit | 0bb4494ba46d459cbc3becc530017da520d9c66a (patch) | |
tree | d79c6148e1e8f8fa9b260815f650240b5c31009b | |
parent | beautified keyservertab in settingsdialog (diff) | |
download | gpg4usb-0bb4494ba46d459cbc3becc530017da520d9c66a.tar.gz gpg4usb-0bb4494ba46d459cbc3becc530017da520d9c66a.zip |
merge mac-build-branch with trunk
git-svn-id: http://cpunk.de/svn/src/gpg4usb/trunk@957 34ebc366-c3a9-4b3c-9f84-69acf7962910
109 files changed, 41079 insertions, 5211 deletions
@@ -25,6 +25,10 @@ BUGS: Release 0.3.4 - Catch bad passphrase message - add keyless encryption +- create revocation file + - on key generation + - later +- add posibility to add keyserver in settings - set gpgme error language to chosen language (context.cpp:49) - Add default key functionality - encrypt and sign, decrypt and verify (?) diff --git a/TODO.kgpgport b/TODO.kgpgport new file mode 100644 index 0000000..1267f3f --- /dev/null +++ b/TODO.kgpgport @@ -0,0 +1,6 @@ +TODO: +- central import, move code duplication from keymgmt, mainwindow and keyserverimport to central place, e.g. keyimportdetaildialog +-reactivate keyimportdetaildialog +- sign should work for more than one secret keyid +- why is listkeys called so often (twice?) +- signverify on one button like kgpg? diff --git a/fileencryptiondialog.cpp b/fileencryptiondialog.cpp index 88f73a8..af05a24 100755 --- a/fileencryptiondialog.cpp +++ b/fileencryptiondialog.cpp @@ -193,9 +193,10 @@ void FileEncryptionDialog::executeAction() if (! mCtx->decrypt(inBuffer, outBuffer)) return; } - if( mAction == Sign ) { + // TODO: with kgpg + /*if( mAction == Sign ) { if(! mCtx->sign(mKeyList->getChecked(), inBuffer, outBuffer, true)) return; - } + }*/ if( mAction == Verify ) { QFile signfile; diff --git a/gpg4usb.pro b/gpg4usb.pro index 3b7a682..646be19 100644 --- a/gpg4usb.pro +++ b/gpg4usb.pro @@ -14,7 +14,9 @@ INCLUDEPATH += . \ #DEFINES += GPG4USB_NON_PORTABLE #CONFIG += release static +#CONFIG += release CONFIG += debug + QT += network # Input HEADERS += attachments.h \ @@ -40,7 +42,41 @@ HEADERS += attachments.h \ verifykeydetailbox.h \ wizard.h \ helppage.h \ - gpgconstants.h + gpgconstants.h \ + kgpg/gpgproc.h \ + kgpg/klinebufferedprocess.h \ + kgpg/kprocess.h \ + kgpg/kprocess_p.h \ + kgpg/kgpginterface.h \ + kgpg/core/kgpgkey.h \ + kgpg/core/KGpgSignableNode.h \ + kgpg/core/KGpgExpandableNode.h \ + kgpg/core/KGpgSignNode.h \ + kgpg/core/KGpgUidNode.h \ + kgpg/core/KGpgUatNode.h \ + kgpg/core/KGpgKeyNode.h \ + kgpg/core/KGpgSubKeyNode.h \ + kgpg/core/KGpgNode.h \ + kgpg/core/KGpgRefNode.h \ + kgpg/core/KGpgRootNode.h \ + kgpg/core/KGpgGroupNode.h \ + kgpg/core/KGpgGroupMemberNode.h \ + kgpg/core/KGpgOrphanNode.h \ + kgpg/core/convert.h \ + kgpg/core/images.h \ + kgpg/transactions/kgpgtransaction.h \ + kgpg/transactions/kgpgtextorfiletransaction.h \ + kgpg/transactions/kgpgencrypt.h \ + kgpg/transactions/kgpgdecrypt.h \ + kgpg/transactions/kgpgexport.h \ + kgpg/transactions/kgpgimport.h \ + kgpg/transactions/kgpgdelkey.h \ + kgpg/transactions/kgpggeneratekey.h \ + kgpg/transactions/kgpgsigntext.h \ + kgpg/transactions/kgpgverify.h \ + #kgpg/model/kgpgitemmodel.h \ + #kgpg/model/kgpgitemnode.h + SOURCES += attachments.cpp \ gpgcontext.cpp \ @@ -66,7 +102,38 @@ SOURCES += attachments.cpp \ verifykeydetailbox.cpp \ wizard.cpp \ helppage.cpp \ - gpgconstants.cpp + gpgconstants.cpp \ + kgpg/gpgproc.cpp \ + kgpg/klinebufferedprocess.cpp \ + kgpg/kprocess.cpp \ + kgpg/kgpginterface.cpp \ + kgpg/core/kgpgkey.cpp \ + kgpg/core/KGpgSignableNode.cpp \ + kgpg/core/KGpgExpandableNode.cpp \ + kgpg/core/KGpgSignNode.cpp \ + kgpg/core/KGpgUidNode.cpp \ + kgpg/core/KGpgUatNode.cpp \ + kgpg/core/KGpgKeyNode.cpp \ + kgpg/core/KGpgSubKeyNode.cpp \ + kgpg/core/KGpgNode.cpp \ + kgpg/core/KGpgRefNode.cpp \ + kgpg/core/KGpgRootNode.cpp \ + kgpg/core/KGpgGroupNode.cpp \ + kgpg/core/KGpgGroupMemberNode.cpp \ + kgpg/core/KGpgOrphanNode.cpp \ + kgpg/core/convert.cpp \ + kgpg/core/images.cpp \ + kgpg/transactions/kgpgtransaction.cpp \ + kgpg/transactions/kgpgtextorfiletransaction.cpp \ + kgpg/transactions/kgpgencrypt.cpp \ + kgpg/transactions/kgpgdecrypt.cpp \ + kgpg/transactions/kgpgexport.cpp \ + kgpg/transactions/kgpgimport.cpp \ + kgpg/transactions/kgpgdelkey.cpp \ + kgpg/transactions/kgpggeneratekey.cpp \ + kgpg/transactions/kgpgsigntext.cpp \ + kgpg/transactions/kgpgverify.cpp \ + #kgpg/model/kgpgitemmodel.cpp RC_FILE = gpg4usb.rc @@ -80,6 +147,9 @@ LIBS += -lgpgme \ #INCLUDEPATH += ./winbuild/include #LIBS +=./winbuild/lib/libgpgme.a ./winbuild/lib/libgpg-error.a +#INCLUDEPATH += ./macbuild/include +#LIBS +=./macbuild/lib/libgpgme.a ./macbuild/lib/libgpg-error.a + DEFINES += _FILE_OFFSET_BITS=64 TRANSLATIONS = release/ts/gpg4usb_en.ts \ @@ -91,6 +161,7 @@ TRANSLATIONS = release/ts/gpg4usb_en.ts \ release/ts/gpg4usb_vi.ts \ release/ts/gpg4usb_my.ts \ release/ts/gpg4usb_zh.ts \ + release/ts/gpg4usb_zh_tw.ts \ release/ts/gpg4usb_ar.ts diff --git a/gpgcontext.cpp b/gpgcontext.cpp index 7d0fbf2..2d98372 100644 --- a/gpgcontext.cpp +++ b/gpgcontext.cpp @@ -20,7 +20,11 @@ */ #include "gpgcontext.h" - +#include "kgpg/gpgproc.h" +#include "kgpg/kgpginterface.h" +#include "kgpg/klinebufferedprocess.h" +#include "kgpg/core/kgpgkey.h" +#include "kgpg/transactions/kgpgencrypt.h" #ifdef _WIN32 #include <windows.h> #include <unistd.h> /* contains read/write */ @@ -41,80 +45,35 @@ GpgContext::GpgContext() /** The function `gpgme_check_version' must be called before any other * function in the library, because it initializes the thread support * subsystem in GPGME. (from the info page) */ - gpgme_check_version(NULL); - - // TODO: Set gpgme_language to config - /*QSettings settings; - qDebug() << " - " << settings.value("int/lang").toLocale().name(); - qDebug() << " - " << QLocale(settings.value("int/lang").toString()).name();*/ - // the locale set here is used for the other setlocale calls which have NULL - // -> NULL means use default, which is configured here - setlocale(LC_ALL, ""); - - /** set locale, because tests do also */ - gpgme_set_locale(NULL, LC_CTYPE, setlocale(LC_CTYPE, NULL)); - //qDebug() << "Locale set to" << LC_CTYPE << " - " << setlocale(LC_CTYPE, NULL); -#ifndef _WIN32 - gpgme_set_locale(NULL, LC_MESSAGES, setlocale(LC_MESSAGES, NULL)); +#ifdef Q_WS_WIN + gpgBin = appPath + "/bin/gpg.exe"; + gpgKeys = appPath + "/keydb"; #endif +#ifdef Q_WS_MAC + gpgBin = appPath + "/bin/gpg-mac.app"; - err = gpgme_new(&mCtx); + gpgKeys = appPath + "/keydb"; - checkErr(err); - /** here come the settings, instead of /usr/bin/gpg - * a executable in the same path as app is used. - * also lin/win must be checked, for calling gpg.exe if needed - */ -#ifdef _WIN32 - QString gpgBin = appPath + "/bin/gpg.exe"; -#else - QString gpgBin = appPath + "/bin/gpg"; + qDebug() << "gpg bin:" << gpgBin; + qDebug() << "gpg keydb: " << gpgKeys; #endif - - QSettings settings; - QString accKeydbPath = settings.value("gpgpaths/keydbpath").toString(); - QString gpgKeys = appPath + "/keydb/"+accKeydbPath; - - if (accKeydbPath != "") { - if (!QDir(gpgKeys).exists()) { - QMessageBox::critical(0,tr("keydb path"),tr("Didn't find keydb directory. Switching to gpg4usb's default keydb directory for this session.")); - gpgKeys = appPath + "/keydb"; - } - } - - /* err = gpgme_ctx_set_engine_info(mCtx, GPGME_PROTOCOL_OpenPGP, - gpgBin.toUtf8().constData(), - gpgKeys.toUtf8().constData());*/ -#ifndef GPG4USB_NON_PORTABLE - err = gpgme_ctx_set_engine_info(mCtx, GPGME_PROTOCOL_OpenPGP, - gpgBin.toLocal8Bit().constData(), - gpgKeys.toLocal8Bit().constData()); - checkErr(err); +#ifdef Q_WS_X11 + gpgBin = appPath + "/bin/gpg"; + gpgKeys = appPath + "/keydb"; #endif - gpgme_engine_info_t engineInfo; - engineInfo = gpgme_ctx_get_engine_info(mCtx); + QStringList args; + args << "--homedir" << gpgKeys << "--list-keys"; - while (engineInfo !=NULL ) { - qDebug() << gpgme_get_protocol_name(engineInfo->protocol); - engineInfo=engineInfo->next; - } +/* QProcess gpg; + gpg.setProcessChannelMode(QProcess::MergedChannels); + gpg.start(gpgBin, args); - /** Setting the output type must be done at the beginning */ - /** think this means ascii-armor --> ? */ - gpgme_set_armor(mCtx, 1); - /** passphrase-callback */ - gpgme_set_passphrase_cb(mCtx, passphraseCb, this); - - /** check if app is called with -d from command line */ - if (qApp->arguments().contains("-d")) { - qDebug() << "gpgme_data_t debug on"; - debug = true; - } else { - debug = false; - } + gpg.waitForFinished(-1); + qDebug() << "huhu" << gpg.readAll(); +*/ connect(this,SIGNAL(keyDBChanged()),this,SLOT(refreshKeyList())); refreshKeyList(); } @@ -124,8 +83,8 @@ GpgContext::GpgContext() */ GpgContext::~GpgContext() { - if (mCtx) gpgme_release(mCtx); - mCtx = 0; + //if (mCtx) gpgme_release(mCtx); + //mCtx = 0; } /** Import Key from QByteArray @@ -236,67 +195,62 @@ bool GpgContext::exportKeys(QStringList *uidList, QByteArray *outBuffer) return true; } -gpgme_key_t GpgContext::getKeyDetails(QString uid) -{ - gpgme_key_t key; +KgpgCore::KgpgKey GpgContext::getKeyDetails(QString uid) { + // try secret - gpgme_get_key(mCtx, uid.toAscii().constData(), &key, 1); - // ok, its a public key - if (!key) { - gpgme_get_key(mCtx, uid.toAscii().constData(), &key, 0); + KgpgCore::KgpgKeyList keys = KgpgInterface::readSecretKeys(QStringList() << uid); + if(keys.empty()) { + // ok try public + keys = KgpgInterface::readPublicKeys(QStringList() << uid); + // that should not happen + /*if(keys.empty()) { + qDebug() << "error, no key with uid" << uid; + return ; + }*/ + } + + KgpgCore::KgpgKey key = keys.first(); return key; + } + + /** List all availabe Keys (VERY much like kgpgme) */ GpgKeyList GpgContext::listKeys() { - gpgme_error_t err; - gpgme_key_t key; - GpgKeyList keys; - //TODO dont run the loop more often than necessary - // list all keys ( the 0 is for all ) - err = gpgme_op_keylist_start(mCtx, NULL, 0); - checkErr(err); - while (!(err = gpgme_op_keylist_next(mCtx, &key))) { - GpgKey gpgkey; + KgpgInterface::readPublicKeys(); - if (!key->subkeys) - continue; - gpgkey.id = key->subkeys->keyid; - gpgkey.fpr = key->subkeys->fpr; - gpgkey.expired = (key->expired != 0); - gpgkey.revoked = (key->revoked != 0); + GpgKeyList keys; + KgpgCore::KgpgKeyList kl = KgpgInterface::readPublicKeys(); - if (key->uids) { - gpgkey.name = QString::fromUtf8(key->uids->name); - gpgkey.email = QString::fromUtf8(key->uids->email); - } - keys.append(gpgkey); - gpgme_key_unref(key); + foreach(KgpgCore::KgpgKey kkey, kl) { + GpgKey key; + key.email = kkey.email(); + //key.expired = kkey.expirationDate().toString(); + key.expired = false; + key.fpr = kkey.fingerprint(); + key.id = kkey.id(); + key.name = kkey.name(); + key.revoked = false; + keys.append(key); } - gpgme_op_keylist_end(mCtx); - // list only private keys ( the 1 does ) - gpgme_op_keylist_start(mCtx, NULL, 1); - while (!(err = gpgme_op_keylist_next(mCtx, &key))) { - if (!key->subkeys) - continue; + foreach(KgpgCore::KgpgKey skey, KgpgInterface::readSecretKeys()) { // iterate keys, mark privates GpgKeyList::iterator it = keys.begin(); while (it != keys.end()) { - if (key->subkeys->keyid == it->id.toStdString()) + if (skey.id() == it->id) { it->privkey = true; + } it++; } - - gpgme_key_unref(key); } - gpgme_op_keylist_end(mCtx); return keys; } @@ -324,7 +278,7 @@ void GpgContext::deleteKeys(QStringList *uidList) bool GpgContext::encrypt(QStringList *uidList, const QByteArray &inBuffer, QByteArray *outBuffer) { - gpgme_data_t in = 0, out = 0; + /*gpgme_data_t in = 0, out = 0; outBuffer->resize(0); if (uidList->count() == 0) { @@ -335,7 +289,7 @@ bool GpgContext::encrypt(QStringList *uidList, const QByteArray &inBuffer, QByte //gpgme_encrypt_result_t e_result; gpgme_key_t recipients[uidList->count()+1]; - /* get key for user */ + // get key for user for (int i = 0; i < uidList->count(); i++) { // the last 0 is for public keys, 1 would return private keys gpgme_op_keylist_start(mCtx, uidList->at(i).toAscii().constData(), 0); @@ -362,7 +316,7 @@ bool GpgContext::encrypt(QStringList *uidList, const QByteArray &inBuffer, QByte } } } - /* unref all keys */ + // unref all keys for (int i = 0; i <= uidList->count(); i++) { gpgme_key_unref(recipients[i]); } @@ -372,9 +326,17 @@ bool GpgContext::encrypt(QStringList *uidList, const QByteArray &inBuffer, QByte if (out) { gpgme_data_release(out); } - return (err == GPG_ERR_NO_ERROR); + return (err == GPG_ERR_NO_ERROR);*/ + QStringList options; + KGpgEncrypt::EncryptOptions opts = KGpgEncrypt::DefaultEncryption; + + //KGpgEncrypt *encr = new KGpgEncrypt(this, uidList, toPlainText(), opts, options); + //encr->start(); + //connect(encr, SIGNAL(done(int)), SLOT(slotEncodeUpdate(int))); } + + /** Decrypt QByteAarray, return QByteArray * mainly from http://basket.kde.org/ (kgpgme.cpp) */ @@ -609,14 +571,12 @@ void GpgContext::executeGpgCommand(QStringList arguments, QByteArray *stdOut, QB } /*** - * if sigbuffer not set, the inbuffer should contain signed text - * * TODO: return type should contain: * -> list of sigs * -> valid * -> errors */ -gpgme_signature_t GpgContext::verify(QByteArray *inBuffer, QByteArray *sigBuffer) { +gpgme_signature_t GpgContext::verify(QByteArray inBuffer) { int error=0; gpgme_data_t in; @@ -624,16 +584,10 @@ gpgme_signature_t GpgContext::verify(QByteArray *inBuffer, QByteArray *sigBuffer gpgme_signature_t sign; gpgme_verify_result_t result; - err = gpgme_data_new_from_mem(&in, inBuffer->data(), inBuffer->size(), 1); + err = gpgme_data_new_from_mem(&in, inBuffer.data(), inBuffer.size(), 1); checkErr(err); - if (sigBuffer != NULL ) { - gpgme_data_t sigdata; - err = gpgme_data_new_from_mem(&sigdata, sigBuffer->data(), sigBuffer->size(), 1); - err = gpgme_op_verify (mCtx, sigdata, in, NULL); - } else { - err = gpgme_op_verify (mCtx, in, NULL, in); - } + err = gpgme_op_verify (mCtx, in, NULL, in); error = checkErr(err); if (error != 0) { @@ -666,12 +620,11 @@ gpgme_signature_t GpgContext::verify(QByteArray *inBuffer, QByteArray *sigBuffer */ //} -bool GpgContext::sign(QStringList *uidList, const QByteArray &inBuffer, QByteArray *outBuffer, bool detached ) { +bool GpgContext::sign(QStringList *uidList, const QByteArray &inBuffer, QByteArray *outBuffer ) { gpgme_error_t err; gpgme_data_t in, out; gpgme_sign_result_t result; - gpgme_sig_mode_t mode; if (uidList->count() == 0) { QMessageBox::critical(0, tr("Key Selection"), tr("No Private Key Selected")); @@ -714,13 +667,7 @@ bool GpgContext::sign(QStringList *uidList, const QByteArray &inBuffer, QByteArr mode settings of the context are ignored. */ - if(detached) { - mode = GPGME_SIG_MODE_DETACH; - } else { - mode = GPGME_SIG_MODE_CLEAR; - } - - err = gpgme_op_sign (mCtx, in, out, mode); + err = gpgme_op_sign (mCtx, in, out, GPGME_SIG_MODE_CLEAR); checkErr (err); if (err == GPG_ERR_CANCELED) { @@ -739,6 +686,10 @@ bool GpgContext::sign(QStringList *uidList, const QByteArray &inBuffer, QByteArr gpgme_data_release(in); gpgme_data_release(out); + if (! settings.value("general/rememberPassword").toBool()) { + clearPasswordCache(); + } + return (err == GPG_ERR_NO_ERROR); } @@ -822,9 +773,14 @@ QString GpgContext::getGpgmeVersion() { return QString(gpgme_check_version(NULL)); } +void GpgContext::emitKeyDBChanged() { + emit keyDBChanged(); +} + } + diff --git a/gpgcontext.h b/gpgcontext.h index cdb522d..388c957 100644 --- a/gpgcontext.h +++ b/gpgcontext.h @@ -28,6 +28,7 @@ #include <gpgme.h> #include <QLinkedList> #include <QtGui> +#include "kgpg/core/kgpgkey.h" QT_BEGIN_NAMESPACE class QMessageBox; @@ -118,10 +119,11 @@ public: bool decrypt(const QByteArray &inBuffer, QByteArray *outBuffer); void clearPasswordCache(); void exportSecretKey(QString uid, QByteArray *outBuffer); - gpgme_key_t getKeyDetails(QString uid); - gpgme_signature_t verify(QByteArray *inBuffer, QByteArray *sigBuffer = NULL); + //gpgme_key_t getKeyDetails(QString uid); + KgpgCore::KgpgKey getKeyDetails(QString uid); + gpgme_signature_t verify(QByteArray in); // void decryptVerify(QByteArray in); - bool sign(QStringList *uidList, const QByteArray &inBuffer, QByteArray *outBuffer, bool detached = false ); + bool sign(QStringList *uidList, const QByteArray &inBuffer, QByteArray *outBuffer ); /** * @details If text contains PGP-message, put a linebreak before the message, * so that gpgme can decrypt correctly @@ -133,6 +135,8 @@ public: GpgKey getKeyByFpr(QString fpr); GpgKey getKeyById(QString id); + void emitKeyDBChanged(); + static QString gpgErrString(gpgme_error_t err); static QString getGpgmeVersion(); @@ -176,6 +180,9 @@ private: QByteArray *stdOut, QByteArray *stdErr); + QString gpgBin; + QString gpgKeys; + }; } // namespace GpgME diff --git a/keydetailsdialog.cpp b/keydetailsdialog.cpp index 5a66122..fb6edf6 100644 --- a/keydetailsdialog.cpp +++ b/keydetailsdialog.cpp @@ -20,12 +20,13 @@ */ #include "keydetailsdialog.h" +#include "kgpg/transactions/kgpgexport.h" -KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWidget *parent) +KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, KgpgCore::KgpgKey key, QWidget *parent) : QDialog(parent) { mCtx = ctx; - keyid = new QString(key->subkeys->keyid); + keyid = new QString(key.id()); ownerBox = new QGroupBox(tr("Owner details")); keyBox = new QGroupBox(tr("Key details")); @@ -34,29 +35,29 @@ KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWid buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); connect(buttonBox, SIGNAL(rejected()), this, SLOT(close())); - nameVarLabel = new QLabel(QString::fromUtf8(key->uids->name)); + nameVarLabel = new QLabel(key.name()); nameVarLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); - emailVarLabel = new QLabel(QString::fromUtf8(key->uids->email)); + emailVarLabel = new QLabel(key.email()); emailVarLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); - commentVarLabel = new QLabel(QString::fromUtf8(key->uids->comment)); + commentVarLabel = new QLabel(key.comment()); commentVarLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); - keyidVarLabel = new QLabel(key->subkeys->keyid); + keyidVarLabel = new QLabel(key.id()); keyidVarLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); QString keySizeVal, keyExpireVal, keyCreatedVal, keyAlgoVal; - if (key->subkeys->expires == 0) { + if (key.expirationDate().isNull()) { keyExpireVal = tr("Never"); } else { - keyExpireVal = QDateTime::fromTime_t(key->subkeys->expires).toString("dd. MMM. yyyy"); + keyExpireVal = key.expirationDate().toString("dd. MMM. yyyy"); } - keyAlgoVal = gpgme_pubkey_algo_name(key->subkeys->pubkey_algo); - keyCreatedVal = QDateTime::fromTime_t(key->subkeys->timestamp).toString("dd. MMM. yyyy"); + keyAlgoVal = key.algorithm(); + keyCreatedVal = key.creationDate().toString("dd. MMM. yyyy"); // have el-gamal key? - if (key->subkeys->next) { + /*if (key->subkeys->next) { keySizeVal.sprintf("%d / %d", int(key->subkeys->length), int(key->subkeys->next->length)); if (key->subkeys->next->expires == 0) { keyExpireVal += tr(" / Never"); @@ -67,7 +68,7 @@ KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWid keyCreatedVal += " / " + QDateTime::fromTime_t(key->subkeys->next->timestamp).toString("dd. MMM. yyyy"); } else { keySizeVal.setNum(int(key->subkeys->length)); - } + }*/ keySizeVarLabel = new QLabel(keySizeVal); expireVarLabel = new QLabel(keyExpireVal); @@ -102,7 +103,7 @@ KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWid keyBox->setLayout(vboxKD); mvbox->addWidget(keyBox); - fingerPrintVarLabel = new QLabel(beautifyFingerprint(key->subkeys->fpr)); + fingerPrintVarLabel = new QLabel(key.fingerprintBeautified()); fingerPrintVarLabel->setTextInteractionFlags(Qt::TextSelectableByMouse); fingerPrintVarLabel->setStyleSheet("margin-left: 20; margin-right: 20;"); QHBoxLayout *hboxFP = new QHBoxLayout(); @@ -122,7 +123,7 @@ KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWid mvbox->addWidget(fingerprintBox); // If key has more than primary uid, also show the other uids - gpgme_user_id_t addUserIds = key->uids->next; + /*gpgme_user_id_t addUserIds = key->uids->next; if (addUserIds !=NULL) { QVBoxLayout *vboxUID = new QVBoxLayout(); while (addUserIds != NULL){ @@ -133,9 +134,9 @@ KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWid } additionalUidBox->setLayout(vboxUID); mvbox->addWidget(additionalUidBox); - } + }*/ - if (key->secret) { + if (key.secret()) { QGroupBox *privKeyBox = new QGroupBox(tr("Private Key")); QVBoxLayout *vboxPK = new QVBoxLayout(); @@ -147,7 +148,7 @@ KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWid mvbox->addWidget(privKeyBox); } - if((key->expired) || (key->revoked)) { + /*if((key->expired) || (key->revoked)) { QHBoxLayout *expBox = new QHBoxLayout(); QIcon icon = QIcon::fromTheme("dialog-warning"); QPixmap pixmap = icon.pixmap(QSize(32,32),QIcon::Normal,QIcon::On); @@ -168,7 +169,7 @@ KeyDetailsDialog::KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWid expBox->addWidget(iconLabel); expBox->addWidget(expLabel); mvbox->addLayout(expBox); - } + }*/ mvbox->addWidget(buttonBox); @@ -192,10 +193,10 @@ void KeyDetailsDialog::exportPrivateKey() // export key, if ok was clicked if (ret == QMessageBox::Ok) { - QByteArray *keyArray = new QByteArray(); + /* QByteArray *keyArray = new QByteArray(); mCtx->exportSecretKey(*keyid, keyArray); - gpgme_key_t key = mCtx->getKeyDetails(*keyid); - QString fileString = QString::fromUtf8(key->uids->name) + " " + QString::fromUtf8(key->uids->email) + "(" + QString(key->subkeys->keyid)+ ")_pub_sec.asc"; + KgpgCore::KgpgKey key = mCtx->getKeyDetails(*keyid); + QString fileString = key.name() + " " + key.email() + "(" + key.id()+ ")_pub_sec.asc"; QString fileName = QFileDialog::getSaveFileName(this, tr("Export Key To File"), fileString, tr("Key Files") + " (*.asc *.txt);;All Files (*)"); QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { @@ -205,10 +206,33 @@ void KeyDetailsDialog::exportPrivateKey() QTextStream stream(&file); stream << *keyArray; file.close(); - delete keyArray; + delete keyArray;*/ + KgpgCore::KgpgKey key = mCtx->getKeyDetails(*keyid); + QString fileString = key.name() + " " + key.email() + "(" + key.id()+ ")_pub_sec.asc"; + + QString fileName = QFileDialog::getSaveFileName(this, tr("Export Key To File"), fileString, tr("Key Files") + " (*.asc *.txt);;All Files (*)"); + + QStringList expopts; + expopts.append(QLatin1String( "--armor" )); + KGpgExport *exp = new KGpgExport(this, QStringList() << *keyid, fileName, expopts, true); + connect(exp, SIGNAL(done(int)), SLOT(slotExportPrivateKeyDone(int))); + exp->start(); } } +void KeyDetailsDialog::slotExportPrivateKeyDone(int result) { + KGpgExport *exp = qobject_cast<KGpgExport *>(sender()); + Q_ASSERT(exp != NULL); + + if (result == KGpgTransaction::TS_OK) { + qDebug() << "export seems ok"; + } else { + qDebug() << "Your key could not be exported\nCheck the key."; + } + + exp->deleteLater(); +} + QString KeyDetailsDialog::beautifyFingerprint(QString fingerprint) { uint len = fingerprint.length(); diff --git a/keydetailsdialog.h b/keydetailsdialog.h index 1079801..8863553 100644 --- a/keydetailsdialog.h +++ b/keydetailsdialog.h @@ -23,6 +23,7 @@ #define __KEYDETAILSDIALOG_H__ #include "gpgcontext.h" +#include "kgpg/core/kgpgkey.h" #include <gpgme.h> QT_BEGIN_NAMESPACE @@ -42,14 +43,7 @@ class KeyDetailsDialog : public QDialog Q_OBJECT public: - /** - * @details Constructor of this class - * - * @param ctx The current GpgME context - * @param key The key to show details of - * @param parent The parent of this widget - */ - KeyDetailsDialog(GpgME::GpgContext* ctx, gpgme_key_t key, QWidget *parent = 0); + KeyDetailsDialog(GpgME::GpgContext* ctx, KgpgCore::KgpgKey key, QWidget *parent = 0); /** * @details Return QString with a space inserted at every fourth character @@ -63,6 +57,7 @@ private slots: * @details Export the key to a file, which is choosen in a file dialog */ void exportPrivateKey(); + void slotExportPrivateKeyDone(int result); /** * @details Copy the fingerprint to clipboard diff --git a/keygendialog.cpp b/keygendialog.cpp index 998fa27..0778b0c 100644 --- a/keygendialog.cpp +++ b/keygendialog.cpp @@ -27,6 +27,7 @@ KeyGenDialog::KeyGenDialog(GpgME::GpgContext *ctx, QWidget *parent) { mCtx = ctx; buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + this->setWindowTitle(tr("Generate Key")); this->setModal(true); generateKeyDialog(); @@ -42,7 +43,6 @@ void KeyGenDialog::generateKeyDialog() keySizeSpinBox = new QSpinBox(this); keySizeSpinBox->setRange(768, 16384); keySizeSpinBox->setValue(2048); - this->lastKeySize=2048; keySizeSpinBox->setSingleStep(256); @@ -132,24 +132,13 @@ void KeyGenDialog::keyGenAccept() /** * create the string for key generation */ - - if (keyTypeComboBox->currentText() == "RSA") { - keyGenParams = "<GnupgKeyParms format=\"internal\">\n" - "Key-Type: RSA\n" - "Key-Usage: sign\n" - "Key-Length: " + keySizeSpinBox->cleanText() + "\n" - "Subkey-Type: RSA\n" - "Subkey-Length: " + keySizeSpinBox->cleanText() + "\n" - "Subkey-Usage: encrypt\n"; - } else { - keyGenParams = "<GnupgKeyParms format=\"internal\">\n" - "Key-Type: DSA\n" - "Key-Length: " + keySizeSpinBox->cleanText() + "\n" - "Subkey-Type: ELG-E\n" - "Subkey-Length: " - + keySizeSpinBox->cleanText() + "\n"; - } - keyGenParams += "Name-Real: " + nameEdit->text().toUtf8() + "\n"; + /*keyGenParams = "<GnupgKeyParms format=\"internal\">\n" + "Key-Type: DSA\n" + "Key-Length: 1024\n" + "Subkey-Type: ELG-E\n" + "Subkey-Length: " + + keySizeSpinBox->cleanText() + "\n" + "Name-Real: " + nameEdit->text().toUtf8() + "\n"; if (!(commentEdit->text().isEmpty())) { keyGenParams += "Name-Comment: " + commentEdit->text().toUtf8() + "\n"; } @@ -167,7 +156,20 @@ void KeyGenDialog::keyGenAccept() keyGenParams += "</GnupgKeyParms>"; KeyGenThread *kg = new KeyGenThread(keyGenParams, mCtx); - kg->start(); + kg->start();*/ + + + // TODO: expdate + KGpgGenerateKey *genkey = new KGpgGenerateKey(this, + nameEdit->text(), + emailEdit->text(), + commentEdit->text(), + KgpgCore::ALGO_RSA_RSA, + keySizeSpinBox->cleanText().toInt(), + 0, + 'd'); + + genkey->start(); this->accept(); @@ -186,7 +188,9 @@ void KeyGenDialog::keyGenAccept() dialog->show(); - while (kg->isRunning()) { + //genkey->thread()->isRunning() + + while (genkey->thread()->isRunning()) { QCoreApplication::processEvents(); } diff --git a/keygendialog.h b/keygendialog.h index 6d264c1..fb661c3 100644 --- a/keygendialog.h +++ b/keygendialog.h @@ -24,6 +24,7 @@ #include "keygenthread.h" #include "gpgcontext.h" +#include "kgpg/transactions/kgpggeneratekey.h" #include <QtGui> QT_BEGIN_NAMESPACE diff --git a/keymgmt.cpp b/keymgmt.cpp index 8bfc8c5..be17e48 100755 --- a/keymgmt.cpp +++ b/keymgmt.cpp @@ -155,26 +155,61 @@ void KeyMgmt::createToolBars() } -void KeyMgmt::importKeys(QByteArray inBuffer) + +// import for text based keys +void KeyMgmt::importKeys(QString text) +{ + KGpgImport *imp = new KGpgImport(this, text); + connect(imp, SIGNAL(done(int)), SLOT(slotImportDone(int))); + imp->start(); +} + +void KeyMgmt::slotImportDone(int result) { - GpgImportInformation result = mCtx->importKey(inBuffer); - new KeyImportDetailDialog(mCtx, result, this); + KGpgImport *import = qobject_cast<KGpgImport *>(sender()); + Q_ASSERT(import != NULL); + const QStringList rawmsgs(import->getMessages()); + + if (result != 0) { + /*KMessageBox::detailedSorry(this, i18n("Key importing failed. Please see the detailed log for more information."), + rawmsgs.join( QLatin1String( "\n")) , i18n("Key Import" ));*/ + qDebug() << "Key importing failed. Please see the detailed log for more information." << rawmsgs.join( QLatin1String( "\n")); + } + + QStringList keys(import->getImportedIds(0x1f)); + const bool needsRefresh = !keys.isEmpty(); + keys << import->getImportedIds(0); +/* + if (!keys.isEmpty()) { + const QString msg(import->getImportMessage()); + const QStringList keynames(import->getImportedKeys()); + + new KgpgDetailedInfo(this, msg, rawmsgs.join( QLatin1String( "\n") ), keynames, i18n("Key Import" )); + if (needsRefresh) + imodel->refreshKeys(keys); + else + changeMessage(i18nc("Application ready for user input", "Ready")); + } else{ + changeMessage(i18nc("Application ready for user input", "Ready")); + } +*/ + //changeMessage(tr("Application ready for user input", "Ready")); + mCtx->emitKeyDBChanged(); + import->deleteLater(); } void KeyMgmt::importKeyFromFile() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open Key"), "", tr("Key Files") + " (*.asc *.txt);;"+tr("Keyring files")+" (*.gpg);;All Files (*)"); if (! fileName.isNull()) { - QFile file; - file.setFileName(fileName); - if (!file.open(QIODevice::ReadOnly)) { - qDebug() << tr("Couldn't Open File: ") + fileName; - return; - } - QByteArray inBuffer = file.readAll(); - importKeys(inBuffer); - file.close(); + + QList<QUrl> urlList; + urlList << QUrl::fromLocalFile(fileName); + + KGpgImport *imp = new KGpgImport(this, urlList); + connect(imp, SIGNAL(done(int)), SLOT(slotImportDone(int))); + imp->start(); } } @@ -212,9 +247,9 @@ void KeyMgmt::deleteKeysWithWarning(QStringList *uidList) } QString keynames; foreach (QString uid, *uidList) { - keynames.append(QString::fromUtf8(mCtx->getKeyDetails(uid)->uids->name)); + keynames.append(mCtx->getKeyDetails(uid).name()); keynames.append("<i> <"); - keynames.append(QString::fromUtf8(mCtx->getKeyDetails(uid)->uids->email)); + keynames.append(mCtx->getKeyDetails(uid).email()); keynames.append("> </i><br/>"); } @@ -224,10 +259,28 @@ void KeyMgmt::deleteKeysWithWarning(QStringList *uidList) QMessageBox::No | QMessageBox::Yes); if (ret == QMessageBox::Yes) { - mCtx->deleteKeys(uidList); + //mCtx->deleteKeys(uidList); + KGpgDelKey *delkey = new KGpgDelKey(this, *uidList); + connect(delkey, SIGNAL(done(int)), SLOT(slotKeyDeleted(int))); + delkey->start(); } } +void KeyMgmt::slotKeyDeleted(int retcode) +{ + KGpgDelKey *delkey = qobject_cast<KGpgDelKey *>(sender()); + + /*KGpgKeyNode *delkey = m_delkey->keys().first(); + if (retcode == 0) { + KMessageBox::information(this, i18n("Key <b>%1</b> deleted.", delkey->getBeautifiedFingerprint()), i18n("Delete key")); + imodel->delNode(delkey); + } else { + KMessageBox::error(this, i18n("Deleting key <b>%1</b> failed.", delkey->getBeautifiedFingerprint()), i18n("Delete key")); + }*/ + mCtx->emitKeyDBChanged(); + delkey->deleteLater(); +} + void KeyMgmt::showKeyDetails() { if (mKeyList->getSelected()->isEmpty()) { @@ -235,7 +288,7 @@ void KeyMgmt::showKeyDetails() } // TODO: first...? - gpgme_key_t key = mCtx->getKeyDetails(mKeyList->getSelected()->first()); + KgpgCore::KgpgKey key = mCtx->getKeyDetails(mKeyList->getSelected()->first()); new KeyDetailsDialog(mCtx, key); } @@ -246,8 +299,8 @@ void KeyMgmt::exportKeyToFile() if (!mCtx->exportKeys(mKeyList->getChecked(), keyArray)) { return; } - gpgme_key_t key = mCtx->getKeyDetails(mKeyList->getChecked()->first()); - QString fileString = QString::fromUtf8(key->uids->name) + " " + QString::fromUtf8(key->uids->email) + "(" + QString(key->subkeys->keyid)+ ")_pub.asc"; + KgpgCore::KgpgKey key = mCtx->getKeyDetails(mKeyList->getChecked()->first()); + QString fileString = key.name() + " " + key.email() + "(" + key.id()+ ")_pub.asc"; QString fileName = QFileDialog::getSaveFileName(this, tr("Export Key To File"), fileString, tr("Key Files") + " (*.asc *.txt);;All Files (*)"); QFile file(fileName); @@ -28,6 +28,8 @@ #include "keyimportdetaildialog.h" #include "keyserverimportdialog.h" #include "keygendialog.h" +#include "kgpg/transactions/kgpgdelkey.h" +#include "kgpg/transactions/kgpgimport.h" #include <QtGui> QT_BEGIN_NAMESPACE @@ -44,7 +46,7 @@ class KeyMgmt : public QMainWindow Q_OBJECT public: - KeyMgmt(GpgME::GpgContext* ctx, QWidget *parent = 0); + KeyMgmt(GpgME::GpgContext *ctx, QWidget *parent); QAction *importKeyFromClipboardAct; QAction *importKeyFromFileAct; QAction *importKeyFromKeyServerAct; @@ -53,13 +55,15 @@ public slots: void importKeyFromFile(); void importKeyFromClipboard(); void importKeyFromKeyServer(); - void importKeys(QByteArray inBuffer); + void importKeys(QString text); + void slotImportDone(int result); void exportKeyToFile(); void exportKeyToClipboard(); void deleteSelectedKeys(); void deleteCheckedKeys(); void generateKeyDialog(); void showKeyDetails(); + void slotKeyDeleted(int retcode); signals: void statusBarChanged(QString); diff --git a/keyserverimportdialog.cpp b/keyserverimportdialog.cpp index 7118676..877e5d5 100644 --- a/keyserverimportdialog.cpp +++ b/keyserverimportdialog.cpp @@ -21,6 +21,7 @@ */ #include "keyserverimportdialog.h" +#include "keymgmt.h" KeyServerImportDialog::KeyServerImportDialog(GpgME::GpgContext *ctx, KeyList *keyList, QWidget *parent) : QDialog(parent) @@ -308,6 +309,44 @@ void KeyServerImportDialog::importFinished() void KeyServerImportDialog::importKeys(QByteArray inBuffer) { - GpgImportInformation result = mCtx->importKey(inBuffer); - new KeyImportDetailDialog(mCtx, result, this); + //GpgImportInformation result = mCtx->importKey(inBuffer); + KGpgImport *imp = new KGpgImport(this, QString(inBuffer)); + connect(imp, SIGNAL(done(int)), SLOT(slotImportDone(int))); + imp->start(); + +} + +void KeyServerImportDialog::slotImportDone(int result) +{ + KGpgImport *import = qobject_cast<KGpgImport *>(sender()); + + Q_ASSERT(import != NULL); + const QStringList rawmsgs(import->getMessages()); + + if (result != 0) { + /*KMessageBox::detailedSorry(this, i18n("Key importing failed. Please see the detailed log for more information."), + rawmsgs.join( QLatin1String( "\n")) , i18n("Key Import" ));*/ + qDebug() << "Key importing failed. Please see the detailed log for more information." << rawmsgs.join( QLatin1String( "\n")); + } + + QStringList keys(import->getImportedIds(0x1f)); + const bool needsRefresh = !keys.isEmpty(); + keys << import->getImportedIds(0); +/* + if (!keys.isEmpty()) { + const QString msg(import->getImportMessage()); + const QStringList keynames(import->getImportedKeys()); + + new KgpgDetailedInfo(this, msg, rawmsgs.join( QLatin1String( "\n") ), keynames, i18n("Key Import" )); + if (needsRefresh) + imodel->refreshKeys(keys); + else + changeMessage(i18nc("Application ready for user input", "Ready")); + } else{ + changeMessage(i18nc("Application ready for user input", "Ready")); + } +*/ + //changeMessage(tr("Application ready for user input", "Ready")); + mCtx->emitKeyDBChanged(); + import->deleteLater(); } diff --git a/keyserverimportdialog.h b/keyserverimportdialog.h index 5f98d8f..801a7df 100644 --- a/keyserverimportdialog.h +++ b/keyserverimportdialog.h @@ -58,7 +58,7 @@ public: private slots: void import(); - + void slotImportDone(int result); void searchFinished(); void importFinished(); void search(); diff --git a/kgpg/core/KGpgExpandableNode.cpp b/kgpg/core/KGpgExpandableNode.cpp new file mode 100644 index 0000000..4cf9607 --- /dev/null +++ b/kgpg/core/KGpgExpandableNode.cpp @@ -0,0 +1,88 @@ +/* Copyright 2008,2009,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgExpandableNode.h" + +//#include "kgpgsettings.h" +#include "convert.h" +//#include "model/kgpgitemmodel.h" + +//#include <KLocale> + +KGpgExpandableNode::KGpgExpandableNode(KGpgExpandableNode *parent) + : KGpgNode(parent) +{ + if (parent != NULL) + parent->children.append(this); +} + +KGpgExpandableNode::~KGpgExpandableNode() +{ + for (int i = children.count() - 1; i >= 0; i--) + delete children[i]; +} + +KGpgNode * +KGpgExpandableNode::getChild(const int index) const +{ + if ((index < 0) || (index > children.count())) + return NULL; + return children.at(index); +} + +int +KGpgExpandableNode::getChildCount() +{ + if (children.count() == 0) + readChildren(); + + return children.count(); +} + +bool +KGpgExpandableNode::hasChildren() const +{ + return (children.count() != 0); +} + +bool +KGpgExpandableNode::wasExpanded() const +{ + return (children.count() != 0); +} + +const +KGpgNode::List & +KGpgExpandableNode::getChildren() const +{ + return children; +} + +int +KGpgExpandableNode::getChildIndex(KGpgNode *node) const +{ + return children.indexOf(node); +} + +void +KGpgExpandableNode::deleteChild(KGpgNode *child) +{ + children.removeAll(child); +} + +//#include "KGpgExpandableNode.moc" diff --git a/kgpg/core/KGpgExpandableNode.h b/kgpg/core/KGpgExpandableNode.h new file mode 100644 index 0000000..39f351d --- /dev/null +++ b/kgpg/core/KGpgExpandableNode.h @@ -0,0 +1,85 @@ +/* Copyright 2008,2009,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGEXPANDABLENODE_H +#define KGPGEXPANDABLENODE_H + +#include "KGpgNode.h" + +class KGpgSubkeyNode; +class KGpgRefNode; + +/** + * @brief The abstract base class for all classes that may have child objects + * + * Every class that represents something in the keyring that may have + * child objects inherits from this class. That does not mean that every + * child object always has children, but every child \em may have children. + */ +class KGpgExpandableNode : public KGpgNode +{ + Q_OBJECT + + friend class KGpgRefNode; + friend class KGpgSubkeyNode; +protected: + KGpgNode::List children; + + /** + * reimplemented in every base class to read in the child data + * + * This allows the child objects to delay the loading of the + * child objects until they are really needed to avoid time + * consuming operations for data never used. + */ + virtual void readChildren() = 0; + + explicit KGpgExpandableNode(KGpgExpandableNode *parent = NULL); +public: + virtual ~KGpgExpandableNode(); + + /** + * check if there are any child nodes + * + * The default implementation returns true if any child nodes were loaded. + * This may be reimplemented by child classes so they can indicate that + * there are child nodes before actually loading them. + * + * This method indicates if there are children if this node is expanded. + * In contrast wasExpanded() will only return true if the child nodes + * are actually present in memory. + */ + virtual bool hasChildren() const; + /** + * check if there are any child nodes present in memory + * + * Returns true if any child nodes were loaded. + * + * This method indicates if the children of this node are already loaded + * into memory. In contrast hasChildren() may return true even if the child + * objects are not present in memory. + */ + virtual bool wasExpanded() const; + virtual int getChildCount(); + virtual const KGpgNode::List &getChildren() const; + virtual KGpgNode *getChild(const int index) const; + virtual int getChildIndex(KGpgNode *node) const; + virtual void deleteChild(KGpgNode *child); +}; + +#endif /* KGPGEXPANDABLENODE_H */ diff --git a/kgpg/core/KGpgGroupMemberNode.cpp b/kgpg/core/KGpgGroupMemberNode.cpp new file mode 100644 index 0000000..e7a9f97 --- /dev/null +++ b/kgpg/core/KGpgGroupMemberNode.cpp @@ -0,0 +1,100 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgGroupMemberNode.h" + +#include <QDateTime> + +#include "KGpgGroupNode.h" +#include "KGpgKeyNode.h" + +KGpgGroupMemberNode::KGpgGroupMemberNode(KGpgGroupNode *parent, const QString &k) + : KGpgRefNode(parent, k) +{ +} + +KGpgGroupMemberNode::KGpgGroupMemberNode(KGpgGroupNode *parent, KGpgKeyNode *k) + : KGpgRefNode(parent, k) +{ +} + +KGpgGroupMemberNode::~KGpgGroupMemberNode() +{ +} + +KgpgKeyTrust +KGpgGroupMemberNode::getTrust() const +{ + if (m_keynode != NULL) + return m_keynode->getTrust(); + return KgpgCore::TRUST_NOKEY; +} + +KgpgItemType +KGpgGroupMemberNode::getType() const +{ + if (m_keynode != NULL) + return m_keynode->getType() | KgpgCore::ITYPE_GROUP; + return KgpgCore::ITYPE_PUBLIC | KgpgCore::ITYPE_GROUP; +} + +QString +KGpgGroupMemberNode::getSize() const +{ + if (m_keynode != NULL) + return m_keynode->getSize(); + return QString(); +} + +QDateTime +KGpgGroupMemberNode::getExpiration() const +{ + if (m_keynode != NULL) + return m_keynode->getExpiration(); + return QDateTime(); +} + +QDateTime +KGpgGroupMemberNode::getCreation() const +{ + if (m_keynode != NULL) + return m_keynode->getCreation(); + return QDateTime(); +} + +unsigned int +KGpgGroupMemberNode::getSignKeySize() const +{ + if (m_keynode != NULL) + return m_keynode->getSignKeySize(); + return 0; +} + +unsigned int +KGpgGroupMemberNode::getEncryptionKeySize() const +{ + if (m_keynode != NULL) + return m_keynode->getEncryptionKeySize(); + return 0; +} + +KGpgGroupNode * +KGpgGroupMemberNode::getParentKeyNode() const +{ + return m_parent->toGroupNode(); +} diff --git a/kgpg/core/KGpgGroupMemberNode.h b/kgpg/core/KGpgGroupMemberNode.h new file mode 100644 index 0000000..2a456ef --- /dev/null +++ b/kgpg/core/KGpgGroupMemberNode.h @@ -0,0 +1,61 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGGROUPMEMBERNODE_H +#define KGPGGROUPMEMBERNODE_H + +#include "KGpgRefNode.h" + +#include <QPixmap> +#include "kgpgkey.h" + +using namespace KgpgCore; + +class KGpgKeyNode; +class KGpgGroupNode; + +/** + * @brief A member of a GnuPG group + */ +class KGpgGroupMemberNode : public KGpgRefNode +{ +public: + explicit KGpgGroupMemberNode(KGpgGroupNode *parent, const QString &k); + explicit KGpgGroupMemberNode(KGpgGroupNode *parent, KGpgKeyNode *k); + virtual ~KGpgGroupMemberNode(); + + virtual KgpgCore::KgpgKeyTrust getTrust() const; + virtual KgpgCore::KgpgItemType getType() const; + virtual QString getSize() const; + virtual QDateTime getExpiration() const; + virtual QDateTime getCreation() const; + virtual KGpgGroupNode *getParentKeyNode() const; + + /** + * Returns the size of the signing key. + * @return signing key size in bits + */ + virtual unsigned int getSignKeySize() const; + /** + * Returns the size of the first encryption subkey. + * @return encryption key size in bits + */ + virtual unsigned int getEncryptionKeySize() const; +}; + +#endif /* KGPGGROUPMEMBERNODE_H */ diff --git a/kgpg/core/KGpgGroupNode.cpp b/kgpg/core/KGpgGroupNode.cpp new file mode 100644 index 0000000..3475303 --- /dev/null +++ b/kgpg/core/KGpgGroupNode.cpp @@ -0,0 +1,279 @@ +/* Copyright 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgGroupNode.h" + +#include "KGpgGroupMemberNode.h" +#include "KGpgRootNode.h" +//#include "kgpgsettings.h" + +#include <QDebug> +//#include <KLocale> +#include <QFile> +#include <QStringList> +#include <QTextStream> + +class KGpgGroupNodePrivate { +public: + KGpgGroupNodePrivate(const QString &name); + + QString m_name; + + /** + * @brief find the line that defines this group in the configuration + * @param conffile file object (will be initialized) + * @param stream text stream (will be initialized and connected to conffile) + * @param lines the lines found in conffile (will be filled) + * @return the index in lines of the entry defining this group + * @retval -1 no entry defining this group was found + * + * stream will be positioned at the beginning. + */ + int findGroupEntry(QFile &conffile, QTextStream &stream, QStringList &lines); + + static const QRegExp &groupPattern(); + static const QString &groupTag(); +}; + +KGpgGroupNodePrivate::KGpgGroupNodePrivate(const QString &name) + : m_name(name) +{ +} + +int +KGpgGroupNodePrivate::findGroupEntry(QFile &conffile, QTextStream &stream, QStringList &lines) +{ + //conffile.setFileName(KGpgSettings::gpgConfigPath()); + conffile.setFileName(""); + + if (!conffile.exists()) + return -1; + + if (!conffile.open(QIODevice::ReadWrite)) + return -1; + + stream.setDevice(&conffile); + int index = -1; + int i = -1; + + while (!stream.atEnd()) { + const QString rawLine = stream.readLine(); + i++; + QString parsedLine = rawLine.simplified().section(QLatin1Char('#'), 0, 0); + + if (groupPattern().exactMatch(parsedLine)) { + // remove "group " + parsedLine = parsedLine.remove(0, 6); + if (parsedLine.startsWith(m_name)) { + if (parsedLine.mid(m_name.length()).simplified().startsWith(QLatin1Char('='))) { + if (index >= 0) { + // multiple definitions of the same group, drop the second one + continue; + } else { + index = i; + } + } + } + } + + lines << rawLine; + } + + stream.seek(0); + + return index; +} + +const QRegExp & +KGpgGroupNodePrivate::groupPattern() +{ + static const QRegExp groupre(QLatin1String("^group [^ ]+ ?= ?([0-9a-fA-F]{8,} ?)*$")); + + return groupre; +} + +const QString & +KGpgGroupNodePrivate::groupTag() +{ + static const QString grouptag(QLatin1String("group ")); + + return grouptag; +} + +KGpgGroupNode::KGpgGroupNode(KGpgRootNode *parent, const QString &name, const QStringList &members) + : KGpgExpandableNode(parent), + d_ptr(new KGpgGroupNodePrivate(name)) +{ + foreach (const QString &id, members) + new KGpgGroupMemberNode(this, id); + + parent->m_groups++; +} + +KGpgGroupNode::KGpgGroupNode(KGpgRootNode *parent, const QString &name, const KGpgKeyNode::List &members) + : KGpgExpandableNode(parent), + d_ptr(new KGpgGroupNodePrivate(name)) +{ + Q_ASSERT(members.count() > 0); + + foreach (KGpgKeyNode *nd, members) + new KGpgGroupMemberNode(this, nd); + + parent->m_groups++; +} + +KGpgGroupNode::~KGpgGroupNode() +{ + KGpgRootNode *root = m_parent->toRootNode(); + + if (root != NULL) + root->m_groups--; +} + +KgpgCore::KgpgItemType +KGpgGroupNode::getType() const +{ + return ITYPE_GROUP; +} + +QString +KGpgGroupNode::getName() const +{ + const Q_D(KGpgGroupNode); + + return d->m_name; +} + +QString +KGpgGroupNode::getSize() const +{ + return tr("1 key", "%1 keys").arg(children.count()); +} + +void +KGpgGroupNode::readChildren() +{ +} + +void +KGpgGroupNode::rename(const QString &newName) +{ + Q_D(KGpgGroupNode); + + QFile conffile; + QTextStream t; + QStringList lines; + int index = d->findGroupEntry(conffile, t, lines); + + // check if file opening failed + if (!t.device()) + return; + + if (index < 0) { + qDebug() << "Group " << d->m_name << " not renamed, group does not exist"; + return; + } + + // 6 = groupTag().length() + const QString values = lines[index].simplified().mid(6 + d->m_name.length()); + lines[index] = d->groupTag() + newName + QLatin1Char(' ') + values; + + conffile.resize(0); + t << lines.join(QLatin1String("\n")) + QLatin1Char('\n'); + + d->m_name = newName; +} + +void +KGpgGroupNode::saveMembers() +{ + Q_D(KGpgGroupNode); + + QFile conffile; + QTextStream t; + QStringList lines; + int index = d->findGroupEntry(conffile, t, lines); + + // check if file opening failed + if (!t.device()) + return; + + QStringList memberIds; + + for (int j = getChildCount() - 1; j >= 0; j--) + memberIds << getChild(j)->toGroupMemberNode()->getId(); + + const QString groupEntry = d->groupTag() + d->m_name + QLatin1String(" = ") + + memberIds.join(QLatin1String(" ")); + + if (index >= 0) + lines[index] = groupEntry; + else + lines << groupEntry; + + conffile.resize(0); + t << lines.join(QLatin1String("\n")) + QLatin1Char('\n'); +} + +void +KGpgGroupNode::remove() +{ + Q_D(KGpgGroupNode); + + QFile conffile; + QTextStream t; + QStringList lines; + int index = d->findGroupEntry(conffile, t, lines); + + // check if file opening failed + if (!t.device()) + return; + + if (index < 0) + return; + + lines.removeAt(index); + conffile.resize(0); + t << lines.join(QLatin1String("\n")) + QLatin1Char('\n'); +} + +QStringList +KGpgGroupNode::readGroups() +{ + QStringList groups; + //QFile qfile(KGpgSettings::gpgConfigPath()); + QFile qfile(""); + + if (!qfile.exists() || !qfile.open(QIODevice::ReadOnly)) + return groups; + + QTextStream t(&qfile); + + while (!t.atEnd()) { + QString line = t.readLine().simplified().section(QLatin1Char('#'), 0, 0); + if (!KGpgGroupNodePrivate::groupPattern().exactMatch(line)) + continue; + + // remove the "group " at the start + line.remove(0, 6); + // transform it in a simple space separated list + groups.append(line.replace(QLatin1Char('='), QLatin1Char(' ')).simplified()); + } + + return groups; +} diff --git a/kgpg/core/KGpgGroupNode.h b/kgpg/core/KGpgGroupNode.h new file mode 100644 index 0000000..5aca837 --- /dev/null +++ b/kgpg/core/KGpgGroupNode.h @@ -0,0 +1,84 @@ +/* Copyright 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGGROUPNODE_H +#define KGPGGROUPNODE_H + +#include "KGpgExpandableNode.h" +#include "KGpgKeyNode.h" + +class QString; +class QStringList; + +class KGpgGroupNodePrivate; + +/** + * @brief A GnuPG group of public keys + */ +class KGpgGroupNode : public KGpgExpandableNode +{ +private: + KGpgGroupNodePrivate * const d_ptr; + Q_DECLARE_PRIVATE(KGpgGroupNode) + Q_DISABLE_COPY(KGpgGroupNode) + +protected: + virtual void readChildren(); + +public: + KGpgGroupNode(KGpgRootNode *parent, const QString &name, const QStringList &members); + KGpgGroupNode(KGpgRootNode *parent, const QString &name, const KGpgKeyNode::List &members); + virtual ~KGpgGroupNode(); + + virtual KgpgCore::KgpgItemType getType() const; + /** + * Return size of group + * + * @return the number of keys in this group + */ + virtual QString getSize() const; + virtual QString getName() const; + + /** + * Rename this group node + * + * @param newName new name of the group + */ + void rename(const QString &newName); + + /** + * Write the current members to GnuPG config file + */ + void saveMembers(); + + /** + * Remove this group from the GnuPG config file + */ + void remove(); + + /** + * @brief get all groups from GnuPG config file + * @return list of groups names and their keys + * + * The strings are themself space separated list. The first entry is the + * group name, the others are the keys inside + */ + static QStringList readGroups(); +}; + +#endif /* KGPGGROUPNODE_H */ diff --git a/kgpg/core/KGpgKeyNode.cpp b/kgpg/core/KGpgKeyNode.cpp new file mode 100644 index 0000000..4e5fb55 --- /dev/null +++ b/kgpg/core/KGpgKeyNode.cpp @@ -0,0 +1,358 @@ +/* Copyright 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgKeyNode.h" + +#include "KGpgGroupMemberNode.h" +#include "KGpgRootNode.h" +#include "KGpgSubkeyNode.h" +#include "KGpgUatNode.h" +#include "KGpgUidNode.h" +#include "convert.h" +#include "../kgpginterface.h" +//#include "kgpgsettings.h" +//#include "model/kgpgitemmodel.h" + +//#include <KLocale> + +KGpgKeyNode::KGpgKeyNode(KGpgRootNode *parent, const KgpgCore::KgpgKey &k) + : KGpgSignableNode(parent), + m_key(new KgpgCore::KgpgKey(k)), + m_signs(0) +{ +} + +KGpgKeyNode::~KGpgKeyNode() +{ + foreach (KGpgRefNode *nd, m_refs) { + nd->unRef(m_parent->toRootNode()); + } +} + +KgpgCore::KgpgItemType +KGpgKeyNode::getType() const +{ + return getType(m_key); +} + +bool +KGpgKeyNode::hasChildren() const +{ + return true; +} + +KgpgCore::KgpgItemType +KGpgKeyNode::getType(const KgpgCore::KgpgKey *k) +{ + if (k->secret()) + return KgpgCore::ITYPE_PAIR; + + return KgpgCore::ITYPE_PUBLIC; +} + +KgpgCore::KgpgKeyTrust +KGpgKeyNode::getTrust() const +{ + return m_key->trust(); +} + +const QString & +KGpgKeyNode::getFingerprint() const +{ + return m_key->fingerprint(); +} + +QString +KGpgKeyNode::getSize() const +{ + return "size of signing key / size of encryption key", + "%1 / %2", QString::number(getSignKeySize()), + QString::number(getEncryptionKeySize()); +} + +QString +KGpgKeyNode::getName() const +{ + return m_key->name(); +} + +QString +KGpgKeyNode::getEmail() const +{ + return m_key->email(); +} + +QDateTime +KGpgKeyNode::getExpiration() const +{ + return m_key->expirationDate(); +} + +QDateTime +KGpgKeyNode::getCreation() const +{ + return m_key->creationDate(); +} + +QString +KGpgKeyNode::getId() const +{ + return m_key->fullId(); +} + +KGpgKeyNode * +KGpgKeyNode::getKeyNode(void) +{ + return this; +} + +bool +KGpgKeyNode::isSecret() const +{ + return m_key->secret(); +} + +const KGpgKeyNode * +KGpgKeyNode::getKeyNode(void) const +{ + return this; +} + +QString +KGpgKeyNode::getBeautifiedFingerprint() const +{ + return m_key->fingerprintBeautified(); +} + +QString +KGpgKeyNode::getComment() const +{ + return m_key->comment(); +} + +void +KGpgKeyNode::readChildren() +{ + KgpgInterface::readSignatures(this); + + m_signs = 0; + foreach(KGpgNode *n, children) + if (n->getType() == ITYPE_SIGN) + m_signs++; +} + +QString +KGpgKeyNode::getSignCount() const +{ + if (!wasExpanded()) + return QString(); + //return i18np("1 signature", "%1 signatures", m_signs); + return "TODO"; +} + +KgpgKey * +KGpgKeyNode::copyKey() const +{ + return new KgpgKey(*m_key); +} + +void +KGpgKeyNode::setKey(const KgpgKey &key) +{ + Q_ASSERT(m_key->fingerprint() == key.fingerprint()); + delete m_key; + + for (int i = 0; i < children.count(); i++) + delete children.at(i); + children.clear(); + + m_key = new KgpgKey(key); +} + +const KgpgKey * +KGpgKeyNode::getKey() const +{ + return m_key; +} + +unsigned int +KGpgKeyNode::getSignKeySize() const +{ + return m_key->size(); +} + +unsigned int +KGpgKeyNode::getEncryptionKeySize() const +{ + return m_key->encryptionSize(); +} + +void +KGpgKeyNode::addRef(KGpgRefNode *node) +{ + Q_ASSERT(m_refs.indexOf(node) == -1); + m_refs.append(node); +} + +void +KGpgKeyNode::delRef(KGpgRefNode *node) +{ + Q_ASSERT(m_refs.indexOf(node) != -1); + m_refs.removeOne(node); + Q_ASSERT(m_refs.indexOf(node) == -1); +} + +QList<KGpgGroupNode *> +KGpgKeyNode::getGroups(void) const +{ + QList<KGpgGroupNode *> ret; + + foreach (KGpgGroupMemberNode *gnd, getGroupRefs()) + ret.append(gnd->getParentKeyNode()); + + return ret; +} + +QList<KGpgRefNode *> +KGpgKeyNode::getRefsOfType(const KgpgItemType &type) const +{ + QList<KGpgRefNode *> ret; + + foreach (KGpgRefNode *nd, m_refs) { + if (nd->getType() & type) + ret.append(nd); + } + + return ret; +} + +QList<KGpgGroupMemberNode *> +KGpgKeyNode::getGroupRefs(void) const +{ + QList<KGpgGroupMemberNode *> ret; + + foreach (KGpgRefNode *rn, getRefsOfType(KgpgCore::ITYPE_GROUP)) + ret.append(rn->toGroupMemberNode()); + + return ret; +} + +KGpgSignNode::List +KGpgKeyNode::getSignRefs(void) const +{ + KGpgSignNode::List ret; + + QList<KGpgRefNode *> refs = getRefsOfType(KgpgCore::ITYPE_SIGN); + + foreach (KGpgRefNode *rn, refs) + ret.append(rn->toSignNode()); + + return ret; +} + +KGpgSignNode::List +KGpgKeyNode::getSignatures(const bool subkeys) const +{ + KGpgSignNode::List ret = KGpgSignableNode::getSignatures(); + + if (!subkeys) + return ret; + + foreach (KGpgNode *child, children) { + KGpgSignNode::List tmp; + + switch (child->getType()) { + case KgpgCore::ITYPE_UID: + case KgpgCore::ITYPE_UAT: + tmp = child->toSignableNode()->getSignatures(); + break; + default: + continue; + } + + foreach (KGpgSignNode *sn, tmp) { + bool found = false; + const QString snid(sn->getId()); + + foreach (const KGpgSignNode *retsn, ret) { + found = (retsn->getId() == snid); + if (found) + break; + } + + if (!found) + ret << sn; + } + } + + return ret; +} + +const KGpgSignableNode * +KGpgKeyNode::getUid(const unsigned int index) const +{ + Q_ASSERT(index > 0); + + if (index == 1) + return this; + + const QString idxstr(QString::number(index)); + + foreach (const KGpgNode *child, children) { + KGpgSignNode::List tmp; + + switch (child->getType()) { + case KgpgCore::ITYPE_UID: + case KgpgCore::ITYPE_UAT: + if (child->getId() == idxstr) + return child->toSignableNode(); + break; + default: + continue; + } + } + + return NULL; +} + +bool +KGpgKeyNode::compareId(const QString &other) const +{ + if (other.length() == m_key->fullId().length()) + return (other.compare(m_key->fullId(), Qt::CaseInsensitive) == 0); + + if (other.length() == m_key->fingerprint().length()) + return (other.compare(m_key->fingerprint(), Qt::CaseInsensitive) == 0); + + const QString comId = m_key->fullId().isEmpty() ? m_key->fingerprint() : m_key->fullId(); + + return (other.right(comId.length()).compare( + comId.right(other.length()), + Qt::CaseInsensitive) == 0); +} + +void +KGpgKeyNode::expand() +{ + if (!wasExpanded()) + readChildren(); + + emit expanded(); +} + +//#include "KGpgKeyNode.moc" diff --git a/kgpg/core/KGpgKeyNode.h b/kgpg/core/KGpgKeyNode.h new file mode 100644 index 0000000..caf0ba4 --- /dev/null +++ b/kgpg/core/KGpgKeyNode.h @@ -0,0 +1,191 @@ +/* Copyright 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGKEYNODE_H +#define KGPGKEYNODE_H + +#include "KGpgSignableNode.h" +#include "KGpgSignNode.h" + +#include "kgpgkey.h" + +class KGpgExpandableNode; +class KGpgRefNode; + +/** + * @brief A public key with or without corresponding secret key + */ +class KGpgKeyNode : public KGpgSignableNode +{ + Q_OBJECT + + friend class KGpgGroupMemberNode; + +private: + KgpgCore::KgpgKey *m_key; + int m_signs; + +protected: + virtual void readChildren(); + + QList<KGpgRefNode *> m_refs; + QList<KGpgRefNode *> getRefsOfType(const KgpgCore::KgpgItemType &type) const; + +public: + typedef QList<KGpgKeyNode *> List; + typedef QList<const KGpgKeyNode *> ConstList; + + explicit KGpgKeyNode(KGpgRootNode *parent, const KgpgCore::KgpgKey &k); + virtual ~KGpgKeyNode(); + + virtual bool hasChildren() const; + + static KgpgCore::KgpgItemType getType(const KgpgCore::KgpgKey *k); + + virtual KgpgCore::KgpgItemType getType() const; + virtual KgpgCore::KgpgKeyTrust getTrust() const; + const QString &getFingerprint() const; + virtual QString getSize() const; + virtual QString getName() const; + virtual QString getEmail() const; + virtual QDateTime getExpiration() const; + virtual QDateTime getCreation() const; + virtual QString getId() const; + virtual KGpgKeyNode *getKeyNode(void); + virtual const KGpgKeyNode *getKeyNode(void) const; + /** + * @brief Return if this key has a private key + */ + bool isSecret() const; + /** + * @brief Print the full key fingerprint with spaces inserted + * + * For display purposes you normally don't want to print the full + * fingerprint as is because it's too many hex characters at once. + * This function returns the fingerprint in the format usually used + * for printing this out, i.e. with a space after each fourth hex + * character. + * + * @return the full fingerprint with spaces inserted + */ + QString getBeautifiedFingerprint() const; + virtual QString getComment() const; + /** + * @brief Return the number of signatures of the primary user id + * + * This is different from the number of children of this node as there + * is usually at least one subkey and there may also be additional + * user ids or attributes. This does not count the signatures to those + * slave objects, only the ones that are direct children of this node. + * + * @return the number of signatures to the primary user id + */ + virtual QString getSignCount() const; + /** + * @brief Creates a copy of the KgpgKey that belongs to this class + */ + virtual KgpgCore::KgpgKey *copyKey() const; + /** + * @brief Replaces the current key information with the new one. + * All sub-items (i.e. signatures, user ids ...) will be deleted. This must + * only be used when the id of both new and old key is the same. + */ + void setKey(const KgpgCore::KgpgKey &key); + /** + * @brief Returns a reference to the key used in this object. + * This allows direct access to the values of the key e.g. for KgpgKeyInfo. + */ + const KgpgCore::KgpgKey *getKey() const; + + /** + * @brief Returns the size of the signing key. + * @return signing key size in bits + */ + virtual unsigned int getSignKeySize() const; + /** + * @brief Returns the size of the first encryption subkey. + * @return encryption key size in bits + */ + virtual unsigned int getEncryptionKeySize() const; + /** + * @brief Notify this key that a KGpgRefNode now references this key. + * @param node object that takes the reference + */ + void addRef(KGpgRefNode *node); + /** + * @brief Remove a reference to this object + * @param node node that no longer has the reference + * + * Note that this must not be called as reply when this object + * emits updated(NULL) + */ + void delRef(KGpgRefNode *node); + /** + * @brief returns a list of all groups this key is member of + */ + QList<KGpgGroupNode *> getGroups(void) const; + /** + * @brief returns a list of all group member nodes that reference this key + */ + QList<KGpgGroupMemberNode *> getGroupRefs(void) const; + /** + * @brief returns a list of all sign nodes that reference this key + */ + KGpgSignNode::List getSignRefs(void) const; + /** + * @brief returns a list of signatures to this key + * @param subkeys if signatures on subkeys should be included + */ + KGpgSignNode::List getSignatures(const bool subkeys) const; + /** + * @brief get the user id or user attribute with the given number + * @param index the index of the user id to return + * @return the requested subitem or NULL if that is not present + * + * User ids indexes are 1-based, so 0 is not a valid index. Passing + * 1 as index will return the object itself, representing the primary + * user id. + */ + const KGpgSignableNode *getUid(const unsigned int index) const; + + /** + * @brief compare the id of this node to the given other node + * @param other key id to compare to + * @return if ids are identical + * + * This handles different length of the id string. + */ + bool compareId(const QString &other) const; +Q_SIGNALS: + void expanded(); + +public slots: + /** + * @brief read all subitems + * + * This will read in all subitems (e.g. subkeys, signatures). When + * this is done the expanded() signal is emitted. The signal is emitted + * immediately if the key has been expanded before. + * + * This will not update the child items in case they are already present. + * Use KGpgItemModel::refreshKey() instead. + */ + void expand(); +}; + +#endif /* KGPGKEYNODE_H */ diff --git a/kgpg/core/KGpgNode.cpp b/kgpg/core/KGpgNode.cpp new file mode 100644 index 0000000..18645f8 --- /dev/null +++ b/kgpg/core/KGpgNode.cpp @@ -0,0 +1,337 @@ +/* Copyright 2008,2009,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgNode.h" + +#include "KGpgGroupMemberNode.h" +#include "KGpgGroupNode.h" +#include "KGpgOrphanNode.h" +#include "KGpgRootNode.h" +#include "KGpgSubkeyNode.h" +#include "KGpgUatNode.h" +#include "KGpgUidNode.h" +//#include "model/kgpgitemmodel.h" + +//#include <KLocale> + +KGpgNode::KGpgNode(KGpgExpandableNode *parent) + : QObject(), m_parent(parent) +{ +/* if (parent == NULL) + m_model = NULL; + else + m_model = parent->m_model; +*/ +} + +KGpgNode::~KGpgNode() +{ +/* Q_ASSERT(m_model); + m_model->invalidateIndexes(this); +*/ + if (m_parent != NULL) + m_parent->deleteChild(this); +} + +QString +KGpgNode::getNameComment() const +{ + if (getComment().isEmpty()) + return getName(); + else + return tr("Name of uid (comment) %1 (%2)").arg(getName()).arg(getComment()); + //return QString("Name of uid (comment)", "%1 (%2)", getName(), getComment()); +} + +KGpgExpandableNode * +KGpgNode::toExpandableNode() +{ + Q_ASSERT(((getType() & KgpgCore::ITYPE_GROUP) && !(getType() & KgpgCore::ITYPE_PAIR)) || + (getType() & (KgpgCore::ITYPE_PAIR | KgpgCore::ITYPE_SUB | KgpgCore::ITYPE_UID | KgpgCore::ITYPE_UAT))); + + return qobject_cast<KGpgExpandableNode *>(this); +} + +const KGpgExpandableNode * +KGpgNode::toExpandableNode() const +{ + Q_ASSERT(((getType() & KgpgCore::ITYPE_GROUP) && !(getType() & KgpgCore::ITYPE_PAIR)) || + (getType() & (KgpgCore::ITYPE_PAIR | KgpgCore::ITYPE_SUB | KgpgCore::ITYPE_UID | KgpgCore::ITYPE_UAT))); + + return qobject_cast<const KGpgExpandableNode *>(this); +} + +KGpgSignableNode * +KGpgNode::toSignableNode() +{ + Q_ASSERT(getType() & (KgpgCore::ITYPE_PAIR | KgpgCore::ITYPE_SUB | KgpgCore::ITYPE_UID | KgpgCore::ITYPE_UAT)); + + return qobject_cast<KGpgSignableNode *>(this); +} + +const KGpgSignableNode * +KGpgNode::toSignableNode() const +{ + Q_ASSERT(getType() & (KgpgCore::ITYPE_PAIR | KgpgCore::ITYPE_SUB | KgpgCore::ITYPE_UID | KgpgCore::ITYPE_UAT)); + + return qobject_cast<const KGpgSignableNode *>(this); +} + +KGpgKeyNode * +KGpgNode::toKeyNode() +{ + Q_ASSERT(getType() & KgpgCore::ITYPE_PAIR); + Q_ASSERT(!(getType() & KgpgCore::ITYPE_GROUP)); + + return qobject_cast<KGpgKeyNode *>(this); +} + +const KGpgKeyNode * +KGpgNode::toKeyNode() const +{ + Q_ASSERT(getType() & KgpgCore::ITYPE_PAIR); + Q_ASSERT(!(getType() & KgpgCore::ITYPE_GROUP)); + + return qobject_cast<const KGpgKeyNode *>(this); +} + +KGpgRootNode * +KGpgNode::toRootNode() +{ + Q_ASSERT((m_parent == NULL) && (getType() == 0)); + + return static_cast<KGpgRootNode *>(this)->asRootNode(); +} + +const KGpgRootNode * +KGpgNode::toRootNode() const +{ + Q_ASSERT((m_parent == NULL) && (getType() == 0)); + + return static_cast<const KGpgRootNode *>(this)->asRootNode(); +} + +KGpgUidNode * +KGpgNode::toUidNode() +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_UID); + + return static_cast<KGpgUidNode *>(this); +} + +const KGpgUidNode * +KGpgNode::toUidNode() const +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_UID); + + return static_cast<const KGpgUidNode *>(this); +} + +KGpgSubkeyNode * +KGpgNode::toSubkeyNode() +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_SUB); + + return static_cast<KGpgSubkeyNode *>(this); +} + +const KGpgSubkeyNode * +KGpgNode::toSubkeyNode() const +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_SUB); + + return static_cast<const KGpgSubkeyNode *>(this); +} + +KGpgUatNode * +KGpgNode::toUatNode() +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_UAT); + + return static_cast<KGpgUatNode *>(this); +} + +const KGpgUatNode * +KGpgNode::toUatNode() const +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_UAT); + + return static_cast<const KGpgUatNode *>(this); +} + +KGpgGroupNode * +KGpgNode::toGroupNode() +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_GROUP); + + return static_cast<KGpgGroupNode *>(this); +} + +const KGpgGroupNode * +KGpgNode::toGroupNode() const +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_GROUP); + + return static_cast<const KGpgGroupNode *>(this); +} + +KGpgRefNode * +KGpgNode::toRefNode() +{ + Q_ASSERT(((getType() & KgpgCore::ITYPE_GROUP) && (getType() & KgpgCore::ITYPE_PAIR)) || (getType() & KgpgCore::ITYPE_SIGN)); + + return qobject_cast<KGpgRefNode *>(this); +} + +const KGpgRefNode * +KGpgNode::toRefNode() const +{ + Q_ASSERT(((getType() & KgpgCore::ITYPE_GROUP) && (getType() & KgpgCore::ITYPE_PAIR)) || (getType() & KgpgCore::ITYPE_SIGN)); + + return qobject_cast<const KGpgRefNode *>(this); +} + +KGpgGroupMemberNode * +KGpgNode::toGroupMemberNode() +{ + Q_ASSERT((getType() & KgpgCore::ITYPE_GROUP) && (getType() & KgpgCore::ITYPE_PAIR)); + + return static_cast<KGpgGroupMemberNode *>(this); +} + +const KGpgGroupMemberNode * +KGpgNode::toGroupMemberNode() const +{ + Q_ASSERT((getType() & KgpgCore::ITYPE_GROUP) && (getType() & KgpgCore::ITYPE_PAIR)); + + return static_cast<const KGpgGroupMemberNode *>(this); +} + +KGpgSignNode * +KGpgNode::toSignNode() +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_SIGN); + + return static_cast<KGpgSignNode *>(this); +} + +const KGpgSignNode * +KGpgNode::toSignNode() const +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_SIGN); + + return static_cast<const KGpgSignNode *>(this); +} + +KGpgOrphanNode * +KGpgNode::toOrphanNode() +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_SECRET); + + return static_cast<KGpgOrphanNode *>(this); +} + +const KGpgOrphanNode * +KGpgNode::toOrphanNode() const +{ + Q_ASSERT(getType() == KgpgCore::ITYPE_SECRET); + + return static_cast<const KGpgOrphanNode *>(this); +} + +bool +KGpgNode::hasChildren() const +{ + return false; +} + +int +KGpgNode::getChildCount() +{ + return 0; +} + +KGpgNode * +KGpgNode::getChild(const int index) const +{ + Q_UNUSED(index); + return NULL; +} + +int +KGpgNode::getChildIndex(KGpgNode *node) const +{ + Q_UNUSED(node); + return 0; +} + +KgpgCore::KgpgKeyTrust +KGpgNode::getTrust() const +{ + return TRUST_NOKEY; +} + +QString +KGpgNode::getSize() const +{ + return QString(); +} + +QString +KGpgNode::getName() const +{ + return QString(); +} + +QString +KGpgNode::getEmail() const +{ + return QString(); +} + +QDateTime +KGpgNode::getExpiration() const +{ + return QDateTime(); +} + +QDateTime +KGpgNode::getCreation() const +{ + return QDateTime(); +} + +QString +KGpgNode::getId() const +{ + return QString(); +} + +QString +KGpgNode::getComment() const +{ + return QString(); +} + +KGpgExpandableNode * +KGpgNode::getParentKeyNode() const +{ + return m_parent; +} + +//#include "KGpgNode.moc" diff --git a/kgpg/core/KGpgNode.h b/kgpg/core/KGpgNode.h new file mode 100644 index 0000000..1d89875 --- /dev/null +++ b/kgpg/core/KGpgNode.h @@ -0,0 +1,156 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGNODE_H +#define KGPGNODE_H + +#include <QPixmap> +#include "kgpgkey.h" + +class KGpgExpandableNode; +class KGpgKeyNode; +class KGpgRootNode; +class KGpgUidNode; +class KGpgSignableNode; +class KGpgSubkeyNode; +class KGpgUatNode; +class KGpgGroupNode; +class KGpgRefNode; +class KGpgGroupMemberNode; +class KGpgSignNode; +class KGpgOrphanNode; +class KGpgItemModel; + +/** + * @brief The abstract base class for all classes representing keyring data + */ +class KGpgNode : public QObject +{ + Q_OBJECT + + friend class KGpgItemModel; + + KGpgNode(); // = delete C++0x +protected: + KGpgExpandableNode *m_parent; + KGpgItemModel *m_model; + + /** + * constructor + * @param parent the parent node in item hierarchy + */ + explicit KGpgNode(KGpgExpandableNode *parent); + +public: + typedef QList<KGpgNode *> List; + + /** + * destructor + */ + virtual ~KGpgNode(); + + /** + * Returns if this node has child nodes + * + * This may be reimplemented by child classes so they can indicate that + * there are child nodes before actually loading them. + */ + virtual bool hasChildren() const; + /** + * Return how many child nodes exist + * + * When the child nodes do not already exist this will create them. + * This is the reason why this method is not const. + */ + virtual int getChildCount(); + /** + * Returns the child node at the given index + * @param index child index + * + * index may be in range 0 to getChildCount() - 1. + */ + virtual KGpgNode *getChild(const int index) const; + /** + * Returns the index for a given child node + * @return -1 if the given node is not a child of this object + */ + virtual int getChildIndex(KGpgNode *node) const; + + /** + * Returns the item type of this object + * + * Since every subclass returns a distinct value you can use the + * result of this function to decide which cast to take. Note that + * there are subclasses (KGpgKeyNode, KGpgGroupMemberNode) that + * can return two different values. + */ + virtual KgpgCore::KgpgItemType getType() const = 0; + virtual KgpgCore::KgpgKeyTrust getTrust() const; + /** + * Returns a string describing the size of this object + * + * Subclasses may return a value that makes sense for whatever + * object they represent. + * + * The default implementation returns an empty string. + */ + virtual QString getSize() const; + virtual QString getName() const; + virtual QString getEmail() const; + virtual QDateTime getExpiration() const; + virtual QDateTime getCreation() const; + virtual QString getId() const; + virtual QString getComment() const; + virtual QString getNameComment() const; + /** + * Returns the parent node in the key hierarchy + * + * For all "primary" items like keys and key groups this will + * return the (invisible) root node. Calling this function for + * the root node will return %NULL. No other node but the root + * node has a %NULL parent. + */ + KGpgExpandableNode *getParentKeyNode() const; + + KGpgExpandableNode *toExpandableNode(); + const KGpgExpandableNode *toExpandableNode() const; + KGpgSignableNode *toSignableNode(); + const KGpgSignableNode *toSignableNode() const; + KGpgKeyNode *toKeyNode(); + const KGpgKeyNode *toKeyNode() const; + KGpgRootNode *toRootNode(); + const KGpgRootNode *toRootNode() const; + KGpgUidNode *toUidNode(); + const KGpgUidNode *toUidNode() const; + KGpgSubkeyNode *toSubkeyNode(); + const KGpgSubkeyNode *toSubkeyNode() const; + KGpgUatNode *toUatNode(); + const KGpgUatNode *toUatNode() const; + KGpgGroupNode *toGroupNode(); + const KGpgGroupNode *toGroupNode() const; + KGpgRefNode *toRefNode(); + const KGpgRefNode *toRefNode() const; + KGpgGroupMemberNode *toGroupMemberNode(); + const KGpgGroupMemberNode *toGroupMemberNode() const; + KGpgSignNode *toSignNode(); + const KGpgSignNode *toSignNode() const; + KGpgOrphanNode *toOrphanNode(); + const KGpgOrphanNode *toOrphanNode() const; +}; + +#endif /* KGPGNODE_H */ diff --git a/kgpg/core/KGpgOrphanNode.cpp b/kgpg/core/KGpgOrphanNode.cpp new file mode 100644 index 0000000..f245121 --- /dev/null +++ b/kgpg/core/KGpgOrphanNode.cpp @@ -0,0 +1,84 @@ +/* Copyright 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgOrphanNode.h" + +KGpgOrphanNode::KGpgOrphanNode(KGpgExpandableNode *parent, const KgpgKey &k) + : KGpgNode(parent), + m_key(new KgpgKey(k)) +{ +} + +KGpgOrphanNode::~KGpgOrphanNode() +{ + delete m_key; +} + +KgpgItemType +KGpgOrphanNode::getType() const +{ + return ITYPE_SECRET; +} + +QString +KGpgOrphanNode::getName() const +{ + return m_key->name(); +} + +QString +KGpgOrphanNode::getEmail() const +{ + return m_key->email(); +} + +QString +KGpgOrphanNode::getSize() const +{ + return QString::number(m_key->size()); +} + +QDateTime +KGpgOrphanNode::getExpiration() const +{ + return m_key->expirationDate(); +} + +QDateTime +KGpgOrphanNode::getCreation() const +{ + return m_key->creationDate(); +} + +QString +KGpgOrphanNode::getId() const +{ + return m_key->fullId(); +} + +KgpgCore::KgpgKeyTrust +KGpgOrphanNode::getTrust() const +{ + return m_key->trust(); +} + +const QString & +KGpgOrphanNode::getFingerprint() const +{ + return m_key->fingerprint(); +} diff --git a/kgpg/core/KGpgOrphanNode.h b/kgpg/core/KGpgOrphanNode.h new file mode 100644 index 0000000..e3b6132 --- /dev/null +++ b/kgpg/core/KGpgOrphanNode.h @@ -0,0 +1,53 @@ +/* Copyright 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGORPHANNODE_H +#define KGPGORPHANNODE_H + +#include "KGpgNode.h" + +#include "kgpgkey.h" + +using namespace KgpgCore; + +class KGpgExpandableNode; + +/** + * @brief A lone secret key without public key + */ +class KGpgOrphanNode : public KGpgNode +{ +private: + KgpgCore::KgpgKey *m_key; + +public: + explicit KGpgOrphanNode(KGpgExpandableNode *parent, const KgpgKey &k); + virtual ~KGpgOrphanNode(); + + virtual KgpgCore::KgpgItemType getType() const; + virtual KgpgCore::KgpgKeyTrust getTrust() const; + const QString &getFingerprint() const; + virtual QString getSize() const; + virtual QString getName() const; + virtual QString getEmail() const; + virtual QDateTime getExpiration() const; + virtual QDateTime getCreation() const; + virtual QString getId() const; +}; + +#endif /* KGPGORPHANNODE_H */ diff --git a/kgpg/core/KGpgRefNode.cpp b/kgpg/core/KGpgRefNode.cpp new file mode 100644 index 0000000..a67d6b5 --- /dev/null +++ b/kgpg/core/KGpgRefNode.cpp @@ -0,0 +1,151 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgRefNode.h" + +//#include <KLocale> + +#include "KGpgExpandableNode.h" +#include "KGpgRootNode.h" + +KGpgRefNode::KGpgRefNode(KGpgExpandableNode *parent, const QString &keyid) + : KGpgNode(parent), + m_id(keyid) +{ + Q_ASSERT(!keyid.isEmpty()); + + KGpgRootNode *root = getRootNode(); + KGpgExpandableNode *pnd = parent; + + do { + m_selfsig = (pnd->getId().right(keyid.length()) == keyid); + if (m_selfsig) + m_keynode = pnd->toKeyNode(); + else + pnd = pnd->getParentKeyNode(); + } while (!m_selfsig && (pnd != root)); + + // Self signatures do net need to get notified by their key: if the key is changed + // the key node is deleted, then those refnode would be deleted anyway. This avoids + // crashes when they would try to find the root node by iterating over their parent + // when the parents destructor is already called (see bug 208659). + if (!m_selfsig) { + m_keynode = root->findKey(keyid); + + if (m_keynode != NULL) { + m_keynode->addRef(this); + } else { + connect(root, SIGNAL(newKeyNode(KGpgKeyNode*)), this, SLOT(keyUpdated(KGpgKeyNode*))); + } + } + + parent->children.append(this); +} + +KGpgRefNode::KGpgRefNode(KGpgExpandableNode *parent, KGpgKeyNode *key) + : KGpgNode(parent), + m_id(key->getId()), + m_keynode(key) +{ + Q_ASSERT(key != NULL); + Q_ASSERT(parent != NULL); + m_keynode->addRef(this); + + parent->children.append(this); +} + +KGpgRefNode::~KGpgRefNode() +{ + if (m_keynode && !m_selfsig) + m_keynode->delRef(this); +} + +KGpgRootNode * +KGpgRefNode::getRootNode() const +{ + KGpgExpandableNode *root; + KGpgExpandableNode *pt = m_parent; + + do { + root = pt; + pt = pt->getParentKeyNode(); + } while (pt != NULL); + + return root->toRootNode(); +} + +void +KGpgRefNode::keyUpdated(KGpgKeyNode *nkey) +{ + Q_ASSERT(m_keynode == NULL); + Q_ASSERT(nkey != NULL); + + if (nkey->getId().right(m_id.length()) == m_id) { + disconnect(sender(), NULL, this, SLOT(keyUpdated(KGpgKeyNode*))); + m_keynode = nkey; + m_keynode->addRef(this); + } +} + +void +KGpgRefNode::unRef(KGpgRootNode *root) +{ + if (root != NULL) + connect(root, SIGNAL(newKeyNode(KGpgKeyNode*)), this, SLOT(keyUpdated(KGpgKeyNode*))); + + m_keynode = NULL; +} + +QString +KGpgRefNode::getId() const +{ + if (m_keynode != NULL) + return m_keynode->getId(); + else + return m_id; +} + +QString +KGpgRefNode::getName() const +{ + if (m_keynode != NULL) + return m_keynode->getName(); + return tr("[No user id found]"); +} + +QString +KGpgRefNode::getEmail() const +{ + if (m_keynode != NULL) + return m_keynode->getEmail(); + return QString(); +} + +bool +KGpgRefNode::isUnknown() const +{ + return (m_keynode == NULL); +} + +KGpgKeyNode * +KGpgRefNode::getRefNode() const +{ + return m_keynode; +} + +//#include "KGpgRefNode.moc" diff --git a/kgpg/core/KGpgRefNode.h b/kgpg/core/KGpgRefNode.h new file mode 100644 index 0000000..f977567 --- /dev/null +++ b/kgpg/core/KGpgRefNode.h @@ -0,0 +1,98 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGREFNODE_H +#define KGPGREFNODE_H + +#include "KGpgNode.h" + +class KGpgKeyNode; +class KGpgRootNode; + +/** + * @brief Class for child objects that are only a reference to a primary key + * + * This is the base class for all type of objects that match these criteria: + * -they can not have child objects + * -they are only a reference to a primary key (which needs not to be in the + * key ring) + * + * Do not create instances from this class. Use KGpgGroupMemberNode and + * KGpgSignNode as those represent the existing objects. This class exists + * only to get the hierarchy right. + */ +class KGpgRefNode : public KGpgNode +{ + Q_OBJECT + +private: + const QString m_id; + bool m_selfsig; ///< if this is a reference to it's own parent + +protected: + KGpgKeyNode *m_keynode; + + explicit KGpgRefNode(KGpgExpandableNode *parent, KGpgKeyNode *key); + explicit KGpgRefNode(KGpgExpandableNode *parent, const QString &keyid); + + KGpgRootNode *getRootNode() const; + +public: + virtual ~KGpgRefNode(); + + virtual QString getId() const; + virtual QString getName() const; + virtual QString getEmail() const; + /** + * Get the node of the primary key this node references to + * + * This will return the key node of the primary key this node + * references. This may be %NULL if the primary key is not in the key + * ring, e.g. if this is a signature of an unknown key. + * + * @return the node of the primary key or %NULL + */ + virtual KGpgKeyNode *getRefNode() const; + + /** + * Check if the referenced key exists + * + * @return if getRefNode() will return %NULL or not + */ + bool isUnknown() const; + + /** + * Break the current reference + * @param root root node + * + * This is called when the referenced node is going away. + * + * The root node is passed for two reasons: + * @li it doesn't need to be searched again for every ref node which + * can be many in case of an important key node get's deleted + * @li the ref node may be a child of the deleted node, then we can + * not call the parents functions to find the root anymore. This helps + * simplifying the code + */ + void unRef(KGpgRootNode *root); + +private Q_SLOTS: + void keyUpdated(KGpgKeyNode *); +}; + +#endif /* KGPGREFNODE_H */ diff --git a/kgpg/core/KGpgRootNode.cpp b/kgpg/core/KGpgRootNode.cpp new file mode 100644 index 0000000..9ceb571 --- /dev/null +++ b/kgpg/core/KGpgRootNode.cpp @@ -0,0 +1,189 @@ +/* Copyright 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgRootNode.h" + +#include "KGpgGroupNode.h" +#include "../kgpginterface.h" +#include "KGpgOrphanNode.h" +//#include "kgpgsettings.h" + +#include <QString> +#include <QStringList> + +KGpgRootNode::KGpgRootNode(KGpgItemModel *model) + : KGpgExpandableNode(NULL), + m_groups(0), + m_deleting(false) +{ + m_model = model; +} + +KGpgRootNode::~KGpgRootNode() +{ + m_deleting = true; +} + +void +KGpgRootNode::readChildren() +{ +} + +KgpgCore::KgpgItemType +KGpgRootNode::getType() const +{ + return 0; +} + +void +KGpgRootNode::addGroups(const QStringList &groups) +{ + foreach (const QString &group, groups) { + QStringList members = group.split(QLatin1Char(' ')); + const QString groupName = members.takeFirst(); + new KGpgGroupNode(this, groupName, members); + } +} + +void +KGpgRootNode::addKeys(const QStringList &ids) +{ + KgpgCore::KgpgKeyList publiclist = KgpgInterface::readPublicKeys(ids); + KgpgCore::KgpgKeyList secretlist = KgpgInterface::readSecretKeys(); + + QStringList issec = secretlist; + + for (int i = 0; i < publiclist.size(); ++i) { + KgpgCore::KgpgKey key = publiclist.at(i); + + int index = issec.indexOf(key.fullId()); + if (index != -1) { + key.setSecret(true); + issec.removeAt(index); + secretlist.removeAt(index); + } + + KGpgKeyNode *nd = new KGpgKeyNode(this, key); + emit newKeyNode(nd); + } + + for (int i = 0; i < secretlist.count(); ++i) { + KgpgCore::KgpgKey key = secretlist.at(i); + + new KGpgOrphanNode(this, key); + } +} + +void +KGpgRootNode::refreshKeys(KGpgKeyNode::List nodes) +{ + QStringList ids; + + foreach (const KGpgNode *nd, nodes) + ids << nd->getId(); + + KgpgCore::KgpgKeyList publiclist = KgpgInterface::readPublicKeys(ids); + QStringList issec = KgpgInterface::readSecretKeys(ids); + + for (int i = 0; i < publiclist.size(); ++i) { + KgpgCore::KgpgKey key = publiclist.at(i); + + int index = issec.indexOf(key.fullId()); + if (index != -1) { + key.setSecret(true); + issec.removeAt(index); + } + + for (int j = 0; j < nodes.count(); j++) { + KGpgKeyNode *nd = nodes.at(j); + + if (nd->getId() == key.fingerprint()) { + nodes.removeAt(j); + nd->setKey(key); + break; + } + } + } +} + +KGpgKeyNode * +KGpgRootNode::findKey(const QString &keyId) +{ + int i = findKeyRow(keyId); + if (i >= 0) { + return children[i]->toKeyNode(); + } + + return NULL; +} + +int +KGpgRootNode::findKeyRow(const QString &keyId) +{ + int i = 0; + + foreach (const KGpgNode *node, children) { + if ((node->getType() & ITYPE_PAIR) == 0) { + ++i; + continue; + } + + const KGpgKeyNode *key = node->toKeyNode(); + + if (key->compareId(keyId)) + return i; + ++i; + } + return -1; +} + +int +KGpgRootNode::groupChildren() const +{ + return m_groups; +} + +int +KGpgRootNode::findKeyRow(const KGpgKeyNode *key) +{ + for (int i = 0; i < children.count(); i++) { + if (children[i] == key) + return i; + } + return -1; +} + +KGpgRootNode * +KGpgRootNode::asRootNode() +{ + if (m_deleting) + return NULL; + + return this; +} + +const KGpgRootNode * +KGpgRootNode::asRootNode() const +{ + if (m_deleting) + return NULL; + + return this; +} + +//#include "KGpgRootNode.moc" diff --git a/kgpg/core/KGpgRootNode.h b/kgpg/core/KGpgRootNode.h new file mode 100644 index 0000000..97c597c --- /dev/null +++ b/kgpg/core/KGpgRootNode.h @@ -0,0 +1,129 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGROOTNODE_H +#define KGPGROOTNODE_H + +#include "KGpgExpandableNode.h" +#include "KGpgKeyNode.h" + +class KGpgGroupNode; +class QString; +class QStringList; + +/** + * @brief The parent of all key data objects + * + * This object is invisible to the user but acts as the internal base object for + * everything in the keyring. It is anchestor of all other KGpgNode objects and + * the only one that will ever return NULL when calling getParentKeyNode() on it. + * + * There is only one object of this type around at any time. + */ +class KGpgRootNode : public KGpgExpandableNode +{ + Q_OBJECT + + friend class KGpgGroupNode; + +private: + int m_groups; + int m_deleting; + +protected: + virtual void readChildren(); + +public: + explicit KGpgRootNode(KGpgItemModel *model); + virtual ~KGpgRootNode(); + + virtual KgpgCore::KgpgItemType getType() const; + + /** + * Create new group nodes + * @param groups list of group names to create + */ + void addGroups(const QStringList &groups); + void addKeys(const QStringList &ids = QStringList()); + void refreshKeys(KGpgKeyNode::List nodes); + /** + * Find a key node with the given id + * + * This scans the list of primary keys for a key with the given id + * and returns the corresponding key node. + * + * The key id will be matched against the characters given in keyId. + * If you give only 8 or 16 byte you will still find the key if it + * exists. To be really sure to find the correct node you should pass + * the complete fingerprint whenever possible. + * + * @param keyId the key id to find, any length is permitted + * @return pointer to key node or %NULL if no such key + */ + KGpgKeyNode *findKey(const QString &keyId); + /** + * Return the child number of the key with the given id + * + * This scans the list of direct children for a key with the given + * key id. It returns the number in the internal list of children + * which is identical to the row number in the item model. Since + * proxy models may sort the items you should only call this function + * from the primary model (i.e. KGpgItemModel). + * + * The key id will be matched against the characters given in keyId. + * If you give only 8 or 16 byte you will still find the key if it + * exists. To be really sure to find the correct node you should pass + * the complete fingerprint whenever possible. + * + * @param keyId the key id to find, any length is permitted + * @return the child number or -1 if there is no such key + */ + int findKeyRow(const QString &keyId); + + /** + * Return the child number of the given key + * @param key the key to search for + * + * @overload + */ + int findKeyRow(const KGpgKeyNode *key); + + /** + * Return the group count + * @return the number of group nodes + */ + int groupChildren() const; + + /** + * Return a pointer to this object or NULL + * + * This returns a pointer to this object if the object will persist, + * i.e. is not currently in destruction. If the object is already + * cleaning up NULL is returned. + */ + KGpgRootNode *asRootNode(); + /** + * @overload + */ + const KGpgRootNode *asRootNode() const; + +Q_SIGNALS: + void newKeyNode(KGpgKeyNode *); +}; + +#endif /* KGPGROOTNODE_H */ diff --git a/kgpg/core/KGpgSignNode.cpp b/kgpg/core/KGpgSignNode.cpp new file mode 100644 index 0000000..f35bd9a --- /dev/null +++ b/kgpg/core/KGpgSignNode.cpp @@ -0,0 +1,95 @@ +/* Copyright 2008,2009,2010 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgSignNode.h" + +#include "KGpgSignableNode.h" + +//#include <KLocale> +#include <QLocale> + +class KGpgSignNodePrivate { +public: + KGpgSignNodePrivate(const QStringList &sl); + + QDateTime m_creation; + QDateTime m_expiration; + bool m_local; + bool m_revocation; +}; + +KGpgSignNodePrivate::KGpgSignNodePrivate(const QStringList &sl) +{ + m_revocation = (sl.at(0) == QLatin1String("rev")); + if (sl.count() < 6) + return; + m_creation = QDateTime::fromTime_t(sl.at(5).toUInt()); + if (sl.count() < 7) + return; + if (!sl.at(6).isEmpty()) + m_expiration = QDateTime::fromTime_t(sl.at(6).toUInt()); + if (sl.count() < 11) + return; + m_local = sl.at(10).endsWith(QLatin1Char( 'l' )); +} + +KGpgSignNode::KGpgSignNode(KGpgSignableNode *parent, const QStringList &s) + : KGpgRefNode(parent, s.at(4)), + d_ptr(new KGpgSignNodePrivate(s)) +{ +} + +KGpgSignNode::~KGpgSignNode() +{ + delete d_ptr; +} + +QDateTime +KGpgSignNode::getExpiration() const +{ + const Q_D(KGpgSignNode); + + return d->m_expiration; +} + +QDateTime +KGpgSignNode::getCreation() const +{ + const Q_D(KGpgSignNode); + + return d->m_creation; +} + +QString +KGpgSignNode::getName() const +{ + const Q_D(KGpgSignNode); + const QString name = KGpgRefNode::getName(); + + if (!d->m_local) + return name; + + //return tr("%1 [local signature]", &name.constData()->toAscii()); + return "fixme"; +} + +KgpgCore::KgpgItemType +KGpgSignNode::getType() const +{ + return KgpgCore::ITYPE_SIGN; +} diff --git a/kgpg/core/KGpgSignNode.h b/kgpg/core/KGpgSignNode.h new file mode 100644 index 0000000..398ee57 --- /dev/null +++ b/kgpg/core/KGpgSignNode.h @@ -0,0 +1,54 @@ +/* Copyright 2008,2009,2010 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGSIGNNODE_H +#define KGPGSIGNNODE_H + +#include "KGpgRefNode.h" + +class KGpgSignableNode; + +class KGpgSignNodePrivate; + +/** + * @brief A signature to another key object + */ +class KGpgSignNode : public KGpgRefNode +{ +private: + KGpgSignNodePrivate * const d_ptr; + Q_DECLARE_PRIVATE(KGpgSignNode) + +public: + typedef QList<KGpgSignNode *> List; + + /** + * @brief constructor for KGpgSignNode + * @param parent the signed node + * @param s GnuPG line describing this signature + */ + explicit KGpgSignNode(KGpgSignableNode *parent, const QStringList &s); + virtual ~KGpgSignNode(); + + virtual KgpgCore::KgpgItemType getType() const; + virtual QDateTime getExpiration() const; + virtual QString getName() const; + virtual QDateTime getCreation() const; +}; + +#endif /* KGPGSIGNNODE_H */ diff --git a/kgpg/core/KGpgSignableNode.cpp b/kgpg/core/KGpgSignableNode.cpp new file mode 100644 index 0000000..e3782c1 --- /dev/null +++ b/kgpg/core/KGpgSignableNode.cpp @@ -0,0 +1,99 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgSignableNode.h" + +//#include <KLocale> + +KGpgSignableNode::KGpgSignableNode(KGpgExpandableNode *parent) + : KGpgExpandableNode(parent) +{ +} + +KGpgSignableNode::~KGpgSignableNode() +{ +} + +KGpgSignNode::List +KGpgSignableNode::getSignatures(void) const +{ + KGpgSignNode::List ret; + + foreach (KGpgNode *kn, children) { + if (kn->getType() == KgpgCore::ITYPE_SIGN) + ret << kn->toSignNode(); + } + + return ret; +} + +QString +KGpgSignableNode::getSignCount() const +{ + //return i18np("1 signature", "%1 signatures", children.count()); + return tr("1 signature", "%1 signatures", children.count()); +} + +bool +KGpgSignableNode::operator<(const KGpgSignableNode &other) const +{ + return operator<(&other); +} + +bool +KGpgSignableNode::operator<(const KGpgSignableNode *other) const +{ + switch (getType()) { + case KgpgCore::ITYPE_PUBLIC: + case KgpgCore::ITYPE_PAIR: { + const QString myid(getId()); + + switch (other->getType()) { + case KgpgCore::ITYPE_PUBLIC: + case KgpgCore::ITYPE_PAIR: + return (myid < other->getId()); + default: { + const QString otherid(other->getParentKeyNode()->getId()); + + if (myid == otherid) + return true; + return (myid < otherid); + } + } + } + default: { + const QString myp(getParentKeyNode()->getId()); + + switch (other->getType()) { + case KgpgCore::ITYPE_PAIR: + case KgpgCore::ITYPE_PUBLIC: + return (myp < other->getId()); + default: { + const QString otherp(other->getParentKeyNode()->getId()); + + if (otherp == myp) + return (getId().toInt() < other->getId().toInt()); + + return (myp < otherp); + } + } + } + } +} + +//#include "KGpgSignableNode.moc" diff --git a/kgpg/core/KGpgSignableNode.h b/kgpg/core/KGpgSignableNode.h new file mode 100644 index 0000000..fddae25 --- /dev/null +++ b/kgpg/core/KGpgSignableNode.h @@ -0,0 +1,62 @@ +/* Copyright 2008,2009,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGSIGNABLENODE_H +#define KGPGSIGNABLENODE_H + +#include "KGpgExpandableNode.h" +#include "KGpgSignNode.h" + +/** + * @brief An object that may have KGpgSignNode children + * + * This class represents an object that may be signed, i.e. key nodes, + * user ids, user attributes, and subkeys. + */ +class KGpgSignableNode : public KGpgExpandableNode +{ + Q_OBJECT + +public: + typedef QList<KGpgSignableNode *> List; + typedef QList<const KGpgSignableNode *> const_List; + + KGpgSignableNode(KGpgExpandableNode *parent = NULL); + virtual ~KGpgSignableNode(); + + KGpgSignNode::List getSignatures(void) const; + /** + * @brief count signatures + * @return the number of signatures to this object + * + * This does not include the number of signatures to child objects. + */ + virtual QString getSignCount() const; + + bool operator<(const KGpgSignableNode &other) const; + bool operator<(const KGpgSignableNode *other) const; + + /** + * @brief returns the key node this node belongs to + * @returns this node if the node itself is a key or it's parent otherwise + */ + virtual KGpgKeyNode *getKeyNode(void) = 0; + virtual const KGpgKeyNode *getKeyNode(void) const = 0; +}; + +#endif /* KGPGSIGNABLENODE_H */ diff --git a/kgpg/core/KGpgSubkeyNode.cpp b/kgpg/core/KGpgSubkeyNode.cpp new file mode 100644 index 0000000..571ca35 --- /dev/null +++ b/kgpg/core/KGpgSubkeyNode.cpp @@ -0,0 +1,100 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgSubkeyNode.h" + +//#include <KLocale> + +#include "convert.h" +#include "KGpgKeyNode.h" + +KGpgSubkeyNode::KGpgSubkeyNode(KGpgKeyNode *parent, const KgpgKeySub &k) + : KGpgSignableNode(parent), + m_skey(k) +{ + Q_ASSERT(parent != NULL); +} +KGpgSubkeyNode::~KGpgSubkeyNode() +{ +} + +void +KGpgSubkeyNode::readChildren() +{ +} + +KgpgCore::KgpgItemType +KGpgSubkeyNode::getType() const +{ + return ITYPE_SUB; +} + +KgpgCore::KgpgKeyTrust +KGpgSubkeyNode::getTrust() const +{ + return m_skey.trust(); +} + +QDateTime +KGpgSubkeyNode::getExpiration() const +{ + return m_skey.expirationDate(); +} + +QDateTime +KGpgSubkeyNode::getCreation() const +{ + return m_skey.creationDate(); +} + +QString +KGpgSubkeyNode::getId() const +{ + return m_skey.id(); +} + +KGpgKeyNode * +KGpgSubkeyNode::getKeyNode(void) +{ + return getParentKeyNode()->toKeyNode(); +} + +const KGpgKeyNode * +KGpgSubkeyNode::getKeyNode(void) const +{ + return getParentKeyNode()->toKeyNode(); +} + +QString +KGpgSubkeyNode::getName() const +{ + //return i18n("%1 subkey", Convert::toString(m_skey.algorithm())); + return "TODO"; +} + +QString +KGpgSubkeyNode::getSize() const +{ + return QString::number(m_skey.size()); +} + +KGpgKeyNode * +KGpgSubkeyNode::getParentKeyNode() const +{ + return m_parent->toKeyNode(); +} diff --git a/kgpg/core/KGpgSubkeyNode.h b/kgpg/core/KGpgSubkeyNode.h new file mode 100644 index 0000000..bbe5ab8 --- /dev/null +++ b/kgpg/core/KGpgSubkeyNode.h @@ -0,0 +1,55 @@ +/* Copyright 2008,2009 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGSUBKEYNODE_H +#define KGPGSUBKEYNODE_H + +#include "KGpgSignableNode.h" + +#include "kgpgkey.h" + +using namespace KgpgCore; + +/** + * @brief a subkey of a public key or key pair + */ +class KGpgSubkeyNode : public KGpgSignableNode +{ +private: + KgpgCore::KgpgKeySub m_skey; + +protected: + virtual void readChildren(); + +public: + explicit KGpgSubkeyNode(KGpgKeyNode *parent, const KgpgCore::KgpgKeySub &k); + virtual ~KGpgSubkeyNode(); + + virtual KgpgCore::KgpgItemType getType() const; + virtual KgpgCore::KgpgKeyTrust getTrust() const; + virtual QString getSize() const; + virtual QString getName() const; + virtual QDateTime getExpiration() const; + virtual QDateTime getCreation() const; + virtual QString getId() const; + virtual KGpgKeyNode *getKeyNode(void); + virtual const KGpgKeyNode *getKeyNode(void) const; + virtual KGpgKeyNode *getParentKeyNode() const; +}; + +#endif /* KGPGSUBKEYNODE_H */ diff --git a/kgpg/core/KGpgUatNode.cpp b/kgpg/core/KGpgUatNode.cpp new file mode 100644 index 0000000..174db66 --- /dev/null +++ b/kgpg/core/KGpgUatNode.cpp @@ -0,0 +1,174 @@ +/* Copyright 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgUatNode.h" + +#include "../gpgproc.h" +#include "KGpgKeyNode.h" + +//#include <KLocale> +//#include <KUrl> + +#include <QUrl> +#include <QDir> +#include <QFile> +#include <QPixmap> +#include <QDateTime> + +class KGpgUatNodePrivate { +public: + KGpgUatNodePrivate(const KGpgKeyNode *parent, const unsigned int index, const QStringList &sl); + + const QString m_idx; + const QPixmap m_pixmap; + QDateTime m_creation; + +private: + static QPixmap loadImage(const KGpgKeyNode *parent, const QString &index); +}; + +KGpgUatNodePrivate::KGpgUatNodePrivate(const KGpgKeyNode *parent, const unsigned int index, const QStringList &sl) + : m_idx(QString::number(index)), + m_pixmap(loadImage(parent, m_idx)) +{ + if (sl.count() < 6) + return; + m_creation = QDateTime::fromTime_t(sl.at(5).toUInt()); +} + +QPixmap +KGpgUatNodePrivate::loadImage(const KGpgKeyNode *parent, const QString &index) +{ + QPixmap pixmap; +#ifdef Q_OS_WIN32 //krazy:exclude=cpp + const QString pgpgoutput = QLatin1String("cmd /C \"echo %I\""); +#else + const QString pgpgoutput = QLatin1String("echo %I"); +#endif + + GPGProc workProcess; + workProcess << + QLatin1String("--no-greeting") << + QLatin1String("--status-fd=2") << + QLatin1String("--photo-viewer") << pgpgoutput << + QLatin1String("--edit-key") << parent->getFingerprint() << + QLatin1String( "uid" ) << index << + QLatin1String( "showphoto" ) << + QLatin1String( "quit" ); + + workProcess.start(); + workProcess.waitForFinished(); + if (workProcess.exitCode() != 0) + return pixmap; + + QString tmpfile; + if (workProcess.readln(tmpfile) < 0) + return pixmap; + + QUrl url(tmpfile); + pixmap.load(url.path()); + QFile::remove(url.path()); + QDir dir; + //dir.rmdir(url.directory()); + + return pixmap; +} + +KGpgUatNode::KGpgUatNode(KGpgKeyNode *parent, const unsigned int index, const QStringList &sl) + : KGpgSignableNode(parent), + d_ptr(new KGpgUatNodePrivate(parent, index, sl)) +{ +} + +KGpgUatNode::~KGpgUatNode() +{ + delete d_ptr; +} + +QString +KGpgUatNode::getName() const +{ + return tr("Photo id"); +} + +QString +KGpgUatNode::getSize() const +{ + const Q_D(KGpgUatNode); + + return QString::number(d->m_pixmap.width()) + QLatin1Char( 'x' ) + QString::number(d->m_pixmap.height()); +} + +QDateTime +KGpgUatNode::getCreation() const +{ + const Q_D(KGpgUatNode); + + return d->m_creation; +} + +KGpgKeyNode * +KGpgUatNode::getParentKeyNode() const +{ + return m_parent->toKeyNode(); +} + +void +KGpgUatNode::readChildren() +{ +} + +KgpgCore::KgpgItemType +KGpgUatNode::getType() const +{ + return KgpgCore::ITYPE_UAT; +} + +KgpgCore::KgpgKeyTrust +KGpgUatNode::getTrust() const +{ + return KgpgCore::TRUST_NOKEY; +} + +const QPixmap & +KGpgUatNode::getPixmap() const +{ + const Q_D(KGpgUatNode); + + return d->m_pixmap; +} + +QString +KGpgUatNode::getId() const +{ + const Q_D(KGpgUatNode); + + return d->m_idx; +} + +KGpgKeyNode * +KGpgUatNode::getKeyNode(void) +{ + return getParentKeyNode()->toKeyNode(); +} + +const KGpgKeyNode * +KGpgUatNode::getKeyNode(void) const +{ + return getParentKeyNode()->toKeyNode(); +} diff --git a/kgpg/core/KGpgUatNode.h b/kgpg/core/KGpgUatNode.h new file mode 100644 index 0000000..b4c6775 --- /dev/null +++ b/kgpg/core/KGpgUatNode.h @@ -0,0 +1,61 @@ +/* Copyright 2008,2009,2010 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGUATNODE_H +#define KGPGUATNODE_H + +#include "KGpgSignableNode.h" + +#include <QDateTime> +#include <QPixmap> + +class KGpgExpandableNode; +class KGpgKeyNode; +class QPixmap; + +class KGpgUatNodePrivate; + +/** + * @brief A user attribute (i.e. photo id) of a public key or key pair + */ +class KGpgUatNode : public KGpgSignableNode +{ +private: + KGpgUatNodePrivate * const d_ptr; + Q_DECLARE_PRIVATE(KGpgUatNode) + +protected: + virtual void readChildren(); + +public: + explicit KGpgUatNode(KGpgKeyNode *parent, const unsigned int index, const QStringList &sl); + virtual ~KGpgUatNode(); + + virtual KgpgCore::KgpgItemType getType() const; + virtual KgpgCore::KgpgKeyTrust getTrust() const; + const QPixmap &getPixmap() const; + virtual QString getId() const; + virtual QString getSize() const; + virtual QString getName() const; + virtual QDateTime getCreation() const; + virtual KGpgKeyNode *getParentKeyNode() const; + virtual KGpgKeyNode *getKeyNode(void); + virtual const KGpgKeyNode *getKeyNode(void) const; +}; + +#endif /* KGPGUATNODE_H */ diff --git a/kgpg/core/KGpgUidNode.cpp b/kgpg/core/KGpgUidNode.cpp new file mode 100644 index 0000000..0be6c10 --- /dev/null +++ b/kgpg/core/KGpgUidNode.cpp @@ -0,0 +1,146 @@ +/* Copyright 2008,2009,2010 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "KGpgUidNode.h" + +#include "KGpgKeyNode.h" +#include "convert.h" + +class KGpgUidNodePrivate { +public: + KGpgUidNodePrivate(const unsigned int index, const QStringList &sl); + + const QString m_index; + QString m_email; + QString m_name; + QString m_comment; + KgpgCore::KgpgKeyTrust m_trust; + bool m_valid; +}; + +KGpgUidNodePrivate::KGpgUidNodePrivate(const unsigned int index, const QStringList &sl) + : m_index(QString::number(index)) +{ + QString fullname(sl.at(9)); + if (fullname.contains(QLatin1Char( '<' )) ) { + m_email = fullname; + + if (fullname.contains(QLatin1Char( ')' )) ) + m_email = m_email.section(QLatin1Char( ')' ), 1); + + m_email = m_email.section(QLatin1Char( '<' ), 1); + m_email.truncate(m_email.length() - 1); + + if (m_email.contains(QLatin1Char( '<' ))) { + // several email addresses in the same key + m_email = m_email.replace(QLatin1Char( '>' ), QLatin1Char( ';' )); + m_email.remove(QLatin1Char( '<' )); + } + } + + m_name = fullname.section(QLatin1String( " <" ), 0, 0); + if (fullname.contains(QLatin1Char( '(' )) ) { + m_name = m_name.section(QLatin1String( " (" ), 0, 0); + m_comment = fullname.section(QLatin1Char( '(' ), 1, 1); + m_comment = m_comment.section(QLatin1Char( ')' ), 0, 0); + } + + m_trust = KgpgCore::Convert::toTrust(sl.at(1)); + m_valid = ((sl.count() <= 11) || !sl.at(11).contains(QLatin1Char( 'D' ))); +} + + +KGpgUidNode::KGpgUidNode(KGpgKeyNode *parent, const unsigned int index, const QStringList &sl) + : KGpgSignableNode(parent), + d_ptr(new KGpgUidNodePrivate(index, sl)) +{ +} + +KGpgUidNode::~KGpgUidNode() +{ + delete d_ptr; +} + +QString +KGpgUidNode::getName() const +{ + const Q_D(KGpgUidNode); + + return d->m_name; +} + +QString +KGpgUidNode::getEmail() const +{ + const Q_D(KGpgUidNode); + + return d->m_email; +} + +QString +KGpgUidNode::getId() const +{ + const Q_D(KGpgUidNode); + + return d->m_index; +} + +KGpgKeyNode * +KGpgUidNode::getKeyNode(void) +{ + return getParentKeyNode()->toKeyNode(); +} + +const KGpgKeyNode * +KGpgUidNode::getKeyNode(void) const +{ + return getParentKeyNode()->toKeyNode(); +} + +KGpgKeyNode * +KGpgUidNode::getParentKeyNode() const +{ + return m_parent->toKeyNode(); +} + +void +KGpgUidNode::readChildren() +{ +} + +KgpgCore::KgpgItemType +KGpgUidNode::getType() const +{ + return KgpgCore::ITYPE_UID; +} + +KgpgCore::KgpgKeyTrust +KGpgUidNode::getTrust() const +{ + const Q_D(KGpgUidNode); + + return d->m_trust; +} + +QString +KGpgUidNode::getComment() const +{ + const Q_D(KGpgUidNode); + + return d->m_comment; +} diff --git a/kgpg/core/KGpgUidNode.h b/kgpg/core/KGpgUidNode.h new file mode 100644 index 0000000..cd1b563 --- /dev/null +++ b/kgpg/core/KGpgUidNode.h @@ -0,0 +1,57 @@ +/* Copyright 2008,2009,2010 Rolf Eike Beer <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License or (at your option) version 3 or any later version + * accepted by the membership of KDE e.V. (or its successor approved + * by the membership of KDE e.V.), which shall act as a proxy + * defined in Section 14 of version 3 of the license. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef KGPGUIDNODE_H +#define KGPGUIDNODE_H + +#include "KGpgSignableNode.h" + +#include "kgpgkey.h" + +class KGpgKeyNode; + +class KGpgUidNodePrivate; + +/** + * @brief A user id of a public key or key pair + */ +class KGpgUidNode : public KGpgSignableNode +{ +private: + KGpgUidNodePrivate * const d_ptr; + Q_DECLARE_PRIVATE(KGpgUidNode) + +protected: + virtual void readChildren(); + +public: + explicit KGpgUidNode(KGpgKeyNode *parent, const unsigned int index, const QStringList &sl); + virtual ~KGpgUidNode(); + + virtual KgpgCore::KgpgItemType getType() const; + virtual KgpgCore::KgpgKeyTrust getTrust() const; + virtual QString getName() const; + virtual QString getEmail() const; + virtual QString getId() const; + virtual KGpgKeyNode *getKeyNode(void); + virtual const KGpgKeyNode *getKeyNode(void) const; + virtual KGpgKeyNode *getParentKeyNode() const; + virtual QString getComment() const; +}; + +#endif /* KGPGUIDNODE_H */ diff --git a/kgpg/core/convert.cpp b/kgpg/core/convert.cpp new file mode 100644 index 0000000..934ec02 --- /dev/null +++ b/kgpg/core/convert.cpp @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2006 Jimmy Gilles <[email protected]> + * Copyright (C) 2010 Rolf Eike Beer <[email protected]> + */ +/*************************************************************************** + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "convert.h" + +//#include <KGlobal> +//#include <KLocale> +#include <QTranslator> +//#include "kgpgsettings.h" +#include "images.h" + +namespace KgpgCore +{ + +QString Convert::toString(const KgpgKeyAlgo algorithm) +{ + switch (algorithm) + { + case ALGO_RSA: return QObject::tr("Encryption algorithm", "RSA"); + case ALGO_DSA: return QObject::tr("Encryption algorithm", "DSA"); + case ALGO_ELGAMAL: return QObject::tr("Encryption algorithm", "ElGamal"); + case ALGO_DSA_ELGAMAL: return QObject::tr("Encryption algorithm", "DSA & ElGamal"); + case ALGO_RSA_RSA: return QObject::tr("Encryption algorithm RSA, Signing algorithm RSA", "RSA & RSA"); + case ALGO_UNKNOWN: + default: return QObject::tr("Unknown algorithm", "Unknown"); + } +} + +QString Convert::toString(const KgpgKeyOwnerTrust ownertrust) +{ + switch (ownertrust) + { + case OWTRUST_UNDEFINED: return QObject::tr("Do not Know"); + case OWTRUST_NONE: return QObject::tr("Do NOT Trust"); + case OWTRUST_MARGINAL: return QObject::tr("Marginally"); + case OWTRUST_FULL: return QObject::tr("Fully"); + case OWTRUST_ULTIMATE: return QObject::tr("Ultimately"); + case OWTRUST_UNKNOWN: + default: return QObject::tr("Unknown trust in key owner", "Unknown"); + } +} + +QString Convert::toString(const KgpgKeyTrust trust) +{ + switch (trust) + { + case TRUST_INVALID: return QObject::tr("Invalid key", "Invalid"); + case TRUST_DISABLED: return QObject::tr("Disabled key", "Disabled"); + case TRUST_REVOKED: return QObject::tr("Revoked"); + case TRUST_EXPIRED: return QObject::tr("Expired key", "Expired"); + case TRUST_UNDEFINED: return QObject::tr("Undefined key trust", "Undefined"); + case TRUST_NONE: return QObject::tr("No trust in key", "None"); + case TRUST_MARGINAL: return QObject::tr("Marginal trust in key", "Marginal"); + case TRUST_FULL: return QObject::tr("Full trust in key", "Full"); + case TRUST_ULTIMATE: return QObject::tr("Ultimate trust in key", "Ultimate"); + case TRUST_UNKNOWN: + default: return QObject::tr("Unknown trust in key", "Unknown"); + } +} + +QColor Convert::toColor(const KgpgKeyTrust trust) +{ + switch (trust) + { + case TRUST_INVALID: + /*case TRUST_DISABLED: return KGpgSettings::colorBad(); + case TRUST_EXPIRED: return KGpgSettings::colorExpired(); + case TRUST_MARGINAL: return KGpgSettings::colorMarginal(); + case TRUST_REVOKED: return KGpgSettings::colorRev(); + case TRUST_UNDEFINED: + case TRUST_NONE: return KGpgSettings::colorUnknown(); + case TRUST_FULL: return KGpgSettings::colorGood(); + case TRUST_ULTIMATE: return KGpgSettings::colorUltimate();*/ + case TRUST_UNKNOWN: + default: return QColor(0,0,0); + //return KGpgSettings::colorUnknown(); + } +} + +QString Convert::toString(const QDate &date) +{ + //return KGlobal::locale()->formatDate(date, KLocale::ShortDate); +} + +KgpgKeyAlgo Convert::toAlgo(const uint v) +{ + switch (v) + { + case 1: return ALGO_RSA; + case 16: + case 20: return ALGO_ELGAMAL; + case 17: return ALGO_DSA; + default: return ALGO_UNKNOWN; + } +} + +KgpgKeyAlgo Convert::toAlgo(const QString &s) +{ + bool b; + unsigned int u = s.toUInt(&b); + return b ? toAlgo(u) : ALGO_UNKNOWN; +} + +KgpgKeyTrust Convert::toTrust(const QChar &c) +{ + switch (c.toAscii()) + { + case 'o': return TRUST_UNKNOWN; + case 'i': return TRUST_INVALID; + case 'd': return TRUST_DISABLED; + case 'r': return TRUST_REVOKED; + case 'e': return TRUST_EXPIRED; + case 'q': return TRUST_UNDEFINED; + case 'n': return TRUST_NONE; + case 'm': return TRUST_MARGINAL; + case 'f': return TRUST_FULL; + case 'u': return TRUST_ULTIMATE; + default: return TRUST_UNKNOWN; + } +} + +KgpgKeyTrust Convert::toTrust(const QString &s) +{ + return s.isEmpty() ? TRUST_UNKNOWN : toTrust(s[0]); +} + +KgpgKeyOwnerTrust Convert::toOwnerTrust(const QChar &c) +{ + switch (c.toAscii()) + { + case 'n': return OWTRUST_NONE; + case 'm': return OWTRUST_MARGINAL; + case 'u': return OWTRUST_ULTIMATE; + case 'f': return OWTRUST_FULL; + default: return OWTRUST_UNDEFINED; + } +} + +KgpgKeyOwnerTrust Convert::toOwnerTrust(const QString &s) +{ + return s.isEmpty() ? OWTRUST_UNDEFINED : toOwnerTrust(s[0]); +} + +QPixmap Convert::toPixmap(const KgpgItemType t) +{ + switch (t) + { + case ITYPE_GROUP: return Images::group(); + case ITYPE_GSECRET: + case ITYPE_SECRET: return Images::orphan(); + case ITYPE_GPUBLIC: + case ITYPE_SUB: + case ITYPE_PUBLIC: return Images::single(); + case ITYPE_GPAIR: + case ITYPE_PAIR: return Images::pair(); + case ITYPE_UID: return Images::userId(); + case ITYPE_UAT: return Images::photo(); + case ITYPE_REVSIGN: return Images::revoke(); + case ITYPE_SIGN: return Images::signature(); + default: Q_ASSERT(1); + return NULL; + } +} + +} // namespace KgpgCore diff --git a/kgpg/core/convert.h b/kgpg/core/convert.h new file mode 100644 index 0000000..96043a8 --- /dev/null +++ b/kgpg/core/convert.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2006 Jimmy Gilles <[email protected]> + * Copyright (C) 2010 Rolf Eike Beer <[email protected]> + */ +/*************************************************************************** + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef CONVERT_H +#define CONVERT_H + +#include "kgpgkey.h" + +class QColor; +class QString; +class QPixmap; + +namespace KgpgCore +{ + +class Convert +{ +public: + static QString toString(const KgpgCore::KgpgKeyAlgo algorithm); + static QString toString(const KgpgCore::KgpgKeyOwnerTrust ownertrust); + static QString toString(const KgpgCore::KgpgKeyTrust trust); + static QString toString(const QDate &date); + static QColor toColor(const KgpgCore::KgpgKeyTrust trust); + static KgpgKeyAlgo toAlgo(const uint v); + static KgpgKeyAlgo toAlgo(const QString &s); + static KgpgKeyTrust toTrust(const QChar &c); + static KgpgKeyTrust toTrust(const QString &s); + static KgpgKeyOwnerTrust toOwnerTrust(const QChar &c); + static KgpgKeyOwnerTrust toOwnerTrust(const QString &s); + static QPixmap toPixmap(const KgpgCore::KgpgItemType t); +}; + +} // namespace KgpgCore + +#endif // CONVERT_H diff --git a/kgpg/core/images.cpp b/kgpg/core/images.cpp new file mode 100644 index 0000000..c63dceb --- /dev/null +++ b/kgpg/core/images.cpp @@ -0,0 +1,100 @@ +/*************************************************************************** + * Copyright (C) 2006 by Jimmy Gilles * + * [email protected] * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "images.h" + +//#include <KIconLoader> + +namespace KgpgCore +{ + +QPixmap Images::single() +{ + static QPixmap single; +// if (single.isNull()) +// single = KIconLoader::global()->loadIcon(QLatin1String( "key-single" ), KIconLoader::Small, 20); + return single; +} + +QPixmap Images::pair() +{ + static QPixmap pair; +// if (pair.isNull()) +// pair = KIconLoader::global()->loadIcon(QLatin1String( "key-pair" ), KIconLoader::Small, 20); + return pair; +} + +QPixmap Images::group() +{ + static QPixmap group; +// if (group.isNull()) +// group = KIconLoader::global()->loadIcon(QLatin1String( "key-group" ), KIconLoader::Small, 20); + return group; +} + +QPixmap Images::orphan() +{ + static QPixmap oprpan; +// if (oprpan.isNull()) +// oprpan = KIconLoader::global()->loadIcon(QLatin1String( "key-orphan" ), KIconLoader::Small, 20); + return oprpan; +} + +QPixmap Images::signature() +{ + static QPixmap signature; +// if (signature.isNull()) +// signature = KIconLoader::global()->loadIcon(QLatin1String( "application-pgp-signature" ), KIconLoader::Small, 20); + return signature; +} + +QPixmap Images::userId() +{ + static QPixmap userid; +// if (userid.isNull()) +// userid = KIconLoader::global()->loadIcon(QLatin1String( "x-office-contact" ), KIconLoader::Small, 20); + return userid; +} + +QPixmap Images::photo() +{ + static QPixmap photo; +// if (photo.isNull()) +// photo = KIconLoader::global()->loadIcon(QLatin1String( "image-x-generic" ), KIconLoader::Small, 20); + return photo; +} + +QPixmap Images::revoke() +{ + static QPixmap revoke; +// if (revoke.isNull()) +// revoke = KIconLoader::global()->loadIcon(QLatin1String( "dialog-error" ), KIconLoader::Small, 20); + return revoke; +} + +QPixmap Images::kgpg() +{ + static QPixmap kgpg; +// if (kgpg.isNull()) +// kgpg = KIconLoader::global()->loadIcon(QLatin1String( "kgpg" ), KIconLoader::Desktop); + return kgpg; +} + +} // namespace KgpgCore diff --git a/kgpg/core/images.h b/kgpg/core/images.h new file mode 100644 index 0000000..739a618 --- /dev/null +++ b/kgpg/core/images.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright (C) 2006 by Jimmy Gilles * + * [email protected] * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef IMAGES_H +#define IMAGES_H + +#include <QPixmap> + +namespace KgpgCore +{ + +class Images +{ +public: + static QPixmap single(); + static QPixmap pair(); + static QPixmap group(); + static QPixmap orphan(); + static QPixmap signature(); + static QPixmap userId(); + static QPixmap photo(); + static QPixmap revoke(); + + /* Desktop image */ + static QPixmap kgpg(); +}; + +} // namespace KgpgCore + +#endif // IMAGES_H diff --git a/kgpg/core/kgpgkey.cpp b/kgpg/core/kgpgkey.cpp new file mode 100644 index 0000000..57ed820 --- /dev/null +++ b/kgpg/core/kgpgkey.cpp @@ -0,0 +1,354 @@ +/* + * Copyright (C) 2006,2007 Jimmy Gilles <[email protected]> + * Copyright (C) 2007,2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgkey.h" + +#include "convert.h" + +//#include <KLocale> + +#include <QStringList> + +namespace KgpgCore +{ + +//BEGIN KeySub +KgpgKeySubPrivate::KgpgKeySubPrivate(const QString &id, const uint size, const KgpgKeyTrust trust, const KgpgKeyAlgo algo, + const KgpgSubKeyType type, const QDateTime &date) + : gpgsubid(id), + gpgsubsize(size), + gpgsubcreation(date), + gpgsubtrust(trust), + gpgsubalgo(algo), + gpgsubtype(type) +{ +} + +bool KgpgKeySubPrivate::operator==(const KgpgKeySubPrivate &other) const +{ + if (gpgsubvalid != other.gpgsubvalid) return false; + if (gpgsubalgo != other.gpgsubalgo) return false; + if (gpgsubid != other.gpgsubid) return false; + if (gpgsubsize != other.gpgsubsize) return false; + if (gpgsubexpiration != other.gpgsubexpiration) return false; + if (gpgsubcreation != other.gpgsubcreation) return false; + if (gpgsubtrust != other.gpgsubtrust) return false; + if (gpgsubtype != other.gpgsubtype) return false; + return true; +} + +KgpgKeySub::KgpgKeySub(const QString &id, const uint size, const KgpgKeyTrust trust, const KgpgKeyAlgo algo, const KgpgSubKeyType type, + const QDateTime &date) + : d(new KgpgKeySubPrivate(id, size, trust, algo, type, date)) +{ + d->gpgsubvalid = false; +} + +KgpgKeySub::KgpgKeySub(const KgpgKeySub &other) +{ + d = other.d; +} + +void KgpgKeySub::setExpiration(const QDateTime &date) +{ + d->gpgsubexpiration = date; +} + +void KgpgKeySub::setValid(const bool valid) +{ + d->gpgsubvalid = valid; +} + +QString KgpgKeySub::id() const +{ + return d->gpgsubid; +} + +uint KgpgKeySub::size() const +{ + return d->gpgsubsize; +} + +bool KgpgKeySub::unlimited() const +{ + return d->gpgsubexpiration.isNull(); +} + +QDateTime KgpgKeySub::expirationDate() const +{ + return d->gpgsubexpiration; +} + +QDateTime KgpgKeySub::creationDate() const +{ + return d->gpgsubcreation; +} + +KgpgKeyTrust KgpgKeySub::trust() const +{ + return d->gpgsubtrust; +} + +KgpgKeyAlgo KgpgKeySub::algorithm() const +{ + return d->gpgsubalgo; +} + +bool KgpgKeySub::valid() const +{ + return d->gpgsubvalid; +} + +KgpgSubKeyType KgpgKeySub::type() const +{ + return d->gpgsubtype; +} + +bool KgpgKeySub::operator==(const KgpgKeySub &other) const +{ + if (d == other.d) return true; + if ((*d) == (*(other.d))) return true; + return false; +} + +KgpgKeySub& KgpgKeySub::operator=(const KgpgKeySub &other) +{ + d = other.d; + return *this; +} + +//END KeySub + + +//BEGIN Key + +KgpgKeyPrivate::KgpgKeyPrivate(const QString &id, const uint size, const KgpgKeyTrust trust, const KgpgKeyAlgo algo, const QDateTime &date) + : gpgkeysecret(false), + gpgkeyvalid(false), + gpgkeyid(id), + gpgkeysize(size), + gpgkeytrust(trust), + gpgkeycreation(date), + gpgkeyalgo(algo), + gpgsublist(new KgpgKeySubList()) +{ +} + +bool KgpgKeyPrivate::operator==(const KgpgKeyPrivate &other) const +{ + if (gpgkeysecret != other.gpgkeysecret) return false; + if (gpgkeyvalid != other.gpgkeyvalid) return false; + if (gpgkeymail != other.gpgkeymail) return false; + if (gpgkeyname != other.gpgkeyname) return false; + if (gpgkeycomment != other.gpgkeycomment) return false; + if (gpgkeyfingerprint != other.gpgkeyfingerprint) return false; + if (gpgkeyid != other.gpgkeyid) return false; + if (gpgkeysize != other.gpgkeysize) return false; + if (gpgkeyownertrust != other.gpgkeyownertrust) return false; + if (gpgkeytrust != other.gpgkeytrust) return false; + if (gpgkeycreation != other.gpgkeycreation) return false; + if (gpgkeyexpiration != other.gpgkeyexpiration) return false; + if (gpgkeyalgo != other.gpgkeyalgo) return false; + if (gpgsublist != other.gpgsublist) return false; + return true; +} + +KgpgKey::KgpgKey(const QString &id, const uint size, const KgpgKeyTrust trust, const KgpgKeyAlgo algo, const QDateTime &date) + : d(new KgpgKeyPrivate(id, size, trust, algo, date)) +{ +} + +KgpgKey::KgpgKey(const KgpgKey &other) +{ + d = other.d; +} + +void KgpgKey::setSecret(const bool secret) +{ + d->gpgkeysecret = secret; +} + +void KgpgKey::setValid(const bool valid) +{ + d->gpgkeyvalid = valid; +} + +void KgpgKey::setName(const QString &name) +{ + d->gpgkeyname = name; +} + +void KgpgKey::setEmail(const QString &email) +{ + d->gpgkeymail = email; +} + +void KgpgKey::setComment(const QString &comment) +{ + d->gpgkeycomment = comment; +} + +void KgpgKey::setFingerprint(const QString &fingerprint) +{ + d->gpgkeyfingerprint = fingerprint; +} + +void KgpgKey::setOwnerTrust(const KgpgKeyOwnerTrust &owtrust) +{ + d->gpgkeyownertrust = owtrust; +} + +void KgpgKey::setExpiration(const QDateTime &date) +{ + d->gpgkeyexpiration = date; +} + +bool KgpgKey::secret() const +{ + return d->gpgkeysecret; +} + +bool KgpgKey::valid() const +{ + return d->gpgkeyvalid; +} + +QString KgpgKey::id() const +{ + return d->gpgkeyid.right(8); +} + +QString KgpgKey::fullId() const +{ + return d->gpgkeyid; +} + +QString KgpgKey::name() const +{ + return d->gpgkeyname; +} + +QString KgpgKey::email() const +{ + return d->gpgkeymail; +} + +QString KgpgKey::comment() const +{ + return d->gpgkeycomment; +} + +const QString &KgpgKey::fingerprint() const +{ + return d->gpgkeyfingerprint; +} + +QString KgpgKey::fingerprintBeautified() const +{ + QString fingervalue =d->gpgkeyfingerprint; + uint len = fingervalue.length(); + if ((len > 0) && (len % 4 == 0)) + for (uint n = 0; 4 * (n + 1) < len; ++n) + fingervalue.insert(5 * n + 4, QLatin1Char( ' ' )); + return fingervalue; +} + +uint KgpgKey::size() const +{ + return d->gpgkeysize; +} + +uint KgpgKey::encryptionSize() const +{ + // Get the first encryption subkey + for (int i = 0; i < d->gpgsublist->count(); ++i) { + KgpgKeySub temp = d->gpgsublist->at(i); + if (temp.type() & SKT_ENCRYPTION) { + return temp.size(); + } + } + return 0; +} + +KgpgKeyOwnerTrust KgpgKey::ownerTrust() const +{ + return d->gpgkeyownertrust; +} + +KgpgKeyTrust KgpgKey::trust() const +{ + return d->gpgkeytrust; +} + +QDateTime KgpgKey::creationDate() const +{ + return d->gpgkeycreation; +} + +QDateTime KgpgKey::expirationDate() const +{ + return d->gpgkeyexpiration; +} + +bool KgpgKey::unlimited() const +{ + return d->gpgkeyexpiration.isNull(); +} + +KgpgKeyAlgo KgpgKey::algorithm() const +{ + return d->gpgkeyalgo; +} + +KgpgKeyAlgo KgpgKey::encryptionAlgorithm() const +{ + // Get the first encryption subkey + for (int i = 0; i < d->gpgsublist->count(); ++i) { + KgpgKeySub temp = d->gpgsublist->at(i); + if (temp.type() & SKT_ENCRYPTION) { + return temp.algorithm(); + } + } + return ALGO_UNKNOWN; +} + +KgpgKeySubListPtr KgpgKey::subList() const +{ + return d->gpgsublist; +} + +bool KgpgKey::operator==(const KgpgKey &other) const +{ + if (d == other.d) return true; + if ((*d) == (*(other.d))) return true; + return false; +} + +KgpgKey& KgpgKey::operator=(const KgpgKey &other) +{ + d = other.d; + return *this; +} + +KgpgKeyList::operator QStringList() const +{ + QStringList res; + foreach(const KgpgKey &key, *this) + res << key.fullId(); + return res; +} + +//END Key + +} // namespace KgpgCore diff --git a/kgpg/core/kgpgkey.h b/kgpg/core/kgpgkey.h new file mode 100644 index 0000000..f16907c --- /dev/null +++ b/kgpg/core/kgpgkey.h @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2006,2007 Jimmy Gilles <[email protected]> + * Copyright (C) 2007,2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGKEY_H +#define KGPGKEY_H + +#include <QSharedDataPointer> +#include <QSharedData> +#include <QPointer> +#include <QObject> +#include <QList> +#include <QDateTime> + +class QStringList; + +namespace KgpgCore +{ + +//BEGIN Enums + +enum KgpgKeyAlgoFlag +{ + ALGO_UNKNOWN = 0, + ALGO_RSA = 1, + ALGO_DSA = 2, + ALGO_ELGAMAL = 4, + ALGO_DSA_ELGAMAL = ALGO_DSA | ALGO_ELGAMAL, + ALGO_RSA_RSA = 0x10001 +}; +Q_DECLARE_FLAGS(KgpgKeyAlgo, KgpgKeyAlgoFlag) +Q_DECLARE_OPERATORS_FOR_FLAGS(KgpgKeyAlgo) + +/*! \brief trust levels of keys, uids and uats + * + * These values represent the trust that you have in a public key or obe if it's + * user ids or attributes (i.e. photo ids). They are more or less ordered by + * the level of trust. Every value but the first and the last matches one trust + * value that is + */ +enum KgpgKeyTrustFlag +{ + TRUST_MINIMUM = 0, //!< internal value for use in filters + TRUST_INVALID = 1, //!< key is invalid + TRUST_DISABLED = 2, //!< key is disabled by user (not owner) + TRUST_REVOKED = 3, //!< key is revoked by owner + TRUST_EXPIRED = 4, //!< key is beyond it's expiry date + TRUST_UNDEFINED = 5, //!< trust value undefined (i.e. you did not set a trust level) + TRUST_UNKNOWN = 6, //!< trust value unknown (i.e. no entry in gpg's trust database) + TRUST_NONE = 7, //!< there is no trusted path to this key + TRUST_MARGINAL = 8, //!< there is a minimal level of trust + TRUST_FULL = 9, //!< you can fully trust this key + TRUST_ULTIMATE = 10, //!< this key has highest possible level of trust (e.g. your own secret keys) + TRUST_NOKEY = 11 //!< internal value, e.g. for key groups +}; +Q_DECLARE_FLAGS(KgpgKeyTrust, KgpgKeyTrustFlag) +Q_DECLARE_OPERATORS_FOR_FLAGS(KgpgKeyTrust) + +/*! \brief trust levels for trust in other key owners + * + * These values represent the trust that you have in other people when they + * sign keys. Once you have signed someones keys you can benefit from the + * keys they have signed if you trust them to carefully check which keys they + * sign. + */ +enum KgpgKeyOwnerTrustFlag +{ + OWTRUST_UNKNOWN = 0, //!< Trust value is unknown (e.g. no entry in trust database). + OWTRUST_UNDEFINED = 1, //!< Trust value undefined (e.g. not trust level set). + OWTRUST_NONE = 2, //!< You do not trust the key owner, keys signed by him are untrusted. + OWTRUST_MARGINAL = 3, //!< You have a minimum level of trust in the key owner. + OWTRUST_FULL = 4, //!< You believe the key owner does good checking. Keys signed by him are trusted by you, too. + OWTRUST_ULTIMATE = 5 //!< There is no doubt in this key owner. This level is used for your own secret keys. +}; +Q_DECLARE_FLAGS(KgpgKeyOwnerTrust, KgpgKeyOwnerTrustFlag) +Q_DECLARE_OPERATORS_FOR_FLAGS(KgpgKeyOwnerTrust) + +enum KgpgSubKeyTypeFlag +{ + SKT_ENCRYPTION = 0x1, + SKT_SIGNATURE = 0x2, + SKT_AUTHENTICATION = 0x4, + SKT_CERTIFICATION = 0x8 +}; +Q_DECLARE_FLAGS(KgpgSubKeyType, KgpgSubKeyTypeFlag) +Q_DECLARE_OPERATORS_FOR_FLAGS(KgpgSubKeyType) + +/*! \brief types of items in the item models + * + * Every item in the item models is of one of the following types. Some of the + * items can have properties of more than one basic type, e.g. a key pair can + * act both as a secret and a public key. Because of this the value for key + * pairs is a composite of the two "elementary" types for secret and public + * keys. Other compositions than the ones defined here must not be used to set + * an item type, but may of course be used as a mask for comparison. + */ +enum KgpgItemTypeFlag +{ + ITYPE_GROUP = 1, //!< the element is a GnuPG key group + ITYPE_SECRET = 2, //!< secret key + ITYPE_PUBLIC = 4, //!< public key + ITYPE_PAIR = ITYPE_SECRET | ITYPE_PUBLIC, //!< key pair + ITYPE_GSECRET = ITYPE_GROUP | ITYPE_SECRET, //!< secret key as member of a key group + ITYPE_GPUBLIC = ITYPE_GROUP | ITYPE_PUBLIC, //!< public key as member of a key group + ITYPE_GPAIR = ITYPE_GROUP | ITYPE_PAIR, //!< key pair as member of a key group + ITYPE_SUB = 8, //!< subkey of a public or secret key + ITYPE_UID = 16, //!< additional user id + ITYPE_UAT = 32, //!< user attribute to a key (i.e. photo id) + ITYPE_REVSIGN = 64, //!< revokation signature + ITYPE_SIGN = 128 //!< signature (to a key, uid or uat) +}; +Q_DECLARE_FLAGS(KgpgItemType, KgpgItemTypeFlag) +Q_DECLARE_OPERATORS_FOR_FLAGS(KgpgItemType) + +//END Enums + +//BEGIN KeySub + +class KgpgKeySubPrivate : public QSharedData +{ + KgpgKeySubPrivate(); +public: + KgpgKeySubPrivate(const QString &id, const uint size, const KgpgKeyTrust trust, const KgpgKeyAlgo algo, const KgpgSubKeyType type, + const QDateTime &date); + + bool gpgsubvalid; + const QString gpgsubid; + const uint gpgsubsize; + QDateTime gpgsubexpiration; + const QDateTime gpgsubcreation; + const KgpgKeyTrust gpgsubtrust; + const KgpgKeyAlgo gpgsubalgo; + const KgpgSubKeyType gpgsubtype; + + bool operator==(const KgpgKeySubPrivate &other) const; + inline bool operator!=(const KgpgKeySubPrivate &other) const + { return !operator==(other); } +}; + +class KgpgKeySub +{ + KgpgKeySub(); +public: + KgpgKeySub(const QString &id, const uint size, const KgpgKeyTrust trust, const KgpgKeyAlgo algo, const KgpgSubKeyType type, + const QDateTime &date); + KgpgKeySub(const KgpgKeySub &other); + + void setExpiration(const QDateTime &date); + void setValid(const bool valid); // FIXME : is it possible to have a subkey that is not valid (disabled)? Please give an example. Thx. If not, this method should be removed. + + QString id() const; + uint size() const; + bool unlimited() const; + QDateTime expirationDate() const; + QDateTime creationDate() const; + KgpgKeyTrust trust() const; + KgpgKeyAlgo algorithm() const; + bool valid() const; + KgpgSubKeyType type() const; + + bool operator==(const KgpgKeySub &other) const; + inline bool operator!=(const KgpgKeySub &other) const + { return !operator==(other); } + KgpgKeySub& operator=(const KgpgKeySub &other); + +private: + QSharedDataPointer<KgpgKeySubPrivate> d; +}; + +class KgpgKeySubList : public QList<KgpgKeySub>, public QObject +{ +public: + inline KgpgKeySubList() { } + inline explicit KgpgKeySubList(const KgpgKeySub &sub) { append(sub); } + inline KgpgKeySubList(const KgpgKeySubList &other) : QList<KgpgKeySub>(other), QObject() { } + inline KgpgKeySubList(const QList<KgpgKeySub> &other) : QList<KgpgKeySub>(other), QObject() { } + + inline KgpgKeySubList operator+(const KgpgKeySubList &other) const + { + KgpgKeySubList n = *this; + n += other; + return n; + } + + inline KgpgKeySubList &operator<<(KgpgKeySub sub) + { + append(sub); + return *this; + } + + inline KgpgKeySubList &operator<<(const KgpgKeySubList &l) + { + *this += l; + return *this; + } +}; +typedef QPointer<KgpgKeySubList> KgpgKeySubListPtr; + +//END KeySub + + +//BEGIN Key + +class KgpgKeyPrivate : public QSharedData +{ + KgpgKeyPrivate(); +public: + KgpgKeyPrivate(const QString &id, const uint size, const KgpgKeyTrust trust, const KgpgKeyAlgo algo, const QDateTime &date); + + bool gpgkeysecret; + bool gpgkeyvalid; + QString gpgkeymail; + QString gpgkeyname; + QString gpgkeycomment; + QString gpgkeyfingerprint; + const QString gpgkeyid; + const uint gpgkeysize; + KgpgKeyOwnerTrust gpgkeyownertrust; + const KgpgKeyTrust gpgkeytrust; + const QDateTime gpgkeycreation; + QDateTime gpgkeyexpiration; + const KgpgKeyAlgo gpgkeyalgo; + + KgpgKeySubListPtr gpgsublist; + + bool operator==(const KgpgKeyPrivate &other) const; + inline bool operator!=(const KgpgKeyPrivate &other) const + { return !operator==(other); } +}; + +class KgpgKey +{ + KgpgKey(); +public: + KgpgKey(const QString &id, const uint size, const KgpgKeyTrust trust, const KgpgKeyAlgo algo, const QDateTime &date); + KgpgKey(const KgpgKey &other); + + void setSecret(const bool secret); + void setValid(const bool valid); + void setName(const QString &name); + void setEmail(const QString &email); + void setComment(const QString &comment); + void setFingerprint(const QString &fingerprint); + void setOwnerTrust(const KgpgKeyOwnerTrust &owtrust); + void setExpiration(const QDateTime &date); + + bool secret() const; + bool valid() const; + QString id() const; + QString fullId() const; + QString name() const; + QString email() const; + QString comment() const; + const QString &fingerprint() const; + QString fingerprintBeautified() const; + uint size() const; + uint encryptionSize() const; + KgpgKeyOwnerTrust ownerTrust() const; + KgpgKeyTrust trust() const; + QDateTime creationDate() const; + QDateTime expirationDate() const; + bool unlimited() const; + KgpgKeyAlgo algorithm() const; + KgpgKeyAlgo encryptionAlgorithm() const; + + KgpgKeySubListPtr subList() const; + + bool operator==(const KgpgKey &other) const; + inline bool operator!=(const KgpgKey &other) const + { return !operator==(other); } + KgpgKey& operator=(const KgpgKey &other); + +private: + QSharedDataPointer<KgpgKeyPrivate> d; +}; + +class KgpgKeyList : public QList<KgpgKey>, public QObject +{ +public: + inline KgpgKeyList() { } + inline explicit KgpgKeyList(const KgpgKey &key) { append(key); } + inline KgpgKeyList(const KgpgKeyList &other) : QList<KgpgKey>(other), QObject() { } + inline KgpgKeyList(const QList<KgpgKey> &other) : QList<KgpgKey>(other), QObject() { } + + inline KgpgKeyList& operator=(const KgpgKeyList &other) + { + QList<KgpgKey>::operator=(static_cast<const QList<KgpgKey> >(other)); + return *this; + } + + inline KgpgKeyList operator+(const KgpgKeyList &other) const + { + KgpgKeyList n = *this; + n += other; + return n; + } + + inline KgpgKeyList &operator<<(KgpgKey key) + { + append(key); + return *this; + } + + inline KgpgKeyList &operator<<(const KgpgKeyList &l) + { + *this += l; + return *this; + } + + operator QStringList() const; +}; + +//END Key + +} // namespace + +#endif // KGPGKEY_H diff --git a/kgpg/gpgproc.cpp b/kgpg/gpgproc.cpp new file mode 100644 index 0000000..10f2845 --- /dev/null +++ b/kgpg/gpgproc.cpp @@ -0,0 +1,370 @@ +/* + * Copyright (C) 2007,2008,2009,2010,2011,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "gpgproc.h" + +//#include "kgpgsettings.h" + +//#include <KDebug> +#include <QDebug> +//#include <KProcess> +#include "kprocess.h" +//#include <KStandardDirs> +#include <QDir> +#include <QTextCodec> + +class GnupgBinary { +public: + GnupgBinary(); + + const QString &binary() const; + void setBinary(const QString &executable); + const QStringList &standardArguments() const; + unsigned int version() const; + bool supportsDebugLevel() const; + //static GnupgBinary* instance(); + +private: + QString m_binary; + QStringList m_standardArguments; + unsigned int m_version; + bool m_useDebugLevel; +}; + +GnupgBinary::GnupgBinary() + : m_useDebugLevel(false) +{ +} + +const QString &GnupgBinary::binary() const +{ + return m_binary; +} + +/** + * @brief check if GnuPG returns an error for this arguments + * @param executable the GnuPG executable to call + * @param arguments the arguments to pass to executable + * + * The arguments will be used together with "--version", so they should not + * be any commands. + */ +static bool checkGnupgArguments(const QString &executable, const QStringList &arguments) +{ + KProcess gpg; + + // We ignore the output anyway, just make sure it doesn't clutter the output of + // the parent process. Simplify the handling by putting all trash in one can. + gpg.setOutputChannelMode(KProcess::MergedChannels); + + QStringList allArguments = arguments; + allArguments << QLatin1String("--version"); + gpg.setProgram(executable, allArguments); + + return (gpg.execute() == 0); +} + +static QString getGpgProcessHome(const QString &binary) +{ + GPGProc process(0, binary); + process << QLatin1String( "--version" ); + process.start(); + process.waitForFinished(-1); + + if (process.exitCode() == 255) { + return QString(); + } + + QString line; + while (process.readln(line) != -1) { + if (line.startsWith(QLatin1String("Home: "))) { + line.remove(0, 6); + return line; + } + } + + return QString(); +} + + +void GnupgBinary::setBinary(const QString &executable) +{ + qDebug() << "checking version of GnuPG executable" << executable; + // must be set first as gpgVersionString() uses GPGProc to parse the output + m_binary = executable; + const QString verstr = GPGProc::gpgVersionString(executable); + m_version = GPGProc::gpgVersion(verstr); + qDebug() << "version is" << verstr << m_version; + + m_useDebugLevel = (m_version > 0x20000); + + const QString gpgConfigFile = "";//KGpgSettings::gpgConfigPath(); + + m_standardArguments.clear(); + m_standardArguments << QLatin1String( "--no-secmem-warning" ) + << QLatin1String( "--no-tty" ) + << QLatin1String("--no-greeting") + << QLatin1String("--homedir") << GPGProc::getGpgHome(""); + + if (!gpgConfigFile.isEmpty()) + m_standardArguments << QLatin1String("--options") + << gpgConfigFile; + + QStringList debugLevelArguments(QLatin1String("--debug-level")); + debugLevelArguments << QLatin1String("none"); + if (checkGnupgArguments(executable, debugLevelArguments)) + m_standardArguments << debugLevelArguments; +} + +const QStringList& GnupgBinary::standardArguments() const +{ + return m_standardArguments; +} + +unsigned int GnupgBinary::version() const +{ + return m_version; +} + +bool GnupgBinary::supportsDebugLevel() const +{ + return m_useDebugLevel; +} + +Q_GLOBAL_STATIC(GnupgBinary, lastBinary) + +GPGProc::GPGProc(QObject *parent, const QString &binary) + : KLineBufferedProcess(parent) +{ + resetProcess(binary); +} + +GPGProc::~GPGProc() +{ +} + +void +GPGProc::resetProcess(const QString &binary) +{ + GnupgBinary *bin = lastBinary(); + QString executable; + + //qDebug() << "bin:" << binary; + + if (binary.isEmpty()) { + //executable = KGpgSettings::gpgBinaryPath(); + QString appPath = qApp->applicationDirPath(); + QString gpgBin; + #ifdef Q_WS_WIN + gpgBin = appPath + "/bin/gpg.exe"; + #endif + #ifdef Q_WS_MAC + gpgBin = appPath + "/gpg-mac"; + #endif + #ifdef Q_WS_X11 + gpgBin = appPath + "/bin/gpg"; + #endif + executable = gpgBin; + } else + executable = binary; + + if (bin->binary() != executable) + bin->setBinary(executable); + //qDebug() << "ex: " << executable; + setProgram(executable, bin->standardArguments()); + + setOutputChannelMode(OnlyStdoutChannel); + + disconnect(SIGNAL(finished(int,QProcess::ExitStatus))); + disconnect(SIGNAL(lineReadyStandardOutput())); +} + +void GPGProc::start() +{ + // make sure there is exactly one connection from us to that signal + connect(this, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(finished()), Qt::UniqueConnection); + connect(this, SIGNAL(lineReadyStandardOutput()), this, SLOT(received()), Qt::UniqueConnection); + KProcess::start(); +} + +void GPGProc::received() +{ + emit readReady(); +} + +void GPGProc::finished() +{ + emit processExited(); +} + +int GPGProc::readln(QString &line, const bool colons) +{ + QByteArray a; + if (!readLineStandardOutput(&a)) + return -1; + + line = recode(a, colons); + + return line.length(); +} + +int GPGProc::readln(QStringList &l) +{ + QString s; + + int len = readln(s); + if (len < 0) + return len; + + l = s.split(QLatin1Char( ':' )); + + for (int i = 0; i < l.count(); ++i) + { + int j = 0; + while ((j = l[i].indexOf(QLatin1String( "\\x3a" ), j, Qt::CaseInsensitive)) >= 0) + { + l[i].replace(j, 4, QLatin1Char( ':' )); + j++; + } + } + + return l.count(); +} + +QString +GPGProc::recode(QByteArray a, const bool colons) +{ + int pos = 0; + + while ((pos = a.indexOf("\\x", pos)) >= 0) { + if (pos > a.length() - 4) + break; + + const QByteArray pattern(a.mid(pos, 4)); + const QByteArray hexnum(pattern.right(2)); + bool ok; + char n[2]; + n[0] = hexnum.toUShort(&ok, 16); + n[1] = '\0'; // to use n as a 0-terminated string + if (!ok) + continue; + + // QLatin1Char( ':' ) must be skipped, it is used as column delimiter + // since it is pure ascii it can be replaced in QString. + if (!colons && (n[0] == ':' )) { + pos += 3; + continue; + } + + // it is likely to find the same byte sequence more than once + int npos = pos; + do { + a.replace(npos, 4, n); + } while ((npos = a.indexOf(pattern, npos)) >= 0); + } + + return QTextCodec::codecForName("utf8")->toUnicode(a); +} + +int GPGProc::gpgVersion(const QString &vstr) +{ + if (vstr.isEmpty()) + return -1; + + QStringList values(vstr.split(QLatin1Char( '.' ))); + if (values.count() < 3) + return -2; + + return (0x10000 * values[0].toInt() + 0x100 * values[1].toInt() + values[2].toInt()); +} + +QString GPGProc::gpgVersionString(const QString &binary) +{ + GPGProc process(0, binary); + process << QLatin1String( "--version" ); + process.start(); + process.waitForFinished(-1); + + if (process.exitCode() == 255) { + qDebug() << "exit255"; + return QString(); + } + + QString line; + if (process.readln(line) != -1) { + qDebug() << line; + return line.simplified().section(QLatin1Char( ' ' ), -1); + } else { + qDebug() << "no readln"; + return QString(); + } +} + +QString GPGProc::getGpgStartupError(const QString &binary) +{ + GPGProc process(0, binary); + process << QLatin1String( "--version" ); + process.start(); + process.waitForFinished(-1); + + QString result; + + while (process.hasLineStandardError()) { + QByteArray tmp; + process.readLineStandardError(&tmp); + tmp += '\n'; + result += QString::fromUtf8(tmp); + } + + return result; +} + +QString GPGProc::getGpgHome(const QString &binary) +{ + // First try: if environment is set GnuPG will use that directory + // We can use this directly without starting a new process +/* QByteArray env(qgetenv("GNUPGHOME")); + QString gpgHome; + if (!env.isEmpty()) { + gpgHome = QLatin1String( env ); + } else if (!binary.isEmpty()) { + // Second try: start GnuPG and ask what it is + gpgHome = getGpgProcessHome(binary); + } + + // Third try: guess what it is. + if (gpgHome.isEmpty()) { +#ifdef Q_OS_WIN32 //krazy:exclude=cpp + gpgHome = qgetenv("APPDATA") + QLatin1String( "/gnupg/" ); + gpgHome.replace(QLatin1Char( '\\' ), QLatin1Char( '/' )); +#else + gpgHome = QDir::homePath() + QLatin1String( "/.gnupg/" ); +#endif + } + + gpgHome.replace(QLatin1String( "//" ), QLatin1String( "/" )); + + if (!gpgHome.endsWith(QLatin1Char( '/' ))) + gpgHome.append(QLatin1Char( '/' )); + + if (gpgHome.startsWith(QLatin1Char( '~' ))) + gpgHome.replace(0, 1, QDir::homePath()); + + //KStandardDirs::makeDir(gpgHome, 0700);*/ + QString appPath = qApp->applicationDirPath(); + QString gpgHome = appPath + "/keydb"; + + return gpgHome; +} + +//#include "gpgproc.moc" diff --git a/kgpg/gpgproc.h b/kgpg/gpgproc.h new file mode 100644 index 0000000..7f9ae9b --- /dev/null +++ b/kgpg/gpgproc.h @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2007 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +#ifndef GPGPROC_H +#define GPGPROC_H + +#include <QString> +#include <QStringList> +#include <QApplication> + +#include "klinebufferedprocess.h" + +/** + * @brief A interface to GnuPG handling UTF8 recoding correctly + * + * This class handles the GnuPG formatted UTF8 output correctly. + * GnuPG recodes some characters as \\xnn where nn is the hex representation + * of the character. This can't be fixed up simply when using QString as + * QString already did it's own UTF8 conversion. Therefore we replace this + * sequences by their corresponding character so QString will work just fine. + * + * As we know that GnuPG limits it's columns by QLatin1Char( ':' ) we skip \\x3a. Since this + * is an ascii character (single byte) the replacement can be done later without + * problems after the line has been split into pieces. + * + * @author Rolf Eike Beer + */ +class GPGProc : public KLineBufferedProcess +{ + Q_OBJECT + +public: + /** + * Constructor + * @param parent parent object + * @param binary path to GnuPG binary or QString() to use the configured + */ + explicit GPGProc(QObject *parent = 0, const QString &binary = QString()); + + /** + * Destructor + */ + ~GPGProc(); + + /** + * Starts the process + */ + void start(); + + /** + * Reads a line of text (excluding '\\n'). + * + * Use readln() in response to a readReady() signal. + * You may use it multiple times if more than one line of data is + * available. + * + * readln() never blocks. + * + * @param line is used to store the line that was read. + * @param colons recode also colons + * @return the number of characters read, or -1 if no data is available. + */ + int readln(QString &line, const bool colons = false); + + /** + * Reads a line of text and splits it into parts. + * + * Use readln() in response to a readReady() signal. + * You may use it multiple times if more than one line of data is + * available. + * + * readln() never blocks. + * + * @param l is used to store the parts of the line that was read. + * @return the number of characters read, or -1 if no data is available. + */ + int readln(QStringList &l); + + /** + * Recode a line from GnuPG encoding to UTF8 + * + * @param a data to recode + * @param colons recode also colons + * @return recoded string + */ + static QString recode(QByteArray a, const bool colons = true); + + /** + * Reset the class to the state it had right after creation + * @param binary path to GnuPG binary or empty string to use the configured one + */ + void resetProcess(const QString &binary = QString()); + + /** + * @brief parse GnuPG version string and return version as number + * @param vstr version string + * @return -1 if vstr is empty, -2 on parse error, parsed number on success + * + * The version string must be in format A.B.C with A, B, and C numbers. The + * returned number is A * 65536 + B * 256 + C. + */ + static int gpgVersion(const QString &vstr); + /** + * @brief get the GnuPG version string of the given binary + * @param binary name or path to GnuPG binary + * @return version string or empty string on error + * + * This starts a GnuPG process and asks the binary for version information. + * The returned string is the version information without any leading text. + */ + static QString gpgVersionString(const QString &binary); + /** + * @brief find users GnuPG directory + * @param binary name or path to GnuPG binary + * @return path to directory + * + * Use this function to find out where GnuPG would store it's configuration + * and data files. The returned path always ends with a '/'. + */ + static QString getGpgHome(const QString &binary); + + /** + * @brief run GnuPG and check if it complains about anything + * @param binary the GnuPG binary to run + * @return the error message GnuPG gave out (if any) + */ + static QString getGpgStartupError(const QString &binary); + +signals: + /** + * Emitted when the process is ready for reading. + * The signal is only emitted if at least one complete line of data is ready. + * @param p the process that emitted the signal + */ + void readReady(); + + /** + * Emitted when the process has finished + * @param p the process that emitted the signal + */ + void processExited(); + +protected slots: + void finished(); + void received(); +}; + +#endif // GPGPROC_H diff --git a/kgpg/kgpginterface.cpp b/kgpg/kgpginterface.cpp new file mode 100644 index 0000000..8632897 --- /dev/null +++ b/kgpg/kgpginterface.cpp @@ -0,0 +1,439 @@ +/* + * Copyright (C) 2002 Jean-Baptiste Mardelle <[email protected]> + * Copyright (C) 2007,2008,2009,2010,2011,2012 + * Rolf Eike Beer <[email protected]> + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpginterface.h" + +#include "gpgproc.h" +#include "core/convert.h" +#include "core/KGpgKeyNode.h" +#include "core/KGpgSignNode.h" +#include "core/KGpgSubkeyNode.h" +#include "core/KGpgUatNode.h" +#include "core/KGpgUidNode.h" + +/*#include <KConfig> +#include <KDebug> +#include <KGlobal> +#include <KLocale> +#include <KMessageBox> +#include <KPasswordDialog> +#include <KProcess> +#include <KPushButton>*/ +#include <QFile> +#include <QPointer> +#include <QString> +#include <QTextStream> +#include <QDebug> +#include <QInputDialog> + +using namespace KgpgCore; + +QString KgpgInterface::getGpgSetting(const QString &name, const QString &configfile) +{ + const QString tmp(name.simplified() + QLatin1Char( ' ' )); + QFile qfile(configfile); + + if (qfile.open(QIODevice::ReadOnly) && (qfile.exists())) { + QTextStream t(&qfile); + while (!t.atEnd()) { + QString result(t.readLine().simplified()); + if (result.startsWith(tmp)) { + result = result.mid(tmp.length()).simplified(); + return result.section(QLatin1Char( ' ' ), 0, 0); + } + } + qfile.close(); + } + + return QString(); +} + +void KgpgInterface::setGpgSetting(const QString &name, const QString &value, const QString &url) +{ + QFile qfile(url); + + if (qfile.open(QIODevice::ReadOnly) && (qfile.exists())) { + const QString temp(name + QLatin1Char( ' ' )); + QString texttowrite; + bool found = false; + QTextStream t(&qfile); + + while (!t.atEnd()) { + QString result = t.readLine(); + if (result.simplified().startsWith(temp)) { + if (!value.isEmpty()) + result = temp + QLatin1Char( ' ' ) + value; + else + result.clear(); + found = true; + } + + texttowrite += result + QLatin1Char( '\n' ); + } + + qfile.close(); + if ((!found) && (!value.isEmpty())) + texttowrite += QLatin1Char( '\n' ) + temp + QLatin1Char( ' ' ) + value; + + if (qfile.open(QIODevice::WriteOnly)) { + QTextStream t(&qfile); + t << texttowrite; + qfile.close(); + } + } +} + +bool KgpgInterface::getGpgBoolSetting(const QString &name, const QString &configfile) +{ + QFile qfile(configfile); + if (qfile.open(QIODevice::ReadOnly) && (qfile.exists())) { + QTextStream t(&qfile); + while (!t.atEnd()) { + if (t.readLine().simplified().startsWith(name)) + return true; + } + qfile.close(); + } + return false; +} + +void KgpgInterface::setGpgBoolSetting(const QString &name, const bool enable, const QString &url) +{ + QFile qfile(url); + + if (qfile.open(QIODevice::ReadOnly) && (qfile.exists())) { + QString texttowrite; + bool found = false; + QTextStream t(&qfile); + + while (!t.atEnd()) { + QString result(t.readLine()); + + if (result.simplified().startsWith(name)) { + if (enable) + result = name; + else + result.clear(); + + found = true; + } + + texttowrite += result + QLatin1Char( '\n' ); + } + qfile.close(); + + if ((!found) && (enable)) + texttowrite += name; + + if (qfile.open(QIODevice::WriteOnly)) { + QTextStream t(&qfile); + t << texttowrite; + qfile.close(); + } + } +} + +int KgpgInterface::sendPassphrase(const QString &text, KProcess *process, QWidget *widget) +{ + qDebug() << "KgpgInterface::sendPassphrase called"; + + QPointer<KProcess> gpgprocess = process; + QByteArray passphrase; + //int code; + bool ok; + + /*QPointer<KPasswordDialog> dlg = new KPasswordDialog(widget); + QObject::connect(process, SIGNAL(processExited()), dlg->button(KDialog::Cancel), SLOT(click())); + dlg->setPrompt(text); + code = dlg->exec(); + + if (!dlg.isNull()) + passphrase = dlg->password().toUtf8(); + delete dlg; + + if (code != KPasswordDialog::Accepted) + return 1; +*/ + + QString password = QInputDialog::getText(QApplication::activeWindow(), QObject::tr("Enter Password"), + text, QLineEdit::Password, + "", &ok); + + if(!ok) return 1; + + passphrase = password.toAscii(); + + if (!gpgprocess.isNull()) { + gpgprocess->write(passphrase + '\n'); + } + + return 0; +} + +/** + * @param p the process that reads the GnuPG data + * @param readNode the node where the signatures are read for + */ +static KgpgCore::KgpgKeyList +readPublicKeysProcess(GPGProc &p, KGpgKeyNode *readNode) +{ + QStringList lsp; + int items; + KgpgCore::KgpgKeyList publiclistkeys; + KgpgCore::KgpgKey *publickey = NULL; + unsigned int idIndex = 0; + QString log; + KGpgSignableNode *currentSNode = NULL; ///< the current (sub)node signatures are read for + + while ((items = p.readln(lsp)) >= 0) { + if ((lsp.at(0) == QLatin1String( "pub" )) && (items >= 10)) { + publiclistkeys << KgpgKey(lsp.at(4), lsp.at(2).toUInt(), Convert::toTrust(lsp.at(1)), + Convert::toAlgo(lsp.at(3).toInt()), QDateTime::fromTime_t(lsp.at(5).toUInt())); + + publickey = &publiclistkeys.last(); + + publickey->setOwnerTrust(Convert::toOwnerTrust(lsp.at(8))); + + if (lsp.at(6).isEmpty()) + publickey->setExpiration(QDateTime()); + else + publickey->setExpiration(QDateTime::fromTime_t(lsp.at(6).toUInt())); + + publickey->setValid((items <= 11) || !lsp.at(11).contains(QLatin1Char( 'D' ), Qt::CaseSensitive)); // disabled key + + idIndex = 0; + } else if ((lsp.at(0) == QLatin1String( "fpr" )) && (items >= 10)) { + const QString fingervalue(lsp.at(9)); + + publickey->setFingerprint(fingervalue); + } else if ((lsp.at(0) == QLatin1String( "sub" )) && (items >= 7)) { + KgpgSubKeyType subtype; + + if (items > 11) { + if (lsp.at(11).contains(QLatin1Char( 's' ))) + subtype |= SKT_SIGNATURE; + if (lsp.at(11).contains(QLatin1Char( 'e' ))) + subtype |= SKT_ENCRYPTION; + if (lsp.at(11).contains(QLatin1Char( 'e' ))) + subtype |= SKT_AUTHENTICATION; + if (lsp.at(11).contains(QLatin1Char( 'e' ))) + subtype |= SKT_CERTIFICATION; + } + + KgpgKeySub sub(lsp.at(4), lsp.at(2).toUInt(), Convert::toTrust(lsp.at(1)), + Convert::toAlgo(lsp.at(3).toInt()), subtype, QDateTime::fromTime_t(lsp.at(5).toUInt())); + + // FIXME: Please see kgpgkey.h, KgpgSubKey class + if (items <= 11) + sub.setValid(true); + else + sub.setValid(!lsp.at(11).contains(QLatin1Char( 'D' ))); + + if (lsp.at(6).isEmpty()) + sub.setExpiration(QDateTime()); + else + sub.setExpiration(QDateTime::fromTime_t(lsp.at(6).toUInt())); + + publickey->subList()->append(sub); + if (readNode == NULL) + currentSNode = NULL; + else + currentSNode = new KGpgSubkeyNode(readNode, sub); + } else if (lsp.at(0) == QLatin1String( "uat" )) { + idIndex++; + if (readNode != NULL) { + currentSNode = new KGpgUatNode(readNode, idIndex, lsp); + } + } else if ((lsp.at(0) == QLatin1String( "uid" )) && (items >= 10)) { + if (idIndex == 0) { + QString fullname(lsp.at(9)); + QString kmail; + if (fullname.contains(QLatin1Char( '<' )) ) { + kmail = fullname; + + if (fullname.contains(QLatin1Char( ')' )) ) + kmail = kmail.section(QLatin1Char( ')' ), 1); + + kmail = kmail.section(QLatin1Char( '<' ), 1); + kmail.truncate(kmail.length() - 1); + + if (kmail.contains(QLatin1Char( '<' ))) { + // several email addresses in the same key + kmail = kmail.replace(QLatin1Char( '>' ), QLatin1Char( ';' )); + kmail.remove(QLatin1Char( '<' )); + } + } + + QString kname(fullname.section( QLatin1String( " <" ), 0, 0)); + QString comment; + if (fullname.contains(QLatin1Char( '(' )) ) { + kname = kname.section( QLatin1String( " (" ), 0, 0); + comment = fullname.section(QLatin1Char( '(' ), 1, 1); + comment = comment.section(QLatin1Char( ')' ), 0, 0); + } + + idIndex++; + publickey->setEmail(kmail); + publickey->setComment(comment); + publickey->setName(kname); + + currentSNode = readNode; + } else { + idIndex++; + if (readNode != NULL) { + currentSNode = new KGpgUidNode(readNode, idIndex, lsp); + } + } + } else if (((lsp.at(0) == QLatin1String( "sig" )) || (lsp.at(0) == QLatin1String( "rev" ))) && (items >= 11)) { + // there are no strings here that could have a recoded QLatin1Char( ':' ) in them + const QString signature = lsp.join(QLatin1String(":")); + + if (currentSNode != NULL) + (void) new KGpgSignNode(currentSNode, lsp); + } else { + log += lsp.join(QString(QLatin1Char( ':' ))) + QLatin1Char( '\n' ); + } + } + + if (p.exitCode() != 0) { +// KMessageBox::detailedError(NULL, i18n("An error occurred while scanning your keyring"), log); + qDebug() << "An error occurred while scanning your keyring" << " - " << log; + log.clear(); + } + + return publiclistkeys; +} + +KgpgKeyList KgpgInterface::readPublicKeys(const QStringList &ids) +{ + GPGProc process; + process << + QLatin1String("--with-colons") << + QLatin1String("--with-fingerprint") << + QLatin1String("--fixed-list-mode") << + QLatin1String("--homedir") << GPGProc::getGpgHome("") << + QLatin1String("--list-keys") << + ids; + + process.setOutputChannelMode(KProcess::MergedChannels); + + process.start(); + process.waitForFinished(-1); + return readPublicKeysProcess(process, NULL); +} + +void KgpgInterface::readSignatures(KGpgKeyNode *node) +{ + GPGProc process; + process << + QLatin1String("--with-colons") << + QLatin1String("--with-fingerprint") << + QLatin1String("--fixed-list-mode") << + QLatin1String("--list-sigs") << + node->getId(); + + process.setOutputChannelMode(KProcess::MergedChannels); + + process.start(); + process.waitForFinished(-1); + + readPublicKeysProcess(process, node); +} + +static KgpgCore::KgpgKeyList +readSecretKeysProcess(GPGProc &p) +{ + QStringList lsp; + int items; + bool hasuid = true; + KgpgCore::KgpgKeyList result; + KgpgCore::KgpgKey *secretkey = NULL; + + while ( (items = p.readln(lsp)) >= 0 ) { + if ((lsp.at(0) == QLatin1String( "sec" )) && (items >= 10)) { + result << KgpgKey(lsp.at(4), lsp.at(2).toUInt(), Convert::toTrust(lsp.at(1)), + Convert::toAlgo(lsp.at(3).toInt()), QDateTime::fromTime_t(lsp.at(5).toUInt())); + + secretkey = &result.last(); + + secretkey->setSecret(true); + + if (lsp.at(6).isEmpty()) + secretkey->setExpiration(QDateTime()); + else + secretkey->setExpiration(QDateTime::fromTime_t(lsp.at(6).toUInt())); + hasuid = true; + } else if ((lsp.at(0) == QLatin1String( "uid" )) && (items >= 10)) { + if (hasuid) + continue; + + hasuid = true; + + const QString fullname(lsp.at(9)); + if (fullname.contains(QLatin1Char( '<' ) )) { + QString kmail(fullname); + + if (fullname.contains(QLatin1Char( ')' ) )) + kmail = kmail.section(QLatin1Char( ')' ), 1); + + kmail = kmail.section(QLatin1Char( '<' ), 1); + kmail.truncate(kmail.length() - 1); + + if (kmail.contains(QLatin1Char( '<' ) )) { // several email addresses in the same key + kmail = kmail.replace(QLatin1Char( '>' ), QLatin1Char( ';' )); + kmail.remove(QLatin1Char( '<' )); + } + + secretkey->setEmail(kmail); + } else { + secretkey->setEmail(QString()); + } + + QString kname(fullname.section( QLatin1String( " <" ), 0, 0)); + if (fullname.contains(QLatin1Char( '(' ) )) { + kname = kname.section( QLatin1String( " (" ), 0, 0); + QString comment = fullname.section(QLatin1Char( '(' ), 1, 1); + comment = comment.section(QLatin1Char( ')' ), 0, 0); + + secretkey->setComment(comment); + } else { + secretkey->setComment(QString()); + } + secretkey->setName(kname); + } else if ((lsp.at(0) == QLatin1String( "fpr" )) && (items >= 10)) { + secretkey->setFingerprint(lsp.at(9)); + } + } + + return result; +} + +KgpgKeyList KgpgInterface::readSecretKeys(const QStringList &ids) +{ + GPGProc process; + process << + QLatin1String("--with-colons") << + QLatin1String("--list-secret-keys") << + QLatin1String("--with-fingerprint") << + QLatin1String("--fixed-list-mode") << + ids; + + process.start(); + process.waitForFinished(-1); + KgpgCore::KgpgKeyList result = readSecretKeysProcess(process); + + return result; +} + +//#include "kgpginterface.moc" diff --git a/kgpg/kgpginterface.h b/kgpg/kgpginterface.h new file mode 100644 index 0000000..1ed0e53 --- /dev/null +++ b/kgpg/kgpginterface.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2002 Jean-Baptiste Mardelle <[email protected]> + * Copyright (C) 2007,2008,2009,2010,2011,2012 + * Rolf Eike Beer <[email protected]> + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGINTERFACE_H +#define KGPGINTERFACE_H + +#include "core/kgpgkey.h" +#include <QStringList> + +class KGpgKeyNode; +class KProcess; +class QString; +class QApplication; + +/** + * GnuPG interface functions + */ +namespace KgpgInterface { + QString getGpgSetting(const QString &name, const QString &configfile); + void setGpgSetting(const QString &name, const QString &value, const QString &url); + + bool getGpgBoolSetting(const QString &name, const QString &configfile); + void setGpgBoolSetting(const QString &name, const bool enable, const QString &url); + + /** + * @brief ask the user for a passphrase and send it to the given gpg process + * @param text text is the message that must be displayed in the MessageBox + * @param process GnuPG process + * @param isnew if the password is a \e new password that must be confirmed. Default is true + * @param widget parent widget of this dialog or NULL + * @return 0 if there is no error + * @return 1 if there is an error + */ + int sendPassphrase(const QString &text, KProcess *process, QWidget *widget = NULL); + + KgpgCore::KgpgKeyList readPublicKeys(const QStringList &ids = QStringList()); + void readSignatures(KGpgKeyNode *node); + KgpgCore::KgpgKeyList readSecretKeys(const QStringList &ids = QStringList()); +}; + +#endif // KGPGINTERFACE_H diff --git a/kgpg/klinebufferedprocess.cpp b/kgpg/klinebufferedprocess.cpp new file mode 100644 index 0000000..00099af --- /dev/null +++ b/kgpg/klinebufferedprocess.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2008 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "klinebufferedprocess.h" + + +KLineBufferedProcessPrivate::KLineBufferedProcessPrivate(KLineBufferedProcess *parent) + : m_newlineInStdout(-1), + m_newlineInStderr(-1), + m_parent(parent), +#ifdef Q_OS_WIN32 //krazy:exclude=cpp + m_lineEnd("\r\n") +#else + m_lineEnd("\n") +#endif +{ +} + +KLineBufferedProcess::KLineBufferedProcess(QObject *parent) + : KProcess(parent), + d(new KLineBufferedProcessPrivate(this)) +{ + connect(this, SIGNAL(readyReadStandardOutput()), this, SLOT(_k_receivedStdout())); + connect(this, SIGNAL(readyReadStandardError()), this, SLOT(_k_receivedStderr())); +} + +KLineBufferedProcess::~KLineBufferedProcess() +{ + delete d; +} + +void KLineBufferedProcessPrivate::_k_receivedStdout() +{ + QByteArray ndata = m_parent->readAllStandardOutput(); + int oldBufferSize = m_stdoutBuffer.size(); + m_stdoutBuffer.append(ndata); + + if (m_newlineInStdout < 0) { + m_newlineInStdout = ndata.indexOf(m_lineEnd); + if (m_newlineInStdout >= 0) { + m_newlineInStdout += oldBufferSize; + emit m_parent->lineReadyStandardOutput(); + } + } +} + +void KLineBufferedProcessPrivate::_k_receivedStderr() +{ + QByteArray ndata = m_parent->readAllStandardError(); + int oldBufferSize = m_stderrBuffer.size(); + m_stderrBuffer.append(ndata); + + if (m_newlineInStderr < 0) { + m_newlineInStderr = ndata.indexOf(m_lineEnd); + if (m_newlineInStderr >= 0) { + m_newlineInStderr += oldBufferSize; + emit m_parent->lineReadyStandardError(); + } + } +} + +bool KLineBufferedProcess::readLineStandardOutput(QByteArray *line) +{ + if (d->m_newlineInStdout < 0) { + return false; + } + + // don't copy '\n' + *line = d->m_stdoutBuffer.left(d->m_newlineInStdout); + d->m_stdoutBuffer.remove(0, d->m_newlineInStdout + d->m_lineEnd.length()); + + d->m_newlineInStdout = d->m_stdoutBuffer.indexOf(d->m_lineEnd); + + return true; +} + +bool KLineBufferedProcess::readLineStandardError(QByteArray *line) +{ + if (d->m_newlineInStderr < 0) { + return false; + } + + // don't copy '\n' + *line = d->m_stderrBuffer.left(d->m_newlineInStderr); + d->m_stderrBuffer.remove(0, d->m_newlineInStderr + d->m_lineEnd.length()); + + d->m_newlineInStderr = d->m_stderrBuffer.indexOf(d->m_lineEnd); + + return true; +} + +bool KLineBufferedProcess::hasLineStandardOutput() const +{ + return d->m_newlineInStdout >= 0; +} + +bool KLineBufferedProcess::hasLineStandardError() const +{ + return d->m_newlineInStderr >= 0; +} + +//#include "moc_klinebufferedprocess.cpp" diff --git a/kgpg/klinebufferedprocess.h b/kgpg/klinebufferedprocess.h new file mode 100644 index 0000000..eab360b --- /dev/null +++ b/kgpg/klinebufferedprocess.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2008 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KLINEBUFFEREDPROCESS_H +#define KLINEBUFFEREDPROCESS_H + +#include "kprocess.h" + +class QByteArray; +//class KLineBufferedProcessPrivate; +class KLineBufferedProcess; +class KLineBufferedProcessPrivate +{ +public: + KLineBufferedProcessPrivate(KLineBufferedProcess *parent); + +//private slot implementations + void _k_receivedStdout(); + void _k_receivedStderr(); + + QByteArray m_stdoutBuffer; + QByteArray m_stderrBuffer; + int m_newlineInStdout; + int m_newlineInStderr; + KLineBufferedProcess * const m_parent; + const QByteArray m_lineEnd; +}; + +/** + * Read output of a process split into lines + * + * This class reads the output of a process and splits it up into lines. This + * is especially useful if you try to parse the output of a command line tool. + * + * \b Usage \n + * + * The class is created and set up like a KProcess. After this you can do + * something like this: + * + * \code + * connect(m_linebufprocess, SIGNAL(lineReadyStandardOutput()), SLOT(dataStdout())); + * ... + * void myobj::dataStdout() + * { + * while (m_linebufprocess->hasLineStandardOutput()) { + * QByteArray line; + * m_linebufprocess->readLineStandardOutput(line); + * ... + * } + * } + * \endcode + * + * Never use the read functionality of KProcess with this class. This class + * needs to read all data from the process into an internal buffer first. If + * you try to use the read functions of the parent classes you would normally + * get no output at all. + * + * The write functions of the parent classes are not effected. You can use + * them exactly the same way as in KProcess. + * + * @author Rolf Eike Beer + */ +class KLineBufferedProcess : public KProcess +{ + Q_OBJECT + friend class KLineBufferedProcessPrivate; + +public: + /** + * Constructor + */ + explicit KLineBufferedProcess(QObject *parent = 0); + + /** + * Destructor + */ + ~KLineBufferedProcess(); + + /** + * Reads a line of text (excluding '\\n') from stdout. + * + * Use readLineStdout() in response to a lineReadyStdout() signal or + * when hasLineStdout() returns true. You may use it multiple times if + * more than one line of data is available. If no complete line is + * available the content of line is undefined and the function returns + * false. + * + * @param line is used to store the line that was read. + * @return if data was read or not + */ + bool readLineStandardOutput(QByteArray *line); + + /** + * Reads a line of text (excluding '\\n') from stderr. + * + * Use readLineStderr() in response to a lineReadyStderr() signal or + * when hasLineStderr() returns true. You may use it multiple times if + * more than one line of data is available. If no complete line is + * available the content of line is undefined and the function returns + * false. + * + * @param line is used to store the line that was read. + * @return if data was read or not + */ + bool readLineStandardError(QByteArray *line); + + /** + * Checks if a line is ready on stdout + * + * @return true if a complete line can be read + */ + bool hasLineStandardOutput() const; + + /** + * Checks if a line is ready on stdout + * + * @return true if a complete line can be read + */ + bool hasLineStandardError() const; + +signals: + /** + * Emitted when there is a line of data available from stdout when there was + * previously none. + * There may or may not be more than one line available for reading when this + * signal is emitted. + */ + void lineReadyStandardOutput(); + + /** + * Emitted when there is a line of data available from stderr when there was + * previously none. + * There may or may not be more than one line available for reading when this + * signal is emitted. + */ + void lineReadyStandardError(); + +private: + KLineBufferedProcessPrivate* const d; + + Q_PRIVATE_SLOT(d, void _k_receivedStdout()) + Q_PRIVATE_SLOT(d, void _k_receivedStderr()) +}; + +#endif // KLINEBUFFEREDPROCESS_H diff --git a/kgpg/kprocess.cpp b/kgpg/kprocess.cpp new file mode 100644 index 0000000..907c75c --- /dev/null +++ b/kgpg/kprocess.cpp @@ -0,0 +1,411 @@ +/* + This file is part of the KDE libraries + + Copyright (C) 2007 Oswald Buddenhagen <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kprocess_p.h" + +//#include <kstandarddirs.h> +//#include <kshell.h> +//#ifdef Q_OS_WIN +//# include <kshell_p.h> +//#endif + +#include <qfile.h> +#include <QDebug> + +#ifdef Q_OS_WIN +# include <windows.h> +#else +# include <unistd.h> +# include <errno.h> +#endif + +#ifndef Q_OS_WIN +# define STD_OUTPUT_HANDLE 1 +# define STD_ERROR_HANDLE 2 +#endif + +#ifdef _WIN32_WCE +#include <stdio.h> +#endif + +void KProcessPrivate::writeAll(const QByteArray &buf, int fd) +{ +#ifdef Q_OS_WIN +#ifndef _WIN32_WCE + HANDLE h = GetStdHandle(fd); + if (h) { + DWORD wr; + WriteFile(h, buf.data(), buf.size(), &wr, 0); + } +#else + fwrite(buf.data(), 1, buf.size(), (FILE*)fd); +#endif +#else + int off = 0; + do { + int ret = ::write(fd, buf.data() + off, buf.size() - off); + if (ret < 0) { + if (errno != EINTR) + return; + } else { + off += ret; + } + } while (off < buf.size()); +#endif +} + +void KProcessPrivate::forwardStd(KProcess::ProcessChannel good, int fd) +{ + Q_Q(KProcess); + + QProcess::ProcessChannel oc = q->readChannel(); + q->setReadChannel(good); + writeAll(q->readAll(), fd); + q->setReadChannel(oc); +} + +void KProcessPrivate::_k_forwardStdout() +{ +#ifndef _WIN32_WCE + forwardStd(KProcess::StandardOutput, STD_OUTPUT_HANDLE); +#else + forwardStd(KProcess::StandardOutput, (int)stdout); +#endif +} + +void KProcessPrivate::_k_forwardStderr() +{ +#ifndef _WIN32_WCE + forwardStd(KProcess::StandardError, STD_ERROR_HANDLE); +#else + forwardStd(KProcess::StandardError, (int)stderr); +#endif +} + +///////////////////////////// +// public member functions // +///////////////////////////// + +KProcess::KProcess(QObject *parent) : + QProcess(parent), + d_ptr(new KProcessPrivate) +{ + d_ptr->q_ptr = this; + setOutputChannelMode(ForwardedChannels); +} + +KProcess::KProcess(KProcessPrivate *d, QObject *parent) : + QProcess(parent), + d_ptr(d) +{ + d_ptr->q_ptr = this; + setOutputChannelMode(ForwardedChannels); +} + +KProcess::~KProcess() +{ + delete d_ptr; +} + +void KProcess::setOutputChannelMode(OutputChannelMode mode) +{ + Q_D(KProcess); + + d->outputChannelMode = mode; + disconnect(this, SIGNAL(readyReadStandardOutput())); + disconnect(this, SIGNAL(readyReadStandardError())); + switch (mode) { + case OnlyStdoutChannel: + connect(this, SIGNAL(readyReadStandardError()), SLOT(_k_forwardStderr())); + break; + case OnlyStderrChannel: + connect(this, SIGNAL(readyReadStandardOutput()), SLOT(_k_forwardStdout())); + break; + default: + QProcess::setProcessChannelMode((ProcessChannelMode)mode); + return; + } + QProcess::setProcessChannelMode(QProcess::SeparateChannels); +} + +KProcess::OutputChannelMode KProcess::outputChannelMode() const +{ + Q_D(const KProcess); + + return d->outputChannelMode; +} + +void KProcess::setNextOpenMode(QIODevice::OpenMode mode) +{ + Q_D(KProcess); + + d->openMode = mode; +} + +#define DUMMYENV "_KPROCESS_DUMMY_=" + +void KProcess::clearEnvironment() +{ + setEnvironment(QStringList() << QString::fromLatin1(DUMMYENV)); +} + +void KProcess::setEnv(const QString &name, const QString &value, bool overwrite) +{ + QStringList env = environment(); + if (env.isEmpty()) { + env = systemEnvironment(); + env.removeAll(QString::fromLatin1(DUMMYENV)); + } + QString fname(name); + fname.append(QLatin1Char('=')); + for (QStringList::Iterator it = env.begin(); it != env.end(); ++it) + if ((*it).startsWith(fname)) { + if (overwrite) { + *it = fname.append(value); + setEnvironment(env); + } + return; + } + env.append(fname.append(value)); + setEnvironment(env); +} + +void KProcess::unsetEnv(const QString &name) +{ + QStringList env = environment(); + if (env.isEmpty()) { + env = systemEnvironment(); + env.removeAll(QString::fromLatin1(DUMMYENV)); + } + QString fname(name); + fname.append(QLatin1Char('=')); + for (QStringList::Iterator it = env.begin(); it != env.end(); ++it) + if ((*it).startsWith(fname)) { + env.erase(it); + if (env.isEmpty()) + env.append(QString::fromLatin1(DUMMYENV)); + setEnvironment(env); + return; + } +} + +void KProcess::setProgram(const QString &exe, const QStringList &args) +{ + Q_D(KProcess); + + d->prog = exe; + d->args = args; +#ifdef Q_OS_WIN + setNativeArguments(QString()); +#endif +} + +void KProcess::setProgram(const QStringList &argv) +{ + Q_D(KProcess); + + Q_ASSERT( !argv.isEmpty() ); + d->args = argv; + d->prog = d->args.takeFirst(); +#ifdef Q_OS_WIN + setNativeArguments(QString()); +#endif +} + +KProcess &KProcess::operator<<(const QString &arg) +{ + Q_D(KProcess); + + if (d->prog.isEmpty()) + d->prog = arg; + else + d->args << arg; + return *this; +} + +KProcess &KProcess::operator<<(const QStringList &args) +{ + Q_D(KProcess); + + if (d->prog.isEmpty()) + setProgram(args); + else + d->args << args; + return *this; +} + +void KProcess::clearProgram() +{ + Q_D(KProcess); + + d->prog.clear(); + d->args.clear(); +#ifdef Q_OS_WIN + setNativeArguments(QString()); +#endif +} + +/*void KProcess::setShellCommand(const QString &cmd) +{ + Q_D(KProcess); + + KShell::Errors err; + d->args = KShell::splitArgs( + cmd, KShell::AbortOnMeta | KShell::TildeExpand, &err); + if (err == KShell::NoError && !d->args.isEmpty()) { + d->prog = KStandardDirs::findExe(d->args[0]); + if (!d->prog.isEmpty()) { + d->args.removeFirst(); +#ifdef Q_OS_WIN + setNativeArguments(QString()); +#endif + return; + } + } + + d->args.clear(); + +#ifdef Q_OS_UNIX +// #ifdef NON_FREE // ... as they ship non-POSIX /bin/sh +# if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) && !defined(__GNU__) + // If /bin/sh is a symlink, we can be pretty sure that it points to a + // POSIX shell - the original bourne shell is about the only non-POSIX + // shell still in use and it is always installed natively as /bin/sh. + d->prog = QFile::symLinkTarget(QString::fromLatin1("/bin/sh")); + if (d->prog.isEmpty()) { + // Try some known POSIX shells. + d->prog = KStandardDirs::findExe(QString::fromLatin1("ksh")); + if (d->prog.isEmpty()) { + d->prog = KStandardDirs::findExe(QString::fromLatin1("ash")); + if (d->prog.isEmpty()) { + d->prog = KStandardDirs::findExe(QString::fromLatin1("bash")); + if (d->prog.isEmpty()) { + d->prog = KStandardDirs::findExe(QString::fromLatin1("zsh")); + if (d->prog.isEmpty()) + // We're pretty much screwed, to be honest ... + d->prog = QString::fromLatin1("/bin/sh"); + } + } + } + } +# else + d->prog = QString::fromLatin1("/bin/sh"); +# endif + + d->args << QString::fromLatin1("-c") << cmd; +#else // Q_OS_UNIX + // KMacroExpander::expandMacrosShellQuote(), KShell::quoteArg() and + // KShell::joinArgs() may generate these for security reasons. + setEnv(PERCENT_VARIABLE, QLatin1String("%")); + +#ifndef _WIN32_WCE + WCHAR sysdir[MAX_PATH + 1]; + UINT size = GetSystemDirectoryW(sysdir, MAX_PATH + 1); + d->prog = QString::fromUtf16((const ushort *) sysdir, size); + d->prog += QLatin1String("\\cmd.exe"); + setNativeArguments(QLatin1String("/V:OFF /S /C \"") + cmd + QLatin1Char('"')); +#else + d->prog = QLatin1String("\\windows\\cmd.exe"); + setNativeArguments(QLatin1String("/S /C \"") + cmd + QLatin1Char('"')); +#endif +#endif +}*/ + +QStringList KProcess::program() const +{ + Q_D(const KProcess); + + QStringList argv = d->args; + argv.prepend(d->prog); + return argv; +} + +void KProcess::start() +{ + Q_D(KProcess); + qDebug() << "prog: " << d->prog << " | args: " << d->args; + QProcess::start(d->prog, d->args, d->openMode); +} + +int KProcess::execute(int msecs) +{ + start(); + if (!waitForFinished(msecs)) { + kill(); + waitForFinished(-1); + return -2; + } + return (exitStatus() == QProcess::NormalExit) ? exitCode() : -1; +} + +// static +int KProcess::execute(const QString &exe, const QStringList &args, int msecs) +{ + KProcess p; + p.setProgram(exe, args); + return p.execute(msecs); +} + +// static +int KProcess::execute(const QStringList &argv, int msecs) +{ + KProcess p; + p.setProgram(argv); + return p.execute(msecs); +} + +int KProcess::startDetached() +{ + Q_D(KProcess); + + qint64 pid; + if (!QProcess::startDetached(d->prog, d->args, workingDirectory(), &pid)) + return 0; + return (int) pid; +} + +// static +int KProcess::startDetached(const QString &exe, const QStringList &args) +{ + qint64 pid; + if (!QProcess::startDetached(exe, args, QString(), &pid)) + return 0; + return (int) pid; +} + +// static +int KProcess::startDetached(const QStringList &argv) +{ + QStringList args = argv; + QString prog = args.takeFirst(); + return startDetached(prog, args); +} + +int KProcess::pid() const +{ +#ifdef Q_OS_UNIX + return (int) QProcess::pid(); +#else + return QProcess::pid() ? QProcess::pid()->dwProcessId : 0; +#endif +} + +#include "moc_kprocess.cpp" diff --git a/kgpg/kprocess.h b/kgpg/kprocess.h new file mode 100644 index 0000000..6f28e24 --- /dev/null +++ b/kgpg/kprocess.h @@ -0,0 +1,341 @@ +/* + This file is part of the KDE libraries + + Copyright (C) 2007 Oswald Buddenhagen <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KPROCESS_H +#define KPROCESS_H + +//#include <kdecore_export.h> + +#include <QtCore/QProcess> + +class KProcessPrivate; +//#include "kprocess_p.h" +/** + * \class KProcess kprocess.h <KProcess> + * + * Child process invocation, monitoring and control. + * + * This class extends QProcess by some useful functionality, overrides + * some defaults with saner values and wraps parts of the API into a more + * accessible one. + * This is the preferred way of spawning child processes in KDE; don't + * use QProcess directly. + * + * @author Oswald Buddenhagen <[email protected]> + **/ +class KProcess : public QProcess +{ + Q_OBJECT + Q_DECLARE_PRIVATE(KProcess) + +public: + + /** + * Modes in which the output channels can be opened. + */ + enum OutputChannelMode { + SeparateChannels = QProcess::SeparateChannels, + /**< Standard output and standard error are handled by KProcess + as separate channels */ + MergedChannels = QProcess::MergedChannels, + /**< Standard output and standard error are handled by KProcess + as one channel */ + ForwardedChannels = QProcess::ForwardedChannels, + /**< Both standard output and standard error are forwarded + to the parent process' respective channel */ + OnlyStdoutChannel, + /**< Only standard output is handled; standard error is forwarded */ + OnlyStderrChannel /**< Only standard error is handled; standard output is forwarded */ + }; + + /** + * Constructor + */ + explicit KProcess(QObject *parent = 0); + + /** + * Destructor + */ + virtual ~KProcess(); + + /** + * Set how to handle the output channels of the child process. + * + * The default is ForwardedChannels, which is unlike in QProcess. + * Do not request more than you actually handle, as this output is + * simply lost otherwise. + * + * This function must be called before starting the process. + * + * @param mode the output channel handling mode + */ + void setOutputChannelMode(OutputChannelMode mode); + + /** + * Query how the output channels of the child process are handled. + * + * @return the output channel handling mode + */ + OutputChannelMode outputChannelMode() const; + + /** + * Set the QIODevice open mode the process will be opened in. + * + * This function must be called before starting the process, obviously. + * + * @param mode the open mode. Note that this mode is automatically + * "reduced" according to the channel modes and redirections. + * The default is QIODevice::ReadWrite. + */ + void setNextOpenMode(QIODevice::OpenMode mode); + + /** + * Adds the variable @p name to the process' environment. + * + * This function must be called before starting the process. + * + * @param name the name of the environment variable + * @param value the new value for the environment variable + * @param overwrite if @c false and the environment variable is already + * set, the old value will be preserved + */ + void setEnv(const QString &name, const QString &value, bool overwrite = true); + + /** + * Removes the variable @p name from the process' environment. + * + * This function must be called before starting the process. + * + * @param name the name of the environment variable + */ + void unsetEnv(const QString &name); + + /** + * Empties the process' environment. + * + * Note that LD_LIBRARY_PATH/DYLD_LIBRARY_PATH is automatically added + * on *NIX. + * + * This function must be called before starting the process. + */ + void clearEnvironment(); + + /** + * Set the program and the command line arguments. + * + * This function must be called before starting the process, obviously. + * + * @param exe the program to execute + * @param args the command line arguments for the program, + * one per list element + */ + void setProgram(const QString &exe, const QStringList &args = QStringList()); + + /** + * @overload + * + * @param argv the program to execute and the command line arguments + * for the program, one per list element + */ + void setProgram(const QStringList &argv); + + /** + * Append an element to the command line argument list for this process. + * + * If no executable is set yet, it will be set instead. + * + * For example, doing an "ls -l /usr/local/bin" can be achieved by: + * \code + * KProcess p; + * p << "ls" << "-l" << "/usr/local/bin"; + * ... + * \endcode + * + * This function must be called before starting the process, obviously. + * + * @param arg the argument to add + * @return a reference to this KProcess + */ + KProcess &operator<<(const QString& arg); + + /** + * @overload + * + * @param args the arguments to add + * @return a reference to this KProcess + */ + KProcess &operator<<(const QStringList& args); + + /** + * Clear the program and command line argument list. + */ + void clearProgram(); + + /** + * Set a command to execute through a shell (a POSIX sh on *NIX + * and cmd.exe on Windows). + * + * Using this for anything but user-supplied commands is usually a bad + * idea, as the command's syntax depends on the platform. + * Redirections including pipes, etc. are better handled by the + * respective functions provided by QProcess. + * + * If KProcess determines that the command does not really need a + * shell, it will trasparently execute it without one for performance + * reasons. + * + * This function must be called before starting the process, obviously. + * + * @param cmd the command to execute through a shell. + * The caller must make sure that all filenames etc. are properly + * quoted when passed as argument. Failure to do so often results in + * serious security holes. See KShell::quoteArg(). + */ + void setShellCommand(const QString &cmd); + + /** + * Obtain the currently set program and arguments. + * + * @return a list, the first element being the program, the remaining ones + * being command line arguments to the program. + */ + QStringList program() const; + + /** + * Start the process. + * + * @see QProcess::start(const QString &, const QStringList &, OpenMode) + */ + void start(); + + /** + * Start the process, wait for it to finish, and return the exit code. + * + * This method is roughly equivalent to the sequence: + * <code> + * start(); + * waitForFinished(msecs); + * return exitCode(); + * </code> + * + * Unlike the other execute() variants this method is not static, + * so the process can be parametrized properly and talked to. + * + * @param msecs time to wait for process to exit before killing it + * @return -2 if the process could not be started, -1 if it crashed, + * otherwise its exit code + */ + int execute(int msecs = -1); + + /** + * @overload + * + * @param exe the program to execute + * @param args the command line arguments for the program, + * one per list element + * @param msecs time to wait for process to exit before killing it + * @return -2 if the process could not be started, -1 if it crashed, + * otherwise its exit code + */ + static int execute(const QString &exe, const QStringList &args = QStringList(), int msecs = -1); + + /** + * @overload + * + * @param argv the program to execute and the command line arguments + * for the program, one per list element + * @param msecs time to wait for process to exit before killing it + * @return -2 if the process could not be started, -1 if it crashed, + * otherwise its exit code + */ + static int execute(const QStringList &argv, int msecs = -1); + + /** + * Start the process and detach from it. See QProcess::startDetached() + * for details. + * + * Unlike the other startDetached() variants this method is not static, + * so the process can be parametrized properly. + * @note Currently, only the setProgram()/setShellCommand() and + * setWorkingDirectory() parametrizations are supported. + * + * The KProcess object may be re-used immediately after calling this + * function. + * + * @return the PID of the started process or 0 on error + */ + int startDetached(); + + /** + * @overload + * + * @param exe the program to start + * @param args the command line arguments for the program, + * one per list element + * @return the PID of the started process or 0 on error + */ + static int startDetached(const QString &exe, const QStringList &args = QStringList()); + + /** + * @overload + * + * @param argv the program to start and the command line arguments + * for the program, one per list element + * @return the PID of the started process or 0 on error + */ + static int startDetached(const QStringList &argv); + + /** + * Obtain the process' ID as known to the system. + * + * Unlike with QProcess::pid(), this is a real PID also on Windows. + * + * This function can be called only while the process is running. + * It cannot be applied to detached processes. + * + * @return the process ID + */ + int pid() const; + +protected: + /** + * @internal + */ + KProcess(KProcessPrivate *d, QObject *parent); + + /** + * @internal + */ + KProcessPrivate * const d_ptr; + +private: + // hide those + using QProcess::setReadChannelMode; + using QProcess::readChannelMode; + using QProcess::setProcessChannelMode; + using QProcess::processChannelMode; + + Q_PRIVATE_SLOT(d_func(), void _k_forwardStdout()) + Q_PRIVATE_SLOT(d_func(), void _k_forwardStderr()) +}; + +#endif + diff --git a/kgpg/kprocess_p.h b/kgpg/kprocess_p.h new file mode 100644 index 0000000..11d3356 --- /dev/null +++ b/kgpg/kprocess_p.h @@ -0,0 +1,50 @@ +/* + This file is part of the KDE libraries + + Copyright (C) 2007 Oswald Buddenhagen <[email protected]> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KPROCESS_P_H +#define KPROCESS_P_H + +#include "kprocess.h" + +//class KProcess; + +class KProcessPrivate { + Q_DECLARE_PUBLIC(KProcess) +protected: + KProcessPrivate() : + openMode(QIODevice::ReadWrite) + { + } + void writeAll(const QByteArray &buf, int fd); + void forwardStd(KProcess::ProcessChannel good, int fd); + void _k_forwardStdout(); + void _k_forwardStderr(); + + QString prog; + QStringList args; + KProcess::OutputChannelMode outputChannelMode; + QIODevice::OpenMode openMode; + + KProcess *q_ptr; +}; + + +#endif diff --git a/kgpg/transactions/kgpgdecrypt.cpp b/kgpg/transactions/kgpgdecrypt.cpp new file mode 100644 index 0000000..20f0c50 --- /dev/null +++ b/kgpg/transactions/kgpgdecrypt.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2010,2011,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgdecrypt.h" + +#include "../gpgproc.h" +//#include "kgpgsettings.h" + +//#include <KLocale> + +KGpgDecrypt::KGpgDecrypt(QObject *parent, const QString &text) + : KGpgTextOrFileTransaction(parent, text), + m_fileIndex(-1), + m_plainLength(-1) +{ +} + +KGpgDecrypt::KGpgDecrypt(QObject *parent, const QList<QUrl> &files) + : KGpgTextOrFileTransaction(parent, files), + m_fileIndex(0), + m_plainLength(-1) +{ +} + +KGpgDecrypt::KGpgDecrypt(QObject* parent, const QUrl& infile, const QUrl& outfile) + : KGpgTextOrFileTransaction(parent, QList<QUrl>() << infile ), + m_fileIndex(0), + m_plainLength(-1), + m_outFilename(outfile.toLocalFile()) +{ +} + +KGpgDecrypt::~KGpgDecrypt() +{ +} + +QStringList +KGpgDecrypt::command() const +{ + QStringList ret; + + ret << QLatin1String("--decrypt") << QLatin1String("--command-fd=0"); + + if (!m_outFilename.isEmpty()) + ret << QLatin1String("-o") << m_outFilename; + + //ret << KGpgSettings::customDecrypt().simplified().split(QLatin1Char(' '), QString::SkipEmptyParts); + + return ret; +} + +QStringList +KGpgDecrypt::decryptedText() const +{ + QStringList result; + int txtlength = 0; + + foreach (const QString &line, getMessages()) + if (!line.startsWith(QLatin1String("[GNUPG:] "))) { + result.append(line); + txtlength += line.length() + 1; + } + + if (result.isEmpty()) + return result; + + QString last = result.last(); + // this may happen when the original text did not end with a newline + if (last.endsWith(QLatin1String("[GNUPG:] DECRYPTION_OKAY"))) { + // if GnuPG doesn't tell us the length assume that this happend + // if it told us the length then check if it _really_ happend + if (((m_plainLength != -1) && (txtlength != m_plainLength)) || + (m_plainLength == -1)) { + last.chop(24); + result[result.count() - 1] = last; + } + } + + return result; +} + +bool +KGpgDecrypt::isEncryptedText(const QString &text, int *startPos, int *endPos) +{ + int posStart = text.indexOf(QLatin1String("-----BEGIN PGP MESSAGE-----")); + if (posStart == -1) + return false; + + int posEnd = text.indexOf(QLatin1String("-----END PGP MESSAGE-----"), posStart); + if (posEnd == -1) + return false; + + if (startPos != NULL) + *startPos = posStart; + if (endPos != NULL) + *endPos = posEnd; + + return true; +} + +bool +KGpgDecrypt::nextLine(const QString& line) +{ + const QList<QUrl> &inputFiles = getInputFiles(); + + if (!inputFiles.isEmpty()) { + if (line == QLatin1String("[GNUPG:] BEGIN_DECRYPTION")) { + emit statusMessage(tr("Status message 'Decrypting <filename>' (operation starts)", "Decrypting %1").arg(inputFiles.at(m_fileIndex).toLocalFile())); + emit infoProgress(2 * m_fileIndex + 1, inputFiles.count() * 2); + } else if (line == QLatin1String("[GNUPG:] END_DECRYPTION")) { + emit statusMessage(tr("Status message 'Decrypted <filename>' (operation was completed)", "Decrypted %1").arg(inputFiles.at(m_fileIndex).toLocalFile())); + m_fileIndex++; + emit infoProgress(2 * m_fileIndex, inputFiles.count() * 2); + } + } else { + if (line.startsWith(QLatin1String("[GNUPG:] PLAINTEXT_LENGTH "))) { + bool ok; + m_plainLength = line.mid(26).toInt(&ok); + if (!ok) + m_plainLength = -1; + } else if (line == QLatin1String("[GNUPG:] BEGIN_DECRYPTION")) { + // close the command channel (if any) to signal GnuPG that it + // can start sending the output. + getProcess()->closeWriteChannel(); + } + } + + return KGpgTextOrFileTransaction::nextLine(line); +} + +//#include "kgpgdecrypt.moc" diff --git a/kgpg/transactions/kgpgdecrypt.h b/kgpg/transactions/kgpgdecrypt.h new file mode 100644 index 0000000..aa28c19 --- /dev/null +++ b/kgpg/transactions/kgpgdecrypt.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2010,2011 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGDECRYPT_H +#define KGPGDECRYPT_H + +#include <QObject> + +#include <QUrl> + +#include "kgpgtextorfiletransaction.h" + +class QProcess; +class QStringList; + +/** + * @brief decrypt the given text or files + */ +class KGpgDecrypt: public KGpgTextOrFileTransaction { + Q_OBJECT + + Q_DISABLE_COPY(KGpgDecrypt) + KGpgDecrypt(); // = delete C++0x +public: + /** + * @brief decrypt given text + * @param parent parent object + * @param text text to decrypt + */ + explicit KGpgDecrypt(QObject *parent, const QString &text = QString()); + + /** + * @brief decrypt file(s) + * @param parent parent object + * @param files list of file locations to decrypt + */ + KGpgDecrypt(QObject *parent, const QList<QUrl> &files); + + /** + * @brief decrypt file to given output filename + * @param parent parent object + * @param infile name of file to decrypt + * @param outfile name of file to write output to (will be overwritten) + */ + KGpgDecrypt(QObject *parent, const QUrl &infile, const QUrl &outfile); + + /** + * @brief destructor + */ + virtual ~KGpgDecrypt(); + + /** + * @brief get decryption result + * @return decrypted text + */ + QStringList decryptedText() const; + + /** + * @brief check if the given text contains an encoded message + * @param text text to check + * @param startPos if not NULL start offset of encoded text will be returned here + * @param endPos if not NULL end offset of encoded text will be returned here + */ + static bool isEncryptedText(const QString &text, int *startPos = NULL, int *endPos = NULL); + +protected: + virtual QStringList command() const; + virtual bool nextLine(const QString &line); + +private: + int m_fileIndex; + int m_plainLength; ///< length of decrypted plain text if given by GnuPG + const QString m_outFilename; ///< name of file to write output to +}; + +#endif // KGPGDECRYPT_H diff --git a/kgpg/transactions/kgpgdelkey.cpp b/kgpg/transactions/kgpgdelkey.cpp new file mode 100644 index 0000000..ac09610 --- /dev/null +++ b/kgpg/transactions/kgpgdelkey.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2008,2009,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgdelkey.h" + +#include "../gpgproc.h" + +#include <QString> +#include <QStringList> + +/*KGpgDelKey::KGpgDelKey(QObject *parent, KGpgKeyNode *key) + : KGpgTransaction(parent) +{ + m_keys << key; + setCmdLine(); +}*/ + +KGpgDelKey::KGpgDelKey(QObject *parent, const QStringList &uids) + : KGpgTransaction(parent), + m_uids(uids) +{ + setCmdLine(); +} + +KGpgDelKey::~KGpgDelKey() +{ +} + +QStringList +KGpgDelKey::keys() const +{ + return m_uids; +} + +bool +KGpgDelKey::nextLine(const QString &line) +{ + if (!line.startsWith(QLatin1String("[GNUPG:] GOT_IT"))) + setSuccess(KGpgTransaction::TS_MSG_SEQUENCE); + + return false; +} + +KGpgTransaction::ts_boolanswer +KGpgDelKey::boolQuestion(const QString &line) +{ + if (line.startsWith(QLatin1String("delete_key.okay"))) + return KGpgTransaction::BA_YES; + + if (line.startsWith(QLatin1String("delete_key.secret.okay"))) + return KGpgTransaction::BA_YES; + + return KGpgTransaction::boolQuestion(line); +} + +bool +KGpgDelKey::preStart() +{ + GPGProc *proc = getProcess(); + QStringList args = proc->program(); + + /*foreach (const KGpgKeyNode *key, m_keys) + args << key->getFingerprint();*/ + foreach (const QString uid, m_uids) + args << uid; + + proc->setProgram(args); + + setSuccess(KGpgTransaction::TS_OK); + + return true; +} + +void +KGpgDelKey::setCmdLine() +{ + addArgument(QLatin1String( "--status-fd=1" )); + addArgument(QLatin1String( "--command-fd=0" )); + addArgument(QLatin1String( "--delete-secret-and-public-key" )); + + m_argscount = getProcess()->program().count(); +} + +//#include "kgpgdelkey.moc" diff --git a/kgpg/transactions/kgpgdelkey.h b/kgpg/transactions/kgpgdelkey.h new file mode 100644 index 0000000..c7a35ae --- /dev/null +++ b/kgpg/transactions/kgpgdelkey.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2008,2009 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGDELKEY_H +#define KGPGDELKEY_H + +#include "kgpgtransaction.h" + +#include "../core/KGpgKeyNode.h" + +#include <QObject> + +/** + * @brief delete a public key + */ +class KGpgDelKey: public KGpgTransaction { + Q_OBJECT + + Q_DISABLE_COPY(KGpgDelKey) + KGpgDelKey(); // = delete C++0x +public: + //KGpgDelKey(QObject *parent, KGpgKeyNode *key); + KGpgDelKey(QObject *parent, const QStringList &uids); + virtual ~KGpgDelKey(); + + /** + * @brief the keys that were requested to be removed + * @return the list of key nodes + */ + QStringList keys() const; + +protected: + virtual bool nextLine(const QString &line); + virtual ts_boolanswer boolQuestion(const QString &line); + virtual bool preStart(); + +private: + //KGpgKeyNode::List m_keys; + QStringList m_uids; + int m_argscount; + + void setCmdLine(); +}; + +#endif // KGPGDELKEY_H diff --git a/kgpg/transactions/kgpgencrypt.cpp b/kgpg/transactions/kgpgencrypt.cpp new file mode 100644 index 0000000..4891bf0 --- /dev/null +++ b/kgpg/transactions/kgpgencrypt.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2011,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "kgpgencrypt.h" + +//#include "kgpgsettings.h" +#include "../gpgproc.h" + +//#include <kio/renamedialog.h> +//#include <KLocale> +#include <QPointer> + +static QStringList trustOptions(const QString &binary) +{ + const int gpgver = GPGProc::gpgVersion(GPGProc::gpgVersionString(binary)); + QStringList args; + if (gpgver >= 0x10302) + args << QLatin1String("--trust-model") + << QLatin1String("always"); + else + args << QLatin1String("--always-trust"); + + return args; +} + +KGpgEncrypt::KGpgEncrypt(QObject *parent, const QStringList &userIds, const QString &text, const EncryptOptions &options, const QStringList &extraOptions) + : KGpgTextOrFileTransaction(parent, text), + m_fileIndex(-1), + m_options(options), + m_userIds(userIds), + m_extraOptions(extraOptions) +{ + if ((m_options & AllowUntrustedEncryption) && !m_userIds.isEmpty()) + m_extraOptions << trustOptions(getProcess()->program().at(0)); +} + +KGpgEncrypt::KGpgEncrypt(QObject *parent, const QStringList &userIds, const QList<QUrl> &files, const EncryptOptions &options, const QStringList &extraOptions) + : KGpgTextOrFileTransaction(parent, files), + m_fileIndex(0), + m_options(options), + m_userIds(userIds), + m_extraOptions(extraOptions) +{ + if ((m_options & AllowUntrustedEncryption) && !m_userIds.isEmpty()) + m_extraOptions << trustOptions(getProcess()->program().at(0)); +} + +KGpgEncrypt::~KGpgEncrypt() +{ +} + +QStringList +KGpgEncrypt::command() const +{ + QStringList ret = m_extraOptions; + + if (m_options.testFlag(AsciiArmored)) + ret << QLatin1String("--armor"); + + if (m_userIds.isEmpty()) { + ret << QLatin1String( "--symmetric" ); + } else { + if (m_options.testFlag(HideKeyId)) + ret << QLatin1String("--throw-keyid"); + + foreach (const QString &uid, m_userIds) + ret << QLatin1String( "--recipient" ) << uid; + ret << QLatin1String( "--encrypt" ); + } + + return ret; +} + +QStringList +KGpgEncrypt::encryptedText() const +{ + QStringList result; + int txtlength = 0; + + foreach (const QString &line, getMessages()) + if (!line.startsWith(QLatin1String("[GNUPG:] "))) { + result.append(line); + txtlength += line.length() + 1; + } + + return result; +} + +bool +KGpgEncrypt::nextLine(const QString &line) +{ + const QList<QUrl> &inputFiles = getInputFiles(); + + if (line.startsWith(QLatin1String("[GNUPG:] MISSING_PASSPHRASE"))) { + setSuccess(KGpgTransaction::TS_BAD_PASSPHRASE); + return true; + } + + if (!inputFiles.isEmpty()) { + static const QString encStart = QLatin1String("[GNUPG:] FILE_START 2 "); + static const QString encDone = QLatin1String("[GNUPG:] FILE_DONE"); + static const QString askName = QLatin1String("[GNUPG:] GET_LINE openfile.askoutname"); + + if (line.startsWith(encStart)) { + m_currentFile = line.mid(encStart.length()); + emit statusMessage(tr("Status message 'Encrypting <filename>' (operation starts)", "Encrypting %1").arg(m_currentFile)); + emit infoProgress(2 * m_fileIndex + 1, inputFiles.count() * 2); + } else if (line == encDone) { + emit statusMessage(tr("Status message 'Encrypted <filename>' (operation was completed)", "Encrypted %1").arg(m_currentFile)); + m_fileIndex++; + emit infoProgress(2 * m_fileIndex, inputFiles.count() * 2); +// TODO +/* } else if (line == askName) { + QPointer<KIO::RenameDialog> over = new KIO::RenameDialog(qobject_cast<QWidget *>(parent()), + i18n("File Already Exists"), KUrl(), + KUrl::fromPath(m_currentFile + encryptExtension(m_options.testFlag(AsciiArmored))), + KIO::M_OVERWRITE); + + if (over->exec() != QDialog::Accepted) { + delete over; + setSuccess(KGpgTransaction::TS_USER_ABORTED); + return true; + } + write(over->newDestUrl().path().toUtf8()); + delete over;*/ + } + } + + return KGpgTextOrFileTransaction::nextLine(line); +} + +QString +KGpgEncrypt::encryptExtension(const bool ascii) +{ + if (ascii) + return QLatin1String( ".asc" ); + /*else if (KGpgSettings::pgpExtension()) + return QLatin1String( ".pgp" );*/ + else + return QLatin1String( ".gpg" ); +} + +//#include "kgpgencrypt.moc" diff --git a/kgpg/transactions/kgpgencrypt.h b/kgpg/transactions/kgpgencrypt.h new file mode 100644 index 0000000..ad9d89c --- /dev/null +++ b/kgpg/transactions/kgpgencrypt.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2011 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGENCRYPT_H +#define KGPGENCRYPT_H + +#include <QObject> +#include <QString> +#include <QStringList> + +#include <QUrl> + +#include "kgpgtextorfiletransaction.h" + +class QProcess; + +/** + * @brief encrypt the given text or files + */ +class KGpgEncrypt: public KGpgTextOrFileTransaction { + Q_OBJECT + + Q_DISABLE_COPY(KGpgEncrypt) + KGpgEncrypt(); // = delete C++0x +public: + enum EncryptOption { + DefaultEncryption = 0, ///< use whatever GnuPGs defaults are + AsciiArmored = 0x1, ///< output the data as printable ASCII as opposed to binary data + AllowUntrustedEncryption = 0x2, ///< allow encryption with untrusted keys, ignored for symmetric encryption + HideKeyId = 0x4 ///< remove anything that shows which key ids this data is encrypted to, ignored for symmetric encryption + }; + Q_DECLARE_FLAGS(EncryptOptions, EncryptOption); + + /** + * @brief encrypt given text + * @param parent parent object + * @param userIds ids to encrypt to or empty list to use symmetric encryption with passphrase + * @param text text to encrypt + * @param options encryption options + */ + explicit KGpgEncrypt(QObject *parent, const QStringList &userIds = QStringList(), const QString &text = QString(), const EncryptOptions &options = DefaultEncryption, const QStringList &extraOptions = QStringList()); + + /** + * @brief encrypt file(s) + * @param parent parent object + * @param userIds ids to encrypt to or empty list to use symmetric encryption with passphrase + * @param files list of file locations to encrypt + * @param options encryption options + */ + KGpgEncrypt(QObject *parent, const QStringList &userIds, const QList<QUrl> &files, const EncryptOptions &options = DefaultEncryption, const QStringList &extraOptions = QStringList()); + + /** + * @brief destructor + */ + virtual ~KGpgEncrypt(); + + /** + * @brief get decryption result + * @return decrypted text + */ + QStringList encryptedText() const; + + /** + * @brief return the preferred extension for encrypted files + * @param ascii if the file is encrypted with ASCII armor + * @return the file extension with leading dot + */ + static QString encryptExtension(const bool ascii); + +protected: + virtual QStringList command() const; + virtual bool nextLine(const QString &line); + +private: + int m_fileIndex; + const EncryptOptions m_options; + const QStringList m_userIds; + QStringList m_extraOptions; + QString m_currentFile; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(KGpgEncrypt::EncryptOptions); + +#endif // KGPGENCRYPT_H diff --git a/kgpg/transactions/kgpgexport.cpp b/kgpg/transactions/kgpgexport.cpp new file mode 100644 index 0000000..79f6afe --- /dev/null +++ b/kgpg/transactions/kgpgexport.cpp @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2009,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgexport.h" + +#include "../gpgproc.h" + +#include <QFile> +#include <QProcess> + +KGpgExport::KGpgExport(QObject *parent, const QStringList &ids, QProcess *outp, const QStringList &options, const bool secret) + : KGpgTransaction(parent), + m_keyids(ids), + m_outp(outp), + m_outputmode(ModeProcess) +{ + procSetup(options, secret); +} + +KGpgExport::KGpgExport(QObject *parent, const QStringList &ids, const QString &file, const QStringList &options, const bool secret) + : KGpgTransaction(parent), + m_keyids(ids), + m_outp(NULL), + m_outf(file), + m_outputmode(ModeFile) +{ + procSetup(options, secret); +} + +KGpgExport::KGpgExport(QObject *parent, const QStringList &ids, const QStringList &options, const bool secret) + : KGpgTransaction(parent), + m_keyids(ids), + m_outp(NULL), + m_outputmode(ModeStdout) +{ + procSetup(options, secret); +} + +KGpgExport::KGpgExport(QObject *parent, const QStringList &ids, KGpgTransaction *outt, const QStringList &options, const bool secret) + : KGpgTransaction(parent), + m_keyids(ids), + m_outp(NULL), + m_outputmode(ModeTransaction) +{ + procSetup(options, secret); + outt->setInputTransaction(this); +} + +KGpgExport::~KGpgExport() +{ +} + +void +KGpgExport::setKeyId(const QString &id) +{ + m_keyids.clear(); + m_keyids.append(id); +} + +void +KGpgExport::setKeyIds(const QStringList &ids) +{ + m_keyids = ids; +} + +const QStringList & +KGpgExport::getKeyIds() const +{ + return m_keyids; +} + +void +KGpgExport::setOutputProcess(QProcess *outp) +{ + m_outf.clear(); + m_outp = outp; + m_outputmode = ModeProcess; +} + +void +KGpgExport::setOutputFile(const QString &filename) +{ + m_outp = NULL; + m_outf = filename; + if (filename.isEmpty()) + m_outputmode = ModeStdout; + else + m_outputmode = ModeFile; +} + +void +KGpgExport::setOutputTransaction(KGpgTransaction *outt) +{ + m_outp = NULL; + m_outf.clear(); + m_outputmode = ModeTransaction; + outt->setInputTransaction(this); +} + +const QString & +KGpgExport::getOutputFile() const +{ + return m_outf; +} + +const QByteArray & +KGpgExport::getOutputData() const +{ + return m_data; +} + +bool +KGpgExport::preStart() +{ + setSuccess(TS_OK); + + switch (m_outputmode) { + case ModeFile: + { + Q_ASSERT(!m_outf.isEmpty()); + Q_ASSERT(m_outp == NULL); + + addArgument(QLatin1String( "--output" )); + addArgument(m_outf); + + QFile ofile(m_outf); + if (ofile.exists()) + ofile.remove(); + + break; + } + case ModeProcess: + Q_ASSERT(m_outf.isEmpty()); + Q_ASSERT(m_outp != NULL); + + getProcess()->setStandardOutputProcess(m_outp); + + break; + case ModeStdout: + Q_ASSERT(m_outf.isEmpty()); + Q_ASSERT(m_outp == NULL); + break; + case ModeTransaction: + Q_ASSERT(m_outf.isEmpty()); + Q_ASSERT(m_outp == NULL); + break; + default: + Q_ASSERT(0); + } + + addArguments(m_keyids); + + m_data.clear(); + + return true; +} + +bool +KGpgExport::nextLine(const QString &line) +{ + // key exporting does not send any messages + + m_data.append(line.toAscii() + '\n'); + + if (m_outputmode != 2) + setSuccess(TS_MSG_SEQUENCE); + + return false; +} + +void +KGpgExport::procSetup(const QStringList &options, const bool secret) +{ + getProcess()->resetProcess(); + + if (secret) + addArgument(QLatin1String( "--export-secret-key" )); + else + addArgument(QLatin1String( "--export" )); + + if ((m_outputmode == 2) && !options.contains(QLatin1String( "--armor" ))) + addArgument(QLatin1String( "--armor" )); + + addArguments(options); +} + +//#include "kgpgexport.moc" diff --git a/kgpg/transactions/kgpgexport.h b/kgpg/transactions/kgpgexport.h new file mode 100644 index 0000000..63aeaac --- /dev/null +++ b/kgpg/transactions/kgpgexport.h @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2009 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGEXPORT_H +#define KGPGEXPORT_H + +#include <QObject> +#include <QStringList> + +#include <QUrl> + +#include "kgpgtransaction.h" + +class QProcess; + +/** + * @brief export one or more keys from keyring + * + * The exported keys can be written to a file or sent to standard input of another + * QProcess. + */ +class KGpgExport: public KGpgTransaction { + Q_OBJECT + + KGpgExport(); // = delete C++0x + Q_DISABLE_COPY(KGpgExport) +public: + /** + * @brief export keys to QProcess + * @param parent parent object + * @param ids ids to export + * @param outp process to write into + * @param options additional options to pass to GnuPG (e.g. export ascii armored) + * @param secret if secret key exporting is allowed + */ + KGpgExport(QObject *parent, const QStringList &ids, QProcess *outp, const QStringList &options = QStringList(), const bool secret = false); + + /** + * @brief export keys to KGpgTransaction + * @param parent parent object + * @param ids ids to export + * @param outt transaction to write into + * @param options additional options to pass to GnuPG (e.g. export ascii armored) + * @param secret if secret key exporting is allowed + */ + KGpgExport(QObject *parent, const QStringList &ids, KGpgTransaction *outt, const QStringList &options = QStringList(), const bool secret = false); + + /** + * @brief export keys to file + * @param parent parent object + * @param ids ids to export + * @param file filename to write into + * @param options additional options to pass to GnuPG (e.g. export ascii armored) + * @param secret if secret key exporting is allowed + */ + KGpgExport(QObject *parent, const QStringList &ids, const QString &file, const QStringList &options = QStringList(), const bool secret = false); + + /** + * @brief export keys to standard output + * @param parent parent object + * @param ids ids to export + * @param options additional options to pass to GnuPG (e.g. export ascii armored) + * @param secret if secret key exporting is allowed + * + * Only ascii-armored export is supported in standard output mode. If it is not + * already set in the given option it will be added automatically. + */ + KGpgExport(QObject *parent, const QStringList &ids, const QStringList &options = QStringList(), const bool secret = false); + + /** + * @brief destructor + */ + virtual ~KGpgExport(); + + /** + * @brief set key id to export + * @param id key fingerprint + */ + void setKeyId(const QString &id); + /** + * @brief set key ids to export + * @param ids key fingerprints + */ + void setKeyIds(const QStringList &ids); + /** + * @brief return the key ids to export + * @return list of key fingerprints + */ + const QStringList &getKeyIds() const; + /** + * @brief set the process the output is sent to + * @param outp process to send output to + */ + void setOutputProcess(QProcess *outp); + /** + * @brief set the transaction the output is sent to + * @param outd transaction to send output to + */ + void setOutputTransaction(KGpgTransaction *outt); + /** + * @brief set filename to send output to + * @param filename file to send output to + */ + void setOutputFile(const QString &filename); + /** + * @brief return the output filename currently set + * @return filename key will get written to + */ + const QString &getOutputFile() const; + /** + * @brief return the data read from standard output + * @return standard output data + */ + const QByteArray &getOutputData() const; + +protected: + virtual bool preStart(); + virtual bool nextLine(const QString &line); + +private: + QStringList m_keyids; + QProcess *m_outp; + QString m_outf; + QByteArray m_data; + + enum OutputMode { + ModeFile = 0, + ModeProcess = 1, + ModeStdout = 2, + ModeTransaction = 3 + }; + enum OutputMode m_outputmode; + + void procSetup(const QStringList &options, const bool secret); +}; + +#endif // KGPGEXPORT_H diff --git a/kgpg/transactions/kgpggeneratekey.cpp b/kgpg/transactions/kgpggeneratekey.cpp new file mode 100644 index 0000000..d95f1e0 --- /dev/null +++ b/kgpg/transactions/kgpggeneratekey.cpp @@ -0,0 +1,276 @@ +/* + * Copyright (C) 2008,2009,2010,2011,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpggeneratekey.h" + +#include "../gpgproc.h" + +//#include <KLocale> +//#include <KMessageBox> +//#include <kpimutils/email.h> +#include <QApplication> + +KGpgGenerateKey::KGpgGenerateKey(QObject *parent, const QString &name, const QString &email, const QString &comment, + const KgpgCore::KgpgKeyAlgo &algorithm, const uint size, const unsigned int expire, + const char expireunit) + : KGpgTransaction(parent) +{ + addArgument(QLatin1String( "--status-fd=1" )); + addArgument(QLatin1String( "--command-fd=0" )); + addArgument(QLatin1String( "--no-verbose" )); + addArgument(QLatin1String( "--gen-key" )); + addArgument(QLatin1String( "--batch" )); + + setName(name); + setEmail(email); + setComment(comment); + setAlgorithm(algorithm); + setSize(size); + setExpire(expire, expireunit); + + getProcess()->setOutputChannelMode(KProcess::SeparateChannels); +} + +KGpgGenerateKey::~KGpgGenerateKey() +{ +} + +bool +KGpgGenerateKey::preStart() +{ + /*if (!m_email.isEmpty() && !KPIMUtils::isValidSimpleAddress(m_email)) { + setSuccess(TS_INVALID_EMAIL); + return false; + }*/ + + m_fingerprint.clear(); + m_namesent = false; + + setSuccess(TS_MSG_SEQUENCE); + + setDescription(QObject::tr("Generating New Key for %1").arg(m_name)); + + return true; +} + +void +KGpgGenerateKey::postStart() +{ + QByteArray keymessage("Key-Type: "); + switch (m_algorithm) { + case KgpgCore::ALGO_RSA: + keymessage.append("RSA"); + break; + case KgpgCore::ALGO_RSA_RSA: + keymessage.append("RSA\nSubkey-Type: RSA"); + break; + case KgpgCore::ALGO_DSA_ELGAMAL: + keymessage.append("DSA\nSubkey-Type: ELG-E"); + break; + default: + Q_ASSERT(m_algorithm == KgpgCore::ALGO_RSA); + return; + } + + const QByteArray keylen = QByteArray::number(m_size); + + keymessage.append("\nKey-Length: "); + keymessage.append(keylen); + keymessage.append("\nSubkey-Length: "); + keymessage.append(keylen); + keymessage.append("\nName-Real: "); + keymessage.append(m_name.toUtf8()); + if (!m_email.isEmpty()) { + keymessage.append("\nName-Email: "); + keymessage.append(m_email.toAscii()); + } + if (!m_comment.isEmpty()) { + keymessage.append("\nName-Comment: "); + keymessage.append(m_comment.toUtf8()); + } + if (m_expire != 0) { + keymessage.append("\nExpire-Date: "); + keymessage.append(QByteArray::number(m_expire)); + keymessage.append(m_expireunit); + } + keymessage.append("\nPassphrase: "); + write(keymessage, false); + + QString passdlgmessage; + if (!m_email.isEmpty()) { + passdlgmessage = QObject::tr("<p><b>Enter passphrase for %1 <%2></b>:<br />Passphrase should include non alphanumeric characters and random sequences.</p>").arg(m_name).arg(m_email); + } else { + passdlgmessage = QObject::tr("<p><b>Enter passphrase for %1</b>:<br />Passphrase should include non alphanumeric characters and random sequences.</p>").arg(m_name); + } + + QApplication::restoreOverrideCursor(); + askNewPassphrase(passdlgmessage); +} + +bool +KGpgGenerateKey::nextLine(const QString &line) +{ + QString msg(QObject::tr("Generating Key")); + + if (!line.startsWith(QLatin1String("[GNUPG:] "))) + return false; + + int result = false; + + if (line.contains(QLatin1String( "PROGRESS" ))) { + QStringList parts(line.mid(18).split(QLatin1Char( ' ' ))); + if (parts.count() >= 4) { + const QString p0(parts.at(0)); + if (p0 == QLatin1String( "primegen" )) { + msg = tr("Generating prime numbers"); + } else if (p0 == QLatin1String( "pk_dsa" )) { + msg = tr("Generating DSA key"); + } else if (p0 == QLatin1String( "pk_elg" )) { + msg = tr("Generating ElGamal key"); + } else if (p0 == QLatin1String( "need_entropy" )) { + msg = tr("Waiting for entropy"); + + // This message is currenlty not displayed. Nevertheless it's + // included here so string freeze is not broken if it will be + // displayed later on. + QString msglong = tr("The entropy pool ran empty. The key generation process is stalled until enough entropy is present. You can generate entropy e.g. by moving the mouse or typing at the keyboard. The easiest way is by using another application until the key generation continues."); + } + if (parts.at(3) != QLatin1String( "0" )) + emit infoProgress(parts.at(2).toUInt(), parts.at(3).toUInt()); + } + } else if (line.contains(QLatin1String( "GOOD_PASSPHRASE" ))) { + setSuccess(TS_MSG_SEQUENCE); + } else if (line.contains(QLatin1String( "KEY_CREATED" ))) { + m_fingerprint = line.right(40); + setSuccess(TS_OK); + result = true; + } else if (line.contains(QLatin1String( "NEED_PASSPHRASE" ))) { + setSuccess(TS_USER_ABORTED); + } else if (line.contains(QLatin1String( "GET_" ))) { + setSuccess(TS_MSG_SEQUENCE); + result = true; + } else if (line.contains(QLatin1String("KEY_NOT_CREATED"))) { + result = true; + } + + emit statusMessage(msg); + + return result; +} + +void +KGpgGenerateKey::finish() +{ + switch (getSuccess()) { + case TS_BAD_PASSPHRASE: + emit statusMessage(tr("Bad passphrase. Cannot generate a new key pair.")); + break; + case TS_USER_ABORTED: + emit statusMessage(tr("Aborted by the user. Cannot generate a new key pair.")); + break; + case TS_INVALID_EMAIL: + emit statusMessage(tr("The email address is not valid. Cannot generate a new key pair.")); + break; + case TS_INVALID_NAME: + emit statusMessage(tr("The name is not accepted by gpg. Cannot generate a new key pair.")); + break; + case TS_OK: + emit statusMessage(tr("Key %1 generated").arg(getFingerprint())); + break; + default: + { + QStringList errorLines; + + while (getProcess()->hasLineStandardError()) { + QByteArray b; + getProcess()->readLineStandardError(&b); + errorLines << QString::fromUtf8(b); + } + + m_errorOutput = errorLines.join(QLatin1String("\n")); + emit statusMessage(tr("gpg process did not finish. Cannot generate a new key pair.")); + } + } +} + +void +KGpgGenerateKey::newPasswordEntered() +{ + QApplication::setOverrideCursor(Qt::BusyCursor); + write("%commit"); +} + +void +KGpgGenerateKey::setName(const QString &name) +{ + m_name = name; +} + +QString +KGpgGenerateKey::getName() const +{ + return m_name; +} + +void +KGpgGenerateKey::setEmail(const QString &email) +{ + m_email = email; +} + +QString +KGpgGenerateKey::getEmail() const +{ + return m_email; +} + +void +KGpgGenerateKey::setComment(const QString &comment) +{ + m_comment = comment; +} + +void +KGpgGenerateKey::setAlgorithm(const KgpgCore::KgpgKeyAlgo &algorithm) +{ + m_algorithm = algorithm; +} + +void +KGpgGenerateKey::setSize(const unsigned int size) +{ + m_size = size; +} + +void +KGpgGenerateKey::setExpire(const unsigned int expire, const char expireunit) +{ + Q_ASSERT((expireunit == 'd') || (expireunit == 'w') || + (expireunit == 'm') || (expireunit == 'y')); + m_expire = expire; + m_expireunit = expireunit; +} + +QString +KGpgGenerateKey::getFingerprint() const +{ + return m_fingerprint; +} + +QString +KGpgGenerateKey::gpgErrorMessage() const +{ + return m_errorOutput; +} + +//#include "kgpggeneratekey.moc" diff --git a/kgpg/transactions/kgpggeneratekey.h b/kgpg/transactions/kgpggeneratekey.h new file mode 100644 index 0000000..3649d8f --- /dev/null +++ b/kgpg/transactions/kgpggeneratekey.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2008,2009,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGGENERATEKEY_H +#define KGPGGENERATEKEY_H + +#include "kgpgtransaction.h" + +#include "../core/kgpgkey.h" + +#include <QObject> + +class QString; + +/** + * @brief generate a new key pair + */ +class KGpgGenerateKey: public KGpgTransaction { + Q_OBJECT + + Q_DISABLE_COPY(KGpgGenerateKey) + KGpgGenerateKey(); // = delete C++0x +public: + enum ts_generatekey { + TS_INVALID_NAME = TS_COMMON_END + 1 ///< the owners name is not accepted by GnuPG + }; + /** + * @brief KGpgGenerateKey's constructor + * @param parent parent object + * @param name the name of the key, it is also the user's name. + * @param email email MUST be a valid email address or an empty string. + * @param comment is a comment, it can be an empty string + * @param algorithm this is the type of the key, RSA or DSA & ELGAMAL (\see Kgpg::KeyAlgo ). + * @param size this is the length of the key (1024, 2048, ...) + * @param expire defines the key expiry time together with \em expireunit, 0 for unlimited key lifetime + * @param expireunit is the unit of the number given as \em expire. \see setExpire + */ + KGpgGenerateKey(QObject *parent, const QString &name, const QString &email, const QString &comment, + const KgpgCore::KgpgKeyAlgo &algorithm, const uint size, const unsigned int expire = 0, + const char expireunit = 'd'); + virtual ~KGpgGenerateKey(); + + void setName(const QString &name); + QString getName() const; + void setEmail(const QString &email); + QString getEmail() const; + void setComment(const QString &comment); + void setAlgorithm(const KgpgCore::KgpgKeyAlgo &algorithm); + void setSize(const unsigned int size); + /** + * @brief set expire date for key + * @param expire defines the key expiry time together with \em expireunit, 0 for unlimited key lifetime + * @param expireunit is the unit of the number given as \em expire. + * + * Valid units are 'd', 'w', 'm' and 'y'. The unit is ignored if expire is 0. + */ + void setExpire(const unsigned int expire, const char expireunit); + + QString getFingerprint() const; + + /** + * @brief get error output of GnuPG + * @return the messages GnuPG printed to standard error + * + * This will only return data after the done() signal has been emitted. + */ + QString gpgErrorMessage() const; + +protected: + virtual bool preStart(); + virtual void postStart(); + virtual bool nextLine(const QString &line); + virtual void finish(); + virtual void newPasswordEntered(); + +private: + QString m_name; + QString m_email; + QString m_comment; + KgpgCore::KgpgKeyAlgo m_algorithm; + unsigned int m_size; + unsigned int m_expire; + unsigned int m_expireunit; + QString m_fingerprint; + bool m_namesent; + QString m_errorOutput; +}; + +#endif // KGPGGENERATEKEY_H diff --git a/kgpg/transactions/kgpgimport.cpp b/kgpg/transactions/kgpgimport.cpp new file mode 100644 index 0000000..4a3041c --- /dev/null +++ b/kgpg/transactions/kgpgimport.cpp @@ -0,0 +1,295 @@ +/* + * Copyright (C) 2008,2009,2010,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgimport.h" + +//#include "model/kgpgitemmodel.h" +#include "../core/KGpgKeyNode.h" + +#include <QDebug> +//#include <KLocale> + +KGpgImport::KGpgImport(QObject *parent, const QString &text) + : KGpgTextOrFileTransaction(parent, text, true) +{ +} + +KGpgImport::KGpgImport(QObject *parent, const QList<QUrl> &files) + : KGpgTextOrFileTransaction(parent, files, true) +{ +} + +KGpgImport::~KGpgImport() +{ +} + +QStringList +KGpgImport::command() const +{ + QStringList ret; + + ret << QLatin1String( "--import" ) << QLatin1String( "--allow-secret-key-import" ); + + return ret; +} + +QStringList +KGpgImport::getImportedKeys() const +{ + QStringList res; + + foreach (const QString &str, getMessages()) + if (str.startsWith(QLatin1String("[GNUPG:] IMPORTED "))) + res << str.mid(18); + + return res; +} + +QStringList +KGpgImport::getImportedIds(const QStringList &log, const int reason) +{ + QStringList res; + + foreach (const QString &str, log) { + if (!str.startsWith(QLatin1String("[GNUPG:] IMPORT_OK "))) + continue; + + QString tmpstr(str.mid(19).simplified()); + + int space = tmpstr.indexOf(QLatin1Char( ' ' )); + if (space <= 0) { + qDebug() << __LINE__ << "invalid format:" << str; + continue; + } + + bool ok; + unsigned char code = tmpstr.left(space).toUInt(&ok); + if (!ok) { + qDebug() << __LINE__ << "invalid format:" << str << space << tmpstr.left(space - 1); + continue; + } + + if ((reason == -1) || ((reason == 0) && (code == 0)) || ((reason & code) != 0)) + res << tmpstr.mid(space + 1); + } + + return res; +} + +QStringList +KGpgImport::getImportedIds(const int reason) const +{ + return getImportedIds(getMessages(), reason); +} + +QString +KGpgImport::getImportMessage() const +{ + return getImportMessage(getMessages()); +} + +QString +KGpgImport::getImportMessage(const QStringList &log) +{ +#define RESULT_PARTS 14 + unsigned long rcode[RESULT_PARTS]; + unsigned int i = 0; + int line = 0; + bool fine; + + memset(rcode, 0, sizeof(rcode)); + + foreach (const QString &str, log) { + line++; + if (!str.startsWith(QLatin1String("[GNUPG:] IMPORT_RES "))) + continue; + + const QStringList rstr(str.mid(20).simplified().split(QLatin1Char( ' ' ))); + + fine = (rstr.count() == RESULT_PARTS); + + i = 0; + while (fine && (i < RESULT_PARTS)) { + rcode[i] += rstr.at(i).toULong(&fine); + i++; + } + + if (!fine) + return tr("The import result string has an unsupported format in line %1.<br />Please see the detailed log for more information.").arg(line); + } + + fine = false; + i = 0; + while (!fine && (i < RESULT_PARTS)) { + fine = (rcode[i] != 0); + i++; + } + + if (!fine) + return tr("No key imported.<br />Please see the detailed log for more information."); + + QString resultMessage(tr("<qt>%1 key processed.</qt>", "<qt>%1 keys processed.</qt>", rcode[0])); + + if (rcode[1]) + resultMessage += tr("<qt><br />One key without ID.</qt>", "<qt><br />%1 keys without ID.</qt>", rcode[1]); + if (rcode[2]) + resultMessage += tr("<qt><br /><b>One key imported:</b></qt>", "<qt><br /><b>%1 keys imported:</b></qt>", rcode[2]); + if (rcode[3]) + resultMessage += tr("<qt><br />One RSA key imported.</qt>", "<qt><br />%1 RSA keys imported.</qt>", rcode[3]); + if (rcode[4]) + resultMessage += tr("<qt><br />One key unchanged.</qt>", "<qt><br />%1 keys unchanged.</qt>", rcode[4]); + if (rcode[5]) + resultMessage += tr("<qt><br />One user ID imported.</qt>", "<qt><br />%1 user IDs imported.</qt>", rcode[5]); + if (rcode[6]) + resultMessage += tr("<qt><br />One subkey imported.</qt>", "<qt><br />%1 subkeys imported.</qt>", rcode[6]); + if (rcode[7]) + resultMessage += tr("<qt><br />One signature imported.</qt>", "<qt><br />%1 signatures imported.</qt>", rcode[7]); + if (rcode[8]) + resultMessage += tr("<qt><br />One revocation certificate imported.</qt>", "<qt><br />%1 revocation certificates imported.</qt>", rcode[8]); + if (rcode[9]) + resultMessage += tr("<qt><br />One secret key processed.</qt>", "<qt><br />%1 secret keys processed.</qt>", rcode[9]); + if (rcode[10]) + resultMessage += tr("<qt><br /><b>One secret key imported.</b></qt>", "<qt><br /><b>%1 secret keys imported.</b></qt>", rcode[10]); + if (rcode[11]) + resultMessage += tr("<qt><br />One secret key unchanged.</qt>", "<qt><br />%1 secret keys unchanged.</qt>", rcode[11]); + if (rcode[12]) + resultMessage += tr("<qt><br />One secret key not imported.</qt>", "<qt><br />%1 secret keys not imported.</qt>", rcode[12]); + + if (rcode[9]) + resultMessage += tr("<qt><br /><b>You have imported a secret key.</b> <br />" + "Please note that imported secret keys are not trusted by default.<br />" + "To fully use this secret key for signing and encryption, you must edit the key (double click on it) and set its trust to Full or Ultimate.</qt>"); + + return resultMessage; +} + +/*static QString +beautifyKeyList(const QStringList &keyIds, const KGpgItemModel *model) +{ + QString result; + + result.append(QLatin1String("\n")); + if (model == NULL) { + result.append(QLatin1String(" ") + keyIds.join(QLatin1String("\n "))); + } else { + foreach (const QString &changed, keyIds) { + const KGpgKeyNode *node = model->findKeyNode(changed); + QString line; + + if (node == NULL) { + line = changed; + } else { + if (node->getEmail().isEmpty()) + line = trc("ID: Name", "%1: %2", node->getFingerprint(), node->getName()); + else + line = trc("ID: Name <Email>", "%1: %2 <%3>", node->getFingerprint(), node->getName(), node->getEmail()); + } + + result.append(QLatin1String(" ") + line + QLatin1String("\n")); + } + } + + return result; +}*/ + +QString +KGpgImport::getDetailedImportMessage(const QStringList &log, const KGpgItemModel *model) +{ + QString result; + QMap<QString, unsigned int> resultcodes; + + foreach (const QString &keyresult, log) { + if (!keyresult.startsWith(QLatin1String("[GNUPG:] IMPORT_OK "))) + continue; + + QStringList rc(keyresult.mid(19).split(QLatin1Char( ' ' ))); + if (rc.count() < 2) { + qDebug() << "unexpected syntax:" << keyresult; + continue; + } + + resultcodes[rc.at(1)] = rc.at(0).toUInt(); + } + + QMap<QString, unsigned int>::const_iterator iterend = resultcodes.constEnd(); + + for (unsigned int flag = 1; flag <= 16; flag <<= 1) { + QStringList thischanged; + + for (QMap<QString, unsigned int>::const_iterator iter = resultcodes.constBegin(); iter != iterend; ++iter) { + if (iter.value() & flag) + thischanged << iter.key(); + } + + if (thischanged.isEmpty()) + continue; + + switch (flag) { + case 1: + result.append(tr("New Key", "New Keys", thischanged.count())); + break; + case 2: + result.append(tr("Key with new User Id", "Keys with new User Ids", thischanged.count())); + break; + case 4: + result.append(tr("Key with new Signatures", "Keys with new Signatures", thischanged.count())); + break; + case 8: + result.append(tr("Key with new Subkeys", "Keys with new Subkeys", thischanged.count())); + break; + case 16: + result.append(tr("New Private Key", "New Private Keys", thischanged.count())); + break; + default: + Q_ASSERT(flag == 1); + } + +// result.append(beautifyKeyList(thischanged, model)); + result.append(QLatin1String("\n\n")); + } + + QStringList unchanged(resultcodes.keys(0)); + + if (unchanged.isEmpty()) { + // remove empty line at end + result.chop(1); + } else { + result.append(tr("Unchanged Key", "Unchanged Keys", unchanged.count())); +// result.append(beautifyKeyList(unchanged, model)); + result.append(QLatin1String("\n")); + } + + return result; +} + +int +KGpgImport::isKey(const QString &text, const bool incomplete) +{ + int markpos = text.indexOf(QLatin1String("-----BEGIN PGP PUBLIC KEY BLOCK-----")); + if (markpos >= 0) { + markpos = text.indexOf(QLatin1String("-----END PGP PUBLIC KEY BLOCK-----"), markpos); + return ((markpos > 0) || incomplete) ? 1 : 0; + } + + markpos = text.indexOf(QLatin1String("-----BEGIN PGP PRIVATE KEY BLOCK-----")); + if (markpos < 0) + return 0; + + markpos = text.indexOf(QLatin1String("-----END PGP PRIVATE KEY BLOCK-----"), markpos); + if ((markpos < 0) && !incomplete) + return 0; + + return 2; +} + +//#include "kgpgimport.moc" diff --git a/kgpg/transactions/kgpgimport.h b/kgpg/transactions/kgpgimport.h new file mode 100644 index 0000000..7fe6deb --- /dev/null +++ b/kgpg/transactions/kgpgimport.h @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2008,2009,2010 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGIMPORT_H +#define KGPGIMPORT_H + +#include <QObject> +#include <QList> +#include <QString> +#include <QStringList> + +#include <QUrl> + +#include "kgpgtextorfiletransaction.h" + +class KGpgItemModel; + +/** + * @brief import one or more keys into the keyring + */ +class KGpgImport: public KGpgTextOrFileTransaction { + Q_OBJECT + + Q_DISABLE_COPY(KGpgImport) +public: + /** + * @brief import given text + * @param parent parent object + * @param text key text to import + */ + explicit KGpgImport(QObject *parent, const QString &text = QString()); + + /** + * @brief import key(s) from file(s) + * @param parent parent object + * @param files list of file locations to import from + */ + KGpgImport(QObject *parent, const QList<QUrl> &files); + + /** + * @brief destructor + */ + virtual ~KGpgImport(); + + /** + * @brief get the names and short fingerprints of the imported keys + * @return list of keys that were imported + */ + QStringList getImportedKeys() const; + + /** + * @brief get the full fingerprints of the imported keys + * @param log transaction log to scan + * @param reason key import reason + * @return list of ids that were imported + * + * You can filter the list of keys returned by the status of that key + * as reported by GnuPG. See doc/DETAILS of GnuPG for the meaning of + * the different flags. + * + * If reason is -1 (the default) all processed key ids are returned. + * If reason is 0 only keys of status 0 (unchanged) are returned. For + * any other value a key is returned if one of his status bits matched + * one of the bits in reason (i.e. (reason & status) != 0). + */ + static QStringList getImportedIds(const QStringList &log, const int reason = -1); + /** + * @brief get the full fingerprints of the imported keys + * + * This is an overloaded member. It calls the static function with the + * result log from this transaction object. + */ + QStringList getImportedIds(const int reason = -1) const; + + /** + * @brief get textual summary of the import events + * @return messages describing what was imported + * + * This is an overloaded member. It calls the static function with the + * result log from this transaction object. + */ + QString getImportMessage() const; + + /** + * @brief get textual summary of the import events + * @param log import log + * @return messages describing what was imported + * + * The log must contain a "IMPORT_RES" line. If this is not present + * the result string will contain an error message. + */ + static QString getImportMessage(const QStringList &log); + + /** + * @brief get detailed summary of import + * @param log import log + * @return message describing which keys changed and how + * + * The log must contain a "IMPORT_RES" line. If this is not present + * the result string will contain an error message. + */ + static QString getDetailedImportMessage(const QStringList &log, const KGpgItemModel *model = NULL); + + /** + * @brief check if the given text contains a private or public key + * @param text text to check + * @param incomplete assume text is only the beginning of the data + * @return if text contains a key or not + * @retval 0 no key found + * @retval 1 public key found + * @retval 2 private key found + */ + static int isKey(const QString &text, const bool incomplete = false); + +protected: + virtual QStringList command() const; +}; + +#endif // KGPGIMPORT_H diff --git a/kgpg/transactions/kgpgsigntext.cpp b/kgpg/transactions/kgpgsigntext.cpp new file mode 100644 index 0000000..c971214 --- /dev/null +++ b/kgpg/transactions/kgpgsigntext.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgsigntext.h" +#include <QDebug> +#include "../gpgproc.h" + +//#include "kgpgsettings.h" + +KGpgSignText::KGpgSignText(QObject *parent, const QString &signId, const QString &text, const SignOptions &options, const QStringList &extraOptions) + : KGpgTextOrFileTransaction(parent, text), + m_fileIndex(-1), + m_options(options), + m_signId(signId), + m_extraOptions(extraOptions), + m_text(text) +{ +} + +KGpgSignText::KGpgSignText(QObject *parent, const QString &signId, const QList<QUrl> &files, const SignOptions &options, const QStringList &extraOptions) + : KGpgTextOrFileTransaction(parent, files), + m_fileIndex(0), + m_options(options), + m_signId(signId), + m_extraOptions(extraOptions) +{ + /* GnuPG can only handle one file at a time when signing */ + Q_ASSERT(files.count() == 1); +} + +KGpgSignText::~KGpgSignText() +{ +} + +QStringList +KGpgSignText::command() const +{ + QStringList ret = m_extraOptions; + + const QList<QUrl> &files = getInputFiles(); + QString fileName; + + if (!files.isEmpty()) + fileName = files.first().path(); + + ret << QLatin1String("-u") << m_signId; + + if (m_options & AsciiArmored) { + if (fileName.isEmpty()) + ret << QLatin1String("--clearsign"); + else + ret << QLatin1String("--armor"); + } + /*if (KGpgSettings::pgpCompatibility()) + ret << QLatin1String("--pgp6");*/ + + if (!fileName.isEmpty()) { + if (m_options & DetachedSignature) + ret << QLatin1String("--detach-sign") << + QLatin1String("--output") << fileName + QLatin1String(".sig"); + + ret << fileName; + } + + // command-fd for pass? + ret << QLatin1String("--command-fd=0"); + + return ret; +} + +QStringList +KGpgSignText::signedText() const +{ + QStringList result; + + foreach (const QString &line, getMessages()) + if (!line.startsWith(QLatin1String("[GNUPG:] "))) { + result.append(line); + } + + return result; +} + +void +KGpgSignText::postStart() +{ + // do nothing, its to early +} + +bool KGpgSignText::nextLine(const QString &line) { + + if (line.startsWith(QLatin1String("[GNUPG:] BEGIN_SIGNING")) &! m_text.isEmpty()) { + GPGProc *proc = getProcess(); + proc->write(m_text.toUtf8()); + proc->closeWriteChannel(); + } else if (!line.startsWith(QLatin1String("[GNUPG:] SIGEXPIRED")) && !line.startsWith(QLatin1String("[GNUPG:] KEYEXPIRED "))) + m_messages.append(line); + + return false; +} + +const QStringList & +KGpgSignText::getMessages() const +{ + return m_messages; +} + +//#include "kgpgsigntext.moc" diff --git a/kgpg/transactions/kgpgsigntext.h b/kgpg/transactions/kgpgsigntext.h new file mode 100644 index 0000000..14459af --- /dev/null +++ b/kgpg/transactions/kgpgsigntext.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGSIGNTEXT_H +#define KGPGSIGNTEXT_H + +#include "kgpgtextorfiletransaction.h" + +#include <QUrl> +#include <QObject> +#include <QString> +#include <QStringList> + +class QProcess; + +/** + * @brief sign the given text or files + */ +class KGpgSignText: public KGpgTextOrFileTransaction { + Q_OBJECT + + Q_DISABLE_COPY(KGpgSignText) + KGpgSignText(); // = delete C++0x +public: + enum SignOption { + DefaultSignature = 0, ///< use whatever GnuPGs defaults are + AsciiArmored = 0x1, ///< output the data as printable ASCII as opposed to binary data + DetachedSignature = 0x2, ///< save the signature in a separate file + }; + Q_DECLARE_FLAGS(SignOptions, SignOption); + + /** + * @brief sign given text + * @param parent parent object + * @param signId the key to use for signing + * @param text text to sign + * @param options signing options + */ + KGpgSignText(QObject *parent, const QString &signId, const QString &text = QString(), const SignOptions &options = AsciiArmored, const QStringList &extraOptions = QStringList()); + + /** + * @brief sign file + * @param parent parent object + * @param signId the key to use for signing + * @param files list of file locations to sign (must only be 1 file) + * @param options signing options + * + * @warning GnuPG can currently handle only one file per invocation for + * signing, so files may only contain one single file. + */ + KGpgSignText(QObject *parent, const QString &signId, const QList<QUrl> &files, const SignOptions &options = DefaultSignature, const QStringList &extraOptions = QStringList()); + + /** + * @brief destructor + */ + virtual ~KGpgSignText(); + + /** + * @brief get signing result + * @return signed text + */ + QStringList signedText() const; + + /** + * @brief get gpg info message + * @return the raw messages from gpg during the operation + */ + const QStringList &getMessages() const; + +protected: + virtual QStringList command() const; + virtual bool nextLine(const QString &line); + +private: + int m_fileIndex; + const SignOptions m_options; + const QString m_signId; + QStringList m_extraOptions; + const QString m_text; + QStringList m_messages; + +private slots: + void postStart(); +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(KGpgSignText::SignOptions); + +#endif // KGPGSIGNTEXT_H diff --git a/kgpg/transactions/kgpgtextorfiletransaction.cpp b/kgpg/transactions/kgpgtextorfiletransaction.cpp new file mode 100644 index 0000000..036d911 --- /dev/null +++ b/kgpg/transactions/kgpgtextorfiletransaction.cpp @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2008,2009,2010,2011,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgtextorfiletransaction.h" + +#include "../gpgproc.h" + +//#include <KIO/NetAccess> +//#include <KLocale> +#include <QDebug> + +KGpgTextOrFileTransaction::KGpgTextOrFileTransaction(QObject *parent, const QString &text, const bool allowChaining) + : KGpgTransaction(parent, allowChaining), + m_text(text) +{ +} + +KGpgTextOrFileTransaction::KGpgTextOrFileTransaction(QObject *parent, const QList<QUrl> &files, const bool allowChaining) + : KGpgTransaction(parent, allowChaining) +{ + setUrls(files); +} + +KGpgTextOrFileTransaction::~KGpgTextOrFileTransaction() +{ + cleanUrls(); +} + +void +KGpgTextOrFileTransaction::setText(const QString &text) +{ + m_text = text; + cleanUrls(); +} + +void +KGpgTextOrFileTransaction::setUrls(const QList<QUrl> &files) +{ + m_text.clear(); + m_inpfiles = files; + qDebug() << "files set:"; + foreach(QUrl file, m_inpfiles) { + qDebug() << file.toString(); + } +} + +bool +KGpgTextOrFileTransaction::preStart() +{ + QStringList locfiles; + + foreach (const QUrl &url, m_inpfiles) { + // qt 4.8 ! todo mac + qDebug() << "what the loc:" << url.isLocalFile(); + + if (url.isLocalFile()) { + locfiles.append(url.toLocalFile()); + } else { + /* QString tmpfile; + //TODO: QIODevice ...? + if (KIO::NetAccess::download(url, tmpfile, 0)) { + m_tempfiles.append(tmpfile); + } else { + m_messages.append(KIO::NetAccess::lastErrorString()); + cleanUrls(); + setSuccess(TS_KIO_FAILED); + return false; + }*/ + } + } + + qDebug() << "m_text: " << m_text; + qDebug() << "hasInputTransaction: " << hasInputTransaction(); + + if (locfiles.isEmpty() && m_tempfiles.isEmpty() && m_text.isEmpty() && !hasInputTransaction()) { + setSuccess(TS_MSG_SEQUENCE); + return false; + } + + QStringList args(QLatin1String("--status-fd=1")); + + args << command(); + // if the input is not stdin set command-fd so GnuPG + // can ask if e.g. the file already exists + if (!locfiles.isEmpty() && !m_tempfiles.isEmpty()) { + args << QLatin1String("--command-fd=0"); + m_closeInput = false; + qDebug() << "if"; + } else { + m_closeInput = !args.contains(QLatin1String("--command-fd=0")); + qDebug() << "else"; + } + if (locfiles.count() + m_tempfiles.count() > 1) + args << QLatin1String("--multifile"); + args << locfiles << m_tempfiles; + addArguments(args); + + return true; +} + +void +KGpgTextOrFileTransaction::postStart() +{ + qDebug() << "post-start! " << m_text; + if (!m_text.isEmpty()){ + GPGProc *proc = getProcess(); + proc->write(m_text.toUtf8()); + if (m_closeInput) + proc->closeWriteChannel(); + } +} + +bool +KGpgTextOrFileTransaction::nextLine(const QString &line) +{ + qDebug() << "nextline called: " << line; + if (!line.startsWith(QLatin1String("[GNUPG:] SIGEXPIRED")) && !line.startsWith(QLatin1String("[GNUPG:] KEYEXPIRED "))) + m_messages.append(line); + + return false; +} + +void +KGpgTextOrFileTransaction::finish() +{ + if (getProcess()->exitCode() != 0) { + setSuccess(TS_MSG_SEQUENCE); + } +} + +const QStringList & +KGpgTextOrFileTransaction::getMessages() const +{ + return m_messages; +} + +void +KGpgTextOrFileTransaction::cleanUrls() +{ +// TODO +/* foreach (const QString &u, m_tempfiles) + KIO::NetAccess::removeTempFile(u); +*/ + m_tempfiles.clear(); + m_locfiles.clear(); + m_inpfiles.clear(); +} + +const QList<QUrl> & +KGpgTextOrFileTransaction::getInputFiles() const +{ + return m_inpfiles; +} + +//#include "kgpgtextorfiletransaction.moc" diff --git a/kgpg/transactions/kgpgtextorfiletransaction.h b/kgpg/transactions/kgpgtextorfiletransaction.h new file mode 100644 index 0000000..46bf190 --- /dev/null +++ b/kgpg/transactions/kgpgtextorfiletransaction.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2008,2009,2010 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGTEXTORFILETRANSACTION_H +#define KGPGTEXTORFILETRANSACTION_H + +#include <QObject> +#include <QList> +#include <QString> +#include <QStringList> + +#include <QUrl> + +#include "kgpgtransaction.h" + +/** + * @brief feed a text or file through gpg + */ +class KGpgTextOrFileTransaction: public KGpgTransaction { + Q_OBJECT + + Q_DISABLE_COPY(KGpgTextOrFileTransaction) + +public: + /** + * @brief additional status codes for KGpgImport + */ + enum ts_import { + TS_KIO_FAILED = TS_COMMON_END + 1 ///< download of remote file failed + }; + +protected: + /** + * @brief work with given text + * @param parent parent object + * @param text text to work with + */ + explicit KGpgTextOrFileTransaction(QObject *parent = 0, const QString &text = QString(), const bool allowChaining = false); + + /** + * @brief work with given file(s) + * @param parent parent object + * @param keys list of file locations to work with + */ + KGpgTextOrFileTransaction(QObject *parent, const QList<QUrl> &files, const bool allowChaining = false); + +public: + /** + * @brief destructor + */ + virtual ~KGpgTextOrFileTransaction(); + + /** + * @brief set text to work with + * @param text text to work with + */ + void setText(const QString &text); + /** + * @brief set file locations to work with + * @param keys list of file locations to work with + */ + void setUrls(const QList<QUrl> &files); + + /** + * @brief get gpg info message + * @return the raw messages from gpg during the operation + */ + const QStringList &getMessages() const; + +protected: + /** + * @brief construct the command line of the process + */ + virtual bool preStart(); + virtual bool nextLine(const QString &line); + /** + * @brief implement special handling for GnuPG return codes + */ + virtual void finish(); + + virtual QStringList command() const = 0; + + const QList<QUrl> &getInputFiles() const; + +private: + QStringList m_tempfiles; + QStringList m_locfiles; + QList<QUrl> m_inpfiles; + QString m_text; + QStringList m_messages; + bool m_closeInput; ///< if input channel of GnuPG should be closed after m_text is written + + void cleanUrls(); + +private slots: + void postStart(); +}; + +#endif // KGPGTEXTORFILETRANSACTION_H diff --git a/kgpg/transactions/kgpgtransaction.cpp b/kgpg/transactions/kgpgtransaction.cpp new file mode 100644 index 0000000..241252c --- /dev/null +++ b/kgpg/transactions/kgpgtransaction.cpp @@ -0,0 +1,558 @@ +/* + * Copyright (C) 2008,2009,2010,2011,2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgtransaction.h" + +#include "../gpgproc.h" +#include "../kgpginterface.h" + +//#include <KDebug> +#include <QDebug> +//#include <knewpassworddialog.h> +//#include <KLocale> +//#include <KPushButton> +#include <QByteArray> +#include <QStringList> +#include <QWeakPointer> +#include <QWidget> + + + +KGpgTransactionPrivate::KGpgTransactionPrivate(KGpgTransaction *parent, bool allowChaining) + : QObject(parent), + m_parent(parent), + m_process(new GPGProc()), + m_inputTransaction(NULL), + //m_passwordDialog(NULL), + m_success(KGpgTransaction::TS_OK), + m_tries(3), + m_chainingAllowed(allowChaining), + m_passphraseAction(KGpgTransaction::PA_NONE), + m_inputProcessDone(false), + m_inputProcessResult(KGpgTransaction::TS_OK), + m_ownProcessFinished(false), + m_quitTries(0) +{ +} + +KGpgTransactionPrivate::~KGpgTransactionPrivate() +{ + /*if (m_passwordDialog) { + m_passwordDialog->close(); + m_passwordDialog->deleteLater(); + }*/ + if (m_process->state() == QProcess::Running) { + m_process->closeWriteChannel(); + m_process->terminate(); + } + delete m_inputTransaction; + delete m_process; +} + +KGpgTransaction::KGpgTransaction(QObject *parent, const bool allowChaining) + : QObject(parent), + d(new KGpgTransactionPrivate(this, allowChaining)) +{ + connect(d->m_process, SIGNAL(readReady()), SLOT(slotReadReady())); + connect(d->m_process, SIGNAL(processExited()), SLOT(slotProcessExited())); + connect(d->m_process, SIGNAL(started()), SLOT(slotProcessStarted())); +} + +KGpgTransaction::~KGpgTransaction() +{ + delete d; +} + +void +KGpgTransactionPrivate::slotReadReady() +{ + QString line; + + QWeakPointer<GPGProc> process(m_process); + QWeakPointer<KGpgTransaction> par(m_parent); + + while (!process.isNull() && (m_process->readln(line, true) >= 0)) { + if (m_quitTries) + m_quitLines << line; +#ifdef KGPG_DEBUG_TRANSACTIONS + qDebug() << m_parent << line; +#endif /* KGPG_DEBUG_TRANSACTIONS */ + //qDebug() << "trans-read: " << m_parent << line; + + + if (line.startsWith(QLatin1String("[GNUPG:] USERID_HINT "))) { + m_parent->addIdHint(line); + } else if (line.startsWith(QLatin1String("[GNUPG:] BAD_PASSPHRASE "))) { + m_success = KGpgTransaction::TS_BAD_PASSPHRASE; + } else if (line.startsWith(QLatin1String("[GNUPG:] GET_HIDDEN passphrase.enter"))) { + // Do not directly assign to the member here, the object could + // get deleted while waiting for the result + const KGpgTransaction::ts_passphrase_actions action = m_parent->passphraseRequested(); + + if (par.isNull()) + return; + + m_passphraseAction = action; + + switch (action) { + case KGpgTransaction::PA_USER_ABORTED: + m_parent->setSuccess(KGpgTransaction::TS_USER_ABORTED); + // sending "quit" here is useless as it would be interpreted as the passphrase + m_process->closeWriteChannel(); + break; + default: + break; + } + } else if ((m_passphraseAction == KGpgTransaction::PA_CLOSE_GOOD) && + line.startsWith(QLatin1String("[GNUPG:] GOOD_PASSPHRASE"))) { + // signal GnuPG that there will be no further input and it can + // begin sending output. + + // except when signing text... + if(QString::fromAscii(m_parent->metaObject()->className()) != "KGpgSignText"){ + m_process->closeWriteChannel(); + } + } else if (line.startsWith(QLatin1String("[GNUPG:] GET_BOOL "))) { + switch (m_parent->boolQuestion(line.mid(18))) { + case KGpgTransaction::BA_YES: + write("YES\n"); + break; + case KGpgTransaction::BA_NO: + write("NO\n"); + break; + case KGpgTransaction::BA_UNKNOWN: + m_parent->setSuccess(KGpgTransaction::TS_MSG_SEQUENCE); + m_parent->unexpectedLine(line); + sendQuit(); + } + } else if (line.startsWith(QLatin1String("[GNUPG:] CARDCTRL "))) { + // just ignore them, pinentry should handle that + } else if (m_parent->nextLine(line)) { + sendQuit(); + } + } +} + +void +KGpgTransactionPrivate::slotProcessExited() +{ + Q_ASSERT(m_parent->sender() == m_process); + m_ownProcessFinished = true; + + if (m_inputProcessDone) + processDone(); +} + +void +KGpgTransactionPrivate::slotProcessStarted() +{ + m_parent->postStart(); +} + +void +KGpgTransactionPrivate::sendQuit(void) +{ + write("quit\n"); + +#ifdef KGPG_DEBUG_TRANSACTIONS + if (m_quitTries == 0) + qDebug() << "sending quit"; +#endif /* KGPG_DEBUG_TRANSACTIONS */ + + if (m_quitTries++ >= 3) { + qDebug() << "tried" << m_quitTries << "times to quit the GnuPG session"; + qDebug() << "last input was" << m_quitLines; + qDebug() << "please file a bug report at https://bugs.kde.org"; + m_process->closeWriteChannel(); + m_success = KGpgTransaction::TS_MSG_SEQUENCE; + } +} + +void +KGpgTransactionPrivate::slotInputTransactionDone(int result) +{ + Q_ASSERT(m_parent->sender() == m_inputTransaction); + + m_inputProcessDone = true; + m_inputProcessResult = result; + + if (m_ownProcessFinished) + processDone(); +} + +void +KGpgTransactionPrivate::slotPasswordEntered(const QString &password) +{ + sender()->deleteLater(); + //m_passwordDialog = NULL; + m_process->write(password.toUtf8() + '\n'); + m_parent->newPasswordEntered(); +} + +void +KGpgTransactionPrivate::slotPasswordAborted() +{ + sender()->deleteLater(); + //m_passwordDialog = NULL; + m_process->closeWriteChannel(); + m_success = KGpgTransaction::TS_USER_ABORTED; +} + +void +KGpgTransactionPrivate::write(const QByteArray &a) +{ + m_process->write(a); +#ifdef KGPG_DEBUG_TRANSACTIONS + qDebug() << m_parent << a; +#endif /* KGPG_DEBUG_TRANSACTIONS */ + qDebug() << "trans-write: " << m_parent << a; +} + +void +KGpgTransactionPrivate::processDone() +{ + m_parent->finish(); + emit m_parent->infoProgress(100, 100); + emit m_parent->done(m_success); +} + +void +KGpgTransaction::start() +{ + d->m_inputProcessResult = false; + d->m_inputProcessDone = (d->m_inputTransaction == NULL); + + setSuccess(TS_OK); + d->m_idhints.clear(); + d->m_tries = 3; + if (preStart()) { + d->m_ownProcessFinished = false; + if (d->m_inputTransaction != NULL) + d->m_inputTransaction->start(); +#ifdef KGPG_DEBUG_TRANSACTIONS + kDebug(2100) << this << d->m_process->program(); +#endif /* KGPG_DEBUG_TRANSACTIONS */ + d->m_process->start(); + emit infoProgress(0, 1); + } else { + emit done(d->m_success); + } +} + +void +KGpgTransaction::write(const QByteArray &a, const bool lf) +{ + if (lf) + d->write(a + '\n'); + else + d->write(a); +} + +void +KGpgTransaction::write(const int i) +{ + write(QByteArray::number(i)); +} + +void +KGpgTransaction::askNewPassphrase(const QString& text) +{ + qDebug() << "KGpgTransaction::askNewPassphrase called"; + + emit statusMessage(tr("Requesting Passphrase")); + + /*d->m_passwordDialog = new KNewPasswordDialog(qobject_cast<QWidget *>(parent())); + d->m_passwordDialog->setPrompt(text); + d->m_passwordDialog->setAllowEmptyPasswords(false); + connect(d->m_passwordDialog, SIGNAL(newPassword(QString)), SLOT(slotPasswordEntered(QString))); + connect(d->m_passwordDialog, SIGNAL(rejected()), SLOT(slotPasswordAborted())); + connect(d->m_process, SIGNAL(processExited()), d->m_passwordDialog->button(KDialog::Cancel), SLOT(clicked())); + d->m_passwordDialog->show();*/ + + +} + +int +KGpgTransaction::getSuccess() const +{ + return d->m_success; +} + +void +KGpgTransaction::setSuccess(const int v) +{ +#ifdef KGPG_DEBUG_TRANSACTIONS + qDebug() << d->m_success << v; +#endif /* KGPG_DEBUG_TRANSACTIONS */ + d->m_success = v; +} + +KGpgTransaction::ts_boolanswer +KGpgTransaction::boolQuestion(const QString& line) +{ + Q_UNUSED(line); + + return BA_UNKNOWN; +} + +void +KGpgTransaction::finish() +{ +} + +void +KGpgTransaction::setDescription(const QString &description) +{ + d->m_description = description; +} + +void +KGpgTransaction::waitForInputTransaction() +{ + Q_ASSERT(d->m_inputTransaction != NULL); + + if (d->m_inputProcessDone) + return; + + d->m_inputTransaction->waitForFinished(); +} + +void +KGpgTransaction::unexpectedLine(const QString &line) +{ + qDebug() << this << "unexpected input line" << line << "for command" << d->m_process->program(); +} + +KGpgTransaction::ts_passphrase_actions +KGpgTransaction::passphraseRequested() +{ + qDebug() << "KGpgTransaction::passphraseRequested called"; + if (!askPassphrase()) + return PA_USER_ABORTED; + else + return PA_CLOSE_GOOD; +} + +bool +KGpgTransaction::preStart() +{ + return true; +} + +void +KGpgTransaction::postStart() +{ +} + +void +KGpgTransaction::addIdHint(QString txt) +{ + int cut = txt.indexOf(QLatin1Char( ' ' ), 22, Qt::CaseInsensitive); + txt.remove(0, cut); + + if (txt.contains(QLatin1Char( '(' ), Qt::CaseInsensitive)) + txt = txt.section(QLatin1Char( '(' ), 0, 0) + txt.section(QLatin1Char( ')' ), -1); + + txt.replace(QLatin1Char( '<' ), QLatin1String( "<" )); + + if (!d->m_idhints.contains(txt)) + d->m_idhints << txt; +} + +QString +KGpgTransaction::getIdHints() const +{ + return d->m_idhints.join( tr(" or " )); +} + +GPGProc * +KGpgTransaction::getProcess() +{ + return d->m_process; +} + +int +KGpgTransaction::addArgument(const QString &arg) +{ + int r = d->m_process->program().count(); + + *d->m_process << arg; + + return r; +} + +int +KGpgTransaction::addArguments(const QStringList &args) +{ + int r = d->m_process->program().count(); + + *d->m_process << args; + + return r; +} + +void +KGpgTransaction::replaceArgument(const int pos, const QString &arg) +{ + QStringList args(d->m_process->program()); + d->m_process->clearProgram(); + + args.replace(pos, arg); + + d->m_process->setProgram(args); +} + +void +KGpgTransaction::insertArgument(const int pos, const QString &arg) +{ + insertArguments(pos, QStringList(arg)); +} + +void +KGpgTransaction::insertArguments(const int pos, const QStringList &args) +{ + QStringList tmp(d->m_process->program()); + + int tmppos = pos; + foreach (const QString &s, args) { + tmp.insert(tmppos++, s); + } + d->m_process->setProgram(tmp); + + int move = args.count(); + foreach (int *ref, d->m_argRefs) { + if (*ref >= pos) + *ref += move; + } +} + +void +KGpgTransaction::addArgumentRef(int *ref) +{ + d->m_argRefs.append(ref); +} + +bool +KGpgTransaction::askPassphrase(const QString &message) +{ + qDebug() << "KGpgTransaction::askPassphrase called"; + + if (d->m_passphraseAction == PA_USER_ABORTED) + return false; + + QString passdlgmessage; + QString userIDs(getIdHints()); + if (userIDs.isEmpty()) + userIDs = tr("[No user id found]"); + else + userIDs.replace(QLatin1Char( '<' ), QLatin1String( "<" )); + + if (d->m_tries < 3) + passdlgmessage = tr("<p><b>Bad passphrase</b>. You have 1 try left.</p>", "<p><b>Bad passphrase</b>. You have %1 tries left.</p>", d->m_tries); + if (message.isEmpty()) { + passdlgmessage += tr("Enter passphrase for <b>%1</b>").arg(userIDs); + } else { + passdlgmessage += message; + } + + --d->m_tries; + + emit statusMessage(tr("Requesting Passphrase")); + return (KgpgInterface::sendPassphrase(passdlgmessage, d->m_process, qobject_cast<QWidget *>(parent())) == 0); +} + +void +KGpgTransaction::setGnuPGHome(const QString &home) +{ + QStringList tmp(d->m_process->program()); + + Q_ASSERT(tmp.count() > 3); + int homepos = tmp.indexOf(QLatin1String("--options"), 1); + if (homepos == -1) + homepos = tmp.indexOf(QLatin1String("--homedir"), 1); + Q_ASSERT(homepos != -1); + Q_ASSERT(homepos + 1 < tmp.count()); + + tmp[homepos] = QLatin1String("--homedir"); + tmp[homepos + 1] = home; + + d->m_process->setProgram(tmp); +} + +int +KGpgTransaction::waitForFinished(const int msecs) +{ + int ret = TS_OK; + + if (d->m_inputTransaction != NULL) { + int ret = d->m_inputTransaction->waitForFinished(msecs); + if ((ret != TS_OK) && (msecs != -1)) + return ret; + } + + bool b = d->m_process->waitForFinished(msecs); + + if (ret != TS_OK) + return ret; + + if (!b) + return TS_USER_ABORTED; + else + return getSuccess(); +} + +const QString & +KGpgTransaction::getDescription() const +{ + return d->m_description; +} + +void +KGpgTransaction::setInputTransaction(KGpgTransaction *ta) +{ + Q_ASSERT(d->m_chainingAllowed); + + if (d->m_inputTransaction != NULL) + clearInputTransaction(); + d->m_inputTransaction = ta; + + GPGProc *proc = ta->getProcess(); + proc->setStandardOutputProcess(d->m_process); + connect(ta, SIGNAL(done(int)), SLOT(slotInputTransactionDone(int))); +} + +void +KGpgTransaction::clearInputTransaction() +{ + disconnect(d->m_inputTransaction, SIGNAL(done(int)), this, SLOT(slotInputTransactionDone(int))); + d->m_inputTransaction = NULL; +} + +bool +KGpgTransaction::hasInputTransaction() const +{ + return (d->m_inputTransaction != NULL); +} + +void +KGpgTransaction::kill() +{ + d->m_process->kill(); +} + +void +KGpgTransaction::newPasswordEntered() +{ +} + +//#include "moc_kgpgtransaction.cpp" diff --git a/kgpg/transactions/kgpgtransaction.h b/kgpg/transactions/kgpgtransaction.h new file mode 100644 index 0000000..8fc76a5 --- /dev/null +++ b/kgpg/transactions/kgpgtransaction.h @@ -0,0 +1,465 @@ +/* + * Copyright (C) 2008,2009 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGTRANSACTION_H +#define KGPGTRANSACTION_H + +#include <QObject> +#include <QString> +#include <QStringList> + +class GPGProc; +class KGpgSignTransactionHelper; +class KGpgTransactionPrivate; +class QByteArray; +class QProcess; + +/** + * @brief Process one GnuPG operation + * + * This class encapsulates one GnuPG operation. It will care for all + * interaction with the gpg process. Everything you have to care about + * is to set up the object properly, call start() and catch the done signal. + * + * This is an abstract base class for specific operations that implements + * the basic I/O loop, the process setup and interaction and some convenience + * members to set extra arguments for the process. + * + * If you want to add a new operation create a child class that implements + * nextLine(). Ususally you also need a constructor that takes some information + * like the id of the key to modify. + * + * @author Rolf Eike Beer + */ +class KGpgTransaction: public QObject { + Q_OBJECT + + friend class KGpgTransactionPrivate; + friend class KGpgSignTransactionHelper; + + Q_DISABLE_COPY(KGpgTransaction) + +public: + /** + * @brief return codes common to many transactions + * + * Every transaction may define additional return codes, which + * should start at TS_COMMON_END + 1. + */ + enum ts_transaction { + TS_OK = 0, ///< everything went fine + TS_BAD_PASSPHRASE = 1, ///< the passphrase was not correct + TS_MSG_SEQUENCE = 2, ///< unexpected sequence of GnuPG messages + TS_USER_ABORTED = 3, ///< the user aborted the transaction + TS_INVALID_EMAIL = 4, ///< the given email address is invalid + TS_INPUT_PROCESS_ERROR = 5, ///< the connected input process returned an error + TS_COMMON_END = 100 ///< placeholder for return values of derived classes + }; + /** + * @brief result codes for GnuPG boolean questions + * + * These are the possible answers to a boolean question of a GnuPG process. + */ + enum ts_boolanswer { + BA_UNKNOWN = 0, ///< the question is not supported (this is an error) + BA_YES = 1, ///< answer "YES" + BA_NO = 2 ///< answer "NO" + }; + /** + * @brief actions to do after a passphrase was sent to GnuPG + */ + enum ts_passphrase_actions { + PA_NONE = 0, ///< do nothing special + PA_CLOSE_GOOD = 1, ///< close command channel if passphrase was accepted + PA_USER_ABORTED = 2 ///< the user has cancelled the dialog, abort the transaction + }; + + /** + * @brief KGpgTransaction constructor + */ + explicit KGpgTransaction(QObject *parent = 0, const bool allowChaining = false); + /** + * @brief KGpgTransaction destructor + */ + virtual ~KGpgTransaction(); + + /** + * @brief Start the operation. + */ + void start(); + + /** + * @brief sets the home directory of GnuPG called for this transaction + */ + void setGnuPGHome(const QString &home); + + /** + * @brief blocks until the transaction is complete + * @return the result of the transaction like done() would + * @retval TS_USER_ABORTED the timeout expired + * + * If this transaction has another transaction set as input then + * it would wait for those transaction to finish first. The msecs + * argument is used as limit for both transactions then so you + * can end up waiting twice the given time (or longer if you have + * more transactions chained). + */ + int waitForFinished(const int msecs = -1); + + /** + * @brief return description of this transaction + * @return string used to describe what's going on + * + * This is especially useful when using this transaction from a KJob. + */ + const QString &getDescription() const; + + /** + * @brief connect the standard input of this transaction to another process + * @param proc process to read data from + * + * Once the input process is connected this transaction will not emit + * the done signal until the input process sends the done signal. + * + * The basic idea is that when an input transaction is set you only need + * to care about this transaction. The other transaction is automatically + * started when this one is started and is destroyed when this one is. + */ + void setInputTransaction(KGpgTransaction *ta); + + /** + * @brief tell the process the standard input is no longer connected + * + * If you had connected an input process you need to tell the transaction + * once this input process is gone. Otherwise you will not get a done + * signal from this transaction as it will wait for the finished signal + * from the process that will never come. + */ + void clearInputTransaction(); + + /** + * @brief check if another transaction will sent input to this + */ + bool hasInputTransaction() const; + + /** + * @brief abort this operation as soon as possible + */ + void kill(); + +signals: + /** + * @brief Emitted when the operation was completed. + * @param result return status of the transaction + * + * @see ts_transaction for the common status codes. Each transaction + * may define additional status codes. + */ + void done(int result); + + /** + * @brief emits textual status information + * @param msg the status message + */ + void statusMessage(const QString &msg); + + /** + * @brief emits procentual status information + * @param processedAmount how much of the job is done + * @param totalAmount how much needs to be done to complete this job + */ + void infoProgress(qulonglong processedAmount, qulonglong totalAmount); + +protected: + /** + * @brief Called before the gpg process is started. + * @return true if the process should be started + * + * You may reimplement this member if you need to do some special + * operations before the process is started. The command line of the + * process may be modified for the last time here. + * + * When you notice that some values passed are invalid or the + * transaction does not need to be run for some other reason you should + * call setSuccess() to set the return value and return false. In this + * case the process is not started but the value is immediately + * returned. + */ + virtual bool preStart(); + /** + * @brief Called when the gpg process is up and running. + * + * This functions is connected to the started() signal of the gpg process. + */ + virtual void postStart(); + /** + * @brief Called for every line the gpg process writes. + * @param line the input from the process + * @return true if "quit" should be sent to process + * + * You need to implement this member to get a usable subclass. + * + * When this function returns true "quit" is written to the process. + */ + virtual bool nextLine(const QString &line) = 0; + /** + * @brief Called for every boolean question GnuPG answers + * @param line the question GnuPG asked + * @return what to answer GnuPG + * + * This is called instead of nextLine() if the line contains a boolean + * question. Returning BA_UNKNOWN will cancel the current transaction + * and will set the transaction result to TS_MSG_SEQUENCE. + * + * The default implementation will answer BA_UNKNOWN to every question. + */ + virtual ts_boolanswer boolQuestion(const QString &line); + /** + * @brief Called when the gpg process finishes. + * + * You may reimplement this member if you need to do some special + * operations after process completion. The provided one simply + * does nothing which should be enough for most cases. + */ + virtual void finish(); + /** + * @brief called when the user entered a new password + * + * This is called after askNewPassphrase() was called, the user has + * entered a new password and it was sent to the GnuPG process. + * + * The default implementation does nothing. + */ + virtual void newPasswordEntered(); + /** + * @brief set the description returned in getDescription() + * @param description the new description of this transaction + */ + void setDescription(const QString &description); + + /** + * @brief wait until the input transaction has finished + */ + void waitForInputTransaction(); + + /** + * @brief notify of an unexpected line + * + * This will print out the line to the console to ease debugging. + */ + void unexpectedLine(const QString &line); + + /** + * @brief called when GnuPG asks for a passphrase + * @return true if "quit" should be sent to process + * + * This allows a transaction to implement special handling for + * passphrases, e.g. when both old and new passphrase must be + * requested when changing it. The default implementation will just + * call askPassphrase(). + */ + virtual ts_passphrase_actions passphraseRequested(); + +private: + KGpgTransactionPrivate* const d; + + Q_PRIVATE_SLOT(d, void slotReadReady()) + Q_PRIVATE_SLOT(d, void slotProcessExited()) + Q_PRIVATE_SLOT(d, void slotProcessStarted()) + Q_PRIVATE_SLOT(d, void slotInputTransactionDone(int)) + Q_PRIVATE_SLOT(d, void slotPasswordEntered(const QString &)) + Q_PRIVATE_SLOT(d, void slotPasswordAborted()) + +protected: + /** + * @brief Ask user for passphrase and send it to gpg process. + * + * If the gpg process asks for a new passphrase this function will do + * all necessary steps for you: ask the user for the password and write + * it to the gpg process. If the password is wrong the user is prompted + * again for the correct password. If the user aborts the password + * entry the gpg process will be killed and the transaction result will + * be set to TS_USER_ABORTED. + * + * In contrast to sendPassphrase() this function will not block, but + * handle everything using signals and slots. + * + * @see KgpgInterface::sendPassphrase + * @see askPassphrase + */ + void askNewPassphrase(const QString &text); + + /** + * @brief get the success value that will be returned with the done signal + */ + int getSuccess() const; + /** + * @brief set the success value that will be returned with the done signal + * @param v the new success value + * + * You should use 0 as success value. Other values can be defined as needed. + */ + void setSuccess(const int v); + + /** + * @brief add a userid hint + * @param txt userid description + * + * Before GnuPG asks for a passphrase it usually sends out a hint message + * for which key the passphrase will be needed. There may be several hint + * messages, e.g. if a text was encrypted with multiple keys. + */ + void addIdHint(QString txt); + /** + * @brief get string of all userid hints + * @returns concatenation of all ids previously added with addIdHint(). + */ + QString getIdHints() const; + + /** + * @brief get a reference to the gpg process object + * @returns gpg process object + * + * This returns a reference to the gpg process object used internally. + * In case you need to do some special things (e.g. changing the output + * mode) you can modify this object. + * + * Usually you will not need this. + * + * @warning Never free this object! + */ + GPGProc *getProcess(); + /** + * @brief add a command line argument to gpg process + * @param arg new argument + * @returns the position of the new argument + * + * This is a convenience function that allows adding one additional + * argument to the command line of the process. This must be called + * before start() is called. Usually you will call this from your + * constructor. + */ + int addArgument(const QString &arg); + /** + * @brief add command line arguments to gpg process + * @param args new arguments + * @returns the position of the first argument added + * + * This is a convenience function that allows adding additional + * arguments to the command line of the process. This must be called + * before start() is called. + */ + int addArguments(const QStringList &args); + /** + * @brief replace the argument at the given position + * @param pos position of old argument + * @param arg new argument + */ + void replaceArgument(const int pos, const QString &arg); + /** + * @brief insert an argument at the given position + * @param pos position to insert at + * @param arg new argument + */ + void insertArgument(const int pos, const QString &arg); + /** + * @brief insert arguments at the given position + * @param pos position to insert at + * @param args new arguments + */ + void insertArguments(const int pos, const QStringList &args); + /** + * @brief make sure the reference to a specific argument is kept up to date + * @param ref the value where the position is stored + * + * You might want to keep the position of a specific argument to + * later be able to repace it easily. In that case put it into + * this function too so every time someone mofifies the argument + * list (especially by insertArgument() and insertArguments()) + * this reference will be kept up to date. + */ + void addArgumentRef(int *ref); + /** + * @brief write data to standard input of gpg process + * @param a data to write + * @param lf if line feed should be appended to message + * + * Use this function to interact with the gpg process. A carriage + * return is appended to the data automatically. Usually you will + * call this function from nextLine(). + */ + void write(const QByteArray &a, const bool lf = true); + /** + * @brief write data to standard input of gpg process + * @param i data to write + * + * @overload + */ + void write(const int i); + /** + * @brief ask user for password + * @param message message to display to the user. If message is empty + * "Enter password for [UID]" will be used. + * @return true if the authorization was successful + * + * This function handles user authorization for key changes. It will + * take care to display the message asking the user for the password + * and the number of tries left. + */ + bool askPassphrase(const QString &message = QString()); +}; + +class KGpgTransactionPrivate: QObject { +public: + KGpgTransactionPrivate(KGpgTransaction *parent, bool allowChaining); + ~KGpgTransactionPrivate(); + + KGpgTransaction *m_parent; + GPGProc *m_process; + KGpgTransaction *m_inputTransaction; + //KNewPasswordDialog *m_passwordDialog; + int m_success; + int m_tries; + QString m_description; + bool m_chainingAllowed; + KGpgTransaction::ts_passphrase_actions m_passphraseAction; ///< ignore further request for passphrase + + QStringList m_idhints; + + void slotReadReady(); + void slotProcessExited(); + void slotProcessStarted(); + void slotInputTransactionDone(int result); + void slotPasswordEntered(const QString &password); + void slotPasswordAborted(); + + QList<int *> m_argRefs; + bool m_inputProcessDone; + int m_inputProcessResult; + bool m_ownProcessFinished; + + /** + * terminate GnuPG session + */ + void sendQuit(void); + + void write(const QByteArray &a); + +private: + void processDone(); + + unsigned int m_quitTries; ///< how many times we tried to quit + QStringList m_quitLines; ///< what we received after we tried to quit +}; + +#endif // KGPGTRANSACTION_H diff --git a/kgpg/transactions/kgpgverify.cpp b/kgpg/transactions/kgpgverify.cpp new file mode 100644 index 0000000..e9dbb36 --- /dev/null +++ b/kgpg/transactions/kgpgverify.cpp @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "kgpgverify.h" + +#include "../gpgproc.h" +#include "../core/KGpgKeyNode.h" +//#include "../model/kgpgitemmodel.h" + +//#include <KGlobal> +//#include <KLocale> + +KGpgVerify::KGpgVerify(QObject *parent, const QString &text) + : KGpgTextOrFileTransaction(parent, text), + m_fileIndex(-1) +{ +} + +KGpgVerify::KGpgVerify(QObject *parent, const QList<QUrl> &files) + : KGpgTextOrFileTransaction(parent, files), + m_fileIndex(0) +{ +} + +KGpgVerify::~KGpgVerify() +{ +} + +QStringList +KGpgVerify::command() const +{ + QStringList ret(QLatin1String("--verify")); + + return ret; +} + +bool +KGpgVerify::nextLine(const QString &line) +{ + if (line.startsWith(QLatin1String("[GNUPG:] NO_PUBKEY "))) { + setSuccess(TS_MISSING_KEY); + m_missingId = line.mid(19).simplified(); + return false; + } + + if (line.startsWith(QLatin1String("[GNUPG:] ")) && + line.contains(QLatin1String("SIG"))) { + if (line.startsWith(QLatin1String("[GNUPG:] BADSIG"))) + setSuccess(KGpgVerify::TS_BAD_SIGNATURE); + else + setSuccess(KGpgTransaction::TS_OK); + } + + return KGpgTextOrFileTransaction::nextLine(line); +} + +void +KGpgVerify::finish() +{ + // GnuPG will return error code 2 if it wasn't able to verify the file. + // If it complained about a missing signature before that is fine. + if (((getProcess()->exitCode() == 2) && (getSuccess() == TS_MISSING_KEY)) || + ((getProcess()->exitCode() == 1) && (getSuccess() == TS_BAD_SIGNATURE))) + return; + + KGpgTextOrFileTransaction::finish(); +} + +static QString +sigTimeMessage(const QString &sigtime) +{ + QDateTime stamp; + if (sigtime.contains(QLatin1Char('T'))) { + stamp = QDateTime::fromString(sigtime, Qt::ISODate); + } else { + bool ok; + qint64 secs = sigtime.toLongLong(&ok); + if (ok) + stamp = QDateTime::fromMSecsSinceEpoch(secs * 1000); + } + + if (!stamp.isValid()) + return QString(); + +/* return tr("first argument is formatted date, second argument is formatted time", + "The signature was created at %1 %2", + KGlobal::locale()->formatDate(stamp.date(), KLocale::LongDate), + KGlobal::locale()->formatTime(stamp.time(), KLocale::LongDate)) + + QLatin1String("<br/>");*/ + return "todo"; +} + +/* +QString +KGpgVerify::getReport(const QStringList &log, const KGpgItemModel *model) +{ + QString result; + // newer versions of GnuPG emit both VALIDSIG and GOODSIG + // for a good signature. Since VALIDSIG has more information + // we use that. + const QRegExp validsig(QLatin1String("^\\[GNUPG:\\] VALIDSIG([ ]+[^ ]+){10,}.*$")); + const bool useGoodSig = (model != NULL) && (log.indexOf(validsig) == -1); + QString sigtime; // timestamp of signature creation + + foreach (const QString &line, log) { + if (!line.startsWith(QLatin1String("[GNUPG:] "))) + continue; + + const QString msg = line.mid(9); + + if (msg.startsWith(QLatin1String("VALIDSIG ")) && !useGoodSig) { + // from GnuPG source, doc/DETAILS: + // VALIDSIG <fingerprint in hex> <sig_creation_date> <sig-timestamp> + // <expire-timestamp> <sig-version> <reserved> <pubkey-algo> + // <hash-algo> <sig-class> <primary-key-fpr> + const QStringList vsig = msg.mid(9).split(QLatin1Char(' '), QString::SkipEmptyParts); + Q_ASSERT(vsig.count() >= 10); + + const KGpgKeyNode *node = model->findKeyNode(vsig[9]); + + if (node != NULL) { + // ignore for now if this is signed with the primary id (vsig[0] == vsig[9]) or not + if (node->getEmail().isEmpty()) + result += tr("<qt>Good signature from:<br /><b>%1</b><br />Key ID: %2<br /></qt>") + .arg(node->getName()).arg(vsig[9]); + else + result += tr("Good signature from: NAME <EMAIL>, Key ID: HEXID", + "<qt>Good signature from:<br /><b>%1 <%2></b><br />Key ID: %3<br /></qt>") + .arg(node->getName()).arg(node->getEmail()).arg(vsig[9]); + + result += sigTimeMessage(vsig[2]); + } else { + // this should normally never happen, but one could delete + // the key just after the verification. Brute force solution: + // do the whole report generation again, but this time make + // sure GOODSIG is used. + return getReport(log, NULL); + } + } else if (msg.startsWith(QLatin1String("UNEXPECTED")) || + msg.startsWith(QLatin1String("NODATA"))) { + result += tr("No signature found.") + QLatin1Char('\n'); + } else if (useGoodSig && msg.startsWith(QLatin1String("GOODSIG "))) { + int sigpos = msg.indexOf( ' ' , 8); + const QString keyid = msg.mid(8, sigpos - 8); + + // split the name/email pair to give translators more power to handle this + QString email; + QString name = msg.mid(sigpos + 1); + + int oPos = name.indexOf(QLatin1Char('<')); + int cPos = name.indexOf(QLatin1Char('>')); + if ((oPos >= 0) && (cPos >= 0)) { + email = name.mid(oPos + 1, cPos - oPos - 1); + name = name.left(oPos).simplified(); + } + + if (email.isEmpty()) + result += tr("<qt>Good signature from:<br /><b>%1</b><br />Key ID: %2<br /></qt>") + .arg(name).arg(keyid); + else + result += tr("Good signature from: NAME <EMAIL>, Key ID: HEXID", + "<qt>Good signature from:<br /><b>%1 <%2></b><br />Key ID: %3<br /></qt>") + .arg(name).arg(email).arg(keyid); + if (!sigtime.isEmpty()) { + result += sigTimeMessage(sigtime); + sigtime.clear(); + } + } else if (msg.startsWith(QLatin1String("SIG_ID "))) { + const QStringList parts = msg.simplified().split(QLatin1Char(' ')); + if (parts.count() > 2) + sigtime = parts[2]; + } else if (msg.startsWith(QLatin1String("BADSIG"))) { + int sigpos = msg.indexOf( ' ', 7); + result += tr("<qt><b>BAD signature</b> from:<br /> %1<br />Key id: %2<br /><br /><b>The file is corrupted</b><br /></qt>") + .arg(msg.mid(sigpos + 1).replace(QLatin1Char('<'), QLatin1String("<"))) + .arg(msg.mid(7, sigpos - 7)); + } else if (msg.startsWith(QLatin1String("TRUST_UNDEFINED"))) { + result += tr("<qt>The signature is valid, but the key is untrusted<br /></qt>"); + } else if (msg.startsWith(QLatin1String("TRUST_ULTIMATE"))) { + result += tr("<qt>The signature is valid, and the key is ultimately trusted<br /></qt>"); + } + } + + return result; +} +*/ + +QString +KGpgVerify::missingId() const +{ + return m_missingId; +} + +//#include "kgpgverify.moc" diff --git a/kgpg/transactions/kgpgverify.h b/kgpg/transactions/kgpgverify.h new file mode 100644 index 0000000..beba12f --- /dev/null +++ b/kgpg/transactions/kgpgverify.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2012 Rolf Eike Beer <[email protected]> + */ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KGPGVERIFY_H +#define KGPGVERIFY_H + +#include "kgpgtextorfiletransaction.h" + +#include <QObject> +#include <QString> +#include <QStringList> + +#include <QUrl> + +//class KGpgItemModel; +class QProcess; + +/** + * @brief verify the signature of the given text or files + */ +class KGpgVerify: public KGpgTextOrFileTransaction { + Q_OBJECT + + Q_DISABLE_COPY(KGpgVerify) + KGpgVerify(); // = delete C++0x +public: + enum ts_verify { + TS_MISSING_KEY = KGpgTransaction::TS_COMMON_END + 1, ///< signing key not in keyring + TS_BAD_SIGNATURE = TS_MISSING_KEY + 1 ///< the file is signed, but the signature is invalid + }; + + /** + * @brief verify signature of given text + * @param parent parent object + * @param text text to verify + */ + explicit KGpgVerify(QObject *parent, const QString &text = QString()); + + /** + * @brief verify signatures of file(s) + * @param parent parent object + * @param files list of file locations to verify + */ + KGpgVerify(QObject *parent, const QList<QUrl> &files); + + /** + * @brief destructor + */ + virtual ~KGpgVerify(); + + /** + * @brief get verification report + * @param log the log lines to scan + * @param model key model to use for key lookups + * @return verification report of GnuPG + */ + //static QString getReport(const QStringList &log, const KGpgItemModel *model = NULL); + + /** + * @brief get the missing key id + * @return key id that signed the message + * + * This is only valid if the transaction returned with result + * TS_MISSING_KEY. + */ + QString missingId() const; + +protected: + virtual QStringList command() const; + virtual bool nextLine(const QString &line); + virtual void finish(); + +private: + int m_fileIndex; + QString m_currentFile; + QStringList m_report; + QString m_missingId; +}; + +#endif // KGPGVERIFY_H @@ -56,8 +56,8 @@ int main(int argc, char *argv[]) putenv(QString("GNUPGHOME=" + appPath + "/keydb").toAscii().data()); // this may help with newer gpgme versions on windows - //putenv(QString("GPGME_GPGPATH=" + appPath.replace("/", "\\") + "\\bin\\gpg.exe").toAscii().data()); - + putenv(QString("GPGME_GPGPATH=" + appPath + "/gpg-mac").toAscii().data()); + qDebug() << appPath + "/gpg-mac"; // QSettings uses org-name for automatically setting path... app.setOrganizationName("conf"); diff --git a/mainwindow.cpp b/mainwindow.cpp index 2064b48..dd5b306 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -23,6 +23,7 @@ MainWindow::MainWindow() { + qDebug() << "hallo"; mCtx = new GpgME::GpgContext(); /* get path were app was started */ @@ -731,7 +732,78 @@ void MainWindow::importKeyFromEdit() return; } - keyMgmt->importKeys(edit->curTextPage()->toPlainText().toAscii()); + //keyMgmt->importKeys(edit->curTextPage()->toPlainText().toAscii()); + QString text = edit->curTextPage()->toPlainText(); + + if (text.isEmpty()) + return; + + KGpgImport *imp; + + if (!KGpgImport::isKey(text) && KGpgDecrypt::isEncryptedText(text)) { + /*if (KMessageBox::questionYesNo(this, + i18n("<qt>The text in the clipboard does not look like a key, but like encrypted text.<br />Do you want to decrypt it first and then try importing it?</qt>"), + i18n("Import from Clipboard")) != KMessageBox::Yes) + return;*/ + + imp = new KGpgImport(this); + KGpgDecrypt *decr = new KGpgDecrypt(this, text); + imp->setInputTransaction(decr); + } else { + imp = new KGpgImport(this, text); + } + + startImport(imp); +} + +void MainWindow::startImport(KGpgImport *import) +{ + qDebug() << "start import"; + changeMessage(tr("Importing..."), true); + connect(import, SIGNAL(done(int)), SLOT(slotImportDone(int))); + import->start(); +} + +void MainWindow::slotImportDone(int result) +{ + KGpgImport *import = qobject_cast<KGpgImport *>(sender()); + + Q_ASSERT(import != NULL); + const QStringList rawmsgs(import->getMessages()); + + if (result != 0) { + /*KMessageBox::detailedSorry(this, i18n("Key importing failed. Please see the detailed log for more information."), + rawmsgs.join( QLatin1String( "\n")) , i18n("Key Import" ));*/ + qDebug() << "Key importing failed. Please see the detailed log for more information." << rawmsgs.join( QLatin1String( "\n")); + } + + QStringList keys(import->getImportedIds(0x1f)); + const bool needsRefresh = !keys.isEmpty(); + keys << import->getImportedIds(0); +/* + if (!keys.isEmpty()) { + const QString msg(import->getImportMessage()); + const QStringList keynames(import->getImportedKeys()); + + new KgpgDetailedInfo(this, msg, rawmsgs.join( QLatin1String( "\n") ), keynames, i18n("Key Import" )); + if (needsRefresh) + imodel->refreshKeys(keys); + else + changeMessage(i18nc("Application ready for user input", "Ready")); + } else{ + changeMessage(i18nc("Application ready for user input", "Ready")); + } +*/ + changeMessage(tr("Application ready for user input", "Ready")); + mCtx->emitKeyDBChanged(); + import->deleteLater(); +} + +void MainWindow::changeMessage(const QString &msg, const bool keep) +{ + int timeout = keep ? 0 : 10000; + + statusBar()->showMessage(msg, timeout); } void MainWindow::openKeyManagement() @@ -749,11 +821,38 @@ void MainWindow::encrypt() QStringList *uidList = mKeyList->getChecked(); - QByteArray *tmp = new QByteArray(); - if (mCtx->encrypt(uidList, edit->curTextPage()->toPlainText().toUtf8(), tmp)) { - QString *tmp2 = new QString(*tmp); - edit->fillTextEditWithText(*tmp2); + if (uidList->count() == 0) { + QMessageBox::critical(0, tr("No Key Selected"), tr("No Key Selected")); + return; } + + QStringList options; + KGpgEncrypt::EncryptOptions opts = KGpgEncrypt::DefaultEncryption; + + opts |= KGpgEncrypt::AllowUntrustedEncryption; + opts |= KGpgEncrypt::AsciiArmored; + + KGpgEncrypt *encr = new KGpgEncrypt(this, *uidList, edit->curTextPage()->toPlainText(), opts, options); + encr->start(); + connect(encr, SIGNAL(done(int)), SLOT(slotEncryptDone(int))); +} + +void MainWindow::slotEncryptDone(int result) +{ + KGpgEncrypt *enc = qobject_cast<KGpgEncrypt *>(sender()); + Q_ASSERT(enc != NULL); + + if (result == KGpgTransaction::TS_OK) { + const QString lf = QLatin1String("\n"); + //setPlainText(enc->encryptedText().join(lf) + lf); + edit->fillTextEditWithText(enc->encryptedText().join(lf) + lf); + } else { + /*KMessageBox::sorry(this, i18n("The encryption failed with error code %1", result), + i18n("Encryption failed."));*/ + qDebug() << "The encryption failed with error code " << result; + } + + sender()->deleteLater(); } void MainWindow::sign() @@ -764,11 +863,41 @@ void MainWindow::sign() QStringList *uidList = mKeyList->getPrivateChecked(); - QByteArray *tmp = new QByteArray(); + if(uidList->isEmpty()) { + QMessageBox::critical(0, tr("Key Selection"), tr("No Private Key Selected")); + return; + } + + //QByteArray *tmp = new QByteArray(); - if (mCtx->sign(uidList, edit->curTextPage()->toPlainText().toUtf8(), tmp)) { + /*if (mCtx->sign(uidList, edit->curTextPage()->toPlainText().toUtf8(), tmp)) { edit->fillTextEditWithText(QString::fromUtf8(*tmp)); + }*/ + + // TODO: more than one signers + KGpgSignText *signt = new KGpgSignText(this, uidList->first(), edit->curTextPage()->toPlainText()); + connect(signt, SIGNAL(done(int)), SLOT(slotSignDone(int))); + signt->start(); + //KGpgTextInterface *interface = new KGpgTextInterface(message, signkeyid, options); + //connect(interface, SIGNAL(txtSigningFinished(QString)), SLOT(slotSignUpdate(QString))); + //interface->signText(message, signkeyid, options); +} + +void MainWindow::slotSignDone(int result) +{ + const KGpgSignText * const signt = qobject_cast<KGpgSignText *>(sender()); + sender()->deleteLater(); + Q_ASSERT(signt != NULL); + + if (result != KGpgTransaction::TS_OK) { + //KMessageBox::sorry(this, i18n("Signing not possible: bad passphrase or missing key")); + //return; + qDebug() << "Signing not possible: bad passphrase or missing key"; + return; } + + edit->fillTextEditWithText(signt->signedText().join(QLatin1String("\n")) + QLatin1String("\n")); + } void MainWindow::decrypt() @@ -777,21 +906,36 @@ void MainWindow::decrypt() return; } - QByteArray *decrypted = new QByteArray(); - QByteArray text = edit->curTextPage()->toPlainText().toAscii(); // TODO: toUtf8() here? - mCtx->preventNoDataErr(&text); + //QByteArray *decrypted = new QByteArray(); + //QByteArray text = edit->curTextPage()->toPlainText().toAscii(); // TODO: toUtf8() here? + + + const QString fullcontent = edit->curTextPage()->toPlainText(); + // TODO: do we still need this with kgpg? + //mCtx->preventNoDataErr(fullcontent.toAscii()); + + // TODO: whats the use of this? + int m_posstart = -1; + int m_posend = -1; + + if (!KGpgDecrypt::isEncryptedText(fullcontent, &m_posstart, &m_posend)) + return; + + KGpgDecrypt *decr = new KGpgDecrypt(this, fullcontent.mid(m_posstart, m_posend - m_posstart)); + connect(decr, SIGNAL(done(int)), SLOT(slotDecryptDone(int))); + decr->start(); // try decrypt, if fail do nothing, especially don't replace text - if(!mCtx->decrypt(text, decrypted)) { + /* if(!mCtx->decrypt(text, decrypted)) { return; - } + }*/ /* * 1) is it mime (content-type:) * 2) parse header * 2) choose action depending on content-type */ - if(Mime::isMime(decrypted)) { +/* if(Mime::isMime(decrypted)) { Header header = Mime::getHeader(decrypted); // is it multipart, is multipart-parsing enabled if(header.getValue("Content-Type") == "multipart/mixed" @@ -807,9 +951,32 @@ void MainWindow::decrypt() } } } - edit->fillTextEditWithText(QString::fromUtf8(*decrypted)); + edit->fillTextEditWithText(QString::fromUtf8(*decrypted));*/ } +void MainWindow::slotDecryptDone(int result) +{ + KGpgDecrypt *decr = qobject_cast<KGpgDecrypt *>(sender()); + Q_ASSERT(decr != NULL); + + /*if (!m_tempfile.isEmpty()) { + KIO::NetAccess::removeTempFile(m_tempfile); + m_tempfile.clear(); + }*/ + + if (result == KGpgTransaction::TS_OK) { + // FIXME choose codec + //setPlainText(decr->decryptedText().join(QLatin1String("\n")) + QLatin1Char('\n')); + edit->fillTextEditWithText(decr->decryptedText().join(QLatin1String("\n")) + QLatin1Char('\n')); + } else if (result != KGpgTransaction::TS_USER_ABORTED) { + //KMessageBox::detailedSorry(this, i18n("Decryption failed."), decr->getMessages().join( QLatin1String( "\n" ))); + qDebug() << "Decryption failed." << decr->getMessages().join( QLatin1String( "\n" )); + } + + decr->deleteLater(); +} + + void MainWindow::verify() { if (edit->tabCount()==0 || edit->curPage() == 0) { @@ -839,9 +1006,24 @@ void MainWindow::appendSelectedKeys() return; } - QByteArray *keyArray = new QByteArray(); - mCtx->exportKeys(mKeyList->getSelected(), keyArray); - edit->curTextPage()->append(*keyArray); + QStringList expopts; + KGpgExport *exp = new KGpgExport(this, *mKeyList->getSelected(), expopts); + connect(exp, SIGNAL(done(int)), SLOT(slotAppendSelectedKeysReady(int))); + exp->start(); +} + +void MainWindow::slotAppendSelectedKeysReady(int result) { + KGpgExport *exp = qobject_cast<KGpgExport *>(sender()); + Q_ASSERT(exp != NULL); + + if (result == KGpgTransaction::TS_OK) { + edit->curTextPage()->append(QLatin1String( exp->getOutputData() )); + } else { + //KMessageBox::sorry(this, i18n("Your public key could not be exported\nCheck the key.")); + qDebug() << "Your public key could not be exported\nCheck the key."; + } + + exp->deleteLater(); } void MainWindow::copyMailAddressToClipboard() @@ -850,9 +1032,9 @@ void MainWindow::copyMailAddressToClipboard() return; } - gpgme_key_t key = mCtx->getKeyDetails(mKeyList->getSelected()->first()); + KgpgCore::KgpgKey key = mCtx->getKeyDetails(mKeyList->getSelected()->first()); QClipboard *cb = QApplication::clipboard(); - QString mail = key->uids->email; + QString mail = key.email(); cb->setText(mail); } @@ -862,8 +1044,8 @@ void MainWindow::showKeyDetails() return; } - gpgme_key_t key = mCtx->getKeyDetails(mKeyList->getSelected()->first()); - if (key) { + KgpgCore::KgpgKey key = mCtx->getKeyDetails(mKeyList->getSelected()->first()); + if (key.id() != "") { new KeyDetailsDialog(mCtx, key, this); } } diff --git a/mainwindow.h b/mainwindow.h index 0097062..c17a71e 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -31,6 +31,13 @@ #include "aboutdialog.h" #include "verifynotification.h" #include "wizard.h" +//#include "kgpg/kgpgtextinterface.h" +#include "kgpg/core/kgpgkey.h" +#include "kgpg/transactions/kgpgencrypt.h" +#include "kgpg/transactions/kgpgdecrypt.h" +#include "kgpg/transactions/kgpgexport.h" +#include "kgpg/transactions/kgpgimport.h" +#include "kgpg/transactions/kgpgsigntext.h" QT_BEGIN_NAMESPACE class QMainWindow; @@ -87,16 +94,19 @@ private slots: * with the currently checked keys */ void encrypt(); + void slotEncryptDone(int result); /** * @details Show a passphrase dialog and decrypt the text of currently active tab. */ void decrypt(); + void slotDecryptDone(int result); /** * @details Sign the text of currently active tab with the checked private keys */ void sign(); + void slotSignDone(int result); /** * @details Verify the text of currently active tab and show verify information. @@ -129,11 +139,14 @@ private slots: * @details Import keys from currently active tab to keylist if possible. */ void importKeyFromEdit(); + void startImport(KGpgImport *import); + void slotImportDone(int result); /** * @details Append the selected keys to currently active textedit. */ void appendSelectedKeys(); + void slotAppendSelectedKeysReady(int result); /** * @details Copy the mailaddress of selected key to clipboard. @@ -277,6 +290,13 @@ private: */ void parseMime(QByteArray *message); + /** + * @brief show a message in the status bar + * @param msg the text to show + * @param keep if the text should stay visible or may be hidden after a while + */ + void changeMessage(const QString &msg, const bool keep = false); + TextEdit *edit; /** Tabwidget holding the edit-windows */ QMenu *fileMenu; /** Submenu for file operations*/ QMenu *editMenu; /** Submenu for text operations*/ diff --git a/release/bin/gpg-mac b/release/bin/gpg-mac Binary files differnew file mode 100755 index 0000000..fe9fe0e --- /dev/null +++ b/release/bin/gpg-mac diff --git a/release/ts/gpg4usb_ar.qm b/release/ts/gpg4usb_ar.qm Binary files differindex 3135f47..17627b8 100644 --- a/release/ts/gpg4usb_ar.qm +++ b/release/ts/gpg4usb_ar.qm diff --git a/release/ts/gpg4usb_ar.ts b/release/ts/gpg4usb_ar.ts index 7989865..97dcbc7 100644 --- a/release/ts/gpg4usb_ar.ts +++ b/release/ts/gpg4usb_ar.ts @@ -933,9 +933,9 @@ Alessandro (pt_br) و Kirill (ru) و Phol (es) و Viriato (es) و Serse (it) و <source>You are about to export your private key. This is NOT your public key, so don't give it away. Make sure you keep it save.Do you really want to export your private key?</source> - <translation>أنت بصدد تصدير مفتاح السريّ. -هذا ليس مفتاحك العلنيّ. -احرص على حفظه في أمان. أتريد حقا تصدير مفتاحك السريّ؟</translation> + <translation>أنت بصدد تصدير مفتاحك السريّ الذي تُظهّر به و توقّع. +هذا ليس مفتاحك العلنيّ الذي.تشاركه مع الآخرين ليُراسلوك. +إن صدّرته فاحرص على حفظه في أمان. أتريد حقا تصدير مفتاحك السريّ؟</translation> </message> <message> <location filename="../../keydetailsdialog.cpp" line="199"/> @@ -1113,7 +1113,7 @@ Weak -> Strong</source> <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> <translatorcomment>To be more informative, I phrased the second sentence as "Uses of tools ompatible with the GPG system can use your public key for you [...]"</translatorcomment> <translation>ينبغي عليك توليد زوج مفاتيح يتألف من مفتاح علنيّ و آخر سريّ.<br /> -يمكن لمن يستخدمون أدوات متوافقةمع نظام التعمية GPG استخدام مفتاحك العلنيّ لتعمية الرسائل لك و للتحقق من توقيعك على الرسائل التي وقّعتها. بينما تستخدم أنت مفتاحك السريّ لتظهير الرسائل المعماة لك و لتوقيع الرسائل.<br /> +يمكن لمن يستخدمون أدوات متوافقةمع نظام التعمية PGP استخدام مفتاحك العلنيّ لتعمية الرسائل لك و للتحقق من توقيعك على الرسائل التي وقّعتها. بينما تستخدم أنت مفتاحك السريّ لتظهير الرسائل المعماة لك و لتوقيع الرسائل.<br /> لمزيد من المعلومات طالع الشرح (الذي سيظهر في النافذة الرئيسية):</translation> </message> <message> @@ -2313,7 +2313,8 @@ Alessandro (pt_br) و Kirill (ru) و Phol (es) و Viriato (es) و Serse (it) و <message> <location filename="../../verifydetailsdialog.cpp" line="61"/> <source>Error Validating signature</source> - <translation>خطأ أثناء التحقق من توقيع</translation> + <translatorcomment>This should better be phrased as "Invalid signature by %1", as "error" imples that the verification process itself filed, instead of yielding a complete, yet undesired, result.</translatorcomment> + <translation>توقيع غير صحيح من</translation> </message> <message> <location filename="../../verifydetailsdialog.cpp" line="67"/> @@ -2377,7 +2378,7 @@ Alessandro (pt_br) و Kirill (ru) و Phol (es) و Viriato (es) و Serse (it) و <message> <location filename="../../verifykeydetailbox.cpp" line="62"/> <source>OK</source> - <translation>حَسَنٌ</translation> + <translation>جيِّد</translation> </message> <message> <location filename="../../verifykeydetailbox.cpp" line="69"/> @@ -2395,12 +2396,12 @@ Alessandro (pt_br) و Kirill (ru) و Phol (es) و Viriato (es) و Serse (it) و <message> <location filename="../../verifynotification.cpp" line="38"/> <source>Show detailed verify information</source> - <translation>أظهر بيانات تفصيلية للاستيثاق</translation> + <translation>أظهر تفاصيلَ بيانات الاستيثاق</translation> </message> <message> <location filename="../../verifynotification.cpp" line="47"/> <source>Details</source> - <translation>بيانات</translation> + <translation>تفاصيل</translation> </message> <message> <location filename="../../verifynotification.cpp" line="117"/> @@ -2415,12 +2416,12 @@ Alessandro (pt_br) و Kirill (ru) و Phol (es) و Viriato (es) و Serse (it) و <message> <location filename="../../verifynotification.cpp" line="164"/> <source>Text was completely signed by: </source> - <translation>النصُّ كُلُّه وقَّعه %1: </translation> + <translation>النصُّ كُلُّه وقَّعه: </translation> </message> <message> <location filename="../../verifynotification.cpp" line="169"/> <source>Text was partially signed by: </source> - <translation>النصُّ بعضُه وقَّعه %1: </translation> + <translation>النصُّ بعضُه وقَّعه: </translation> </message> <message> <location filename="../../verifynotification.cpp" line="147"/> diff --git a/release/ts/gpg4usb_de.ts b/release/ts/gpg4usb_de.ts index e3366ef..c59b3ed 100644 --- a/release/ts/gpg4usb_de.ts +++ b/release/ts/gpg4usb_de.ts @@ -83,34 +83,6 @@ <context> <name>Attachments</name> <message> - <source>Add File</source> - <translation type="obsolete">Datei hinzufügen</translation> - </message> - <message> - <source>Add a file</source> - <translation type="obsolete">Füge eine Datei hinzu</translation> - </message> - <message> - <source>Encrypt</source> - <translation type="obsolete">Verschlüsseln</translation> - </message> - <message> - <source>Encrypt marked File(s)</source> - <translation type="obsolete">Verschlüssele die markierten Dateien</translation> - </message> - <message> - <source>Decrypt</source> - <translation type="obsolete">Entschlüsseln</translation> - </message> - <message> - <source>Decrypt marked File(s)</source> - <translation type="obsolete">Entschlüssele die markierten Dateien</translation> - </message> - <message> - <source>couldn't open file: </source> - <translation type="obsolete">Konnte Datei nicht öffnen:</translation> - </message> - <message> <location filename="../../attachments.cpp" line="78"/> <location filename="../../attachments.cpp" line="115"/> <source>Save File</source> @@ -282,23 +254,11 @@ <translation>Die Datei existiert bereits! Möchten sie sie überschreiben?</translation> </message> <message> - <source>Files</source> - <translation type="obsolete">Dateien</translation> - </message> - <message> - <source>All Files (*)</source> - <translation type="obsolete">Alle Dateien (*) </translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="142"/> <source>Save File</source> <translation>Datei Speichern</translation> </message> <message> - <source>couldn't open file: </source> - <translation type="obsolete">Konnte Datei nicht öffnen:</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="180"/> <source>Cannot write file %1: %2.</source> @@ -342,49 +302,6 @@ <source>Language</source> <translation>Sprache</translation> </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">Die Änderung der Sprache wird beim nächsten Programmstart übernommen.</translation> - </message> - <message> - <source>System Default</source> - <translation type="obsolete">Systemstandard</translation> - </message> -</context> -<context> - <name>GpgME::Context</name> - <message> - <source>No Key Selected</source> - <translation type="obsolete">Kein Schlüssel ausgewählt</translation> - </message> - <message> - <source>Unsupported algorithm</source> - <translation type="obsolete">Nicht unterstützter Algorithmus</translation> - </message> - <message> - <source>Error decrypting:</source> - <translation type="obsolete">Fehler beim Entschlüsseln:</translation> - </message> - <message> - <source>Wrong password</source> - <translation type="obsolete">Falsches Passwort</translation> - </message> - <message> - <source>Enter Password</source> - <translation type="obsolete">Bitte Passwort eingeben</translation> - </message> - <message> - <source>Key Selection</source> - <translation type="obsolete">Schlüsselauswahl</translation> - </message> - <message> - <source>No Private Key Selected</source> - <translation type="obsolete">Kein privater Schlüssel ausgewählt</translation> - </message> - <message> - <source>Error signing:</source> - <translation type="obsolete">Fehler beim Signieren:</translation> - </message> </context> <context> <name>GpgME::GpgContext</name> @@ -440,453 +357,6 @@ </message> </context> <context> - <name>GpgWin</name> - <message> - <source>&Open...</source> - <translation type="obsolete">Ö&ffnen...</translation> - </message> - <message> - <source>Ctrl+O</source> - <translation type="obsolete">Strg+O</translation> - </message> - <message> - <source>Open an existing file</source> - <translation type="obsolete">Öffen Datei</translation> - </message> - <message> - <source>&Save</source> - <translation type="obsolete">&Speichern</translation> - </message> - <message> - <source>Ctrl+S</source> - <translation type="obsolete">Strg+S</translation> - </message> - <message> - <source>Save the current File</source> - <translation type="obsolete">Speichere Datei</translation> - </message> - <message> - <source>Save &As</source> - <translation type="obsolete">Speichern &unter</translation> - </message> - <message> - <source>Ctrl+A</source> - <translation type="obsolete">Strg+A</translation> - </message> - <message> - <source>Save the current File as...</source> - <translation type="obsolete">Speichere aktuelle Datei als....</translation> - </message> - <message> - <source>&Print</source> - <translation type="obsolete">&Drucken</translation> - </message> - <message> - <source>Ctrl+P</source> - <translation type="obsolete">Strg+P</translation> - </message> - <message> - <source>Print Document</source> - <translation type="obsolete">Drucken</translation> - </message> - <message> - <source>&Quit</source> - <translation type="obsolete">&Beenden</translation> - </message> - <message> - <source>Ctrl+Q</source> - <translation type="obsolete">Strg+Q</translation> - </message> - <message> - <source>Quit Program</source> - <translation type="obsolete">Beende das Programm</translation> - </message> - <message> - <source>&Paste</source> - <translation type="obsolete">E&infügen</translation> - </message> - <message> - <source>Ctrl+V</source> - <translation type="obsolete">Strg+V</translation> - </message> - <message> - <source>Paste Text From Clipboard</source> - <translation type="obsolete">Füge Text aus der Zwischenablage ein</translation> - </message> - <message> - <source>Cu&t</source> - <translation type="obsolete">&Ausschneiden</translation> - </message> - <message> - <source>Ctrl+X</source> - <translation type="obsolete">Strg+X</translation> - </message> - <message> - <source>Cut the current selection's contents to the clipboard</source> - <translation type="obsolete">aktuelle Auswahl ausschneiden und in Zwischenablage einfügen</translation> - </message> - <message> - <source>&Copy</source> - <translation type="obsolete">&Kopieren</translation> - </message> - <message> - <source>Ctrl+C</source> - <translation type="obsolete">Strg+C</translation> - </message> - <message> - <source>Copy the current selection's contents to the clipboard</source> - <translation type="obsolete">aktuelle Auswahl in Zwischenablage kopieren</translation> - </message> - <message> - <source>Select &All</source> - <translation type="obsolete">Alles &markieren</translation> - </message> - <message> - <source>Select the whole text</source> - <translation type="obsolete">Den ganzen Text markieren</translation> - </message> - <message> - <source>Open settings dialog</source> - <translation type="obsolete">Öffne den Einstellungsdialog</translation> - </message> - <message> - <source>&Encrypt</source> - <translation type="obsolete">&Verschlüsseln</translation> - </message> - <message> - <source>Ctrl+E</source> - <translation type="obsolete">Ctrl+E</translation> - </message> - <message> - <source>Encrypt Message</source> - <translation type="obsolete">Verschlüssele den Text</translation> - </message> - <message> - <source>&Decrypt</source> - <translation type="obsolete">&Entschlüsseln</translation> - </message> - <message> - <source>Ctrl+D</source> - <translation type="obsolete">Ctrl+D</translation> - </message> - <message> - <source>Decrypt Message</source> - <translation type="obsolete">Entschlüssele den Text</translation> - </message> - <message> - <source>Import New Key From File</source> - <translation type="obsolete">Importiere einen neuen Schlüssel aus Datei</translation> - </message> - <message> - <source>Import New Key From Editor</source> - <translation type="obsolete">Importiere einen neuen Schlüssel aus dem Textfeld</translation> - </message> - <message> - <source>&About</source> - <translation type="obsolete">&Info</translation> - </message> - <message> - <source>Show the application's About box</source> - <translation type="obsolete">Zeige die Information über die Anwendung</translation> - </message> - <message> - <source>&File</source> - <translation type="obsolete">&Datei</translation> - </message> - <message> - <source>&Edit</source> - <translation type="obsolete">&Bearbeiten</translation> - </message> - <message> - <source>&Help</source> - <translation type="obsolete">&Hilfe</translation> - </message> - <message> - <source>File</source> - <translation type="obsolete">Datei</translation> - </message> - <message> - <source>Edit</source> - <translation type="obsolete">Bearbeiten</translation> - </message> - <message> - <source>&Undo</source> - <translation type="obsolete">&Rückgängig</translation> - </message> - <message> - <source>&New</source> - <translation type="obsolete">&Neu</translation> - </message> - <message> - <source>Open a new file</source> - <translation type="obsolete">Öffne eine neue Datei</translation> - </message> - <message> - <source>&Close</source> - <translation type="obsolete">&Schliessen</translation> - </message> - <message> - <source>Close file</source> - <translation type="obsolete">Schliesse die Datei</translation> - </message> - <message> - <source>Undo Last Edit Action</source> - <translation type="obsolete">Mache die letzte Aktion rückgängig</translation> - </message> - <message> - <source>&Redo</source> - <translation type="obsolete">&Wiederherstellen</translation> - </message> - <message> - <source>Redo Last Edit Action</source> - <translation type="obsolete">Stelle die letzte Editieraktion wieder her</translation> - </message> - <message> - <source>&Quote</source> - <translation type="obsolete">&Kommentiere</translation> - </message> - <message> - <source>Quote whole text</source> - <translation type="obsolete">Kommentiere den gesamten Text</translation> - </message> - <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">Entferne doppelte &Zeilenumbrüche</translation> - </message> - <message> - <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation type="obsolete">Entferne doppelte Zeilenumbrüche, z.B. bei eingefügtem Text aus einem Webmailer</translation> - </message> - <message> - <source>Se&ttings</source> - <translation type="obsolete">Ei&nstellungen</translation> - </message> - <message> - <source>&File Encryption</source> - <translatorcomment>Datei Verschlüsselung</translatorcomment> - <translation type="obsolete">&Datei Verschlüsselung</translation> - </message> - <message> - <source>Encrypt/Decrypt File</source> - <translation type="obsolete">Ver-/Entschlüssele Datei</translation> - </message> - <message> - <source>&Sign</source> - <translation type="obsolete">&Signiere</translation> - </message> - <message> - <source>Sign Message</source> - <translation type="obsolete">Signiere die Nachricht</translation> - </message> - <message> - <source>&Verify</source> - <translation type="obsolete">&Verifiziere</translation> - </message> - <message> - <source>Verify Message</source> - <translation type="obsolete">Verifiziere die Nachricht</translation> - </message> - <message> - <source>Key Management</source> - <translation type="obsolete">Schlüsselverwaltung</translation> - </message> - <message> - <source>Open Keymanagement</source> - <translation type="obsolete">Öffne die Schlüsselverwaltung</translation> - </message> - <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">Öffne den Schlüsselimport Dialog</translation> - </message> - <message> - <source>Online &Tutorial</source> - <translation type="obsolete">Online &Dokumentation</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">Öffne die Online Dokumentation</translation> - </message> - <message> - <source>Translate gpg4usb</source> - <translation type="obsolete">Übersetze gpg4usb</translation> - </message> - <message> - <source>Translate gpg4usb yourself</source> - <translation type="obsolete">Übersetze gpg4usb selbst</translation> - </message> - <message> - <source>Append Selected Key(s) To Text</source> - <translation type="obsolete">Hänge die ausgewählten Schlüssel an den Text an</translation> - </message> - <message> - <source>Append The Selected Keys To Text in Editor</source> - <translation type="obsolete">Hänge den gewählten Schhlüssel an den Text im Editor an</translation> - </message> - <message> - <source>Copy EMail-address</source> - <translation type="obsolete">Kopiere EMail-Adresse</translation> - </message> - <message> - <source>Copy selected EMailaddress to clipboard</source> - <translation type="obsolete">Kopiere die ausgewählten EMail-Adresse in die Zwischenablage</translation> - </message> - <message> - <source>Show Keydetails</source> - <translation type="obsolete">Eigenschaften anzeigen</translation> - </message> - <message> - <source>Show Details for this Key</source> - <translation type="obsolete">Details zu diesem Schlüssel anzeigen</translation> - </message> - <message> - <source>&Keys</source> - <translation type="obsolete">Sch&lüssel</translation> - </message> - <message> - <source>&Import Key From...</source> - <translation type="obsolete">&Importiere Schlüssel aus...</translation> - </message> - <message> - <source>&View</source> - <translation type="obsolete">&Ansicht</translation> - </message> - <message> - <source>Key</source> - <translation type="obsolete">Schlüssel</translation> - </message> - <message> - <source>Ready</source> - <translation type="obsolete">Fertig</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Diese Anwendung erlaubt es, auf einfache <br>Art Texte und Dateien zu ver- und entschlüsseln. <br>Sie steht unter der GPL v3.0<br><br><b>Entwickler:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Übersetzung:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>Falls sie Fragen und/oder Vorschläge haben,<br>kontaktieren sie uns unter<br>gpg4usb at cpunk.de</a><br><br>oder treffen Sie uns in unserem xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center> oder senden Sie eine Email an unsere Mailingliste unter <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">&Schlüsselserver</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Diese Anwendung erlaubt es, auf einfache <br>Art Texte und Dateien zu ver- und entschlüsseln. <br>Sie steht unter der GPL v2.0<br><br><b>Entwickler:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Übersetzung:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>Falls sie Fragen und/oder Vorschläge haben,<br>kontaktieren sie uns unter<br>gpg4usb at cpunk.de</a><br><br>oder treffen Sie uns in unserem xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Diese Anwendung erlaubt es, auf einfache <br>Art Texte und Dateien zu ver- und entschlüsseln. <br>Sie steht unter der GPL v2.0<br><br><b>Entwickler:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Übersetzung:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>Falls sie Fragen und/oder Vorschläge haben,<br>kontaktieren sie uns unter<br>gpg4usb at cpunk.de</a><br><br>oder treffen Sie uns in unserem xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>There is one unencrypted file in attachment folder</source> - <translation type="obsolete">Es gibt unverschlüsselte Dateien im Attachment Ordner</translation> - </message> - <message> - <source>There are </source> - <translation type="obsolete">Es gibt</translation> - </message> - <message> - <source> unencrypted files in attachment folder</source> - <translation type="obsolete">unverschlüsselte Dateien im Attachment Ordner</translation> - </message> - <message> - <source>Encrypt for:</source> - <translation type="obsolete">Verschlüssele für:</translation> - </message> - <message> - <source>Attached files:</source> - <translation type="obsolete">Angehängte Dateien:</translation> - </message> - <message> - <source>Application</source> - <translation type="obsolete">Anwendung</translation> - </message> - <message> - <source>Cannot read file %1: -%2.</source> - <translation type="obsolete">Kann Datei nicht lesen %1: %2.</translation> - </message> - <message> - <source>File loaded</source> - <translation type="obsolete">Datei geladen</translation> - </message> - <message> - <source>The document has been modified. -Do you want to save your changes?</source> - <translation type="obsolete">Die Datei würde verändert. Möchten Sie die Änderung speichern?</translation> - </message> - <message> - <source>Cannot write file %1: -%2.</source> - <translation type="obsolete">Kann Datei nicht lesen %1: %2.</translation> - </message> - <message> - <source>Saved '%1'</source> - <translation type="obsolete">%1 gespeichert</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es)<br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Diese Anwendung ermöglicht einfaches<br>Ver- und Entschlüsseln von Texten und Dateien.<br>Sie steht unter der GPL v2.0<br><br><b>Entwickler:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Übersetzung:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es)<br><br>Falls Sie irgendwelche Fragen und/oder <br>Vorschläge haben, kontaktieren Sie uns über<br>gpg4usb at cpunk.de</a><br><br>oder treffen sie uns einfach in unserem XMPP-Channel:<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>Open Key</source> - <translation type="obsolete">Öffne Datei</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Kirill (ru)<br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Diese Anwendung erlaubt das einfache<br> Ver-und Entschlüsseln von Texten und Dateien.<br>Die Anwendung ist lizensiert unter der GPL v2.0<br><br><b>Entwickler:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Übersetzung:</b><br>Kirill (ru), Alessandro (pt)<br><br>Falls sie Fragen oder Anregungen haben,<br> kontaktieren sie uns unter gpg4usb at cpunk.de</a><br><br>oder treffen sie uns in unserem XMPP-Channel:<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>couldn't open file: </source> - <translation type="obsolete">Konnte Datei nicht öffnen:</translation> - </message> - <message> - <source>&Editor</source> - <translation type="obsolete">&Editor</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Diese Anwendung erlaubt es, auf einfache <br>Art Texte und Dateien zu ver- und entschlüsseln. <br>Sie steht unter der GPL v3.0<br><br><b>Entwickler:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Übersetzung:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>Falls sie Fragen und/oder Vorschläge haben,<br>kontaktieren sie uns unter<br>gpg4usb at cpunk.de</a><br><br>oder treffen Sie uns in unserem xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center> oder senden Sie eine Email an unsere Mailingliste unter <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>&Clipboard</source> - <translation type="obsolete">&Zwischenablage</translation> - </message> - <message> - <source>Import New Key From Clipboard</source> - <translation type="obsolete">Importiere neuen Schlüssel aus der Zwischenablage</translation> - </message> - <message> - <source>Import Key</source> - <translation type="obsolete">Schlüsselimport</translation> - </message> - <message> - <source>&Crypt</source> - <translation type="obsolete">&Crypt</translation> - </message> - <message> - <source>Crypt</source> - <translation type="obsolete">Crypt</translation> - </message> - <message> - <source>About </source> - <translation type="obsolete">Über</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru)<br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Diese Anwendung ermöglicht einfaches<br>Ver- und Entschlüsseln von Texten und Dateien.<br>Sie steht unter der GPL v2.0<br><br><b>Entwickler:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Übersetzung:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es)<br><br>Falls Sie irgendwelche Fragen und/oder <br>Vorschläge haben, kontaktieren Sie uns über<br>gpg4usb at cpunk.de</a><br><br>oder treffen sie uns einfach in unserem XMPP-Channel:<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>Key Files</source> - <translation type="obsolete">Schlüssel Dateien</translation> - </message> - <message> - <source>All Files</source> - <translation type="obsolete">Alle Dateien</translation> - </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">Impoertiere neuen Schlüssel aus...</translation> - </message> -</context> -<context> <name>ImportFromGnupgPage</name> <message> <location filename="../../wizard.cpp" line="288"/> @@ -966,10 +436,6 @@ Do you want to save your changes?</source> <source>Imported Configuration from old gpg4usb.<br>Will now restart to activate the configuration.</source> <translation>Einstellungen wurden erfolgreich aus anderen gpg4usb importiert.<br> Starte neu, um die Einstellungen zu aktivieren.</translation> </message> - <message> - <source>Imported Configuration from old gpg4usb.<br/>Will now restart to activate the configuration.</source> - <translation type="obsolete">Einstellungen wurden erfolgreich aus anderen gpg4usb importiert.<br> Starte neu, um die Einstellungen zu aktivieren.</translation> - </message> </context> <context> <name>IntroPage</name> @@ -1119,14 +585,6 @@ Make sure you keep it save.Do you really want to export your private key?</sourc <translation>Privaten Schlüssel exportieren</translation> </message> <message> - <source>You are about to export your private key. -This is NOT your public key, so don't give it away. -Make sure you keep it save.</source> - <translation type="obsolete">Sie sind dabei ihren privaten Schlüssel zu exportieren. -Das ist NICHT ihr öffentlicher Schlüssel, -also geben sie ihn nicht weiter.</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="199"/> <source>Export Key To File</source> <translation>Schlüssel In Datei exportieren</translation> @@ -1136,10 +594,6 @@ also geben sie ihn nicht weiter.</translation> <source>Key Files</source> <translation>Schlüssel Dateien</translation> </message> - <message> - <source>Key Files </source> - <translation type="obsolete">Schlüsseldateien</translation> - </message> </context> <context> <name>KeyGenDialog</name> @@ -1432,19 +886,11 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> <translation>Beende die Schlüsselverwaltung</translation> </message> <message> - <source>Import From &File</source> - <translation type="obsolete">&Import aus Datei</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="76"/> <source>Import New Key From File</source> <translation>Importiere einen neuen Schlüssel aus einer Datei</translation> </message> <message> - <source>Import From &Clipboard</source> - <translation type="obsolete">Import aus &Zwischenablage</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="81"/> <source>Import New Key From Clipboard</source> <translation>Importiere einen neuen Schlüssel aus der Zwischenablage</translation> @@ -1561,10 +1007,6 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> <translation>Sch&lüssel</translation> </message> <message> - <source>Crypt</source> - <translation type="obsolete">Crypt</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="167"/> <source>Open Key</source> <translation>Öffne Datei</translation> @@ -1601,81 +1043,10 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> <translation><br/>Diese Aktion kann nicht rückgängig gemacht werden.</translation> </message> <message> - <source>Are you sure that you want to delete the selected keys?. -The action can not be undone.</source> - <translation type="obsolete">Sind Sie sicher, das sie die ausgewählten Schlüssel löschen wollen? -Die Aktion kann nicht rückgängig gemacht werden.</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="252"/> <source>Export Key To File</source> <translation>Schlüssel exportieren</translation> </message> - <message> - <source>Name:</source> - <translation type="obsolete">Name:</translation> - </message> - <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">E-Mailadresse:</translation> - </message> - <message> - <source>Comment:</source> - <translation type="obsolete">Kommentar:</translation> - </message> - <message> - <source>KeySize (in Bit):</source> - <translation type="obsolete">Schlüsselgröße (in Bit):</translation> - </message> - <message> - <source>Expiration Date:</source> - <translation type="obsolete">Ablaufdatum:</translation> - </message> - <message> - <source>Password:</source> - <translation type="obsolete">Passwort:</translation> - </message> - <message> - <source>Repeat Password:</source> - <translation type="obsolete">Passwort wiederholen:</translation> - </message> - <message> - <source>Never Expire</source> - <translation type="obsolete">läuft nie ab</translation> - </message> - <message> - <source>Password: Strength -Weak -> Strong</source> - <translation type="obsolete">Passwortstärke -Schwach -> Stark</translation> - </message> - <message> - <source>Password Strength</source> - <translation type="obsolete">Passwortstärke</translation> - </message> - <message> - <source> Name must contain at least five characters. -</source> - <translation type="obsolete">Name muss mindestens 5 Buchstaben lang sein.</translation> - </message> - <message> - <source> Password and Repeat don't match. </source> - <translation type="obsolete">Passwort und Wiederholung stimmen nicht überein.</translation> - </message> - <message> - <source>Generating Key...</source> - <translation type="obsolete">Erzeuge Schlüssel...</translation> - </message> - <message> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="obsolete">Sammle Zufallsdaten für Schlüsselerzeugung. -Das kann etwas dauern. -Benutze den Computer um den Vorgang zu -Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> - </message> </context> <context> <name>KeyServerImportDialog</name> @@ -1730,52 +1101,52 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> <translation>Bemerkung</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="153"/> + <location filename="../../keyserverimportdialog.cpp" line="154"/> <source>Couldn't contact keyserver!</source> <translation>Konnte Schlüsselserver nicht erreichen!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="161"/> + <location filename="../../keyserverimportdialog.cpp" line="162"/> <source>Too many responses from keyserver!</source> <translation>Zu viele Antworten vom Schlüsselserver!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="167"/> + <location filename="../../keyserverimportdialog.cpp" line="168"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation>Keine Schlüssel gefunden, der Suchbegriff könnte eine Schlüssel-ID sein. Wiederhole suche mit vorangestellten 0x.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="171"/> + <location filename="../../keyserverimportdialog.cpp" line="172"/> <source>No keys found containing the search string!</source> <translation>Keinen Schlüssel gefunden, der den Suchbegriff enthält!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="174"/> + <location filename="../../keyserverimportdialog.cpp" line="175"/> <source>Insufficiently specific search string!</source> <translation>Suchbegriff zu ungenau definiert!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="201"/> + <location filename="../../keyserverimportdialog.cpp" line="203"/> <source>revoked</source> <translation>abgelaufen</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="204"/> + <location filename="../../keyserverimportdialog.cpp" line="206"/> <source>disabled</source> <translation>deaktiviert</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="243"/> + <location filename="../../keyserverimportdialog.cpp" line="245"/> <source>%1 keys found. Doubleclick a key to import it.</source> <translation>%1 Schlüssel gefunden. Importiere durch Doppelklick.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="288"/> + <location filename="../../keyserverimportdialog.cpp" line="291"/> <source>Error while contacting keyserver!</source> <translation>Fehler bei der Verbindung zum Schlüsselserver!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="292"/> + <location filename="../../keyserverimportdialog.cpp" line="295"/> <source>Key imported</source> <translation>Schlüssel importiert</translation> </message> @@ -1783,10 +1154,6 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> <context> <name>KeyserverTab</name> <message> - <source>Deafult Keyserver for import:</source> - <translation type="obsolete">Standard Schlüsselserver für den Import:</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="404"/> <source>Default Keyserver for import:</source> <translation>Standard-Server für den Schlüsselimport:</translation> @@ -2350,99 +1717,6 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> <translation>Einstellungen</translation> </message> <message> - <source>Iconsize</source> - <translation type="obsolete">Optionen</translation> - </message> - <message> - <source>small</source> - <translation type="obsolete">klein</translation> - </message> - <message> - <source>medium</source> - <translation type="obsolete">mittel</translation> - </message> - <message> - <source>large</source> - <translation type="obsolete">gross</translation> - </message> - <message> - <source>Iconstyle</source> - <translation type="obsolete">Iconstil</translation> - </message> - <message> - <source>just text</source> - <translation type="obsolete">Nur Text</translation> - </message> - <message> - <source>just icons</source> - <translation type="obsolete">Nur Icons</translation> - </message> - <message> - <source>text and icons</source> - <translation type="obsolete">Text und Icons</translation> - </message> - <message> - <source>Windowstate</source> - <translation type="obsolete">Fenstereinstellungen</translation> - </message> - <message> - <source>Save window size and position on exit.</source> - <translation type="obsolete">Speichere Fenstergröße und -position beim Beenden.</translation> - </message> - <message> - <source>Save checked private keys on exit and restore them on next start.</source> - <translation type="obsolete">Speichere ausgewählte private Schlüssel beim Beenden und stelle diese beim nächsten Start wieder her.</translation> - </message> - <message> - <source>MIME-parsing (Experimental)</source> - <translation type="obsolete">MIME-Parsing (Experimentell)</translation> - </message> - <message> - <source>Try to split attachments from PGP-MIME ecrypted messages.</source> - <translation type="obsolete">Versuche, die Anhänge von PGP-MIME verschlüsselten Nachrichten zu extrahieren.</translation> - </message> - <message> - <source>Try to recognize quoted printable.</source> - <translation type="obsolete">Versuche Quoted Printable Text zu erkennen.</translation> - </message> - <message> - <source>Enable open with external app, saves file in tmp folder.</source> - <translation type="obsolete">Aktiviere das Öffnen mit externen Anwendungen (dieses speichert die Datei im Temp Verzeichnis).</translation> - </message> - <message> - <source>Remember Password</source> - <translation type="obsolete">Behalte das Passwort</translation> - </message> - <message> - <source>Remember password till closing gpg4usb</source> - <translation type="obsolete">Behalte das Passwort bis gpg4usb geschlossen wird</translation> - </message> - <message> - <source>save window size and position on exit</source> - <translation type="obsolete">Speichere Fenstergröße und -position beim Beenden</translation> - </message> - <message> - <source>Save Checked Keys</source> - <translation type="obsolete">Schlüsselspeicherung</translation> - </message> - <message> - <source>Save checked private keys on exit and restore them on next start</source> - <translation type="obsolete">Speichere ausgewählte private Schlüssel beim Beenden und stelle diese beim nächsten Start wieder her.</translation> - </message> - <message> - <source>Language</source> - <translation type="obsolete">Sprache</translation> - </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">DIe Änderung der Sprache wird beim nächsten Progrmmstart übernommen.</translation> - </message> - <message> - <source>English</source> - <comment>Insert local name of language here. This is used for the language menu of the settingsdialog</comment> - <translation type="obsolete">Deutsch</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="34"/> <source>General</source> <translation>Allgemein</translation> @@ -2468,10 +1742,6 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> <translation>Erweitert</translation> </message> <message> - <source>English</source> - <translation type="obsolete">Deutsch</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="72"/> <source>System Default</source> <translation>Systemstandard</translation> @@ -2560,16 +1830,6 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> </source> <translation>Der Text wurde teilweise signiert am %1 von:</translation> </message> - <message> - <source>Text was completly signed on %1 by: -</source> - <translation type="obsolete">Der Text wurde vollständig signiert am %1 durch:</translation> - </message> - <message> - <source>Text was partially signed on %1 by: -</source> - <translation type="obsolete">Der Text wurde teilweise signiert am %1 durch:</translation> - </message> </context> <context> <name>VerifyKeyDetailBox</name> @@ -2662,22 +1922,10 @@ Beschleunugen(z.B. Internet-surfen, Musik hören, ...)</translation> <translation>Der Text wurde teilweise signiert von:</translation> </message> <message> - <source>Key not present with Fingerprint: </source> - <translation type="obsolete">Schlüssel nicht vorhanden mit Fingerabdruck:</translation> - </message> - <message> <location filename="../../verifynotification.cpp" line="147"/> <source>Error for key with fingerprint </source> <translation>Fehler den den Schlüssel mit Fingerabdruck </translation> </message> - <message> - <source>Text is completly signed by: </source> - <translation type="obsolete">Text ist vollständig signiert durch: </translation> - </message> - <message> - <source>Text is partially signed by: </source> - <translation type="obsolete">Text ist teilweise signiert durch: </translation> - </message> </context> <context> <name>Wizard</name> diff --git a/release/ts/gpg4usb_en.ts b/release/ts/gpg4usb_en.ts index c56be76..fa16e5b 100644 --- a/release/ts/gpg4usb_en.ts +++ b/release/ts/gpg4usb_en.ts @@ -1096,52 +1096,52 @@ Weak -> Strong</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="153"/> + <location filename="../../keyserverimportdialog.cpp" line="154"/> <source>Couldn't contact keyserver!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="161"/> + <location filename="../../keyserverimportdialog.cpp" line="162"/> <source>Too many responses from keyserver!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="167"/> + <location filename="../../keyserverimportdialog.cpp" line="168"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="171"/> + <location filename="../../keyserverimportdialog.cpp" line="172"/> <source>No keys found containing the search string!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="174"/> + <location filename="../../keyserverimportdialog.cpp" line="175"/> <source>Insufficiently specific search string!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="201"/> + <location filename="../../keyserverimportdialog.cpp" line="203"/> <source>revoked</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="204"/> + <location filename="../../keyserverimportdialog.cpp" line="206"/> <source>disabled</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="243"/> + <location filename="../../keyserverimportdialog.cpp" line="245"/> <source>%1 keys found. Doubleclick a key to import it.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="288"/> + <location filename="../../keyserverimportdialog.cpp" line="291"/> <source>Error while contacting keyserver!</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="292"/> + <location filename="../../keyserverimportdialog.cpp" line="295"/> <source>Key imported</source> <translation type="unfinished"></translation> </message> @@ -1707,11 +1707,6 @@ Weak -> Strong</source> <context> <name>SettingsDialog</name> <message> - <source>English</source> - <comment>Insert local name of language here. This is used for the language menu of the settingsdialog</comment> - <translation type="obsolete">English</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="34"/> <source>General</source> <translation type="unfinished"></translation> @@ -1746,10 +1741,6 @@ Weak -> Strong</source> <source>System Default</source> <translation type="unfinished"></translation> </message> - <message> - <source>English</source> - <translation type="obsolete">English</translation> - </message> </context> <context> <name>TextEdit</name> diff --git a/release/ts/gpg4usb_es.ts b/release/ts/gpg4usb_es.ts index 044003c..b580e2b 100644 --- a/release/ts/gpg4usb_es.ts +++ b/release/ts/gpg4usb_es.ts @@ -2,1112 +2,6 @@ <!DOCTYPE TS> <TS version="2.0" language="es" sourcelanguage="en"> <context> - <name></name> - <message> - <source>Iconsize</source> - <translation type="obsolete">Tamaño Icono</translation> - </message> - <message> - <source>small</source> - <translation type="obsolete">pequeño</translation> - </message> - <message> - <source>medium</source> - <translation type="obsolete">mediano</translation> - </message> - <message> - <source>large</source> - <translation type="obsolete">grande</translation> - </message> - <message> - <source>Iconstyle</source> - <translation type="obsolete">Estilo Icono</translation> - </message> - <message> - <source>just text</source> - <translation type="obsolete">solo texto</translation> - </message> - <message> - <source>just icons</source> - <translation type="obsolete">solo iconos</translation> - </message> - <message> - <source>text and icons</source> - <translation type="obsolete">texto e iconos</translation> - </message> - <message> - <source>Windowstate</source> - <translation type="obsolete">Ventana de Estado</translation> - </message> - <message> - <source>Save window size and position on exit.</source> - <translation type="obsolete">Guardar tamaño y posicion ventana al salir.</translation> - </message> - <message> - <source>Filename</source> - <translation type="obsolete">Nombre de archivo</translation> - </message> - <message> - <source>Contenttype</source> - <translation type="obsolete">Tipo de contenido</translation> - </message> - <message> - <source>couldn't open file: </source> - <translation type="obsolete">no se pudo abrir el archivo:</translation> - </message> - <message> - <source>Save File</source> - <translation type="obsolete">Guardar Archivo</translation> - </message> - <message> - <source>Save this file</source> - <translation type="obsolete">Guardar este archivo</translation> - </message> - <message> - <source>Open File</source> - <translation type="obsolete">Abrir Archivo</translation> - </message> - <message> - <source>Open this file</source> - <translation type="obsolete">Abrir este archivo</translation> - </message> - <message> - <source>File</source> - <translation type="obsolete">Archivo</translation> - </message> - <message> - <source>Cannot write file %1: -%2.</source> - <translation type="obsolete">No puedo escribir archivo %1: -%2.</translation> - </message> - <message> - <source>Encrypt / Decrypt File</source> - <translation type="obsolete">Cifrar / Descifrar Archivo</translation> - </message> - <message> - <source>Action</source> - <translation type="obsolete">Accion</translation> - </message> - <message> - <source>Input</source> - <translation type="obsolete">Entrada</translation> - </message> - <message> - <source>...</source> - <translation type="obsolete">...</translation> - </message> - <message> - <source>Output</source> - <translation type="obsolete">Salida</translation> - </message> - <message> - <source>&Encrypt</source> - <translation type="obsolete">&Cifrar</translation> - </message> - <message> - <source>&Decrypt</source> - <translation type="obsolete">&Descifrar</translation> - </message> - <message> - <source>File exists! Do you want to overwrite it?</source> - <translation type="obsolete">El archivo existe! ¿Quiere sobreescribirlo?</translation> - </message> - <message> - <source>Remember Password</source> - <translation type="obsolete">Recordar Contraseña</translation> - </message> - <message> - <source>Remember password until closing gpg4usb</source> - <translation type="obsolete">Recordar contraseña hasta cerrar gpg4usb</translation> - </message> - <message> - <source>Save Checked Keys</source> - <translation type="obsolete">Guardar Llaves Verificadas</translation> - </message> - <message> - <source>Save checked private keys on exit and restore them on next start.</source> - <translation type="obsolete">Guardar llaves privadas verificadas al salir y restaurarlas en proximo arranque.</translation> - </message> - <message> - <source>Confirm drag'n'drop key import</source> - <translation type="obsolete">Confirmar importar llave arrastrar y soltar</translation> - </message> - <message> - <source>Import files dropped on the keylist without confirmation.</source> - <translation type="obsolete">Importar archivos soltados en la lista de llaves sin confirmacion.</translation> - </message> - <message> - <source>Language</source> - <translation type="obsolete">Idioma</translation> - </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">Cambio idioma se aplicara despues de reiniciar el programa.</translation> - </message> - <message> - <source>System Default</source> - <translation type="obsolete">Por Defecto</translation> - </message> - <message> - <source>No Key Selected</source> - <translation type="obsolete">Ninguna llave seleccionada</translation> - </message> - <message> - <source>Unsupported algorithm</source> - <translation type="obsolete">Algoritmo incompatible</translation> - </message> - <message> - <source>Error decrypting:</source> - <translation type="obsolete">Error al descifrar:</translation> - </message> - <message> - <source>Wrong password</source> - <translation type="obsolete">Contraseña incorrecta</translation> - </message> - <message> - <source>Enter Password</source> - <translation type="obsolete">Ingresar Contraseña</translation> - </message> - <message> - <source>Key Selection</source> - <translation type="obsolete">Seleccionar Llave</translation> - </message> - <message> - <source>No Private Key Selected</source> - <translation type="obsolete">No se Selecciono Llave Privada</translation> - </message> - <message> - <source>Error signing:</source> - <translation type="obsolete">Error al firmar:</translation> - </message> - <message> - <source>&Open...</source> - <translation type="obsolete">&Abrir...</translation> - </message> - <message> - <source>Ctrl+O</source> - <translation type="obsolete">Crtl+O</translation> - </message> - <message> - <source>Open an existing file</source> - <translation type="obsolete">Abrir archivo existente</translation> - </message> - <message> - <source>&Save</source> - <translation type="obsolete">&Guardar</translation> - </message> - <message> - <source>Ctrl+S</source> - <translation type="obsolete">Crtl+S</translation> - </message> - <message> - <source>Save the current File</source> - <translation type="obsolete">Guardar archivo actual</translation> - </message> - <message> - <source>Save &As</source> - <translation type="obsolete">Guardar &Como</translation> - </message> - <message> - <source>Save the current File as...</source> - <translation type="obsolete">Guardar Archivo actual como...</translation> - </message> - <message> - <source>&Print</source> - <translation type="obsolete">&Imprimir</translation> - </message> - <message> - <source>Ctrl+P</source> - <translation type="obsolete">Crtl+P</translation> - </message> - <message> - <source>Print Document</source> - <translation type="obsolete">Imprimir Documento</translation> - </message> - <message> - <source>&Quit</source> - <translation type="obsolete">&Salir</translation> - </message> - <message> - <source>Ctrl+Q</source> - <translation type="obsolete">Crtl+Q</translation> - </message> - <message> - <source>Quit Program</source> - <translation type="obsolete">Salir del Programa</translation> - </message> - <message> - <source>&Undo</source> - <translation type="obsolete">&Deshacer</translation> - </message> - <message> - <source>Undo Last Edit Action</source> - <translation type="obsolete">Deshacer Ultima Accion Editar</translation> - </message> - <message> - <source>&Redo</source> - <translation type="obsolete">&Rehacer</translation> - </message> - <message> - <source>Redo Last Edit Action</source> - <translation type="obsolete">Rehacer ultima accion editar</translation> - </message> - <message> - <source>&Paste</source> - <translation type="obsolete">&Pegar</translation> - </message> - <message> - <source>Ctrl+V</source> - <translation type="obsolete">Crtl+V</translation> - </message> - <message> - <source>Paste Text From Clipboard</source> - <translation type="obsolete">Pegar Texto desde Portapapeles</translation> - </message> - <message> - <source>Cu&t</source> - <translation type="obsolete">Corta&r</translation> - </message> - <message> - <source>Ctrl+X</source> - <translation type="obsolete">Crtl+X</translation> - </message> - <message> - <source>Cut the current selection's contents to the clipboard</source> - <translation type="obsolete">Cortar contenido de la seleccion actual al portapapeles</translation> - </message> - <message> - <source>&Copy</source> - <translation type="obsolete">&Copiar</translation> - </message> - <message> - <source>Ctrl+C</source> - <translation type="obsolete">Crtl+C</translation> - </message> - <message> - <source>Copy the current selection's contents to the clipboard</source> - <translation type="obsolete">Copiar contenido de la seleccion actual al portapapeles</translation> - </message> - <message> - <source>Select &All</source> - <translation type="obsolete">Seleccionar &Todo</translation> - </message> - <message> - <source>Ctrl+A</source> - <translation type="obsolete">Crtl+A</translation> - </message> - <message> - <source>Select the whole text</source> - <translation type="obsolete">Seleccionar todo el texto</translation> - </message> - <message> - <source>Se&ttings</source> - <translation type="obsolete">Con&figuracion</translation> - </message> - <message> - <source>Open settings dialog</source> - <translation type="obsolete">Abrir dialogo configuracion</translation> - </message> - <message> - <source>Ctrl+E</source> - <translation type="obsolete">Crtl+E</translation> - </message> - <message> - <source>Encrypt Message</source> - <translation type="obsolete">Cifrar Mensaje</translation> - </message> - <message> - <source>Ctrl+D</source> - <translation type="obsolete">Crtl+D</translation> - </message> - <message> - <source>Decrypt Message</source> - <translation type="obsolete">Descifrar Mensaje</translation> - </message> - <message> - <source>&File Encryption</source> - <translation type="obsolete">&Cifrado Archivo</translation> - </message> - <message> - <source>Encrypt/Decrypt File</source> - <translation type="obsolete">Cifrar / Descifrar Archivo</translation> - </message> - <message> - <source>&Sign</source> - <translation type="obsolete">&Firmar</translation> - </message> - <message> - <source>Sign Message</source> - <translation type="obsolete">Firmar Mensaje</translation> - </message> - <message> - <source>&Verify</source> - <translation type="obsolete">&Verificar</translation> - </message> - <message> - <source>Verify Message</source> - <translation type="obsolete">Verificar Mensaje</translation> - </message> - <message> - <source>&File</source> - <translation type="obsolete">&Archivo</translation> - </message> - <message> - <source>Import New Key From File</source> - <translation type="obsolete">Importar Nueva Llave Desde Archivo</translation> - </message> - <message> - <source>&Editor</source> - <translation type="obsolete">&Editor</translation> - </message> - <message> - <source>Import New Key From Editor</source> - <translation type="obsolete">Importar Nueva Llave Desde Editor</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translatorcomment>Try to determine if you use not complicated encryption (simple) or you use one taht is easy to use (facil)</translatorcomment> - <translation type="obsolete"><center>Este programa le permite hacer un facil<br/>cifrado/descifrado de sus mensajes de texto o archivos<br>Esta licenciado bajo el GPL v2.0<br><br><b>Programadores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Traduccion:</b><br>Alessandro (pt_br), Kirill (ru), Viriato13 (es), Serse (it) <br><br>Si usted tiene alguna pregunta y/o sugerencias, entre<br/>en nuestra <a href="http://gpg4usb.cpunk.de/contact.php">pagina de contacto</a> o envie un email a nuestra<br/> lista decorreo en <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>&Clipboard</source> - <translation type="obsolete">&Portapapeles</translation> - </message> - <message> - <source>Import New Key From Clipboard</source> - <translation type="obsolete">Importar Nueva Llave Desde Portapapeles</translation> - </message> - <message> - <source>Key Management</source> - <translation type="obsolete">Administrador de Llaves</translation> - </message> - <message> - <source>Open Keymanagement</source> - <translation type="obsolete">Abrir Administrador de Llaves</translation> - </message> - <message> - <source>Import Key</source> - <translation type="obsolete">Importar Llave</translation> - </message> - <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">Abrir Dialogo Importar Nueva Llave</translation> - </message> - <message> - <source>&About</source> - <translation type="obsolete">&Acerca de</translation> - </message> - <message> - <source>Show the application's About box</source> - <translation type="obsolete">Mostrar recuadro Acerca de del programa</translation> - </message> - <message> - <source>Online &Tutorial</source> - <translation type="obsolete">Tutorial &En linea</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">Abrir Tutorial En linea</translation> - </message> - <message> - <source>Translate gpg4usb</source> - <translation type="obsolete">Traducir gpg4usb</translation> - </message> - <message> - <source>Translate gpg4usb yourself</source> - <translation type="obsolete">Traduzca usted mismo gpg4usb</translation> - </message> - <message> - <source>Append Selected Key(s) To Text</source> - <translation type="obsolete">Adjuntar Llave(s) Seleccionada(s) Al Texto</translation> - </message> - <message> - <source>Append The Selected Keys To Text in Editor</source> - <translation type="obsolete">Adjuntar Llaves Seleccionadas Al Texto en Editor</translation> - </message> - <message> - <source>Copy EMail-address</source> - <translation type="obsolete">Copiar direcciones de Correo Electronico</translation> - </message> - <message> - <source>Copy selected EMailaddress to clipboard</source> - <translation type="obsolete">Copiar direcciones de Correo Electronico seleccionadas a portapapeles</translation> - </message> - <message> - <source>Show Keydetails</source> - <translation type="obsolete">Mostrar Detalles de Llave</translation> - </message> - <message> - <source>Show Details for this Key</source> - <translation type="obsolete">Mostrar Detalles para esta Llave</translation> - </message> - <message> - <source>&Edit</source> - <translation type="obsolete">&Editar</translation> - </message> - <message> - <source>&Crypt</source> - <translation type="obsolete">&Cifrar</translation> - </message> - <message> - <source>&Keys</source> - <translation type="obsolete">&Llaves</translation> - </message> - <message> - <source>&Import Key From...</source> - <translation type="obsolete">&Importar Llave Desde...</translation> - </message> - <message> - <source>&View</source> - <translation type="obsolete">&Ver</translation> - </message> - <message> - <source>&Help</source> - <translation type="obsolete">&Ayuda</translation> - </message> - <message> - <source>Crypt</source> - <translation type="obsolete">Cifrar</translation> - </message> - <message> - <source>Key</source> - <translation type="obsolete">Llave</translation> - </message> - <message> - <source>Edit</source> - <translation type="obsolete">Editar</translation> - </message> - <message> - <source>Ready</source> - <translation type="obsolete">Listo</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Este programa le permite hacer un facil<br/>cifrado/descifrado de sus mensajes de texto o archivos<br>Esta licenciado bajo el GPL v2.0<br><br><b>Programadores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Traduccion:</b><br>Alessandro (pt_br), Kirill (ru), Viriato13 (es), Serse (it) <br><br>Si usted tiene alguna pregunta y/o sugerencias, entre<br/>en nuestra <a href="http://gpg4usb.cpunk.de/contact.php">pagina de contacto</a> o envie un email a nuestra<br/> lista decorreo en <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">&Servidor de llaves</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Este programa le permite hacer un facil<br>cifrado/descifrado de sus mensajes de texto o archivos<br>Esta licenciado bajo el GPL v2.0<br><br><b>Programadores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Traduccion:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato13 (es), Serse (it) <br><br>Si usted tiene alguna pregunta y/o<br>sugerencias, contactenos en<br>gpg4usb en cpunk.de</a><br><br>o puede encontrarnos en nuestro xmpp-channel:<br>gpg4usb en conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>There is one unencrypted file in attachment folder</source> - <translation type="obsolete">Hay un archivo sin cifrar en carpeta adjuntos</translation> - </message> - <message> - <source>There are </source> - <translation type="obsolete">Hay</translation> - </message> - <message> - <source> unencrypted files in attachment folder</source> - <translation type="obsolete">archivos sin cifrar en carpeta adjuntos</translation> - </message> - <message> - <source>Encrypt for:</source> - <translation type="obsolete">Cifrar para:</translation> - </message> - <message> - <source>&New</source> - <translation type="obsolete">&Nuevo</translation> - </message> - <message> - <source>Open a new file</source> - <translation type="obsolete">Abrir nuevo archivo</translation> - </message> - <message> - <source>&Close</source> - <translation type="obsolete">&Cerrar</translation> - </message> - <message> - <source>Close file</source> - <translation type="obsolete">Cerrar archivo</translation> - </message> - <message> - <source>&Quote</source> - <translation type="obsolete">&Poner comillas</translation> - </message> - <message> - <source>Quote whole text</source> - <translation type="obsolete">Poner comillas a todo el texto</translation> - </message> - <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">Quitar doble &Fin de linea</translation> - </message> - <message> - <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation type="obsolete">Quitar dobel fin de linea, p.ej. en texto pegado desde webmailer</translation> - </message> - <message> - <source>Attached files:</source> - <translation type="obsolete">Archivos Adjuntos:</translation> - </message> - <message> - <source>Application</source> - <translation type="obsolete">Programa</translation> - </message> - <message> - <source>Cannot read file %1: -%2.</source> - <translation type="obsolete">No puedo leer archivo %1: -%2.</translation> - </message> - <message> - <source>File loaded</source> - <translation type="obsolete">Archivo cargado</translation> - </message> - <message> - <source>%1[*] - %2</source> - <translation type="obsolete">%1[*] - %2</translation> - </message> - <message> - <source>The document has been modified. -Do you want to save your changes?</source> - <translation type="obsolete">El documento ha sido modificado. -¿Quiere usted guardar los cambios?</translation> - </message> - <message> - <source>Saved '%1'</source> - <translation type="obsolete">Guardado '%1'</translation> - </message> - <message> - <source>About </source> - <translation type="obsolete">Acerca de'</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es)<br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Este Programa le permite hacer un facil<br>cifrado/descifrado de sus mensajes de texto o archivos.<br>Esta licenciado bajo el GPL v2.0<br><br><b>Programadores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Traduccion:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato13 (es)<br><br>Si usted tiene alguna pregunta y/ o <br>sugerencia, contacte con nosotros en<br>gpg4usb en cpunk.de</a><br><br>o puede encontrarnos en nuestro xmpp-channel:<br>gpg4usb en conference.jabber.ccc.de</center></translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru)<br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Este Programa le permite hacer un facil<br>cifrado/descifrado de sus mensajes de texto o archivos.<br>Esta licenciado bajo el GPL v2.0<br><br><b>Programadores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Traduccion:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato13 (es)<br><br>Si usted tiene alguna pregunta y/ o <br>sugerencia, contacte con nosotros en<br>gpg4usb en cpunk.de</a><br><br>o puede encontrarnos en nuestro xmpp-channel:<br>gpg4usb en conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>Open Key</source> - <translation type="obsolete">Abrir Llave</translation> - </message> - <message> - <source>Key Files</source> - <translation type="obsolete">Archivos de Llaves</translation> - </message> - <message> - <source>All Files</source> - <translation type="obsolete">Todos los Archivos</translation> - </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">Importar Llave Desde...</translation> - </message> - <message> - <source>Owner details</source> - <translation type="obsolete">Detalles del Propietario</translation> - </message> - <message> - <source>Key details</source> - <translation type="obsolete">Detalles de la Llave</translation> - </message> - <message> - <source>Fingerprint</source> - <translation type="obsolete">Huella Digital</translation> - </message> - <message> - <source>Name:</source> - <translation type="obsolete">Nombre:</translation> - </message> - <message> - <source>E-Mailaddress:</source> - <translation type="obsolete">Direccion de Correo Electronico:</translation> - </message> - <message> - <source>Comment:</source> - <translation type="obsolete">Comentario:</translation> - </message> - <message> - <source>Key size:</source> - <translation type="obsolete">Tamaño de Llave:</translation> - </message> - <message> - <source>Expires on: </source> - <translation type="obsolete">Expira en:</translation> - </message> - <message> - <source>Created on: </source> - <translation type="obsolete">Creado en:</translation> - </message> - <message> - <source>Algorithm: </source> - <translation type="obsolete">Algoritmo:</translation> - </message> - <message> - <source>Key ID: </source> - <translation type="obsolete">ID de Llave:</translation> - </message> - <message> - <source>Never</source> - <translation type="obsolete">Nunca</translation> - </message> - <message> - <source> / Never</source> - <translation type="obsolete"> / Nunca</translation> - </message> - <message> - <source>Private Key</source> - <translation type="obsolete">Llave Privada</translation> - </message> - <message> - <source>Export Private Key</source> - <translation type="obsolete">Exportar llave Privada</translation> - </message> - <message> - <source>Warning: Key expired</source> - <translation type="obsolete">Advertencia: Llave expirada</translation> - </message> - <message> - <source>Keydetails</source> - <translation type="obsolete">Detalles de Llave</translation> - </message> - <message> - <source>Exporting private Key</source> - <translation type="obsolete">Exportando Llave privada</translation> - </message> - <message> - <source>You are about to export your private key. -This is NOT your public key, so don't give it away. -Make sure you keep it save.</source> - <translation type="obsolete">Esta a punto de exportar su llave privada. -Esta NO es su llave publica, asi que no la revele. -Guardela de forma segura.</translation> - </message> - <message> - <source>Export Key To File</source> - <translation type="obsolete">Exportar Llave a Archivo</translation> - </message> - <message> - <source>Key Files </source> - <translation type="obsolete">Archivos Llaves</translation> - </message> - <message> - <source>Name</source> - <translation type="obsolete">Nombre</translation> - </message> - <message> - <source>EMail</source> - <translation type="obsolete">Correo Electrónico</translation> - </message> - <message> - <source>Import Keys</source> - <translation type="obsolete">Importar Llaves</translation> - </message> - <message> - <source>You've dropped something on the keylist. - gpg4usb will now try to import key(s).</source> - <translation type="obsolete">Usted ha soltado algo en la lista de llaves -gpg4usb intentara ahora importar la(s) llave(s).</translation> - </message> - <message> - <source>Always import without bothering.</source> - <translation type="obsolete">Siempre importar sin molestias.</translation> - </message> - <message> - <source>Couldn't Open File: </source> - <translation type="obsolete">No se pudo Abrir el Archivo: </translation> - </message> - <message> - <source>Keymanagement</source> - <translation type="obsolete">Administrador der Llaves</translation> - </message> - <message> - <source>&Close Key Management</source> - <translation type="obsolete">&Cerrar Administrador de Llaves</translation> - </message> - <message> - <source>Close Key Management</source> - <translation type="obsolete">Cerrar Administrador de Llaves</translation> - </message> - <message> - <source>Import From &File</source> - <translation type="obsolete">Importar Desde &Archivo</translation> - </message> - <message> - <source>Import From &Clipboard</source> - <translation type="obsolete">Importar Desde &Portapapeles</translation> - </message> - <message> - <source>Import New Key From Keyserver</source> - <translation type="obsolete">Importar Nueva Llave desde Servidor de Llaves</translation> - </message> - <message> - <source>Export To &Clipboard</source> - <translation type="obsolete">Exportar A &Portapapeles</translation> - </message> - <message> - <source>Export Selected Key(s) To Clipboard</source> - <translation type="obsolete">Exportar Llave(s) Seleccionada(s) A Portapapeles</translation> - </message> - <message> - <source>Export To &File</source> - <translation type="obsolete">Exportar A &Archivo</translation> - </message> - <message> - <source>Export Selected Key(s) To File</source> - <translation type="obsolete">Exportar Llave(s) Seleccionada(s) A Archivo</translation> - </message> - <message> - <source>Delete Selected Key(s)</source> - <translation type="obsolete">Borrar Llave(s) Seleccionada(s)</translation> - </message> - <message> - <source>Delete the Selected keys</source> - <translation type="obsolete">Borrar las Llaves Seleccionadas</translation> - </message> - <message> - <source>Delete Checked Key(s)</source> - <translation type="obsolete">Borrar Llave(s) Verificadas</translation> - </message> - <message> - <source>Delete the Checked keys</source> - <translation type="obsolete">Borrar las Llaves Verificadas</translation> - </message> - <message> - <source>Generate Key</source> - <translation type="obsolete">Crear Llave</translation> - </message> - <message> - <source>Generate New Key</source> - <translation type="obsolete">Crear Nueva Llave</translation> - </message> - <message> - <source>&Key</source> - <translation type="obsolete">&Llave</translation> - </message> - <message> - <source>Deleting Keys</source> - <translation type="obsolete">Borrando Llaves</translation> - </message> - <message> - <source><b>Are you sure that you want to delete the following keys?.</b><br/><br/></source> - <translation type="obsolete">¿Esta usted seguro de querer borrar las siguientes llaves?.</b><br/><br/></translation> - </message> - <message> - <source><br/>The action can not be undone.</source> - <translation type="obsolete"><br/> La accion no puede deshacerse.</translation> - </message> - <message> - <source>Are you sure that you want to delete the selected keys?. -The action can not be undone.</source> - <translation type="obsolete">¿Esta seguro de querer borrar las llaves seleccionadas?. -Esta accion no se puede deshacer.</translation> - </message> - <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">Direccion de Correo Electronico:</translation> - </message> - <message> - <source>KeySize (in Bit):</source> - <translation type="obsolete">Tamaño Llave (en Bit):</translation> - </message> - <message> - <source>Expiration Date:</source> - <translation type="obsolete">Fecha Expiracion:</translation> - </message> - <message> - <source>Password:</source> - <translation type="obsolete">Contraseña:</translation> - </message> - <message> - <source>Repeat Password:</source> - <translation type="obsolete">Repetir Contraseña:</translation> - </message> - <message> - <source>Never Expire</source> - <translation type="obsolete">Nunca Expira</translation> - </message> - <message> - <source>Password: Strength -Weak -> Strong</source> - <translation type="obsolete">Contraseña: Fortaleza -Debil -> Fuerte</translation> - </message> - <message> - <source>Password Strength</source> - <translation type="obsolete">Fortaleza de la Contraseña</translation> - </message> - <message> - <source> Name must contain at least five characters. -</source> - <translation type="obsolete">El nombre debe contener al menos cinco caracteres. -</translation> - </message> - <message> - <source> Password and Repeat don't match. </source> - <translation type="obsolete"> Contraseña y Repetir no coinciden. </translation> - </message> - <message> - <source>Generating Key...</source> - <translation type="obsolete">Creando Llave...</translation> - </message> - <message> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="obsolete">Recogiendo datos aleatorios para crear llave. -Puede tardar un rato. -Para acelerar el proceso use su computadora -(ejemplo, navegar por la Red, oir musica,...)</translation> - </message> - <message> - <source>&Import</source> - <translation type="obsolete">&Importar</translation> - </message> - <message> - <source>&Search</source> - <translation type="obsolete">&Buscar</translation> - </message> - <message> - <source>Search string:</source> - <translation type="obsolete">Buscar cadena de caracteres:</translation> - </message> - <message> - <source>Keyserver:</source> - <translation type="obsolete">Servidor de llaves:</translation> - </message> - <message> - <source>Import Keys from Keyserver</source> - <translation type="obsolete">Importar Llaves desde el Servidor de Llaves</translation> - </message> - <message> - <source>UID</source> - <translation type="obsolete">Tu ID</translation> - </message> - <message> - <source>Creation date</source> - <translation type="obsolete">Fecha de creacion</translation> - </message> - <message> - <source>KeyID</source> - <translation type="obsolete">ID de Llave</translation> - </message> - <message> - <source>Couldn't contact keyserver!</source> - <translation type="obsolete">¡No se puede contactar la servidor de llaves!</translation> - </message> - <message> - <source>Too many responses from keyserver!</source> - <translation type="obsolete">¡Demasiadas respuestas desde el servidor de llaves!</translation> - </message> - <message> - <source>No keys found, input may be kexId, retrying search with 0x.</source> - <translation type="obsolete">No se encontraron llaves, el ingreso puede estar kexId, intentar buscar con 0x.</translation> - </message> - <message> - <source>No keys found containing the search string!</source> - <translation type="obsolete">¿No existen llaves con esa cadena de caracteres!</translation> - </message> - <message> - <source>Insufficiently specific search string!</source> - <translation type="obsolete">¡Cadena de caracteres insuficiente para busqueda!</translation> - </message> - <message> - <source>%1 keys found. Doubleclick a key to import it.</source> - <translation type="obsolete">%1 llaves encontradas. Pulse dos veces una llave para importarla.</translation> - </message> - <message> - <source>Error while contacting keyserver!</source> - <translation type="obsolete">¡Error mientras contactaba al servidor de llaves!</translation> - </message> - <message> - <source>Key imported</source> - <translation type="obsolete">Llave importada</translation> - </message> - <message> - <source>Default Keyserver for import:</source> - <translation type="obsolete">Servidor de llaves por defecto para importar:</translation> - </message> - <message> - <source>Decode quoted printable</source> - <translation type="obsolete">Descifrar quoted printable</translation> - </message> - <message> - <source>Try to recognize quoted printable.</source> - <translation type="obsolete">Intentar reconocer quoted printable.</translation> - </message> - <message> - <source>Parse PGP/MIME (Experimental)</source> - <translation type="obsolete">Analizar PGP/MIME (Experimental)</translation> - </message> - <message> - <source>Try to split attachments from PGP-MIME ecrypted messages.</source> - <translation type="obsolete">Intenta separar los archivos adjuntos de los mensajes cifrados PGP-MIME.</translation> - </message> - <message> - <source>Open with external application (Experimental)</source> - <translation type="obsolete">Abrir con programa externo (Experimental)</translation> - </message> - <message> - <source>Open attachments with default application for the filetype.<br> There are at least two possible problems with this behaviour:<ol><li>File needs to be saved unencrypted to attachments folder.<br> Its your job to clean this folder.</li><li>The external application may have its own temp files.</li></ol></source> - <translation type="obsolete">Abrir adjuntos con programa por defecto para el tipo de archivo <br>Hay al menos dos posibles problemas con esta opcion:<ol><li>Se necesita guardar el archivo sin cifrar en la carpeta adjuntos <br>Es tarea suya limpiar esta carpeta </li><li>El programa externo puede tener sus propios archivos temporales </li></ol></translation> - </message> - <message> - <source>Enable opening with external applications.</source> - <translation type="obsolete">Permitir abrir con programas externos.</translation> - </message> - <message> - <source>Unsaved files</source> - <translation type="obsolete">Archivos No guardados</translation> - </message> - <message> - <source><h3>%1 files contain unsaved information.<br/>Save the changes before closing?</h3></source> - <translation type="obsolete"><h3>%1 archivos contienen informacion sin guardar.<br/>¿Guardar los cambios antes de cerrar?</h3></translation> - </message> - <message> - <source>Check the files you want to save:</source> - <translation type="obsolete">Verificar los archivos que usted quiere guardar:</translation> - </message> - <message> - <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> - <translation type="obsolete"><b>Nota:</b>Si usted no guarda estos archivos, se perderan todos los cambios.<br/></translation> - </message> - <message> - <source>Settings</source> - <translation type="obsolete">Configuracion</translation> - </message> - <message> - <source>save window size and position on exit</source> - <translation type="obsolete">guardar tamaño y posicion de ventana al salir</translation> - </message> - <message> - <source>MIME-parsing (Experimental)</source> - <translation type="obsolete">MIME-analisis (Experimental)</translation> - </message> - <message> - <source>General</source> - <translation type="obsolete">General</translation> - </message> - <message> - <source>Appearance</source> - <translation type="obsolete">Aspecto</translation> - </message> - <message> - <source>PGP/Mime</source> - <translation type="obsolete">PGP/Mime</translation> - </message> - <message> - <source>Keyserver</source> - <translation type="obsolete">Servidor de llaves</translation> - </message> - <message> - <source>Tab Dialog</source> - <translation type="obsolete">Pestaña Dialogo</translation> - </message> - <message> - <source>English</source> - <translation type="obsolete">Español</translation> - </message> - <message> - <source>untitled</source> - <translation type="obsolete">sin nombre</translation> - </message> - <message> - <source>Open file</source> - <translation type="obsolete">Abrir archivo</translation> - </message> - <message> - <source>Save file </source> - <translation type="obsolete">Guardar archivo </translation> - </message> - <message> - <source>Unsaved document</source> - <translation type="obsolete">Documento sin guardar</translation> - </message> - <message> - <source><h3>The document "%1" has been modified.<br/>Do you want to save your changes?</h3></source> - <translation type="obsolete"><h3>El documento "%1" ha sido modificado.<br/>¿Quiere guardar sus cambios? </h3></translation> - </message> - <message> - <source>Signaturedetails</source> - <translation type="obsolete">Detalles de firma</translation> - </message> - <message> - <source>Error Validating signature</source> - <translation type="obsolete">Error al Validar firma</translation> - </message> - <message> - <source>Text was completely signed on - %1 by: -</source> - <translation type="obsolete">El texto se registro completamente - %1 por:</translation> - </message> - <message> - <source>Text was partially signed on - %1 by: -</source> - <translation type="obsolete">El texto se registro parcialmente - %1 por:</translation> - </message> - <message> - <source>Import from keyserver</source> - <translation type="obsolete">Importar desde servidor de llaves</translation> - </message> - <message> - <source>Status:</source> - <translation type="obsolete">Estado:</translation> - </message> - <message> - <source>Fingerprint:</source> - <translation type="obsolete">Huella Digital:</translation> - </message> - <message> - <source>Key not present in keylist</source> - <translation type="obsolete">Llave ausente en la lista de llaves</translation> - </message> - <message> - <source>Key not present with id 0x</source> - <translation type="obsolete">Llave ausente con id 0x</translation> - </message> - <message> - <source>EMail:</source> - <translation type="obsolete">Correo electronico:</translation> - </message> - <message> - <source>OK</source> - <translation type="obsolete">OK</translation> - </message> - <message> - <source>Error for key with id 0x</source> - <translation type="obsolete">Error para llave con id 0x</translation> - </message> - <message> - <source>Import missing key from Keyserver</source> - <translation type="obsolete">Importar llave faltante desde Servidor de llaves</translation> - </message> - <message> - <source>Show detailed verify information</source> - <translation type="obsolete">Mostrar informacion de verificacion detallada</translation> - </message> - <message> - <source>Error validating signature by: </source> - <translation type="obsolete">Error al validar firma de:</translation> - </message> - <message> - <source>Text was completely signed by: </source> - <translation type="obsolete">El texto fue completamente firmado por:</translation> - </message> - <message> - <source>Text was partially signed by: </source> - <translation type="obsolete">El texto fue parcialmente firmado por:</translation> - </message> - <message> - <source>Error for key with fingerprint </source> - <translation type="obsolete">Error para la llave con huella digital</translation> - </message> -</context> -<context> <name>AdvancedTab</name> <message> <source>Show Steganography Options [Advanced]</source> @@ -1278,10 +172,6 @@ Para acelerar el proceso use su computadora <translation>Entrada</translation> </message> <message> - <source>...</source> - <translation type="obsolete">...</translation> - </message> - <message> <source>Output</source> <translation>Salida</translation> </message> @@ -1302,10 +192,6 @@ Para acelerar el proceso use su computadora <translation>Guardar Archivo</translation> </message> <message> - <source>couldn't open file: </source> - <translation type="obsolete">no se pudo abrir el archivo:</translation> - </message> - <message> <source>File exists! Do you want to overwrite it?</source> <translation>El archivo ya existe! ¿Quiere sobreescribirlo?</translation> </message> @@ -1358,49 +244,6 @@ Para acelerar el proceso use su computadora <source>Language</source> <translation>Idioma</translation> </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">Cambio de idioma se aplicara despues de reiniciar el programa.</translation> - </message> - <message> - <source>System Default</source> - <translation type="obsolete">Por Defecto</translation> - </message> -</context> -<context> - <name>GpgME::Context</name> - <message> - <source>No Key Selected</source> - <translation type="obsolete">Ninguna llave seleccionada</translation> - </message> - <message> - <source>Unsupported algorithm</source> - <translation type="obsolete">Algoritmo incompatible</translation> - </message> - <message> - <source>Error decrypting:</source> - <translation type="obsolete">Error al descifrar:</translation> - </message> - <message> - <source>Wrong password</source> - <translation type="obsolete">Contraseña incorrecta</translation> - </message> - <message> - <source>Enter Password</source> - <translation type="obsolete">Ingresar Contraseña</translation> - </message> - <message> - <source>Key Selection</source> - <translation type="obsolete">Seleccionar Llave</translation> - </message> - <message> - <source>No Private Key Selected</source> - <translation type="obsolete">No se Selecciono Llave Privada</translation> - </message> - <message> - <source>Error signing:</source> - <translation type="obsolete">Error al firmar:</translation> - </message> </context> <context> <name>GpgME::GpgContext</name> @@ -1446,337 +289,6 @@ Para acelerar el proceso use su computadora </message> </context> <context> - <name>GpgWin</name> - <message> - <source>&New</source> - <translation type="obsolete">&Nuevo</translation> - </message> - <message> - <source>Open a new file</source> - <translation type="obsolete">Abrir nuevo archivo</translation> - </message> - <message> - <source>&Open...</source> - <translation type="obsolete">&Abrir...</translation> - </message> - <message> - <source>Open an existing file</source> - <translation type="obsolete">Abrir archivo existente</translation> - </message> - <message> - <source>&Save</source> - <translation type="obsolete">&Guardar</translation> - </message> - <message> - <source>Save the current File</source> - <translation type="obsolete">Guardar archivo actual</translation> - </message> - <message> - <source>Save &As</source> - <translation type="obsolete">Guardar &Como</translation> - </message> - <message> - <source>Save the current File as...</source> - <translation type="obsolete">Guardar Archivo actual como...</translation> - </message> - <message> - <source>&Print</source> - <translation type="obsolete">&Imprimir</translation> - </message> - <message> - <source>Print Document</source> - <translation type="obsolete">Imprimir Documento</translation> - </message> - <message> - <source>&Close</source> - <translation type="obsolete">&Cerrar</translation> - </message> - <message> - <source>Close file</source> - <translation type="obsolete">Cerrar archivo</translation> - </message> - <message> - <source>&Quit</source> - <translation type="obsolete">&Salir</translation> - </message> - <message> - <source>Quit Program</source> - <translation type="obsolete">Salir del Programa</translation> - </message> - <message> - <source>&Undo</source> - <translation type="obsolete">&Deshacer</translation> - </message> - <message> - <source>Undo Last Edit Action</source> - <translation type="obsolete">Deshacer Ultima Accion Editar</translation> - </message> - <message> - <source>&Redo</source> - <translation type="obsolete">&Rehacer</translation> - </message> - <message> - <source>Redo Last Edit Action</source> - <translation type="obsolete">Rehacer ultima accion editar</translation> - </message> - <message> - <source>&Paste</source> - <translation type="obsolete">&Pegar</translation> - </message> - <message> - <source>Paste Text From Clipboard</source> - <translation type="obsolete">Pegar Texto desde Portapapeles</translation> - </message> - <message> - <source>Cu&t</source> - <translation type="obsolete">Corta&r</translation> - </message> - <message> - <source>Cut the current selection's contents to the clipboard</source> - <translation type="obsolete">Cortar contenido de la seleccion actual al portapapeles</translation> - </message> - <message> - <source>&Copy</source> - <translation type="obsolete">&Copiar</translation> - </message> - <message> - <source>Copy the current selection's contents to the clipboard</source> - <translation type="obsolete">Copiar contenido de la seleccion actual al portapapeles</translation> - </message> - <message> - <source>&Quote</source> - <translation type="obsolete">&Poner comillas</translation> - </message> - <message> - <source>Quote whole text</source> - <translation type="obsolete">Poner comillas a todo el texto</translation> - </message> - <message> - <source>Select &All</source> - <translation type="obsolete">Seleccionar &Todo</translation> - </message> - <message> - <source>Select the whole text</source> - <translation type="obsolete">Seleccionar todo el texto</translation> - </message> - <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">Quitar doble &Fin de linea</translation> - </message> - <message> - <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation type="obsolete">Quitar doble fin de linea, p.ej. en texto pegado desde webmailer</translation> - </message> - <message> - <source>Se&ttings</source> - <translation type="obsolete">Con&figuracion</translation> - </message> - <message> - <source>Open settings dialog</source> - <translation type="obsolete">Abrir dialogo configuracion</translation> - </message> - <message> - <source>&Encrypt</source> - <translation type="obsolete">&Cifrar</translation> - </message> - <message> - <source>Encrypt Message</source> - <translation type="obsolete">Cifrar Mensaje</translation> - </message> - <message> - <source>&Decrypt</source> - <translation type="obsolete">&Descifrar</translation> - </message> - <message> - <source>Decrypt Message</source> - <translation type="obsolete">Descifrar Mensaje</translation> - </message> - <message> - <source>&File Encryption</source> - <translation type="obsolete">&Cifrado Archivo</translation> - </message> - <message> - <source>Encrypt/Decrypt File</source> - <translation type="obsolete">Cifrar / Descifrar Archivo</translation> - </message> - <message> - <source>&Sign</source> - <translation type="obsolete">&Firmar</translation> - </message> - <message> - <source>Sign Message</source> - <translation type="obsolete">Firmar Mensaje</translation> - </message> - <message> - <source>&Verify</source> - <translation type="obsolete">&Verificar</translation> - </message> - <message> - <source>Verify Message</source> - <translation type="obsolete">Verificar Mensaje</translation> - </message> - <message> - <source>&Editor</source> - <translation type="obsolete">&Editor</translation> - </message> - <message> - <source>Import New Key From Editor</source> - <translation type="obsolete">Importar Nueva Llave Desde Editor</translation> - </message> - <message> - <source>Key Management</source> - <translation type="obsolete">Administrador de Llaves</translation> - </message> - <message> - <source>Open Keymanagement</source> - <translation type="obsolete">Abrir Administrador de Llaves</translation> - </message> - <message> - <source>Import Key</source> - <translation type="obsolete">Importar Llave</translation> - </message> - <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">Abrir Dialogo Importar Nueva Llave</translation> - </message> - <message> - <source>&About</source> - <translation type="obsolete">&Acerca de</translation> - </message> - <message> - <source>Show the application's About box</source> - <translation type="obsolete">Mostrar recuadro Acerca de del programa</translation> - </message> - <message> - <source>Online &Tutorial</source> - <translation type="obsolete">Tutorial &En linea</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">Abrir Tutorial En linea</translation> - </message> - <message> - <source>Translate gpg4usb</source> - <translation type="obsolete">Traducir gpg4usb</translation> - </message> - <message> - <source>Translate gpg4usb yourself</source> - <translation type="obsolete">Traduzca usted mismo gpg4usb</translation> - </message> - <message> - <source>Append Selected Key(s) To Text</source> - <translation type="obsolete">Adjuntar Llave(s) Seleccionada(s) Al Texto</translation> - </message> - <message> - <source>Append The Selected Keys To Text in Editor</source> - <translation type="obsolete">Adjuntar Llaves Seleccionadas Al Texto en Editor</translation> - </message> - <message> - <source>Copy EMail-address</source> - <translation type="obsolete">Copiar direcciones de Correo Electronico</translation> - </message> - <message> - <source>Copy selected EMailaddress to clipboard</source> - <translation type="obsolete">Copiar direcciones de Correo Electronico seleccionadas a portapapeles</translation> - </message> - <message> - <source>Show Keydetails</source> - <translation type="obsolete">Mostrar Detalles de Llave</translation> - </message> - <message> - <source>Show Details for this Key</source> - <translation type="obsolete">Mostrar Detalles para esta Llave</translation> - </message> - <message> - <source>&File</source> - <translation type="obsolete">&Archivo</translation> - </message> - <message> - <source>&Edit</source> - <translation type="obsolete">&Editar</translation> - </message> - <message> - <source>&Crypt</source> - <translation type="obsolete">&Cifrar</translation> - </message> - <message> - <source>&Keys</source> - <translation type="obsolete">&Llaves</translation> - </message> - <message> - <source>&Import Key From...</source> - <translation type="obsolete">&Importar Llave Desde...</translation> - </message> - <message> - <source>&View</source> - <translation type="obsolete">&Ver</translation> - </message> - <message> - <source>&Help</source> - <translation type="obsolete">&Ayuda</translation> - </message> - <message> - <source>Crypt</source> - <translation type="obsolete">Cifrar</translation> - </message> - <message> - <source>Key</source> - <translation type="obsolete">Llave</translation> - </message> - <message> - <source>Edit</source> - <translation type="obsolete">Editar</translation> - </message> - <message> - <source>Ready</source> - <translation type="obsolete">Listo</translation> - </message> - <message> - <source>Encrypt for:</source> - <translation type="obsolete">Cifrar para:</translation> - </message> - <message> - <source>Attached files:</source> - <translation type="obsolete">Archivos Adjuntos:</translation> - </message> - <message> - <source>About </source> - <translation type="obsolete">Acerca de'</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Este programa le permite hacer un facil<br/>cifrado/descifrado de sus mensajes de texto o archivos<br>Esta licenciado bajo el GPL v3.0<br><br><b>Programadores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Traduccion:</b><br>Alessandro (pt_br), Kirill (ru), Viriato13 (es), Serse (it) <br><br>Si usted tiene alguna pregunta y/o sugerencias, entre<br/>en nuestra <a href="http://gpg4usb.cpunk.de/contact.php">pagina de contacto</a> o envie un email a nuestra<br/> lista decorreo en <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>There is one unencrypted file in attachment folder</source> - <translation type="obsolete">Hay un archivo sin cifrar en carpeta adjuntos</translation> - </message> - <message> - <source>There are </source> - <translation type="obsolete">Hay</translation> - </message> - <message> - <source> unencrypted files in attachment folder</source> - <translation type="obsolete">archivos sin cifrar en carpeta adjuntos</translation> - </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">Importar Llave Desde...</translation> - </message> - <message> - <source>&Clipboard</source> - <translation type="obsolete">&Portapapeles</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">&Servidor de llaves</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Este programa permite un fácil cifrado <br/>y descifrado de mensajes de texto o de archivos.<br>Esta autorizado en virtud al GPL v3<br><br><b>Programadores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Traduccion:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>Si tiene preguntas o sugerencias diríjase a <br/>nuestra <a href="http://gpg4usb.cpunk.de/contact.php">pagina de contacto</a> o envie un correo electrónico a nuestra<br/> lista de correos a <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> -</context> -<context> <name>ImportFromGnupgPage</name> <message> <source>Import keys...</source> @@ -1936,14 +448,6 @@ Para acelerar el proceso use su computadora <translation>Exportando Llave privada</translation> </message> <message> - <source>You are about to export your private key. -This is NOT your public key, so don't give it away. -Make sure you keep it save.</source> - <translation type="obsolete">Esta a punto de exportar su llave privada. -Esta NO es su llave publica, asi que no la revele. -Guardela de forma segura.</translation> - </message> - <message> <source>Export Key To File</source> <translation>Exportar Llave a Archivo</translation> </message> @@ -2326,72 +830,6 @@ gpg4usb intentara ahora importar la(s) llave(s).</translation> <translation>Exportar Llave a Archivo</translation> </message> <message> - <source>Name:</source> - <translation type="obsolete">Nombre:</translation> - </message> - <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">Direccion de Correo Electronico:</translation> - </message> - <message> - <source>Comment:</source> - <translation type="obsolete">Comentario:</translation> - </message> - <message> - <source>KeySize (in Bit):</source> - <translation type="obsolete">Tamaño Llave (en Bit):</translation> - </message> - <message> - <source>Expiration Date:</source> - <translation type="obsolete">Fecha Expiracion:</translation> - </message> - <message> - <source>Password:</source> - <translation type="obsolete">Contraseña:</translation> - </message> - <message> - <source>Repeat Password:</source> - <translation type="obsolete">Repetir Contraseña:</translation> - </message> - <message> - <source>Never Expire</source> - <translation type="obsolete">Nunca Expira</translation> - </message> - <message> - <source>Password: Strength -Weak -> Strong</source> - <translation type="obsolete">Contraseña: Fortaleza -Debil -> Fuerte</translation> - </message> - <message> - <source>Password Strength</source> - <translation type="obsolete">Fortaleza de la Contraseña</translation> - </message> - <message> - <source> Name must contain at least five characters. -</source> - <translation type="obsolete">El nombre debe contener al menos cinco caracteres. -</translation> - </message> - <message> - <source> Password and Repeat don't match. </source> - <translation type="obsolete"> Contraseña y Repetir no coinciden. </translation> - </message> - <message> - <source>Generating Key...</source> - <translation type="obsolete">Creando Llave...</translation> - </message> - <message> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="obsolete">Recogiendo datos aleatorios para crear llave. -Puede tardar un rato. -Para acelerar el proceso no use en su computadora -(ejemplo, navegar por la Red, oir musica,...)</translation> - </message> - <message> <source>Keyring files</source> <translation>Carpetas Llavero</translation> </message> @@ -2970,10 +1408,6 @@ Para acelerar el proceso no use en su computadora <translation>Configuracion</translation> </message> <message> - <source>English</source> - <translation type="obsolete">Español</translation> - </message> - <message> <source>Advanced</source> <translation>Avanzado</translation> </message> diff --git a/release/ts/gpg4usb_he.qm b/release/ts/gpg4usb_he.qm Binary files differnew file mode 100644 index 0000000..626d6cf --- /dev/null +++ b/release/ts/gpg4usb_he.qm diff --git a/release/ts/gpg4usb_he.ts b/release/ts/gpg4usb_he.ts new file mode 100644 index 0000000..9287a3a --- /dev/null +++ b/release/ts/gpg4usb_he.ts @@ -0,0 +1,1973 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="he_IL"> +<context> + <name>AdvancedTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="448"/> + <source>Show Steganography Options [Advanced]</source> + <translation>להציג אפשרויות סטגנוגרפיה [מתקדם]</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="450"/> + <source>Show Steganographic Options.</source> + <translation>להציג אפשרויות סטגנוגרפיה.</translation> + </message> +</context> +<context> + <name>AppearanceTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="279"/> + <source>Iconsize</source> + <translation>אייקונים</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="281"/> + <source>small</source> + <translation>קטנים</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="282"/> + <source>medium</source> + <translation>בינוניים</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="283"/> + <source>large</source> + <translation>גדולים</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="299"/> + <source>Iconstyle</source> + <translation>סגנון אייקונים</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="301"/> + <source>just text</source> + <translation>טקסט בלבד</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="302"/> + <source>just icons</source> + <translation>איקונים בלבד</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="303"/> + <source>text and icons</source> + <translation>טקסט ואיקונים</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="319"/> + <source>Windowstate</source> + <translation>מצב החלון</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="321"/> + <source>Save window size and position on exit.</source> + <translation>לשמור את גודל החלון ומיקומו ביציאה.</translation> + </message> +</context> +<context> + <name>AttachmentTableModel</name> + <message> + <location filename="../../attachmenttablemodel.cpp" line="128"/> + <source>Filename</source> + <translation>שם קובץ</translation> + </message> + <message> + <location filename="../../attachmenttablemodel.cpp" line="131"/> + <source>Contenttype</source> + <translation>סוג תוכן</translation> + </message> +</context> +<context> + <name>Attachments</name> + <message> + <location filename="../../attachments.cpp" line="78"/> + <location filename="../../attachments.cpp" line="115"/> + <source>Save File</source> + <translation>שמירה</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="79"/> + <source>Save this file</source> + <translation>לשמור קובץ</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="83"/> + <source>Open File</source> + <translation>פתיחה</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="84"/> + <source>Open this file</source> + <translation>לפתוח קובץ</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="121"/> + <location filename="../../attachments.cpp" line="166"/> + <source>File</source> + <translation>קובץ</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="122"/> + <location filename="../../attachments.cpp" line="167"/> + <source>Cannot write file %1: +%2.</source> + <translation>לא ניתן לכתוב לקובץ %1: +%2.</translation> + </message> +</context> +<context> + <name>ChoosePage</name> + <message> + <location filename="../../wizard.cpp" line="159"/> + <source>Choose your action...</source> + <translation>בחר פעולה...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="160"/> + <source>...by clicking on the apropriate link.</source> + <translation>...על-ידי לחיצה על הקישור המתאים.</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="162"/> + <source>If you have never used gpg4usb before and also don't own a gpg key yet you may possibly want to </source> + <translation>במידה וטרם השתמשת ב- gpg4usb וגם אין ברשותך מפתח gpg עדיין אולי תרצה </translation> + </message> + <message> + <location filename="../../wizard.cpp" line="164"/> + <source>create a new keypair</source> + <translation>ליצור זוג מפתחות חדש</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="168"/> + <source>If you upgrade from an older version of gpg4usb you may want to </source> + <translation>במידה ואתה משדרג מגרסה קודמת של gpg4usb אולי תרצה </translation> + </message> + <message> + <location filename="../../wizard.cpp" line="170"/> + <source>import settings and/or keys from gpg4usb</source> + <translation>ליבא הגדרות ו/או מפתחות מ- gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="174"/> + <source>If you are already using GnuPG you may want to </source> + <translation>במידה ואתה כבר נשתמש ב- GnuPG אולי תרצה </translation> + </message> + <message> + <location filename="../../wizard.cpp" line="176"/> + <source>import keys from GnuPG</source> + <translation>ליבא מפתחות מ- GnuPG</translation> + </message> +</context> +<context> + <name>ConclusionPage</name> + <message> + <location filename="../../wizard.cpp" line="391"/> + <source>Ready.</source> + <translation>מוכן.</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="392"/> + <source>Have fun with gpg4usb!</source> + <translation>תהנו עם gpg4usb!</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="394"/> + <source>You are ready to use gpg4usb now.<br><br>The offline help will get you started with gpg4usb. It will open in the main window.<br></source> + <translation>אתה מוכן להתחיל להשתמש ב- gpg4usb.<br><br>קבצי העזרה יעזרו לך להתחיל לעבוד. הם יפתחו בחלון הראשי.<br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="399"/> + <source>Open offline help.</source> + <translation>לפתוח את קבצי העזרה.</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="402"/> + <source>Dont show the wizard again.</source> + <translation>אל תראה את האשף פעם נוספת.</translation> + </message> +</context> +<context> + <name>FileEncryptionDialog</name> + <message> + <location filename="../../fileencryptiondialog.cpp" line="36"/> + <source>Encrypt / Decrypt File</source> + <translation>להצפין/לפענח קובץ</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="46"/> + <location filename="../../fileencryptiondialog.cpp" line="170"/> + <location filename="../../fileencryptiondialog.cpp" line="179"/> + <source>File</source> + <translation>קובץ</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="47"/> + <source>Action</source> + <translation>פעולה</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="31"/> + <source>Decrypt File</source> + <translation>לפענח קובץ</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="33"/> + <source>Encrypt File</source> + <translation>להצפין קובץ</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="53"/> + <source>Input</source> + <translation>קלט</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="59"/> + <source>Output</source> + <translation>פלט</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="78"/> + <source>&Encrypt</source> + <translation>&הצפנה</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="80"/> + <source>&Decrypt</source> + <translation>&פענוח</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="116"/> + <source>Open File</source> + <translation>פתיחה</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="142"/> + <source>Save File</source> + <translation>שמירה</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="153"/> + <source>Couldn't Open file: </source> + <translation>לא הצלחתי לפתוח קובץ:</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="180"/> + <source>Cannot write file %1: +%2.</source> + <translation>לא ניתן לכתוב לקובץ %1: +%2.</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="171"/> + <source>File exists! Do you want to overwrite it?</source> + <translation>הקובץ קיים! האם להחליפו?</translation> + </message> +</context> +<context> + <name>GeneralTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="105"/> + <source>Remember Password</source> + <translation>לזכור סיסמה</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="107"/> + <source>Remember password until closing gpg4usb</source> + <translation>לזכור סיסמה עד לסגירת gpg4usb</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="114"/> + <source>Save Checked Keys</source> + <translation>לשמור מפתחות מסומנים</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="116"/> + <source>Save checked private keys on exit and restore them on next start.</source> + <translation>לשמור את המפתחות הפרטיים ביציאה ולשחזר אותם בהפעלה הבאה.</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="123"/> + <source>Confirm drag'n'drop key import</source> + <translation>לאשר יבוא מפתח בגרור-וזרוק</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="125"/> + <source>Import files dropped on the keylist without confirmation.</source> + <translation>ליבא מפתחות הזרקים ברשימת המפתחות ללא בקשת אישור.</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="132"/> + <source>Language</source> + <translation>שפה</translation> + </message> +</context> +<context> + <name>GpgME::GpgContext</name> + <message> + <location filename="../../gpgcontext.cpp" line="312"/> + <source>No Key Selected</source> + <translation>לא נבחר מפתח</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="384"/> + <source><br>No private key with id %1 present in keyring</source> + <translation><br>לא נמצא מפתח פרטי בטבעת עם המזהה %1</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="392"/> + <source>Unsupported algorithm</source> + <translation>אלגוריתם לא נתמך</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="402"/> + <source>Error decrypting:</source> + <translation>שגיאת פענוח:</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="476"/> + <source>Wrong password</source> + <translation>סיסמה שגויה</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="484"/> + <source>Enter Password for</source> + <translation>הכנס סיסמה עבור</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="488"/> + <source>Enter Password</source> + <translation>הכנס סיסמה</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="649"/> + <source>Key Selection</source> + <translation>בחירת מפתח</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="649"/> + <source>No Private Key Selected</source> + <translation>לא נבחר מפתח פרטי</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="697"/> + <source>Error signing:</source> + <translation>שגיאת חתימה:</translation> + </message> +</context> +<context> + <name>ImportFromGnupgPage</name> + <message> + <location filename="../../wizard.cpp" line="288"/> + <source>Import keys...</source> + <translation>יבוא מפתחות...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="289"/> + <source>...from existing GnuPG installation</source> + <translation>...מהתקנה קיימת של GnuPG</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="291"/> + <source>You can import keys from a locally installed GnuPG.<br><br> The location is read from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br></source> + <translation>ניתן ליבא מפתחות מ- GnuPG המותקן מקומית.<br><br> המיקום נקרא מהרגיסטרי של חלונות או מספריית .gnupg בתיקיית הבית של לינוקס.<br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="295"/> + <source>Import keys from GnuPG</source> + <translation>יבוא מפתחות מ- GnuPG</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="310"/> + <source>Import Error</source> + <translation>שגיאת יבוא</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="310"/> + <source>Couldn't locate GnuPG home directory</source> + <translation>לא הצלחתי לאתר את ספריית הבית של GnuPG</translation> + </message> +</context> +<context> + <name>ImportFromGpg4usbPage</name> + <message> + <location filename="../../wizard.cpp" line="208"/> + <source>Import from...</source> + <translation>יבוא מ...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="209"/> + <source>...existing gpg4usb</source> + <translation>...גרסה אחרת של gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="211"/> + <source>You can import keys and/or settings from existing gpg4usb. <br><br>Just check what you want to import, click the import button and choose the directory of your other gpg4usb in the appearing file dialog.</source> + <translation>באפשרותך ליבא מפתחות או הגדרות מגרסה אחרת של gpg4usb. <br><br>יש לסמן את האפשרויות ליבוא, ללחוץ על כפתור היבוא ולבחור את התיקיה של הגרסה האחרת של gpg4usb.</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="218"/> + <source>Keys</source> + <translation>מפתחות</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="222"/> + <source>Configuration</source> + <translation>הגדרות</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="224"/> + <source>Import from gpg4usb</source> + <translation>ליבא מ- gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="240"/> + <source>Other gpg4usb directory</source> + <translation>תיקיית gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="260"/> + <source>Configuration Imported</source> + <translation>הגדרות יובאו</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="260"/> + <source>Imported Configuration from old gpg4usb.<br>Will now restart to activate the configuration.</source> + <translation>יבאתי את ההגדרות מהגרסה הקודמת של gpg4usb. <br>מאתחל את התוכנה בכדי להפעיל ההגדרות החדשות.</translation> + </message> +</context> +<context> + <name>IntroPage</name> + <message> + <location filename="../../wizard.cpp" line="106"/> + <source>Getting started...</source> + <translation>מתחילים...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="107"/> + <source>... with gpg4usb</source> + <translation>...עם gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="109"/> + <source>To use gpg4usb for decrypting and signing messages, you need a private key. The next page will help you with key generation or import.<br><br>For more information have a look at the <a href='docu_concepts.html'>concepts</a> (by clicking the link, the page will open in the main window). <br></source> + <translation>בכדי להשתמש ב- gpg4usb לפענוח וחתימה של הודעות, יש צורך במפתח פרטי. הדף הבא יסייע לך ביצירת מפתח או יבוא של אחד.<br><br>למידע נוסף יש ללחוץ על הקישור לדף <a href='docu_concepts.html'>העקרונות</a> (לחיצה על הקישור תפתח את הדף בחלון המרכזי). <br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="118"/> + <source>Choose a Language</source> + <translation>בחירת שפה</translation> + </message> +</context> +<context> + <name>KeyDetailsDialog</name> + <message> + <location filename="../../keydetailsdialog.cpp" line="30"/> + <source>Owner details</source> + <translation>פרטי הבעלים</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="31"/> + <source>Key details</source> + <translation>פרטי המפתח</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="32"/> + <source>Fingerprint</source> + <translation>טביעת אצבע</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="33"/> + <source>Additional Uids</source> + <translation>מזהים נוספים</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="81"/> + <source>Name:</source> + <translation>שם:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="82"/> + <source>E-Mailaddress:</source> + <translation>כתובת דוא"ל:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="83"/> + <source>Comment:</source> + <translation>הערות:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="89"/> + <source>Expires on: </source> + <translation>תקף עד:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="91"/> + <source>Created on: </source> + <translation>נוצר ב:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="92"/> + <source>Key ID: </source> + <translation>מזהה מפתח:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="116"/> + <source>copy fingerprint to clipboard</source> + <translation>להעתיק טביעת אצבע ללוח ההדבקה</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="158"/> + <source>Warning: Key expired</source> + <translation>זהירות: פג תוקף המפתח</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="161"/> + <source>Warning: Key revoked</source> + <translation>זהירות: המפתח בוטל</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="176"/> + <source>Keydetails</source> + <translation>פרטי מפתח</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="187"/> + <source>You are about to export your private key. +This is NOT your public key, so don't give it away. +Make sure you keep it save.Do you really want to export your private key?</source> + <translation>הנך עומד ליצא את המפתח הפרטי שלך +זה *לא* המפתח הציבורי, אז אל תפיץ אותו. +חשוב לשמור עליו. האם ליצא את המפתח הפרטי?</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="199"/> + <source>Key Files</source> + <translation>קבצי מפתחות</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="202"/> + <source>Export error</source> + <translation>שגיאת יצוא</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="202"/> + <source>Couldn't open %1 for writing</source> + <translation>לא ניתן לפתוח את %1 לכתיבה</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="88"/> + <source>Key size:</source> + <translation>גודל המפתח:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="90"/> + <source>Algorithm: </source> + <translation>אלגוריתם:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="50"/> + <source>Never</source> + <translation>לעולם לא</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="62"/> + <source> / Never</source> + <translation> / לעולם לא</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="139"/> + <source>Private Key</source> + <translation>מפתח פרטי</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="142"/> + <source>Export Private Key</source> + <translation>ליצא את המפתח הפרטי</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="186"/> + <source>Exporting private Key</source> + <translation>מייצא את הפתח הפרטי</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="199"/> + <source>Export Key To File</source> + <translation>ליצא מפתח לקובץ</translation> + </message> +</context> +<context> + <name>KeyGenDialog</name> + <message> + <location filename="../../keygendialog.cpp" line="31"/> + <source>Generate Key</source> + <translation>יצירת מפתח</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="68"/> + <source>Password Strength</source> + <translation>חוזק סיסמה</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="73"/> + <source>Name:</source> + <translation>שם:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="74"/> + <source>E-Mailaddress:</source> + <translation>כתובת דוא"ל:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="75"/> + <source>Comment:</source> + <translation>הערה:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="76"/> + <source>Expiration Date:</source> + <translation>בתוקף עד:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="77"/> + <source>Never Expire</source> + <translation>תקף לעד</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="78"/> + <source>KeySize (in Bit):</source> + <translation>גודל מפתח (בביטים):</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="79"/> + <source>Password:</source> + <translation>סיסמה:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="80"/> + <source>Password: Strength +Weak -> Strong</source> + <translation>סיסמה: חוזק חלשה -> חזקה</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="81"/> + <source>Repeat Password:</source> + <translation>סיסמה בשנית:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="117"/> + <source> Name must contain at least five characters. +</source> + <translation>השם חייב להכיל לפחות חמשה תווים.</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="120"/> + <source> Password and Repeat don't match. </source> + <translation>שתי הסיסמאות לא תואמות.</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="157"/> + <source>Generating Key...</source> + <translation>מייצר מפתח...</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="159"/> + <source>Collecting random data for key generation. + This may take a while. + To speed up the process use your computer + (e.g. browse the net, listen to music,...)</source> + <translation>אוסף נתונים אקראיים ליצירת המפתח. +הפעולה עשויה להתארך. +בכדי להאיץ את התהליך אפשר להשתמש במחשב +(לדוגמה: לגלוש ברשת, להאזין למוזיקה,...)</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="175"/> + <source>Success</source> + <translation>הצלחה</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="175"/> + <source>New key created</source> + <translation>מפתח חדש נוצר</translation> + </message> +</context> +<context> + <name>KeyGenPage</name> + <message> + <location filename="../../wizard.cpp" line="348"/> + <source>Create a keypair...</source> + <translation>ליצור זוג מפתחות...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="349"/> + <source>...for decrypting and signing messages</source> + <translation>...לפענוח וחתימה על הודעות</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="350"/> + <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> + <translation>עליך ליצור זוג מפתחות חדש. הזוג כולל מפתח ציבורי ומפתח פרטי.<br>משתמשים אחרים יכולים להשתמש במפתח הציבורי שלך בכדי להצפין הודעות עבורך ולודא הודעות שנחתמו על ידך. באפשרותך לפענח ולחתום על הודעות בעזרת המפתח הפרטי.<br>למידע נוסף יש לפנות למדריכים הלא מקוונים (יוצג בחלון הראשי):</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="357"/> + <source>Offline tutorial</source> + <translation>מדריך לא מקוון</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="364"/> + <source>Create New Key</source> + <translation>יצירת מפתח חדש</translation> + </message> +</context> +<context> + <name>KeyImportDetailDialog</name> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="31"/> + <location filename="../../keyimportdetaildialog.cpp" line="47"/> + <source>Key import details</source> + <translation>נתוני יבוא מפתח</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="31"/> + <source>No keys found to import</source> + <translation>לא נמצאו מפתחות ליבוא</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="56"/> + <source>Genral key import info</source> + <translation>נתונים כלליים</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="59"/> + <source>Considered:</source> + <translation>נמצאו:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="63"/> + <source>Public unchanged:</source> + <translation>ציבוריים ללא שינוי:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="68"/> + <source>Imported:</source> + <translation>יובאו:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="73"/> + <source>Not imported:</source> + <translation>לא יובאו:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="78"/> + <source>Private read:</source> + <translation>פרטיים:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="83"/> + <source>Private imported:</source> + <translation>מפתחות פרטיים שיובאו:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="88"/> + <source>Private unchanged:</source> + <translation>פרטיים ללא שינוי:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Name</source> + <translation>שם</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Email</source> + <translation>דוא"ל</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Status</source> + <translation>מצב</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Fingerprint</source> + <translation>טביעת אצבע</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="128"/> + <source>private</source> + <translation>פרטי</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="131"/> + <source>public</source> + <translation>ציבורי</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="134"/> + <source>unchanged</source> + <translation>ללא שינוי</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="137"/> + <source>new key</source> + <translation>מפתח חדש</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="140"/> + <source>new subkey</source> + <translation>תת מפתח חדש</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="144"/> + <source>new signature</source> + <translation>חתימה חדשה</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="148"/> + <source>new uid</source> + <translation>מזהה חדש</translation> + </message> +</context> +<context> + <name>KeyList</name> + <message> + <location filename="../../keylist.cpp" line="50"/> + <source>Name</source> + <translation>שם</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="50"/> + <source>EMail</source> + <translation>דוא"ל</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="193"/> + <source>Import Keys</source> + <translation>יבוא מפתחות</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="195"/> + <source>You've dropped something on the keylist. + gpg4usb will now try to import key(s).</source> + <translation>זרקת משהו על רשימת המפתחות +התוכנה תנסה ליבא את המפתח/ות.</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="198"/> + <source>Always import without bothering.</source> + <translation>תמיד יבא ללא שאלות.</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="234"/> + <source>Couldn't Open File: </source> + <translation>לא הצלחתי לפתוח את הקובץ:</translation> + </message> +</context> +<context> + <name>KeyMgmt</name> + <message> + <location filename="../../keymgmt.cpp" line="61"/> + <source>Keymanagement</source> + <translation>מנהל מפתחות</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="68"/> + <source>&Close Key Management</source> + <translation>&לסגור את מנהל המפתחות</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="69"/> + <source>Ctrl+Q</source> + <translation>Ctrl+Q</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="71"/> + <source>Close Key Management</source> + <translation>לסגור את מנהל המפתחות</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="76"/> + <source>Import New Key From File</source> + <translation>יבוא מפתח חדש מקובץ</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="81"/> + <source>Import New Key From Clipboard</source> + <translation>יבוא מפתח חדש מלוח ההדבקה</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="84"/> + <source>&Keyserver</source> + <translation>&שרת מפתחות</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="86"/> + <source>Import New Key From Keyserver</source> + <translation>יבוא מפתח חדש משרת מפתחות</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="89"/> + <source>Export To &Clipboard</source> + <translation>יצוא &ללוח ההדבקה</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="91"/> + <source>Export Selected Key(s) To Clipboard</source> + <translation>יצוא המפתח/ות שנבחרו ללוח ההדבקה</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="94"/> + <source>Export To &File</source> + <translation>יצוא &לקובץ</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="96"/> + <source>Export Selected Key(s) To File</source> + <translation>לייצא מפתחות שנבחרו לקובץ</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="99"/> + <source>Delete Selected Key(s)</source> + <translation>למחוק מפתחות שנבחרו</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="100"/> + <source>Delete the Selected keys</source> + <translation>למחוק מפתחות שנבחרו</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="103"/> + <source>Delete Checked Key(s)</source> + <translation>למחוק מפתחות שסומנו</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="104"/> + <source>Delete the Checked keys</source> + <translation>למחוק מפתחות שסומנו</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="108"/> + <source>Generate Key</source> + <translation>יצירת מפתח</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="109"/> + <source>Generate New Key</source> + <translation>יצירת מפתח חדש</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="113"/> + <source>Show Keydetails</source> + <translation>להציג נתוני מפתח</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="114"/> + <source>Show Details for this Key</source> + <translation>להציג נתונים עבור מפתח זה</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="145"/> + <source>Import key</source> + <translation>ליבא מפתח</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="146"/> + <source>Import key from</source> + <translation>ליבא מפתח ממקור</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="260"/> + <source>key(s) exported</source> + <translation>מפתחות יוצאו</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="74"/> + <location filename="../../keymgmt.cpp" line="120"/> + <source>&File</source> + <translation>&קובץ</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="79"/> + <source>&Clipboard</source> + <translation>&לוח הדבקה</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="123"/> + <source>&Key</source> + <translation>&מפתח</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="124"/> + <source>&Import Key From...</source> + <translation>&ליבא מפתח מ...</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="137"/> + <source>Key</source> + <translation>מפתח</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <source>Open Key</source> + <translation>לפתוח מפתח</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <location filename="../../keymgmt.cpp" line="252"/> + <source>Key Files</source> + <translation>קבצי מפתח</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <source>Keyring files</source> + <translation>קבצי טבעת מפתחות</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="172"/> + <source>Couldn't Open File: </source> + <translation>לא הצלחתי לפתוח קובץ:</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="221"/> + <source>Deleting Keys</source> + <translation>מוחק מפתחות</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="222"/> + <source><b>Are you sure that you want to delete the following keys?.</b><br/><br/></source> + <translation><b>האם למחוק את המפתחות הבאים?.</b><br/><br/></translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="223"/> + <source><br/>The action can not be undone.</source> + <translation><br/>The לא ניתן לשחזר פעולה זו.</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="252"/> + <source>Export Key To File</source> + <translation>ליצא מפתח לקובץ</translation> + </message> +</context> +<context> + <name>KeyServerImportDialog</name> + <message> + <location filename="../../keyserverimportdialog.cpp" line="31"/> + <source>&Close</source> + <translation>&סגירה</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="32"/> + <source>&Import</source> + <translation>&יבוא</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="33"/> + <source>&Search</source> + <translation>&חיפוש</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="36"/> + <source>Search string:</source> + <translation>מחרוזת חיפוש:</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="40"/> + <source>Keyserver:</source> + <translation>שרת מפתחות:</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="71"/> + <source>Import Keys from Keyserver</source> + <translation>ליבא מפתחות משרת מפתחות</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>UID</source> + <translation>מזהה</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>Creation date</source> + <translation>תאריך יצירה</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>KeyID</source> + <translation>מזהה מפתח</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>Tag</source> + <translation>תג</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="154"/> + <source>Couldn't contact keyserver!</source> + <translation>לא הצלחתי להתחבר לשרת המפתחות!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="162"/> + <source>Too many responses from keyserver!</source> + <translation>תשובות רבות מדי משרת המפתחות!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="168"/> + <source>No keys found, input may be kexId, retrying search with 0x.</source> + <translation>לא נמצאו מפתחות, הקלט יכול להיות keyId, מנסה לחפש עם 0x.</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="172"/> + <source>No keys found containing the search string!</source> + <translation>לא נמצאו מפתחות המכילים את מחרוזת החיפוש!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="175"/> + <source>Insufficiently specific search string!</source> + <translation>מחרוזת החיפוש אינה מוגדרת!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="203"/> + <source>revoked</source> + <translation>נשלל</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="206"/> + <source>disabled</source> + <translation>נוטרל</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="245"/> + <source>%1 keys found. Doubleclick a key to import it.</source> + <translation>%1 מפתח/ות נמצאו. הקלקה כפולה בכדי לייבא.</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="291"/> + <source>Error while contacting keyserver!</source> + <translation>שגיאה בהתחברות לשרת המפתחות!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="295"/> + <source>Key imported</source> + <translation>מפתח יובא</translation> + </message> +</context> +<context> + <name>KeyserverTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="404"/> + <source>Default Keyserver for import:</source> + <translation>ברירת מחדל לשרת מפתחות ליבוא:</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../../mainwindow.cpp" line="152"/> + <source>&New</source> + <translation>&חדש</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="158"/> + <source>Open a new file</source> + <translation>לפתוח קובץ חדש</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="161"/> + <source>&Open...</source> + <translation>&לפתוח...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="164"/> + <source>Open an existing file</source> + <translation>לפתוח קובץ חדש</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="167"/> + <source>&Save</source> + <translation>&שמירה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="170"/> + <source>Save the current File</source> + <translation>לשמור את הקובץ הנוכחי</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="173"/> + <source>Save &As</source> + <translation>&לשמור בשם</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="176"/> + <source>Save the current File as...</source> + <translation>לשמור את הקובץ הנוכחי בשם...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="179"/> + <source>&Print</source> + <translation>&הדפסה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="182"/> + <source>Print Document</source> + <translation>להדפיס</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="185"/> + <location filename="../../mainwindow.cpp" line="640"/> + <source>&Close</source> + <translation>&סגירה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="187"/> + <source>Close file</source> + <translation>לסגור את הקובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="190"/> + <source>&Quit</source> + <translation>&יציאה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="193"/> + <source>Quit Program</source> + <translation>לצאת מהתוכנית</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="198"/> + <source>&Undo</source> + <translation>&ביטול</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="200"/> + <source>Undo Last Edit Action</source> + <translation>ביטול פעולת עריכה אחרונה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="203"/> + <source>&Redo</source> + <translation>&שחזור פעולה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="205"/> + <source>Redo Last Edit Action</source> + <translation>לשחזר את פעולת העריכה האחרנה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="208"/> + <source>Zoom In</source> + <translation>הגדלה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="212"/> + <source>Zoom Out</source> + <translation>הקטנה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="216"/> + <source>&Paste</source> + <translation>&הדבקה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="219"/> + <source>Paste Text From Clipboard</source> + <translation>הדבקת טקסט מלוח ההדבקה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="222"/> + <source>Cu&t</source> + <translation>&גזירה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="225"/> + <source>Cut the current selection's contents to the clipboard</source> + <translation>גזריה ללוח ההדבקה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="229"/> + <source>&Copy</source> + <translation>&העתקה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="232"/> + <source>Copy the current selection's contents to the clipboard</source> + <translation>העתקה ללוח ההדבקה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="236"/> + <source>&Quote</source> + <translation>&ציטוט</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="238"/> + <source>Quote whole text</source> + <translation>ציטוט כל הטקסט</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="241"/> + <source>Select &All</source> + <translation>בחירת &הכול</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="244"/> + <source>Select the whole text</source> + <translation>בחירת כל הטקסט</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="247"/> + <source>Remove &spacing</source> + <translation>להסיר &רווחים</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="250"/> + <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> + <translation>הסרת מעברי שורות כפולים כגון בטקסט מעותק</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="253"/> + <source>Se&ttings</source> + <translation>&הגדרות</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="254"/> + <source>Open settings dialog</source> + <translation>פתיחת חלון ההגדרות</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="260"/> + <source>&Encrypt</source> + <translation>&הצפנה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="263"/> + <source>Encrypt Message</source> + <translation>להצפין הודעה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="266"/> + <source>&Decrypt</source> + <translation>&פענוח</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="269"/> + <source>Decrypt Message</source> + <translation>לפענח הודעה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="272"/> + <source>&File Encryption</source> + <translation>&הצפנת קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="274"/> + <source>Encrypt/Decrypt File</source> + <translation>להצפין/לפענח קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="280"/> + <source>&Encrypt File</source> + <translation>&הצפנת קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="282"/> + <source>Encrypt File</source> + <translation>להצפין קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="285"/> + <source>&Decrypt File</source> + <translation>&פענח קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="287"/> + <source>Decrypt File</source> + <translation>לפענח קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="290"/> + <source>&Sign</source> + <translation>&חתימה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="293"/> + <source>Sign Message</source> + <translation>לחתום הודעה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="296"/> + <source>&Verify</source> + <translation>&אימות</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="299"/> + <source>Verify Message</source> + <translation>לאמת הודעה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="305"/> + <source>&Editor</source> + <translation>&עורך</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="307"/> + <source>Import New Key From Editor</source> + <translation>יבוא מפתח חדש מהעורך</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="310"/> + <source>Manage &keys</source> + <translation>ניהול &מפתחות</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="312"/> + <source>Open Keymanagement</source> + <translation>פתיחת מנהל המפתחות</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="317"/> + <source>&About</source> + <translation>&אודות</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="319"/> + <source>Show the application's About box</source> + <translation>להציג את חלון האודות של היישום</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="322"/> + <source>Integrated Help</source> + <translation>עזרה מובנית</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="323"/> + <source>Open integrated Help</source> + <translation>לפתוח את העזרה המובנת</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="326"/> + <source>Online &Tutorials</source> + <translation>מדריכים &מקוונים</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="327"/> + <source>Open Online Tutorials</source> + <translation>לפתוח את המדריכין המקוונים</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="330"/> + <source>Translate gpg4usb</source> + <translation>תרגום gpg4usb</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="331"/> + <source>Translate gpg4usb yourself</source> + <translation>תרגם את gpg4usb</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="334"/> + <source>Open &Wizard</source> + <translation>פתיחת &אשף</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="335"/> + <source>Open the wizard</source> + <translation>לפתוח את האשף</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="340"/> + <source>Append Selected Key(s) To Text</source> + <translation>לצרף את המפתח/ות שנבחרו לטקסט</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="341"/> + <source>Append The Selected Keys To Text in Editor</source> + <translation>לצרף את המפתחות שנבחרו לטקסט שבעורך</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="344"/> + <source>Copy EMail-address</source> + <translation>להעתיק כתובת דוא"ל</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="345"/> + <source>Copy selected EMailaddress to clipboard</source> + <translation>העתקת כתובות דוא"ל שנבחרו ללוח ההדבקה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="349"/> + <source>Show Keydetails</source> + <translation>הצגת נתוני מפתח</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="350"/> + <source>Show Details for this Key</source> + <translation>להציג פרטים אודות מפתח זה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="410"/> + <source>&File</source> + <translation>&קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="422"/> + <source>&Edit</source> + <translation>&עריכה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="438"/> + <source>&Crypt</source> + <translation>&הצפנה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="448"/> + <source>&Keys</source> + <translation>&מפתחות</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="449"/> + <source>&Import Key From...</source> + <translation>&יבוא מפתח מ...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="458"/> + <source>&Steganography</source> + <translation>&סטגנוגרפיה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="365"/> + <source>Remove PGP Header</source> + <translation>הסרת כותרת PGP</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="368"/> + <source>Add PGP Header</source> + <translation>הוספת כותרת PGP</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="467"/> + <source>&View</source> + <translation>&צפייה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="469"/> + <source>&Help</source> + <translation>&עזרה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="482"/> + <source>File</source> + <translation>קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="490"/> + <source>Crypt</source> + <translation>הצפנה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="499"/> + <source>Key</source> + <translation>מפתח</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="504"/> + <source>Edit</source> + <translation>עריכה</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="511"/> + <source>Special edit</source> + <translation>עריכה מיוחדת</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="522"/> + <source>Import key from...</source> + <translation>יבוא מפתח מ...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="523"/> + <source>Import key</source> + <translation>יבוא מפתח</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="534"/> + <source>Encrypt or decrypt File</source> + <translation>הצפנת או פענוח קובץ</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="535"/> + <source>File..</source> + <translation>קובץ..</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="553"/> + <source>Ready</source> + <translation>מוכן</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="561"/> + <source>Encrypt for:</source> + <translation>להצפין עבור:</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="580"/> + <source>Attached files:</source> + <translation>קבצים מצורפים:</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="620"/> + <source>About </source> + <translation>אודות </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="623"/> + <source><center>This application allows simple encryption <br>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Viriato/Phol (es), <br>Serse (it), Russell (my),<br>Alessandro (pt_br), Kirill (ru), Tom (vi)<br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> + <translation><center>תוכנה זו מאפשרת הצפנה ופענוח <br>פשוטים של הודעות טקסט וקבצים.<br>היא מופצת תחת רישיון GPL v3<br><br><b>מפתחים:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>תרגום:</b><br>Viriato/Phol (es), <br>Serse (it), Russell (my),<br>Alessandro (pt_br), Kirill (ru),<br>Tom (vi), Elad (he) <br><br>אם יש לך הצעות או שאלות ממולץ להציץ<br/>בדף <a href="http://gpg4usb.cpunk.de/contact.php">יצירת הקשר</a> שלנו או לשלוח מייל <br/> לרשימת התפוצה שלנו <a href="mailto:[email protected]">[email protected]</a>.</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="635"/> + <source><br><br> Built with Qt </source> + <translation><br><br>נבנה בעזרת Qt </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="636"/> + <source> and GPGME </source> + <translation> ו- GPGME </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="741"/> + <source>There is one unencrypted file in attachment folder</source> + <translation>יש קובץ לא מוצפן בספריית הקבצים המצורפים</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="743"/> + <source>There are </source> + <translation>יש </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="743"/> + <source> unencrypted files in attachment folder</source> + <translation> קבצים לא מוצפנים בספריית הקבצים המצורפים</translation> + </message> +</context> +<context> + <name>MimeTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="204"/> + <source>Decode quoted printable</source> + <translation>פענוח ציטוטים</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="206"/> + <source>Try to recognize quoted printable.</source> + <translation>נסה לזהות ציטוטים.</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="210"/> + <source>Parse PGP/MIME (Experimental)</source> + <translation>פרוק PGP/MIME (ניסויני)</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="212"/> + <source>Try to split attachments from PGP-MIME ecrypted messages.</source> + <translation>נסה לחלץ מידע מצורף מהודעות מוצפנות מסוג PGP-MIME.</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="216"/> + <source>Open with external application (Experimental)</source> + <translation>לפתוח בעזרת יישום חיצוני (ניסיוני)</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="218"/> + <source>Open attachments with default application for the filetype.<br> There are at least two possible problems with this behaviour:<ol><li>File needs to be saved unencrypted to attachments folder.<br> Its your job to clean this folder.</li><li>The external application may have its own temp files.</li></ol></source> + <translation>לפתוח קבצים מצורפים בעזרת יישום ברירת המחדל לסוג זה של קובץ.<br> ישנן לפחות שתי בעיות אפשריות בהתנהגות זו:<ol><li>יש לשמור את הקובץ המפוענח לספריית הקבצים המצורפים.<br> זו העבודה שלך לנקות ספרייה זו.</li><li>ליישום החיצוני עשויים להיות קבצים זמניים.</li></ol></translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="225"/> + <source>Enable opening with external applications.</source> + <translation>לפתוח בעזרת יישומים חיצוניים.</translation> + </message> +</context> +<context> + <name>QuitDialog</name> + <message> + <location filename="../../quitdialog.cpp" line="28"/> + <source>Unsaved files</source> + <translation>קבצים שלא נשמרו</translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="74"/> + <source><h3>%1 files contain unsaved information.<br/>Save the changes before closing?</h3></source> + <translation><h3>%1 קבצים מכילים מידע שלא נשמר.<br/>לשמור לפני הסגירה?</h3></translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="85"/> + <source>Check the files you want to save:</source> + <translation>יש לסמן את הקבצים שברצונך לשמור:</translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="86"/> + <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> + <translation><b>זהירות:</b> אי שמירה של קבצים אלו תביא לאובדן המידע.<br/></translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../../settingsdialog.cpp" line="34"/> + <source>General</source> + <translation>כללי</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="35"/> + <source>Appearance</source> + <translation>תצוגה</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="36"/> + <source>PGP/Mime</source> + <translation>PGP/MIME</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="37"/> + <source>Keyserver</source> + <translation>שרת מפתחות</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="38"/> + <source>Advanced</source> + <translation>מתקדם</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="51"/> + <source>Settings</source> + <translation>הגדות</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="72"/> + <source>System Default</source> + <translation>ברירת המחדל של המערכת</translation> + </message> +</context> +<context> + <name>TextEdit</name> + <message> + <location filename="../../textedit.cpp" line="45"/> + <source>untitled</source> + <translation>untitled</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="66"/> + <source>Open file</source> + <translation>פתיחת קובץ</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="90"/> + <location filename="../../textedit.cpp" line="378"/> + <source>Application</source> + <translation>יישום</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="91"/> + <location filename="../../textedit.cpp" line="379"/> + <source>Cannot read file %1: +%2.</source> + <translation>לא ניתן לקרוא את הקובץ %1: +%2.</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="142"/> + <source>File</source> + <translation>קובץ</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="143"/> + <source>Cannot write file %1: +%2.</source> + <translation>לא ניתן לכתוב את הקובץ %1: +%2.</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="165"/> + <source>Save file </source> + <translation>שמירת קובץ</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="231"/> + <source>Unsaved document</source> + <translation>קובץ לא שמור</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="232"/> + <source><h3>The document "%1" has been modified.<br/>Do you want to save your changes?</h3></source> + <translation><h3>המסמך "%1" שונה.<br/>האם ברצונך לשמור את השינויים?</h3></translation> + </message> + <message> + <location filename="../../textedit.cpp" line="233"/> + <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> + <translation><b>זהירות:</b> במידה והקובץ לא יישמר, כל השינויים יאבדו.<br/></translation> + </message> +</context> +<context> + <name>VerifyDetailsDialog</name> + <message> + <location filename="../../verifydetailsdialog.cpp" line="30"/> + <source>Signaturedetails</source> + <translation>נתוני חתימה</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="61"/> + <source>Error Validating signature</source> + <translation>שגיאה באימות החתימה</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="67"/> + <source>Text was completely signed on + %1 by: +</source> + <translation>כל הטקסט נחתם ב- + %1 על-ידי: +</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="72"/> + <source>Text was partially signed on + %1 by: +</source> + <translation>חלק מהטקסט נחתם ב- + %1 על-ידי: +</translation> + </message> +</context> +<context> + <name>VerifyKeyDetailBox</name> + <message> + <location filename="../../verifykeydetailbox.cpp" line="37"/> + <source>Import from keyserver</source> + <translation>ליבא משרת מפתחות</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="42"/> + <location filename="../../verifykeydetailbox.cpp" line="57"/> + <location filename="../../verifykeydetailbox.cpp" line="72"/> + <source>Status:</source> + <translation>מצב:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="56"/> + <location filename="../../verifykeydetailbox.cpp" line="73"/> + <source>Fingerprint:</source> + <translation>טביעת אצבע:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="44"/> + <source>Key not present in keylist</source> + <translation>המפתח לא נמצא ברשימת המפתחות</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="40"/> + <source>Key not present with id 0x</source> + <translation>המפתח לא נמצא עם מזהה 0x</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="54"/> + <location filename="../../verifykeydetailbox.cpp" line="70"/> + <source>Name:</source> + <translation>שם:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="55"/> + <location filename="../../verifykeydetailbox.cpp" line="71"/> + <source>EMail:</source> + <translation>דוא"ל:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="62"/> + <source>OK</source> + <translation>בסדר</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="69"/> + <source>Error for key with id 0x</source> + <translation>שגיאה עבור מפתח עם מזהה 0x</translation> + </message> +</context> +<context> + <name>VerifyNotification</name> + <message> + <location filename="../../verifynotification.cpp" line="35"/> + <source>Import missing key from Keyserver</source> + <translation>ליבא מפתח חסר משרת מפתחות</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="38"/> + <source>Show detailed verify information</source> + <translation>להציג מידע מפורט לאימות</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="47"/> + <source>Details</source> + <translation>נתונים</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="117"/> + <source>Key not present with id 0x</source> + <translation>מפתח לא נמצא עם מזהה 0x</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="159"/> + <source>Error validating signature by: </source> + <translation>שגיאה באימות חתימה על-ידי:</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="164"/> + <source>Text was completely signed by: </source> + <translation>כל הטקסט נחתם על-ידי:</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="169"/> + <source>Text was partially signed by: </source> + <translation>חלק מהתקסט נחתם על-ידי:</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="147"/> + <source>Error for key with fingerprint </source> + <translation>שגיאה עבור מפתח עם טביעת האצבע</translation> + </message> +</context> +<context> + <name>Wizard</name> + <message> + <location filename="../../wizard.cpp" line="40"/> + <source>First Start Wizard</source> + <translation>באיתחול הפעל את האשף</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="73"/> + <source>Import Error</source> + <translation>שגיאת יבוא</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="73"/> + <source>Couldn't locate any keyring file in %1</source> + <translation>לא מצאתי את קובץ טבעת המפתחות ב- %1</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="81"/> + <location filename="../../wizard.cpp" line="91"/> + <source>Import error</source> + <translation>שגיאת יבוא</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="81"/> + <source>Couldn't open private keyringfile: %1</source> + <translation>לא ניתן לפתוח את קובץ טבעת המפתחות הפרטיים: %1</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="91"/> + <source>Couldn't open public keyringfile: %1</source> + <translation>לא ניתן לפתוח את קובץ טבעת המפתחות הציבוריים: %1</translation> + </message> +</context> +</TS> diff --git a/release/ts/gpg4usb_my.ts b/release/ts/gpg4usb_my.ts index 1f29646..1ff72c0 100644 --- a/release/ts/gpg4usb_my.ts +++ b/release/ts/gpg4usb_my.ts @@ -116,10 +116,6 @@ %2.</source> <translation type="unfinished"></translation> </message> - <message> - <source>Cannot write file %1: %2.</source> - <translation type="obsolete">ဖိုင် %1: %2 ကို ရေးလို့မရပါ။</translation> - </message> </context> <context> <name>ChoosePage</name> @@ -212,10 +208,6 @@ <translation>လုပ်ဆောင်ချက်</translation> </message> <message> - <source>...</source> - <translation type="obsolete">...</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="31"/> <source>Decrypt File</source> <translation type="unfinished"></translation> @@ -267,14 +259,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>couldn't open file:</source> - <translation type="obsolete">ဖိုင်ကို ဖွင့်လို့ မရပါ -</translation> - </message> - <message> - <source>Cannot write file %1: %2.</source> - <translation type="obsolete">ဖိုင် %1: %2 ကို ရေးလို့ မရပါ။</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="171"/> <source>File exists! Do you want to overwrite it?</source> <translation>ဖိုင် ရှိနေတယ်။ အဲဒီဖိုင်ကို ဖျက်လိုပါသလား။</translation> @@ -317,49 +301,6 @@ <source>Language</source> <translation>ဘာသာစကား</translation> </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">ဘာသာစကား အပြောင်းအလဲကို ပရိုဂရမ် ပြန်ဖွင့်တဲ့အခါ အတည်ပြုသွားမှာ ဖြစ်တယ်။</translation> - </message> - <message> - <source>System Default</source> - <translation type="obsolete">နည်းစနစ် သတ်မှတ်ချက်</translation> - </message> -</context> -<context> - <name>GpgME::Context</name> - <message> - <source>No Key Selected</source> - <translation type="obsolete">ကီး ရွေးချယ်မထားပါ</translation> - </message> - <message> - <source>Unsupported algorithm</source> - <translation type="obsolete">ပံ့ပိုးမထားတဲ့ အယ်လဂိုရီသမ်</translation> - </message> - <message> - <source>Error decrypting:</source> - <translation type="obsolete">စာဝှက်ဖြည်နေစဉ် အမှားအယွင်း ဖြစ်ပေါ်နေတယ် -</translation> - </message> - <message> - <source>Wrong password</source> - <translation type="obsolete">စကားဝှက် မှားနေတယ်</translation> - </message> - <message> - <source>Enter Password</source> - <translation type="obsolete">စကားဝှက်ကို ရေးထည့်ရန်</translation> - </message> - <message> - <source>Key Selection</source> - <translation type="obsolete">ကီး ရွေးချယ်မှု</translation> - </message> - <message> - <source>No Private Key Selected</source> - <translation type="obsolete">Private ကီး ရွေးချယ်မထားပါ</translation> - </message> - <message> - <source>Error signing:</source> - <translation type="obsolete">လက်မှတ်ရေးထိုးနေစဉ် အမှားအယွင်း ဖြစ်ပေါ်နေတယ် -</translation> - </message> </context> <context> <name>GpgME::GpgContext</name> @@ -415,333 +356,6 @@ </message> </context> <context> - <name>GpgWin</name> - <message> - <source>&Open...</source> - <translation type="obsolete">ဖွင့်ရန်...</translation> - </message> - <message> - <source>Open an existing file</source> - <translation type="obsolete">ရှိပြီးသား ဖိုင်ကို ဖွင့်ရန်</translation> - </message> - <message> - <source>&Save</source> - <translation type="obsolete">သိမ်းဆည်းရန်</translation> - </message> - <message> - <source>Save the current File</source> - <translation type="obsolete">လက်ရှိ ဖိုင်ကို သိမ်းဆည်းရန်</translation> - </message> - <message> - <source>Save &As</source> - <translation type="obsolete">သိမ်းဆည်းမဲ့ ပုံစံ</translation> - </message> - <message> - <source>Save the current File as...</source> - <translation type="obsolete">လက်ရှိ ဖိုင်ကို သိမ်းဆည်းမဲ့ ပုံစံ...</translation> - </message> - <message> - <source>&Print</source> - <translation type="obsolete">ပရင့်ထုတ်ရန်</translation> - </message> - <message> - <source>Print Document</source> - <translation type="obsolete">မှတ်တမ်းမှတ်ရာကို ပရင့်ထုတ်ရန်</translation> - </message> - <message> - <source>&Close</source> - <translation type="obsolete">ပိတ်ရန်</translation> - </message> - <message> - <source>Close file</source> - <translation type="obsolete">ဖိုင်ကို ပိတ်ရန်</translation> - </message> - <message> - <source>&Quit</source> - <translation type="obsolete">ပိတ်ရန်</translation> - </message> - <message> - <source>Quit Program</source> - <translation type="obsolete">ပရိုဂရမ်ကို ပိတ်ရန်</translation> - </message> - <message> - <source>&Undo</source> - <translation type="obsolete">ပြန်ပြင်ရန်</translation> - </message> - <message> - <source>Undo Last Edit Action</source> - <translation type="obsolete">နောက်ဆုံး တည်းဖြတ်မှုကို ပြန်ပြင်ရန်</translation> - </message> - <message> - <source>&Redo</source> - <translation type="obsolete">ပြန်ဖြည်ရန်</translation> - </message> - <message> - <source>Redo Last Edit Action</source> - <translation type="obsolete">နောက်ဆုံး လုပ်ဆောင်ချက်ကို ပြန်ဖြည်ရန်</translation> - </message> - <message> - <source>&Paste</source> - <translation type="obsolete">ပွားရန်</translation> - </message> - <message> - <source>Paste Text From Clipboard</source> - <translation type="obsolete">Clipboard ထဲက စာသားကို ပွားရန်</translation> - </message> - <message> - <source>Cu&t</source> - <translation type="obsolete">ဖြတ်ထုတ်ရန်</translation> - </message> - <message> - <source>Cut the current selection's contents to the clipboard</source> - <translation type="obsolete">လက်ရှိ ရွေးချယ်ထားတဲ့ အကြောင်းအရာကို clipboard ထဲကို ဖြတ်ယူရန်</translation> - </message> - <message> - <source>&Copy</source> - <translation type="obsolete">ကော်ပီကူးရန်</translation> - </message> - <message> - <source>Copy the current selection's contents to the clipboard</source> - <translation type="obsolete">လက်ရှိ ရွေးချယ်ထားတဲ့ အကြောင်းအရာများကို clipboard ထဲ ကော်ပီကူးရန်</translation> - </message> - <message> - <source>&Quote</source> - <translation type="obsolete">ကိုးကားရန်</translation> - </message> - <message> - <source>Quote whole text</source> - <translation type="obsolete">စာသား တခုလုံးကို ကိုးကားရန်</translation> - </message> - <message> - <source>Select &All</source> - <translation type="obsolete">အားလုံးကို ရွေးချယ်ရန်</translation> - </message> - <message> - <source>Select the whole text</source> - <translation type="obsolete">စာသား တခုလုံးကို ရွေးချယ်ရန်</translation> - </message> - <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">နှစ်ထပ် မျဉ်းကြောင်းကို ဖယ်ရှားရန်</translation> - </message> - <message> - <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation type="obsolete">နှစ်ထပ် မျဉ်းကြောင်းကို ဖယ်ရှားရန်၊ ဥပမာ - webmailer ကနေ ပွားယူလိုက်တဲ့ စာသားထဲမှ</translation> - </message> - <message> - <source>Open settings dialog</source> - <translation type="obsolete">settings dialog ကို ဖွင့်ရန်</translation> - </message> - <message> - <source>&Encrypt</source> - <translation type="obsolete">စာဝှက်ရန်</translation> - </message> - <message> - <source>Encrypt Message</source> - <translation type="obsolete">ပေးစာကို စာဝှက်ရန်</translation> - </message> - <message> - <source>&Decrypt</source> - <translation type="obsolete">စာဝှက်ဖြည်ရန်</translation> - </message> - <message> - <source>Decrypt Message</source> - <translation type="obsolete">ပေးစာကို စာဝှက်ဖြည်ရန်</translation> - </message> - <message> - <source>&File Encryption</source> - <translation type="obsolete">ဖိုင်ကို စာဝှက်ခြင်း</translation> - </message> - <message> - <source>Encrypt/Decrypt File</source> - <translation type="obsolete">ဖိုင်ကို စာဝှက်ရန်/စာဝှက်ဖြည်ရန်</translation> - </message> - <message> - <source>&Sign</source> - <translation type="obsolete">လက်မှတ်ရေးထိုးရန်</translation> - </message> - <message> - <source>Sign Message</source> - <translation type="obsolete">ပေးစာကို လက်မှတ်ရေးထိုးရန်</translation> - </message> - <message> - <source>&Verify</source> - <translation type="obsolete">အတည်ပြုရန်</translation> - </message> - <message> - <source>Verify Message</source> - <translation type="obsolete">ပေးစာကို အတည်ပြုရန်</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>ဒီလုပ်ငန်းသုံး ဆော့ဗ်ဝဲကို အသုံးပြုပြီး ပေးစာများ (သို့) ဖိုင်များကို <br/>ရိုးရိုး စာဝှက်ပေးခြင်းနဲ့၊ စာဝှက်ဖြည်ခြင်း ပြုလုပ်နိုင်တယ်။<br>၄င်းကို GPL v3 အောက်မှာ လိုင်စင် ပြုလုပ်ထားတယ်။<br><br><b>ဖန်တီး လုပ်ဆောင်သူများ -</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>ဘာသာပြန်ဆိုခြင်း -</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>အကယ်လို့ သင့်မှာ မေးစရာ မေးခွန်များ (သို့) အကြံပြုချက်များ ရှိရင်<br/>ကျွန်ုပ်တို့ရဲ့ <a href="http://gpg4usb.cpunk.de/contact.php">ဆက်သွယ်ရန် စာမျက်နှာ</a> ကို သွားရောက်နိုင်တယ် <br/> (သို့) ကျွန်ုပ်တို့ရဲ့ အီးမေးလ် အုပ်စု<a href="mailto:[email protected]">[email protected]</a>ကို စာ ရေးသားပေးပို့နိုင်တယ်။</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">ကီးဆာဗာ</translation> - </message> - <message> - <source>Import New Key From Editor</source> - <translation type="obsolete">ကီး အသစ်ကို အယ်ဒီတာကနေ တင်သွင်းရန်</translation> - </message> - <message> - <source>Key Management</source> - <translation type="obsolete">ကီး စီမံခန့်ခွဲရေး</translation> - </message> - <message> - <source>Open Keymanagement</source> - <translation type="obsolete">Keymanagement ကို ဖွင့်ရန်</translation> - </message> - <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">Import New Key Dialog ကို ဖွင့်ရန်</translation> - </message> - <message> - <source>&About</source> - <translation type="obsolete">အကြောင်းအရာ</translation> - </message> - <message> - <source>Show the application's About box</source> - <translation type="obsolete">ဒီလုပ်ငန်းသုံး ဆော့ဗ်ဝဲရဲ့ အကြောင်းအရာ ဇယားကို ဖေါ်ပြရန်</translation> - </message> - <message> - <source>&File</source> - <translation type="obsolete">ဖိုင်</translation> - </message> - <message> - <source>&Edit</source> - <translation type="obsolete">တည်းဖြတ်ရန်</translation> - </message> - <message> - <source>&Help</source> - <translation type="obsolete">အကူအညီ</translation> - </message> - <message> - <source>Append Selected Key(s) To Text</source> - <translation type="obsolete">ရွေးချယ်ထားတဲ့ ကီး(များ)ကို စာသားနဲ့ ပူးတွဲပေးရန်</translation> - </message> - <message> - <source>Se&ttings</source> - <translation type="obsolete">ချိန်ညှိချက်များ</translation> - </message> - <message> - <source>&New</source> - <translation type="obsolete">အသစ်</translation> - </message> - <message> - <source>Open a new file</source> - <translation type="obsolete">ဖိုင်အသစ် ဖွင့်ရန်</translation> - </message> - <message> - <source>Online &Tutorial</source> - <translation type="obsolete">အွန်လိုင်း သင်တန်းလမ်းညွှန်</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">အွန်လိုင်း သင်တန်းလမ်းညွှန်ကို ဖွင့်ရန်</translation> - </message> - <message> - <source>Translate gpg4usb</source> - <translation type="obsolete">gpg4usb ကို ဘာသာပြန်ဆိုရန်</translation> - </message> - <message> - <source>Translate gpg4usb yourself</source> - <translation type="obsolete">gpg4usb ကို ကိုယ်တိုင် ဘာသာပြန်ဆိုရန်</translation> - </message> - <message> - <source>Append The Selected Keys To Text in Editor</source> - <translation type="obsolete">ရွေးချယ်ထားတဲ့ ကီးများကို အယ်ဒီတာထဲမှာ စာသားနဲ့ ပူးတွဲပေးရန်</translation> - </message> - <message> - <source>Copy EMail-address</source> - <translation type="obsolete">အီးမေးလ် လိပ်စာကို ကော်ပီကူးရန်</translation> - </message> - <message> - <source>Copy selected EMailaddress to clipboard</source> - <translation type="obsolete">အီးမေးလ် လိပ်စာကို clipboard မှာ ကော်ပီကူးရန်</translation> - </message> - <message> - <source>Show Keydetails</source> - <translation type="obsolete">ကီးအကြောင်း အသေးစိတ်ကို ဖေါ်ပြရန်</translation> - </message> - <message> - <source>Show Details for this Key</source> - <translation type="obsolete">ဒီကီးအကြောင်း အသေးစိတ်ကို ဖေါ်ပြရန်</translation> - </message> - <message> - <source>&Keys</source> - <translation type="obsolete">ကီး</translation> - </message> - <message> - <source>&Import Key From...</source> - <translation type="obsolete">ကီးကို တင်သွင်းရမဲ့ နေရာ...</translation> - </message> - <message> - <source>&View</source> - <translation type="obsolete">ကြည့်ရှုရန်</translation> - </message> - <message> - <source>Ready</source> - <translation type="obsolete">အဆင်သင့်</translation> - </message> - <message> - <source>Encrypt for:</source> - <translation type="obsolete">စာဝှက်မဲ့အချက် -</translation> - </message> - <message> - <source>Attached files:</source> - <translation type="obsolete">ပူးတွဲထားတဲ့ ဖိုင်များ -</translation> - </message> - <message> - <source>There is one unencrypted file in attachment folder</source> - <translation type="obsolete">ပူးတွဲထားတဲ့ ဖိုင်ထဲမှာ စာဝှက်မထားတဲ့ ဖိုင်တခု ရှိတယ်</translation> - </message> - <message> - <source>There are</source> - <translation type="obsolete">ပါ၀င်တဲ့အချက်</translation> - </message> - <message> - <source>unencrypted files in attachment folder</source> - <translation type="obsolete">ပူးတွဲထားတဲ့ ဖိုင်တွဲထဲက စာဝှက်မထားတဲ့ ဖိုင်များ</translation> - </message> - <message> - <source>&Editor</source> - <translation type="obsolete">အယ်ဒီတာ</translation> - </message> - <message> - <source>&Clipboard</source> - <translation type="obsolete">&Clipboard</translation> - </message> - <message> - <source>Import Key</source> - <translation type="obsolete">ကီးကို တင်သွင်းရန်</translation> - </message> - <message> - <source>&Crypt</source> - <translation type="obsolete">စာဝှက်ရန်</translation> - </message> - <message> - <source>Crypt</source> - <translation type="obsolete">စာဝှက်ရန်</translation> - </message> - <message> - <source>Key</source> - <translation type="obsolete">ကီး</translation> - </message> - <message> - <source>Edit</source> - <translation type="obsolete">တည်းဖြတ်ရန်</translation> - </message> - <message> - <source>About</source> - <translation type="obsolete">အကြောင်းအရာ</translation> - </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">ကီးကို တင်သွင်းရမဲ့ နေရာ...</translation> - </message> -</context> -<context> <name>ImportFromGnupgPage</name> <message> <location filename="../../wizard.cpp" line="288"/> @@ -923,18 +537,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>Expires on:</source> - <translation type="obsolete">သက်တမ်း ကုန်ဆုံးချိန် -</translation> - </message> - <message> - <source>Created on:</source> - <translation type="obsolete">ဖန်တီးတဲ့ နေ့စွဲ -</translation> - </message> - <message> - <source>Key ID:</source> - <translation type="obsolete">ကီး ID -</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="158"/> <source>Warning: Key expired</source> <translation>သတိပေးချက် - ကီးရဲ့ သက်တမ်း ကုန်ဆုံးပြီ</translation> @@ -967,19 +569,11 @@ Make sure you keep it save.Do you really want to export your private key?</sourc <translation>ကီး အရွယ်အစား -</translation> </message> <message> - <source>Algorithm:</source> - <translation type="obsolete">ဘယ်လဂိုရီသမ် -</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="50"/> <source>Never</source> <translation>လုံး၀</translation> </message> <message> - <source>/ Never</source> - <translation type="obsolete">/ လုံး၀</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="139"/> <source>Private Key</source> <translation>Private ကီး</translation> @@ -995,10 +589,6 @@ Make sure you keep it save.Do you really want to export your private key?</sourc <translation>Private ကီးကို တင်ပို့နေတယ်</translation> </message> <message> - <source>You are about to export your private key. This is NOT your public key, so don't give it away. Make sure you keep it save.</source> - <translation type="obsolete">သင်ဟာ သင့်ရဲ့ private ကီးကို တင်ပို့ဖို့ လုပ်ဆောင်နေတယ်။ ဒါဟာ သင့်ရဲ့ public ကီးမဟုတ်တဲ့အတွက်၊ ဒီတိုင်း ပစ်မထားပဲ၊ လုံလုံခြုံခြုံ သိမ်းဆည်းထားပါ။</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="199"/> <source>Export Key To File</source> <translation>ကီးကို ဖိုင်အဖြစ် တင်ပို့ရန်</translation> @@ -1263,18 +853,10 @@ Weak -> Strong</source> <translation type="unfinished"></translation> </message> <message> - <source>You've dropped something on the keylist. gpg4usb will now try to import key(s).</source> - <translation type="obsolete">ကီးစာရင်းထဲမှာ သင် တစုံတခု ထည့်သွင်းထားတယ်။ အခု gpg4usb က ကီးတွေကို တင်သွင်းလာလိမ့်မယ်။</translation> - </message> - <message> <location filename="../../keylist.cpp" line="198"/> <source>Always import without bothering.</source> <translation>အနှောင့်အယှက် မရှိပဲ အမြဲတမ်း တင်သွင်းရန်။</translation> </message> - <message> - <source>Couldn't Open File:</source> - <translation type="obsolete">ဖိုင်ကို ဖွင့်လို့ မရပါ -</translation> - </message> </context> <context> <name>KeyMgmt</name> @@ -1441,10 +1023,6 @@ Weak -> Strong</source> <translation>ကီးဖိုင်များ</translation> </message> <message> - <source>Couldn't Open File:</source> - <translation type="obsolete">ဖိုင်ကို ဖွင့်မရပါ -</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="221"/> <source>Deleting Keys</source> <translation>ကီးများကို ပယ်ဖျက်ရန်</translation> @@ -1464,62 +1042,6 @@ Weak -> Strong</source> <source>Export Key To File</source> <translation>ကီးကို ဖိုင်အဖြစ် တင်ပို့ရန်</translation> </message> - <message> - <source>Name:</source> - <translation type="obsolete">နာမည် -</translation> - </message> - <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">အီးမေးလ် လိပ်စာ -</translation> - </message> - <message> - <source>Comment:</source> - <translation type="obsolete">မှတ်ချက် -</translation> - </message> - <message> - <source>KeySize (in Bit):</source> - <translation type="obsolete">ကီး အရွယ်အစား (Bit) -</translation> - </message> - <message> - <source>Expiration Date:</source> - <translation type="obsolete">သက်တမ်း ကုန်ဆုံးချိန် -</translation> - </message> - <message> - <source>Password:</source> - <translation type="obsolete">စကားဝှက် -</translation> - </message> - <message> - <source>Repeat Password:</source> - <translation type="obsolete">စကားဝှက်ကို ထပ်ရေးရန် -</translation> - </message> - <message> - <source>Never Expire</source> - <translation type="obsolete">သက်တမ်း ကုန်ဆုံးချိန် မရှိ</translation> - </message> - <message> - <source>Password: Strength Weak -> Strong</source> - <translation type="obsolete">စကားဝှက် - ကြံ့ခိုင်မှု အားနည်း -> အားကောင်း</translation> - </message> - <message> - <source>Password Strength</source> - <translation type="obsolete">စကားဝှက်ရဲ့ ကြံ့ခိုင်မှု</translation> - </message> - <message> - <source>Name must contain at least five characters.</source> - <translation type="obsolete">နာမည်ထဲမှာ အနည်းဆုံး အက္ခရာစာလုံး ငါးလုံး ပါဝင်ရမယ်။</translation> - </message> - <message> - <source>Password and Repeat don't match.</source> - <translation type="obsolete">စကားဝှက်နဲ့ ထပ်မံ ရေးသားချက် မကိုက်ညီပါ။</translation> - </message> - <message> - <source>Generating Key...</source> - <translation type="obsolete">ကီး ထုတ်လုပ်ရန်...</translation> - </message> - <message> - <source>Collecting random data for key generation. This may take a while. To speed up the process use your computer (e.g. browse the net, listen to music,...)</source> - <translation type="obsolete">ကီး ထုတ်လုပ်ဖို့ ကျပန်း ဒေတာများကို စုဆောင်းနေတယ်။ အချိန်အတော်ကြာ ယူနိုင်တယ်။ လုပ်ငန်းကို အရှိန်မြှင့်ဖို့ ကွန်ပျူတာ အသုံးပြုပါ (ဥပမာ - အင်တာနက်ကို သုံးပါ၊ တေးသီချင်းများ နားဆင်ပါ၊...)</translation> - </message> </context> <context> <name>KeyServerImportDialog</name> @@ -1574,52 +1096,52 @@ Weak -> Strong</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="153"/> + <location filename="../../keyserverimportdialog.cpp" line="154"/> <source>Couldn't contact keyserver!</source> <translation>ကီးဆာဗာကို ဆက်သွယ်လို့ မရပါ။</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="161"/> + <location filename="../../keyserverimportdialog.cpp" line="162"/> <source>Too many responses from keyserver!</source> <translation>ကီးဆာဗာဆီရဲ့ တုံ့ပြန်ချက် အလွန်များပြားနေတယ်။</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="167"/> + <location filename="../../keyserverimportdialog.cpp" line="168"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation>ကီး မတွေ့ရှိပါ၊ ဖြည့်သွင်းချက်ဟာ kexId ဖြစ်နေနိုင်တယ်၊ 0x ကို အသုံးပြုပြီး ထပ်မံရှာဖွေပါ။</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="171"/> + <location filename="../../keyserverimportdialog.cpp" line="172"/> <source>No keys found containing the search string!</source> <translation>ရှာဖွေနေတဲ့ အက္ခရာစာလုံး ပါတဲ့ ကီးကို မတွေ့ရှိပါ။</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="174"/> + <location filename="../../keyserverimportdialog.cpp" line="175"/> <source>Insufficiently specific search string!</source> <translation>ပြည့်စုံမှု မရှိတဲ့ ရှာဖွေရေး အက္ခရာစာလုံး။</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="201"/> + <location filename="../../keyserverimportdialog.cpp" line="203"/> <source>revoked</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="204"/> + <location filename="../../keyserverimportdialog.cpp" line="206"/> <source>disabled</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="243"/> + <location filename="../../keyserverimportdialog.cpp" line="245"/> <source>%1 keys found. Doubleclick a key to import it.</source> <translation>ကီး %1 ခုကို တွေ့ရှိရတယ်။ သူ့ကို တင်သွင်းဖို့ ကီးတခုကို နှစ်ချက် နှိပ်ပါ။</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="288"/> + <location filename="../../keyserverimportdialog.cpp" line="291"/> <source>Error while contacting keyserver!</source> <translation>ကီးဆာဗာကို ဆက်သွယ်နေစဉ် အမှားအယွင်း ဖြစ်ပေါ်နေတယ်။</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="292"/> + <location filename="../../keyserverimportdialog.cpp" line="295"/> <source>Key imported</source> <translation>တင်သွင်းလိုက်တဲ့ ကီး</translation> </message> @@ -2185,11 +1707,6 @@ Weak -> Strong</source> <context> <name>SettingsDialog</name> <message> - <source>English</source> - <comment>Insert local name of language here. This is used for the language menu of the settingsdialog</comment> - <translation type="obsolete">English</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="34"/> <source>General</source> <translation>အထွေထွေ</translation> @@ -2224,10 +1741,6 @@ Weak -> Strong</source> <source>System Default</source> <translation type="unfinished">နည်းစနစ် သတ်မှတ်ချက်</translation> </message> - <message> - <source>English</source> - <translation type="obsolete">အင်္ဂလိပ် (My)</translation> - </message> </context> <context> <name>TextEdit</name> @@ -2266,23 +1779,11 @@ Weak -> Strong</source> <translation type="unfinished"></translation> </message> <message> - <source>Cannot read file %1: %2.</source> - <translation type="obsolete">ဖိုင် %1: %2 ကို ဖတ်လို့ မရဘူး။</translation> - </message> - <message> <location filename="../../textedit.cpp" line="142"/> <source>File</source> <translation>ဖုိင်</translation> </message> <message> - <source>Cannot write file %1: %2.</source> - <translation type="obsolete">ဖိုင် %1: %2 ကို ရေးလို့ မရဘူး။</translation> - </message> - <message> - <source>Save file</source> - <translation type="obsolete">ဖိုင်ကို သိမ်းဆည်းရန်</translation> - </message> - <message> <location filename="../../textedit.cpp" line="231"/> <source>Unsaved document</source> <translation>သိမ်းဆည်းမထားတဲ့ မှတ်တမ်းမှတ်ရာများ</translation> @@ -2324,14 +1825,6 @@ Weak -> Strong</source> </source> <translation type="unfinished"></translation> </message> - <message> - <source>Text was completely signed on %1 by:</source> - <translation type="obsolete">စသားကို %1 မှာ အပြည့်အစုံ လက်မှတ်ရေးထိုးပေးတဲ့သူ -</translation> - </message> - <message> - <source>Text was partially signed on %1 by:</source> - <translation type="obsolete">စာသားကို %1 တပိုင်းတစနဲ့ လက်မှတ်ရေးထိုးပေးသူ -</translation> - </message> </context> <context> <name>VerifyKeyDetailBox</name> @@ -2428,22 +1921,6 @@ Weak -> Strong</source> <source>Text was partially signed by: </source> <translation type="unfinished"></translation> </message> - <message> - <source>Error validating signature by:</source> - <translation type="obsolete">လက်မှတ် အတည်ပြုမှု အမှားအယွင်းကို ဖန်တီးသူ -</translation> - </message> - <message> - <source>Text was completely signed by:</source> - <translation type="obsolete">စာသားကို အပြည့်အစုံ လက်မှတ်ရေးထိုးသူ -</translation> - </message> - <message> - <source>Text was partially signed by:</source> - <translation type="obsolete">စာသားကို တပိုင်းတစနဲ့ လက်မှတ်ရေးထိုးသူ -</translation> - </message> - <message> - <source>Error for key with fingerprint</source> - <translation type="obsolete">လက်ဗွေပါတဲ့ ကီးရဲ့ မှားယွင်းချက်</translation> - </message> </context> <context> <name>Wizard</name> diff --git a/release/ts/gpg4usb_pt_BR.ts b/release/ts/gpg4usb_pt_BR.ts index 565a208..dad2783 100644 --- a/release/ts/gpg4usb_pt_BR.ts +++ b/release/ts/gpg4usb_pt_BR.ts @@ -164,14 +164,6 @@ <context> <name>ConclusionPage</name> <message> - <source>Finish Start Wizard</source> - <translation type="obsolete">Terminar o Auxiliar de Primeiro Uso</translation> - </message> - <message> - <source>You're ready to encrypt and decrpt now.</source> - <translation type="obsolete">Agora você está preparado para encriptar e decriptar.</translation> - </message> - <message> <location filename="../../wizard.cpp" line="391"/> <source>Ready.</source> <translation>Pronto.</translation> @@ -217,10 +209,6 @@ <translation>Ação</translation> </message> <message> - <source>...</source> - <translation type="obsolete">...</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="31"/> <source>Decrypt File</source> <translation>Decriptar Arquivo</translation> @@ -266,23 +254,11 @@ <translation>O arquivo existe! Deseja sobreescrever?</translation> </message> <message> - <source>Files</source> - <translation type="obsolete">Arquivos</translation> - </message> - <message> - <source>All Files (*)</source> - <translation type="obsolete">Todos os Arquivos (*)</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="142"/> <source>Save File</source> <translation>Salvar Arquivo</translation> </message> <message> - <source>couldn't open file: </source> - <translation type="obsolete">não pode abrir o arquivo: </translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="180"/> <source>Cannot write file %1: %2.</source> @@ -327,49 +303,6 @@ <source>Language</source> <translation>Idioma</translation> </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">A alteração de idioma será aplicada após reiniciar o programa.</translation> - </message> - <message> - <source>System Default</source> - <translation type="obsolete">Padrão do Sistema</translation> - </message> -</context> -<context> - <name>GpgME::Context</name> - <message> - <source>No Key Selected</source> - <translation type="obsolete">Chave Não Selecionada</translation> - </message> - <message> - <source>Unsupported algorithm</source> - <translation type="obsolete">Algorítmo não suportado</translation> - </message> - <message> - <source>Error decrypting:</source> - <translation type="obsolete">Erro ao decriptar:</translation> - </message> - <message> - <source>Wrong password</source> - <translation type="obsolete">Senha errada</translation> - </message> - <message> - <source>Enter Password</source> - <translation type="obsolete">Insira a Senha</translation> - </message> - <message> - <source>Key Selection</source> - <translation type="obsolete">Seleção de chave</translation> - </message> - <message> - <source>No Private Key Selected</source> - <translation type="obsolete">Chave privada não selecionada</translation> - </message> - <message> - <source>Error signing:</source> - <translation type="obsolete">Erro durante assinatura:</translation> - </message> </context> <context> <name>GpgME::GpgContext</name> @@ -425,462 +358,6 @@ </message> </context> <context> - <name>GpgWin</name> - <message> - <source>&Open...</source> - <translation type="obsolete">&Abrir...</translation> - </message> - <message> - <source>Ctrl+O</source> - <translation type="obsolete">Ctrl+A</translation> - </message> - <message> - <source>Open an existing file</source> - <translation type="obsolete">Abrir um arquivo existente</translation> - </message> - <message> - <source>&Save</source> - <translation type="obsolete">&Salvar</translation> - </message> - <message> - <source>Ctrl+S</source> - <translation type="obsolete">Ctrl+S</translation> - </message> - <message> - <source>Save the current File</source> - <translation type="obsolete">Salvar o arquivo atual</translation> - </message> - <message> - <source>Save &As</source> - <translation type="obsolete">Salvar Co&mo</translation> - </message> - <message> - <source>Ctrl+A</source> - <translation type="obsolete">Ctrl+M</translation> - </message> - <message> - <source>Save the current File as...</source> - <translation type="obsolete">Salvar o arquivo atual como...</translation> - </message> - <message> - <source>&Print</source> - <translation type="obsolete">&Imprimir</translation> - </message> - <message> - <source>Ctrl+P</source> - <translation type="obsolete">Ctrl+I</translation> - </message> - <message> - <source>Print Document</source> - <translation type="obsolete">Imprimir Documento</translation> - </message> - <message> - <source>&Quit</source> - <translation type="obsolete">Sai&r</translation> - </message> - <message> - <source>Ctrl+Q</source> - <translation type="obsolete">Ctrl+R</translation> - </message> - <message> - <source>Quit Program</source> - <translation type="obsolete">Sair</translation> - </message> - <message> - <source>&Paste</source> - <translatorcomment>i used this without accelerator & to avoid confusion with windows native paste (ctrl+v)</translatorcomment> - <translation type="obsolete">&Colar</translation> - </message> - <message> - <source>Ctrl+V</source> - <translation type="obsolete">Ctrl+V</translation> - </message> - <message> - <source>Paste Text From Clipboard</source> - <translation type="obsolete">Colar Texto da Área de Transferência</translation> - </message> - <message> - <source>Cu&t</source> - <translatorcomment>i used this without accelerator & to avoid confusion with native windows cut ctrl+x</translatorcomment> - <translation type="obsolete">&Recortar</translation> - </message> - <message> - <source>Ctrl+X</source> - <translation type="obsolete">Ctrl+X</translation> - </message> - <message> - <source>Cut the current selection's contents to the clipboard</source> - <translation type="obsolete">Recortar a seleção atual para a Área de Transferência</translation> - </message> - <message> - <source>&Copy</source> - <translation type="obsolete">&Copiar</translation> - </message> - <message> - <source>Ctrl+C</source> - <translation type="obsolete">Ctrl+C</translation> - </message> - <message> - <source>Copy the current selection's contents to the clipboard</source> - <translation type="obsolete">Copiar a seleção para a área de transferência</translation> - </message> - <message> - <source>Select &All</source> - <translation type="obsolete">Selecionar &Tudo</translation> - </message> - <message> - <source>Select the whole text</source> - <translation type="obsolete">Selecionar todo texto</translation> - </message> - <message> - <source>Se&ttings</source> - <translation type="obsolete">Con&figurações</translation> - </message> - <message> - <source>Open settings dialog</source> - <translation type="obsolete">Abrir janela de configurações</translation> - </message> - <message> - <source>&Encrypt</source> - <translation type="obsolete">&Encriptar</translation> - </message> - <message> - <source>Ctrl+E</source> - <translation type="obsolete">Ctrl+E</translation> - </message> - <message> - <source>Encrypt Message</source> - <translation type="obsolete">Encriptar Mensagem</translation> - </message> - <message> - <source>&Decrypt</source> - <translation type="obsolete">&Decriptar</translation> - </message> - <message> - <source>Ctrl+D</source> - <translation type="obsolete">Ctrl+D</translation> - </message> - <message> - <source>Decrypt Message</source> - <translation type="obsolete">Decriptar Mensagem</translation> - </message> - <message> - <source>&File Encryption</source> - <translation type="obsolete">Encriptar &Arquivo</translation> - </message> - <message> - <source>Encrypt/Decrypt File</source> - <translation type="obsolete">Encriptar/Decriptar Arquivo</translation> - </message> - <message> - <source>Import New Key From File</source> - <translation type="obsolete">Importar Nova Chave do Arquivo</translation> - </message> - <message> - <source>Import New Key From Editor</source> - <translation type="obsolete">Importar Nova Chave do Editor</translation> - </message> - <message> - <source>Key Management</source> - <translation type="obsolete">Gerenciador de Chaves</translation> - </message> - <message> - <source>Open Keymanagement</source> - <translation type="obsolete">Abrir Gerenciador de Chaves</translation> - </message> - <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">Abrir Diálogo de Importação de Nova Chave</translation> - </message> - <message> - <source>&About</source> - <translation type="obsolete">&Sobre</translation> - </message> - <message> - <source>Show the application's About box</source> - <translation type="obsolete">Exibe a janela 'sobre'</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru)<br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Esse programa serve para encriptar e<br>decriptar mensagens de texto ou arquivos.<br>E é liberado sob a licença GPL v2.0<br><br><b>Desenvolvedores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Tradução:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru)<br><br>Caso tenha dúvidas e/ou sugestões,<br>envie uma mensagem para<br>gpg4usb at cpunk.de</a><br><br>ou nos encontre no nosso canal xmpp:<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>&File</source> - <translation type="obsolete">&Arquivo</translation> - </message> - <message> - <source>&Edit</source> - <translation type="obsolete">E&ditar</translation> - </message> - <message> - <source>&Help</source> - <translation type="obsolete">A&juda</translation> - </message> - <message> - <source>File</source> - <translation type="obsolete">Arquivo</translation> - </message> - <message> - <source>Edit</source> - <translation type="obsolete">Editar</translation> - </message> - <message> - <source>&Undo</source> - <translation type="obsolete">&Desfazer</translation> - </message> - <message> - <source>&New</source> - <translation type="obsolete">&Novo</translation> - </message> - <message> - <source>Open a new file</source> - <translation type="obsolete">Abrir um novo arquivo</translation> - </message> - <message> - <source>&Close</source> - <translation type="obsolete">&Fechar</translation> - </message> - <message> - <source>Close file</source> - <translation type="obsolete">Fechar o arquivo</translation> - </message> - <message> - <source>Undo Last Edit Action</source> - <translation type="obsolete">Desfazer Última Edição</translation> - </message> - <message> - <source>&Redo</source> - <translation type="obsolete">&Repetir</translation> - </message> - <message> - <source>Redo Last Edit Action</source> - <translation type="obsolete">Repete a última ação de edição</translation> - </message> - <message> - <source>&Quote</source> - <translation type="obsolete">&Destacar</translation> - </message> - <message> - <source>Quote whole text</source> - <translation type="obsolete">Destacar todo o texto</translation> - </message> - <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">Remover quebras de linha &duplicadas</translation> - </message> - <message> - <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation type="obsolete">Remover quebras de linha duplicadas, como ocorre quando colamos o texto do webmail</translation> - </message> - <message> - <source>&Sign</source> - <translation type="obsolete">&Assinar</translation> - </message> - <message> - <source>Sign Message</source> - <translation type="obsolete">Assinar Mensagem</translation> - </message> - <message> - <source>&Verify</source> - <translation type="obsolete">&Verificar</translation> - </message> - <message> - <source>Verify Message</source> - <translation type="obsolete">Verificar a Mensagem</translation> - </message> - <message> - <source>Online &Tutorial</source> - <translation type="obsolete">&Tutorial Online</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">Abrir Tutorial Online</translation> - </message> - <message> - <source>Translate gpg4usb</source> - <translation type="obsolete">Traduzir gpg4usb</translation> - </message> - <message> - <source>Translate gpg4usb yourself</source> - <translation type="obsolete">Traduza o gpg4usb você mesmo</translation> - </message> - <message> - <source>Append Selected Key(s) To Text</source> - <translation type="obsolete">Anexar Chaves Marcadas no Texto</translation> - </message> - <message> - <source>Append The Selected Keys To Text in Editor</source> - <translation type="obsolete">Anexar Chaves Marcadas ao Texto do Editor</translation> - </message> - <message> - <source>Copy EMail-address</source> - <translation type="obsolete">Copiar o endereço de EMail</translation> - </message> - <message> - <source>Copy selected EMailaddress to clipboard</source> - <translation type="obsolete">Copiar o endereço de EMail selecionado para a área de transferência</translation> - </message> - <message> - <source>Show Keydetails</source> - <translation type="obsolete">Exibir detalhes da chave</translation> - </message> - <message> - <source>Show Details for this Key</source> - <translation type="obsolete">Exibir Detalhes da Chave</translation> - </message> - <message> - <source>&Keys</source> - <translation type="obsolete">&Chaves</translation> - </message> - <message> - <source>&Import Key From...</source> - <translation type="obsolete">&Importar Chave de...</translation> - </message> - <message> - <source>&View</source> - <translation type="obsolete">E&xibir</translation> - </message> - <message> - <source>Key</source> - <translation type="obsolete">Chave</translation> - </message> - <message> - <source>Ready</source> - <translation type="obsolete">Pronto</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Esse programa permite a encriptação e decriptação<br>simplificada de mensagens de texto ou arquivos.<br>E é liberado sob a licença GPL v3<br><br><b>Desenvolvedores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Tradução:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom(vi) <br><br>Caso tenha alguma dúvida ou sugestão dê uma olhada <br/>na nossa <a href="http://gpg4usb.cpunk.de/contact.php">página de contato</a> ou envie um email<br/> para <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">&Servidor de Chaves</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Esse programa permite a encriptação e decriptação<br>simplificada de mensagens de texto ou arquivos.<br>E é liberado sob a licença GPL v2.0<br><br><b>Desenvolvedores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Tradução:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it)<br><br>Caso tenha alguma dúvida ou sugestão dê uma olhada <br/>na nossa <a href="http://gpg4usb.cpunk.de/contact.php">página de contato</a> ou envie um email<br/> para <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Esse programa serve para encriptar e<br>decriptar mensagens de texto ou arquivos.<br>E é liberado sob a licença GPL v2.0<br><br><b>Desenvolvedores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Tradução:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es), Serse (it)<br><br>Caso tenha dúvidas e/ou sugestões,<br>envie uma mensagem para<br>gpg4usb at cpunk.de</a><br><br>ou nos encontre no nosso canal xmpp:<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>There is one unencrypted file in attachment folder</source> - <translation type="obsolete">Há um arquivo não decriptado na pasta de anexos</translation> - </message> - <message> - <source>There are </source> - <translation type="obsolete">Existem </translation> - </message> - <message> - <source> unencrypted files in attachment folder</source> - <translation type="obsolete"> arquivos não decriptados na pasta de anexos</translation> - </message> - <message> - <source>Encrypt for:</source> - <translation type="obsolete">Encriptar para:</translation> - </message> - <message> - <source>Attached files:</source> - <translation type="obsolete">Arquivos anexos:</translation> - </message> - <message> - <source>Application</source> - <translation type="obsolete">Aplicação</translation> - </message> - <message> - <source>Cannot read file %1: -%2.</source> - <translation type="obsolete">Não leu o arquivo %1: -%2.</translation> - </message> - <message> - <source>File loaded</source> - <translation type="obsolete">Arquivo carregado</translation> - </message> - <message> - <source>%1[*] - %2</source> - <translation type="obsolete">%1[*] - %2</translation> - </message> - <message> - <source>The document has been modified. -Do you want to save your changes?</source> - <translation type="obsolete">O documento foi alterado. -Deseja salvar as alterações?</translation> - </message> - <message> - <source>Cannot write file %1: -%2.</source> - <translation type="obsolete">Não escreveu o arquivo %1: -%2.</translation> - </message> - <message> - <source>Saved '%1'</source> - <translatorcomment>i used inverse order because its more natural speak in this way</translatorcomment> - <translation type="obsolete">'%1' salvo</translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Kirill (ru)<br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center> Este aplicativo permite a encriptação/decriptação<br>simplificada das suas mensagens de texto ou arquivos.<br>E é liberado sob licença GPL-V2.0<br><br>Desenvolvedores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Tradução:</b><br>Krill(ru)<br>Alessandro Benevenuto (pt-br)<br><br>Caso tenha dúvidas e/ou sugestões, entre em<br>contatoatravés de gpg4usb at cpunk.de</a><br><br>ou no canal xmpp<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>Open Key</source> - <translation type="obsolete">Abrir a Chave</translation> - </message> - <message> - <source>Key Files</source> - <translation type="obsolete">Arquivos de Chaves</translation> - </message> - <message> - <source>All Files</source> - <translation type="obsolete">Todos os Arquivos</translation> - </message> - <message> - <source>couldn't open file: </source> - <translation type="obsolete">Não pode abrir o arquivo: </translation> - </message> - <message> - <source>&Editor</source> - <translation type="obsolete">&Editor</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Esse programa permite a encriptação e decriptação<br>simplificada de mensagens de texto ou arquivos.<br>E é liberado sob a licença GPL v2.0<br><br><b>Desenvolvedores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Tradução:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it)<br><br>Caso tenha alguma dúvida ou sugestão dê uma olhada <br/>na nossa <a href="http://gpg4usb.cpunk.de/contact.php">página de contato</a> ou envie um email<br/> para <a href="mailto:[email protected]">[email protected]</a>. {3<?} {4u?} {4u?} {4u?}</translation> - </message> - <message> - <source>&Clipboard</source> - <translation type="obsolete">Área de &Transferência</translation> - </message> - <message> - <source>Import New Key From Clipboard</source> - <translation type="obsolete">Importar Nova Chave da Área de Transferência</translation> - </message> - <message> - <source>Import Key</source> - <translation type="obsolete">Importar Chave</translation> - </message> - <message> - <source>&Crypt</source> - <translation type="obsolete">&Encriptar</translation> - </message> - <message> - <source>Crypt</source> - <translation type="obsolete">Encriptar</translation> - </message> - <message> - <source>About </source> - <translation type="obsolete">Sobre </translation> - </message> - <message> - <source><center>This Application allows you to do simple<br>encryption/decryption of your text-message or file.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es)<br><br>If you have any questions and/or<br>suggestions, contact us at<br>gpg4usb at cpunk.de</a><br><br>or feel free to meet us in our xmpp-channel:<br>gpg4usb at conference.jabber.ccc.de</center></source> - <translation type="obsolete"><center>Esse programa serve para encriptar e<br>decriptar mensagens de texto ou arquivos.<br>E é liberado sob a licença GPL V2.0<br><br><b>Desenvolvedores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Tradução:</b><br>Alessandro (pt_br), Alex (fr), Kirill (ru), Viriato (es)<br><br>Caso tenha duvidas e/ou sugestões,<br>envie uma mensagem para<br>gpg4usb at cpunk.de</a><br><br>ou nos encontre no nosso canal xmppl:<br>gpg4usb at conference.jabber.ccc.de</center></translation> - </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">Importar Chave de...</translation> - </message> -</context> -<context> <name>ImportFromGnupgPage</name> <message> <location filename="../../wizard.cpp" line="288"/> @@ -964,14 +441,6 @@ Deseja salvar as alterações?</translation> <context> <name>IntroPage</name> <message> - <source>Introduction</source> - <translation type="obsolete">Introdução</translation> - </message> - <message> - <source>This wizard will help you getting started with encrypting and decrypting.</source> - <translation type="obsolete">Esse auxiliar ajudará você a começar a encriptar e decriptar.</translation> - </message> - <message> <location filename="../../wizard.cpp" line="106"/> <source>Getting started...</source> <translation>Primeiros passos...</translation> @@ -1089,10 +558,6 @@ Tenha certeza de mantê-la segura. Você realmente deseja exportar sua chave pri <translation>Não pode abrir %1 para escrita</translation> </message> <message> - <source>Key Files </source> - <translation type="obsolete">Arquivos de Chaves </translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="88"/> <source>Key size:</source> <translation>Tamanho da chave:</translation> @@ -1128,14 +593,6 @@ Tenha certeza de mantê-la segura. Você realmente deseja exportar sua chave pri <translation>Exportando Chave Privada</translation> </message> <message> - <source>You are about to export your private key. -This is NOT your public key, so don't give it away. -Make sure you keep it save.</source> - <translation type="obsolete">Você está prestes a exportar sua chave privada. -Essa NÃO é sua chave pública, portanto NÃO a distribua. -Guarde-a em segurança.</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="199"/> <source>Export Key To File</source> <translation>Exportar Chave para Arquivo</translation> @@ -1154,10 +611,6 @@ Guarde-a em segurança.</translation> <translation>Nome:</translation> </message> <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">E-mail:</translation> - </message> - <message> <location filename="../../keygendialog.cpp" line="75"/> <source>Comment:</source> <translation>Comentários:</translation> @@ -1246,14 +699,6 @@ Fraca -> Forte</translation> <context> <name>KeyGenPage</name> <message> - <source>Key-Generating</source> - <translation type="obsolete">Gerando a Chave</translation> - </message> - <message> - <source>First you've got to create an own key.</source> - <translation type="obsolete">Primeiro você precisa criar sua própria chave.</translation> - </message> - <message> <location filename="../../wizard.cpp" line="348"/> <source>Create a keypair...</source> <translation>Criar um par de chaves...</translation> @@ -1278,10 +723,6 @@ Fraca -> Forte</translation> <source>Create New Key</source> <translation>Criar Nova Chave</translation> </message> - <message> - <source>key generated. Now you can crypt and sign texts.</source> - <translation type="obsolete">Chave gerada. Agora você pode encriptar e assinar textos.</translation> - </message> </context> <context> <name>KeyImportDetailDialog</name> @@ -1451,19 +892,11 @@ gpg4usb tentará importar a(s) chave(s).</translation> <translation>Fechar Gerenciador de Chaves</translation> </message> <message> - <source>Import From &File</source> - <translation type="obsolete">Importar do &Arquivo</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="76"/> <source>Import New Key From File</source> <translation>Importar Nova Chave do Arquivo</translation> </message> <message> - <source>Import From &Clipboard</source> - <translation type="obsolete">Importar da Área de &Transferência</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="81"/> <source>Import New Key From Clipboard</source> <translation>Importar Nova Chave da Área de Transferência</translation> @@ -1580,10 +1013,6 @@ gpg4usb tentará importar a(s) chave(s).</translation> <translation>&Chave</translation> </message> <message> - <source>Crypt</source> - <translation type="obsolete">Encriptar</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="167"/> <source>Open Key</source> <translation>Abrir Chave</translation> @@ -1620,82 +1049,10 @@ gpg4usb tentará importar a(s) chave(s).</translation> <translation><br/>Essa ação não poderá ser desfeita.</translation> </message> <message> - <source>Are you sure that you want to delete the selected keys?. -The action can not be undone.</source> - <translation type="obsolete">Tem certeza que deseja excluir as chaves marcadas? -A ação não poderá ser desfeita.</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="252"/> <source>Export Key To File</source> <translation>Exportar Chave para Arquivo</translation> </message> - <message> - <source>Name:</source> - <translation type="obsolete">Nome:</translation> - </message> - <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">E-mail:</translation> - </message> - <message> - <source>Comment:</source> - <translation type="obsolete">Comentários:</translation> - </message> - <message> - <source>KeySize (in Bit):</source> - <translation type="obsolete">Tamanho da Chave (bits):</translation> - </message> - <message> - <source>Expiration Date:</source> - <translation type="obsolete">Data de expiração:</translation> - </message> - <message> - <source>Password:</source> - <translation type="obsolete">Senha:</translation> - </message> - <message> - <source>Repeat Password:</source> - <translation type="obsolete">Repetir a Senha:</translation> - </message> - <message> - <source>Never Expire</source> - <translation type="obsolete">Nunca Expira</translation> - </message> - <message> - <source>Password: Strength -Weak -> Strong</source> - <translation type="obsolete">Senha: Resistência: -Fraca -> Forte</translation> - </message> - <message> - <source>Password Strength</source> - <translation type="obsolete">Resistência da Senha</translation> - </message> - <message> - <source> Name must contain at least five characters. -</source> - <translation type="obsolete"> O nome deve conter pelo menos cinco caracteres. -</translation> - </message> - <message> - <source> Password and Repeat don't match. </source> - <translation type="obsolete"> As senhas não conferem. </translation> - </message> - <message> - <source>Generating Key...</source> - <translation type="obsolete">Gerando as Chaves...</translation> - </message> - <message> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="obsolete">Coletando dados aleatórios para a geração da chave. - Isso pode demorar um pouco. - Para agilizar o processo use seu computador - (ex: navegue na internet, ouça música,...)</translation> - </message> </context> <context> <name>KeyServerImportDialog</name> @@ -1750,52 +1107,52 @@ Fraca -> Forte</translation> <translation>Tag</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="153"/> + <location filename="../../keyserverimportdialog.cpp" line="154"/> <source>Couldn't contact keyserver!</source> <translation>Não foi possivel acessar o servidor de chaves!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="161"/> + <location filename="../../keyserverimportdialog.cpp" line="162"/> <source>Too many responses from keyserver!</source> <translation>Muitas respostas do Servidor de Chaves!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="167"/> + <location filename="../../keyserverimportdialog.cpp" line="168"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation>Não foram localizadas chaves, a entrada deve ser kexID, tente uma nova pesquisa com 0x.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="171"/> + <location filename="../../keyserverimportdialog.cpp" line="172"/> <source>No keys found containing the search string!</source> <translation>Não foram encontradas chaves com o texto da pesquisa!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="174"/> + <location filename="../../keyserverimportdialog.cpp" line="175"/> <source>Insufficiently specific search string!</source> <translation>Texto da pesquisa insuficiente!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="201"/> + <location filename="../../keyserverimportdialog.cpp" line="203"/> <source>revoked</source> <translation>revogado</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="204"/> + <location filename="../../keyserverimportdialog.cpp" line="206"/> <source>disabled</source> <translation>desabilitado</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="243"/> + <location filename="../../keyserverimportdialog.cpp" line="245"/> <source>%1 keys found. Doubleclick a key to import it.</source> <translation>%1 chaves encontradas. Dê um duplo clique na chave para importá-la.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="288"/> + <location filename="../../keyserverimportdialog.cpp" line="291"/> <source>Error while contacting keyserver!</source> <translation>Erro durante a conexão com o servidor de chaves!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="292"/> + <location filename="../../keyserverimportdialog.cpp" line="295"/> <source>Key imported</source> <translation>Chave importada</translation> </message> @@ -2027,10 +1384,6 @@ Fraca -> Forte</translation> <translation> e GPGME </translation> </message> <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">Remover quebras de linha &duplicadas</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="250"/> <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> <translation>Remover quebras de linha duplicadas, como ocorre quando colamos o texto do webmail</translation> @@ -2126,23 +1479,11 @@ Fraca -> Forte</translation> <translation>Importar Nova Chave do Editor</translation> </message> <message> - <source>Key Management</source> - <translation type="obsolete">Gerenciador de Chaves</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="312"/> <source>Open Keymanagement</source> <translation>Abrir Gerenciador de Chaves</translation> </message> <message> - <source>Import Key</source> - <translation type="obsolete">Importar Chave</translation> - </message> - <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">Abrir Diálogo de Importação de Nova Chave</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="317"/> <source>&About</source> <translation>&Sobre</translation> @@ -2153,14 +1494,6 @@ Fraca -> Forte</translation> <translation>Exibe a janela 'sobre'</translation> </message> <message> - <source>Online &Tutorial</source> - <translation type="obsolete">&Tutorial Online</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">Abrir Tutorial Online</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="330"/> <source>Translate gpg4usb</source> <translation>Traduzir gpg4usb</translation> @@ -2306,10 +1639,6 @@ Fraca -> Forte</translation> <translation>Sobre </translation> </message> <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Esse programa permite a encriptação e decriptação<br>simplificada de mensagens de texto ou arquivos.<br>E é liberado sob a licença GPL v3<br><br><b>Desenvolvedores:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Tradução:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it)<br><br>Caso tenha alguma dúvida ou sugestão dê uma olhada <br/>na nossa <a href="http://gpg4usb.cpunk.de/contact.php">página de contato</a> ou envie um email<br/> para <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="741"/> <source>There is one unencrypted file in attachment folder</source> <translation>Há um arquivo não decriptado na pasta de anexos</translation> @@ -2324,18 +1653,6 @@ Fraca -> Forte</translation> <source> unencrypted files in attachment folder</source> <translation> arquivos não decriptados na pasta de anexos</translation> </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">Importar Chave de...</translation> - </message> - <message> - <source>&Clipboard</source> - <translation type="obsolete">Área de &Transferência</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">&Servidor de Chaves</translation> - </message> </context> <context> <name>MimeTab</name> @@ -2406,79 +1723,6 @@ Fraca -> Forte</translation> <translation>Configurações</translation> </message> <message> - <source>Iconsize</source> - <translation type="obsolete">Tamanho do ícone</translation> - </message> - <message> - <source>small</source> - <translation type="obsolete">pequeno</translation> - </message> - <message> - <source>medium</source> - <translation type="obsolete">médio</translation> - </message> - <message> - <source>large</source> - <translation type="obsolete">grande</translation> - </message> - <message> - <source>Iconstyle</source> - <translation type="obsolete">Estilo do ícone</translation> - </message> - <message> - <source>just text</source> - <translation type="obsolete">somente texto</translation> - </message> - <message> - <source>just icons</source> - <translation type="obsolete">somente ícones</translation> - </message> - <message> - <source>text and icons</source> - <translation type="obsolete">texto e ícones</translation> - </message> - <message> - <source>Windowstate</source> - <translation type="obsolete">Status da Janela</translation> - </message> - <message> - <source>Save window size and position on exit.</source> - <translation type="obsolete">Salvar tamanho e posição da janela na saída.</translation> - </message> - <message> - <source>Save checked private keys on exit and restore them on next start.</source> - <translation type="obsolete">Salvar chaves privadas selecionadas na saída e restaurá-las na proxima execução.</translation> - </message> - <message> - <source>MIME-parsing (Experimental)</source> - <translation type="obsolete">Análise-MIME (Experimental)</translation> - </message> - <message> - <source>Try to split attachments from PGP-MIME ecrypted messages.</source> - <translation type="obsolete">Tentar dividir os anexos das mensagens PGP-MIME encriptadas.</translation> - </message> - <message> - <source>save window size and position on exit</source> - <translation type="obsolete">Salvar posição e tamanho da janela ao sair</translation> - </message> - <message> - <source>Save Checked Keys</source> - <translation type="obsolete">Salvar chaves marcadas</translation> - </message> - <message> - <source>Language</source> - <translation type="obsolete">Idioma</translation> - </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">A alteração de idioma será aplicada após reiniciar o programa.</translation> - </message> - <message> - <source>English</source> - <comment>Insert local name of language here. This is used for the language menu of the settingsdialog</comment> - <translation type="obsolete">Português do Brasil</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="34"/> <source>General</source> <translation>Geral</translation> @@ -2504,14 +1748,6 @@ Fraca -> Forte</translation> <translation>Avançado</translation> </message> <message> - <source>Tab Dialog</source> - <translation type="obsolete">Configurações</translation> - </message> - <message> - <source>English</source> - <translation type="obsolete">Português do Brasil</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="72"/> <source>System Default</source> <translation>Padrão do Sistema</translation> diff --git a/release/ts/gpg4usb_ru.qm b/release/ts/gpg4usb_ru.qm Binary files differindex 852ac46..37e916d 100644 --- a/release/ts/gpg4usb_ru.qm +++ b/release/ts/gpg4usb_ru.qm diff --git a/release/ts/gpg4usb_ru.ts b/release/ts/gpg4usb_ru.ts index a593b40..70d46b9 100644 --- a/release/ts/gpg4usb_ru.ts +++ b/release/ts/gpg4usb_ru.ts @@ -83,10 +83,6 @@ <context> <name>Attachments</name> <message> - <source>couldn't open file: </source> - <translation type="obsolete">Не удалось открыть файл: </translation> - </message> - <message> <location filename="../../attachments.cpp" line="78"/> <location filename="../../attachments.cpp" line="115"/> <source>Save File</source> @@ -213,10 +209,6 @@ <translation>Действие</translation> </message> <message> - <source>...</source> - <translation type="obsolete">...</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="31"/> <source>Decrypt File</source> <translation>Расшифровать файл</translation> @@ -262,23 +254,11 @@ <translation>Такой файл уже существует. Перезаписать его?</translation> </message> <message> - <source>Files</source> - <translation type="obsolete">Файлы</translation> - </message> - <message> - <source>All Files (*)</source> - <translation type="obsolete">Все файлы</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="142"/> <source>Save File</source> <translation>Сохранить файл</translation> </message> <message> - <source>couldn't open file: </source> - <translation type="obsolete">Не удалось открыть файл: </translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="180"/> <source>Cannot write file %1: %2.</source> @@ -323,49 +303,6 @@ <source>Language</source> <translation>Язык</translation> </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">Изменение языка вступит в силу после перезапуска программы.</translation> - </message> - <message> - <source>System Default</source> - <translation type="obsolete">Стандартнай язык системы</translation> - </message> -</context> -<context> - <name>GpgME::Context</name> - <message> - <source>No Key Selected</source> - <translation type="obsolete">Не выбран Ключ</translation> - </message> - <message> - <source>Unsupported algorithm</source> - <translation type="obsolete">Неподдерживаемый алгоритмм</translation> - </message> - <message> - <source>Error decrypting:</source> - <translation type="obsolete">Ошибка расшифровки:</translation> - </message> - <message> - <source>Wrong password</source> - <translation type="obsolete">Неверный Пароль</translation> - </message> - <message> - <source>Enter Password</source> - <translation type="obsolete">Введите Пароль</translation> - </message> - <message> - <source>Key Selection</source> - <translation type="obsolete">Выбор Ключа</translation> - </message> - <message> - <source>No Private Key Selected</source> - <translation type="obsolete">Не выбран Секретный Ключ</translation> - </message> - <message> - <source>Error signing:</source> - <translation type="obsolete">Ошибка подписания:</translation> - </message> </context> <context> <name>GpgME::GpgContext</name> @@ -395,6 +332,11 @@ <translation>Неверный Пароль</translation> </message> <message> + <location filename="../../gpgcontext.cpp" line="484"/> + <source>Enter Password for</source> + <translation>Ввести пароль для</translation> + </message> + <message> <location filename="../../gpgcontext.cpp" line="488"/> <source>Enter Password</source> <translation>Введите Пароль</translation> @@ -416,391 +358,6 @@ </message> </context> <context> - <name>GpgWin</name> - <message> - <source>&Open...</source> - <translation type="obsolete">&Открыть...</translation> - </message> - <message> - <source>Open an existing file</source> - <translation type="obsolete">Открать существующий файл</translation> - </message> - <message> - <source>&Save</source> - <translation type="obsolete">&Сохранить</translation> - </message> - <message> - <source>Save the current File</source> - <translation type="obsolete">Сохранить файл</translation> - </message> - <message> - <source>Save &As</source> - <translation type="obsolete">Сохранить &как</translation> - </message> - <message> - <source>Save the current File as...</source> - <translation type="obsolete">Сохранить файл как...</translation> - </message> - <message> - <source>&Print</source> - <translation type="obsolete">&Печать</translation> - </message> - <message> - <source>Print Document</source> - <translation type="obsolete">Печать</translation> - </message> - <message> - <source>&Close</source> - <translation type="obsolete">&Закрыть</translation> - </message> - <message> - <source>Close file</source> - <translation type="obsolete">Закрыть файл</translation> - </message> - <message> - <source>&Quit</source> - <translation type="obsolete">Вы&йти</translation> - </message> - <message> - <source>Quit Program</source> - <translation type="obsolete">Завершить программу</translation> - </message> - <message> - <source>&Undo</source> - <translation type="obsolete">&Отменить</translation> - </message> - <message> - <source>Undo Last Edit Action</source> - <translation type="obsolete">Отменить последнее действие</translation> - </message> - <message> - <source>&Redo</source> - <translation type="obsolete">&Вернуть отмену</translation> - </message> - <message> - <source>Redo Last Edit Action</source> - <translation type="obsolete">Вернуть последнее изменение</translation> - </message> - <message> - <source>&Paste</source> - <translation type="obsolete">&Вставить</translation> - </message> - <message> - <source>Paste Text From Clipboard</source> - <translation type="obsolete">Вставить текст из Буфера Обмена</translation> - </message> - <message> - <source>Cu&t</source> - <translation type="obsolete">&Вырезать</translation> - </message> - <message> - <source>Cut the current selection's contents to the clipboard</source> - <translation type="obsolete">Вырезать выделенные элементы в Буфер Обмена</translation> - </message> - <message> - <source>&Copy</source> - <translation type="obsolete">&Копировать</translation> - </message> - <message> - <source>Copy the current selection's contents to the clipboard</source> - <translation type="obsolete">Копировать выделенные элементы в Буфер Обмена</translation> - </message> - <message> - <source>&Quote</source> - <translation type="obsolete">&Цитировать</translation> - </message> - <message> - <source>Quote whole text</source> - <translation type="obsolete">Цитировать весь текст</translation> - </message> - <message> - <source>Select &All</source> - <translation type="obsolete">В&ыделить всё</translation> - </message> - <message> - <source>Select the whole text</source> - <translation type="obsolete">Выделить весь текст</translation> - </message> - <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">Удалить двойной &перенос строк</translation> - </message> - <message> - <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation type="obsolete">Удалить двойной перенос строк, например в тексте, вставленном из браузера</translation> - </message> - <message> - <source>Open settings dialog</source> - <translation type="obsolete">Открыть окно настроек</translation> - </message> - <message> - <source>&Encrypt</source> - <translation type="obsolete">З&ашифровать</translation> - </message> - <message> - <source>Encrypt Message</source> - <translation type="obsolete">Зашифровать текст</translation> - </message> - <message> - <source>&Decrypt</source> - <translation type="obsolete">Расшифро&вать</translation> - </message> - <message> - <source>Decrypt Message</source> - <translation type="obsolete">Расшифровать текст</translation> - </message> - <message> - <source>&Sign</source> - <translation type="obsolete">&Подписать</translation> - </message> - <message> - <source>Sign Message</source> - <translation type="obsolete">Подписать сообщение</translation> - </message> - <message> - <source>&Verify</source> - <translation type="obsolete">&Проверить</translation> - </message> - <message> - <source>Verify Message</source> - <translation type="obsolete">Проверить сообщение</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">Сервера &ключей</translation> - </message> - <message> - <source>Import New Key From File</source> - <translation type="obsolete">Импорт нового ключа из файла</translation> - </message> - <message> - <source>Import New Key From Editor</source> - <translation type="obsolete">Импорт нового ключа из редактора</translation> - </message> - <message> - <source>&About</source> - <translation type="obsolete">&О программе</translation> - </message> - <message> - <source>Show the application's About box</source> - <translation type="obsolete">Показать инфо о программе</translation> - </message> - <message> - <source>&File</source> - <translation type="obsolete">Ф&айл</translation> - </message> - <message> - <source>&Edit</source> - <translation type="obsolete">&Правка</translation> - </message> - <message> - <source>&Help</source> - <translation type="obsolete">&Справка</translation> - </message> - <message> - <source>File</source> - <translation type="obsolete">Файл</translation> - </message> - <message> - <source>Edit</source> - <translation type="obsolete">Правка</translation> - </message> - <message> - <source>Se&ttings</source> - <translation type="obsolete">&Настройки</translation> - </message> - <message> - <source>&New</source> - <translation type="obsolete">&Создать</translation> - </message> - <message> - <source>Open a new file</source> - <translation type="obsolete">Открыть новый файл</translation> - </message> - <message> - <source>&File Encryption</source> - <translation type="obsolete">Шифрование &файлов</translation> - </message> - <message> - <source>Encrypt/Decrypt File</source> - <translation type="obsolete">Зашифровать/Расшифровать файл</translation> - </message> - <message> - <source>Key Management</source> - <translation type="obsolete">Менеджер ключей</translation> - </message> - <message> - <source>Open Keymanagement</source> - <translation type="obsolete">Открыть Менеджер ключей</translation> - </message> - <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">Открыть окно импорта ключей</translation> - </message> - <message> - <source>Online &Tutorial</source> - <translation type="obsolete">Онлайн-&руководство</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">Открыть онлайн-руководство</translation> - </message> - <message> - <source>Translate gpg4usb</source> - <translation type="obsolete">Перевести gpg4usb</translation> - </message> - <message> - <source>Translate gpg4usb yourself</source> - <translation type="obsolete">Самостоятельно перевести gpg4usb</translation> - </message> - <message> - <source>Append Selected Key(s) To Text</source> - <translation type="obsolete">Добавить выбранн. ключ(и) к тексту</translation> - </message> - <message> - <source>Append The Selected Keys To Text in Editor</source> - <translation type="obsolete">Добавить выбранный ключ к тексту в редакторе</translation> - </message> - <message> - <source>Copy EMail-address</source> - <translation type="obsolete">Копировать адрес eMail</translation> - </message> - <message> - <source>Copy selected EMailaddress to clipboard</source> - <translation type="obsolete">Копировать выбранный адрес eMail в Буфер Обмена</translation> - </message> - <message> - <source>Show Keydetails</source> - <translation type="obsolete">Показать свойства ключа</translation> - </message> - <message> - <source>Show Details for this Key</source> - <translation type="obsolete">Показать детали для этого ключа</translation> - </message> - <message> - <source>&Keys</source> - <translation type="obsolete">&Ключи</translation> - </message> - <message> - <source>&Import Key From...</source> - <translation type="obsolete">&Импорт ключа из...</translation> - </message> - <message> - <source>&View</source> - <translation type="obsolete">&Вид</translation> - </message> - <message> - <source>Key</source> - <translation type="obsolete">Ключ</translation> - </message> - <message> - <source>Ready</source> - <translation type="obsolete">Готово</translation> - </message> - <message> - <source>Encrypt for:</source> - <translation type="obsolete"> Зашифровать для:</translation> - </message> - <message> - <source>Attached files:</source> - <translation type="obsolete">Прикреплённые файлы:</translation> - </message> - <message> - <source>Application</source> - <translation type="obsolete">Приложение</translation> - </message> - <message> - <source>Cannot read file %1: -%2.</source> - <translation type="obsolete">Не удалось прочесть файл %1: -%2.</translation> - </message> - <message> - <source>File loaded</source> - <translation type="obsolete">Файл загружен</translation> - </message> - <message> - <source>The document has been modified. -Do you want to save your changes?</source> - <translation type="obsolete">Документ был редактирован. -Сохранить изменения?</translation> - </message> - <message> - <source>Cannot write file %1: -%2.</source> - <translation type="obsolete">Не удалось записать файл %1: -%2.</translation> - </message> - <message> - <source>Saved '%1'</source> - <translation type="obsolete">"%1" сохранён</translation> - </message> - <message> - <source>Open Key</source> - <translation type="obsolete">Открыть ключ</translation> - </message> - <message> - <source>couldn't open file: </source> - <translation type="obsolete">Не удалось открыть файл: </translation> - </message> - <message> - <source>&Editor</source> - <translation type="obsolete">Окна &редактора</translation> - </message> - <message> - <source>&Clipboard</source> - <translation type="obsolete">&Буфера Обмена</translation> - </message> - <message> - <source>Import New Key From Clipboard</source> - <translation type="obsolete">Импорт нового ключа из Буфера Обмена</translation> - </message> - <message> - <source>Import Key</source> - <translation type="obsolete">Импорт ключа</translation> - </message> - <message> - <source>&Crypt</source> - <translation type="obsolete">&Шифрование</translation> - </message> - <message> - <source>Crypt</source> - <translation type="obsolete">Шифрование</translation> - </message> - <message> - <source>About </source> - <translation type="obsolete">О программе </translation> - </message> - <message> - <source>There is one unencrypted file in attachment folder</source> - <translation type="obsolete">Имеется один незашифрованный файл в папке вложений</translation> - </message> - <message> - <source>There are </source> - <translation type="obsolete">Имеются</translation> - </message> - <message> - <source> unencrypted files in attachment folder</source> - <translation type="obsolete">незашифрованные файлы в папке вложений</translation> - </message> - <message> - <source>Key Files</source> - <translation type="obsolete">Файлы ключей</translation> - </message> - <message> - <source>All Files</source> - <translation type="obsolete">Все файлы</translation> - </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">Импорт ключа из...</translation> - </message> -</context> -<context> <name>ImportFromGnupgPage</name> <message> <location filename="../../wizard.cpp" line="288"/> @@ -1002,10 +559,6 @@ Make sure you keep it save.Do you really want to export your private key?</sourc <translation>Не удалось открыть %1 для записи</translation> </message> <message> - <source>Key Files </source> - <translation type="obsolete">Файлы ключей</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="88"/> <source>Key size:</source> <translation>Длина ключа:</translation> @@ -1041,14 +594,6 @@ Make sure you keep it save.Do you really want to export your private key?</sourc <translation>Экспорт Секретного Ключа</translation> </message> <message> - <source>You are about to export your private key. -This is NOT your public key, so don't give it away. -Make sure you keep it save.</source> - <translation type="obsolete">Вы собираетесь экспортировать свой Секретный ключ. -Это НЕ открытый ключ, так что не давайте его никому. -Убедитесь, что он хранится в Надёжном Месте.</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="199"/> <source>Export Key To File</source> <translation>Экспорт ключа в файл</translation> @@ -1347,19 +892,11 @@ gpg4usb попробует импортировать ключ(и).</translation <translation>Закрыть Менеджер ключей</translation> </message> <message> - <source>Import From &File</source> - <translation type="obsolete">Импорт из ф&айла</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="76"/> <source>Import New Key From File</source> <translation>Импорт нового ключа из файла</translation> </message> <message> - <source>Import From &Clipboard</source> - <translation type="obsolete">Импорт из &Буфера Обмена</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="81"/> <source>Import New Key From Clipboard</source> <translation>Импорт нового ключа из Буфера Обмена</translation> @@ -1476,10 +1013,6 @@ gpg4usb попробует импортировать ключ(и).</translation <translation>&Ключ</translation> </message> <message> - <source>Crypt</source> - <translation type="obsolete">Шифрование</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="167"/> <source>Open Key</source> <translation>Открыть ключ</translation> @@ -1516,82 +1049,10 @@ gpg4usb попробует импортировать ключ(и).</translation <translation><br/>Это действие нельзя будет отменить.</translation> </message> <message> - <source>Are you sure that you want to delete the selected keys?. -The action can not be undone.</source> - <translation type="obsolete">Вы уверены, что хотите стереть выбранные ключи? -Это действие будет необратимым.</translation> - </message> - <message> <location filename="../../keymgmt.cpp" line="252"/> <source>Export Key To File</source> <translation>Экспорт ключа в файл</translation> </message> - <message> - <source>Name:</source> - <translation type="obsolete">Имя:</translation> - </message> - <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">Адрес eMail:</translation> - </message> - <message> - <source>Comment:</source> - <translation type="obsolete">Комментарий:</translation> - </message> - <message> - <source>KeySize (in Bit):</source> - <translation type="obsolete">Длина ключа (бит):</translation> - </message> - <message> - <source>Expiration Date:</source> - <translation type="obsolete">Истекает:</translation> - </message> - <message> - <source>Password:</source> - <translation type="obsolete">Пароль:</translation> - </message> - <message> - <source>Repeat Password:</source> - <translation type="obsolete">Повторите Пароль:</translation> - </message> - <message> - <source>Never Expire</source> - <translation type="obsolete">без срока годности</translation> - </message> - <message> - <source>Password: Strength -Weak -> Strong</source> - <translation type="obsolete">Надёжность Пароля -Слабый -> Стойкий</translation> - </message> - <message> - <source>Password Strength</source> - <translation type="obsolete">Надёжность Пароля</translation> - </message> - <message> - <source> Name must contain at least five characters. -</source> - <translation type="obsolete"> Имя должно быть длиной не менее 5 букв. -</translation> - </message> - <message> - <source> Password and Repeat don't match. </source> - <translation type="obsolete">Повторно введённый Пароль не совпал.</translation> - </message> - <message> - <source>Generating Key...</source> - <translation type="obsolete">Генерация ключа...</translation> - </message> - <message> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="obsolete">Сбор случайных данных для генерации ключа. -Это займёт некоторое время. Можно ускорить -процесс, активно используя компьютер (листая -страницы интернета, слушая музыку и т.д.)</translation> - </message> </context> <context> <name>KeyServerImportDialog</name> @@ -1646,52 +1107,52 @@ Weak -> Strong</source> <translation>Тег</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="153"/> + <location filename="../../keyserverimportdialog.cpp" line="154"/> <source>Couldn't contact keyserver!</source> <translation>Не удалось связаться с сервером ключей!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="161"/> + <location filename="../../keyserverimportdialog.cpp" line="162"/> <source>Too many responses from keyserver!</source> <translation>Слишком много ответов от сервера ключей!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="167"/> + <location filename="../../keyserverimportdialog.cpp" line="168"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation>Не найдено ключа, запрос может быть идентификатором ключа, повторяю поиск, подставив 0x.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="171"/> + <location filename="../../keyserverimportdialog.cpp" line="172"/> <source>No keys found containing the search string!</source> <translation>Не найдено Ключей, содержащих поисковый запрос!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="174"/> + <location filename="../../keyserverimportdialog.cpp" line="175"/> <source>Insufficiently specific search string!</source> <translation>Поисковый запрос сформулирован слишком неопределённо!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="201"/> + <location filename="../../keyserverimportdialog.cpp" line="203"/> <source>revoked</source> <translation>отозван</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="204"/> + <location filename="../../keyserverimportdialog.cpp" line="206"/> <source>disabled</source> <translation>деактивирован</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="243"/> + <location filename="../../keyserverimportdialog.cpp" line="245"/> <source>%1 keys found. Doubleclick a key to import it.</source> <translation>Найдено %1 ключей. Для импорта двойной клик по ключу.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="288"/> + <location filename="../../keyserverimportdialog.cpp" line="291"/> <source>Error while contacting keyserver!</source> <translation>Ошибка соединения с сервером ключей!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="292"/> + <location filename="../../keyserverimportdialog.cpp" line="295"/> <source>Key imported</source> <translation>Ключ импортирован</translation> </message> @@ -2262,80 +1723,6 @@ Weak -> Strong</source> <translation>Настройки</translation> </message> <message> - <source>Iconsize</source> - <translation type="obsolete">Размер значков</translation> - </message> - <message> - <source>small</source> - <translation type="obsolete">Маленький</translation> - </message> - <message> - <source>medium</source> - <translation type="obsolete">Средний</translation> - </message> - <message> - <source>large</source> - <translation type="obsolete">Большой</translation> - </message> - <message> - <source>Iconstyle</source> - <translation type="obsolete">Стиль панелей инструментов</translation> - </message> - <message> - <source>just text</source> - <translation type="obsolete">Только текст</translation> - </message> - <message> - <source>just icons</source> - <translation type="obsolete">Только значки</translation> - </message> - <message> - <source>text and icons</source> - <translation type="obsolete">Значки и текст</translation> - </message> - <message> - <source>Windowstate</source> - <translation type="obsolete">Настройки окна</translation> - </message> - <message> - <source>Save window size and position on exit.</source> - <translation type="obsolete">Запоминать размер и положение окна при выходе.</translation> - </message> - <message> - <source>Save checked private keys on exit and restore them on next start.</source> - <translation type="obsolete">Запоминать отмеченные ключи при выходе и выделять их при следующем запуске.</translation> - </message> - <message> - <source>MIME-parsing (Experimental)</source> - <translation type="obsolete">MIME-parsing (экспериментально)</translation> - </message> - <message> - <source>Try to split attachments from PGP-MIME ecrypted messages.</source> - <translation type="obsolete">Пробовать отделять вложения писем, зашифрованных PGP-MIME.</translation> - </message> - <message> - <source>save window size and position on exit</source> - <translation type="obsolete">Сохранять размер окна при выходе</translation> - </message> - <message> - <source>Save Checked Keys</source> - <translation type="obsolete">Сохранение выбора ключей</translation> - </message> - <message> - <source>Language</source> - <translation type="obsolete">Язык</translation> - </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">Изменение языка вступит в силу после перезапуска программы.</translation> - </message> - <message> - <source>English</source> - <comment>Insert local name of language here. This is used for the language menu of the settingsdialog</comment> - <translatorcomment>Local language here is russian</translatorcomment> - <translation type="obsolete">Русский</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="34"/> <source>General</source> <translation>Общие</translation> @@ -2361,15 +1748,6 @@ Weak -> Strong</source> <translation>Дополнительные</translation> </message> <message> - <source>Tab Dialog</source> - <translation type="obsolete">Настройки</translation> - </message> - <message> - <source>English</source> - <translatorcomment>Also local language here?</translatorcomment> - <translation type="obsolete">Русский</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="72"/> <source>System Default</source> <translation>Стандартнай язык системы</translation> @@ -2460,16 +1838,6 @@ Weak -> Strong</source> </source> <translation>Текст был %1 частично подписан: </translation> </message> - <message> - <source>Text was completly signed on %1 by: -</source> - <translation type="obsolete">Текст был %1 полностью подписан:</translation> - </message> - <message> - <source>Text was partially signed on %1 by: -</source> - <translation type="obsolete">Текст был %1 частично подписан:</translation> - </message> </context> <context> <name>VerifyKeyDetailBox</name> @@ -2537,42 +1905,35 @@ Weak -> Strong</source> <translation>Показать детали проверки подписи</translation> </message> <message> - <location filename="../../verifynotification.cpp" line="120"/> + <location filename="../../verifynotification.cpp" line="47"/> + <source>Details</source> + <translation>Детали</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="117"/> <source>Key not present with id 0x</source> <translation>Отсутствует ключ с идентификатором 0x</translation> </message> <message> - <location filename="../../verifynotification.cpp" line="162"/> + <location filename="../../verifynotification.cpp" line="159"/> <source>Error validating signature by: </source> <translation>Ошибка проверки подписи от: </translation> </message> <message> - <location filename="../../verifynotification.cpp" line="167"/> + <location filename="../../verifynotification.cpp" line="164"/> <source>Text was completely signed by: </source> <translation>Текст был полностью подписан:</translation> </message> <message> - <location filename="../../verifynotification.cpp" line="172"/> + <location filename="../../verifynotification.cpp" line="169"/> <source>Text was partially signed by: </source> <translation>Текст был частично подписан:</translation> </message> <message> - <source>Key not present with Fingerprint: </source> - <translation type="obsolete">Отсутствует ключ с отпечатком:</translation> - </message> - <message> - <location filename="../../verifynotification.cpp" line="150"/> + <location filename="../../verifynotification.cpp" line="147"/> <source>Error for key with fingerprint </source> <translation>Ошибка ключа с отпечатком </translation> </message> - <message> - <source>Text is completly signed by: </source> - <translation type="obsolete">Текст полностью подписан:</translation> - </message> - <message> - <source>Text is partially signed by: </source> - <translation type="obsolete">Текст частично подписан:</translation> - </message> </context> <context> <name>Wizard</name> diff --git a/release/ts/gpg4usb_sv.qm b/release/ts/gpg4usb_sv.qm Binary files differnew file mode 100644 index 0000000..12e9c02 --- /dev/null +++ b/release/ts/gpg4usb_sv.qm diff --git a/release/ts/gpg4usb_sv.ts b/release/ts/gpg4usb_sv.ts new file mode 100644 index 0000000..5dc57d2 --- /dev/null +++ b/release/ts/gpg4usb_sv.ts @@ -0,0 +1,1975 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="sv_SE" sourcelanguage="en"> +<context> + <name>AdvancedTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="448"/> + <source>Show Steganography Options [Advanced]</source> + <translation>Visa Steganography-alternativ [Avancerat]</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="450"/> + <source>Show Steganographic Options.</source> + <translation>Visa Steganographiska alternativ.</translation> + </message> +</context> +<context> + <name>AppearanceTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="279"/> + <source>Iconsize</source> + <translation>Ikonstorlek</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="281"/> + <source>small</source> + <translation>Liten</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="282"/> + <source>medium</source> + <translation>Medium</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="283"/> + <source>large</source> + <translation>Stor</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="299"/> + <source>Iconstyle</source> + <translation>Ikonstil</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="301"/> + <source>just text</source> + <translation>Endast text</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="302"/> + <source>just icons</source> + <translation>Endast ikoner</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="303"/> + <source>text and icons</source> + <translation>Text och ikoner</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="319"/> + <source>Windowstate</source> + <translation>Fönsterstatus</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="321"/> + <source>Save window size and position on exit.</source> + <translation>Spara fönsterstorlek och position vid avslut.</translation> + </message> +</context> +<context> + <name>AttachmentTableModel</name> + <message> + <location filename="../../attachmenttablemodel.cpp" line="128"/> + <source>Filename</source> + <translation>Filnamn</translation> + </message> + <message> + <location filename="../../attachmenttablemodel.cpp" line="131"/> + <source>Contenttype</source> + <translation>Innehållstyp</translation> + </message> +</context> +<context> + <name>Attachments</name> + <message> + <location filename="../../attachments.cpp" line="78"/> + <location filename="../../attachments.cpp" line="115"/> + <source>Save File</source> + <translation>Spara filen</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="79"/> + <source>Save this file</source> + <translation>Spara den här filen</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="83"/> + <source>Open File</source> + <translation>Öppna filen</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="84"/> + <source>Open this file</source> + <translation>Öppna den här filen</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="121"/> + <location filename="../../attachments.cpp" line="166"/> + <source>File</source> + <translation>Fil</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="122"/> + <location filename="../../attachments.cpp" line="167"/> + <source>Cannot write file %1: +%2.</source> + <translation>Kan inte skriva filen %1 +%2.</translation> + </message> +</context> +<context> + <name>ChoosePage</name> + <message> + <location filename="../../wizard.cpp" line="159"/> + <source>Choose your action...</source> + <translation>Välj åtgärd...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="160"/> + <source>...by clicking on the apropriate link.</source> + <translation>...genom att klicka på lämplig länk.</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="162"/> + <source>If you have never used gpg4usb before and also don't own a gpg key yet you may possibly want to </source> + <translation>Har du aldrig använt gpg4usb tidigare och inte har någon gpg-nyckel ännu, kanske du vill</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="164"/> + <source>create a new keypair</source> + <translation> skapa ett nytt nyckelpar</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="168"/> + <source>If you upgrade from an older version of gpg4usb you may want to </source> + <translation>Om du uppgraderat från en äldre version av gpg4usb. kanske du vill</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="170"/> + <source>import settings and/or keys from gpg4usb</source> + <translation> importera inställningar och/eller nycklar från gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="174"/> + <source>If you are already using GnuPG you may want to </source> + <translation>Om du redan använder GnuPG, vill du kanske</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="176"/> + <source>import keys from GnuPG</source> + <translation> importera nycklar från GnuPG</translation> + </message> +</context> +<context> + <name>ConclusionPage</name> + <message> + <location filename="../../wizard.cpp" line="391"/> + <source>Ready.</source> + <translation>Klar.</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="392"/> + <source>Have fun with gpg4usb!</source> + <translation>Ha det så kul med gpg4usb!</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="394"/> + <source>You are ready to use gpg4usb now.<br><br>The offline help will get you started with gpg4usb. It will open in the main window.<br></source> + <translation>Du är nu redo att börja använda gpg4usb.<br><br>Hjälpfilen kommer att hjälpa dig igång med gpg4usb. Den öppnas i programfönstret.<br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="399"/> + <source>Open offline help.</source> + <translation>Öppna hjälpfilen.</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="402"/> + <source>Dont show the wizard again.</source> + <translation>Visa inte denna guide igen.</translation> + </message> +</context> +<context> + <name>FileEncryptionDialog</name> + <message> + <location filename="../../fileencryptiondialog.cpp" line="36"/> + <source>Encrypt / Decrypt File</source> + <translation>Kryptera/Dekryptera fil</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="46"/> + <location filename="../../fileencryptiondialog.cpp" line="170"/> + <location filename="../../fileencryptiondialog.cpp" line="179"/> + <source>File</source> + <translation>Fil</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="47"/> + <source>Action</source> + <translation>Åtgärd</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="31"/> + <source>Decrypt File</source> + <translation>Dekryptera fil</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="33"/> + <source>Encrypt File</source> + <translation>Kryptera fil</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="53"/> + <source>Input</source> + <translation>Indata</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="59"/> + <source>Output</source> + <translation>Utdata</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="78"/> + <source>&Encrypt</source> + <translation>&Kryptera</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="80"/> + <source>&Decrypt</source> + <translation>&Dekryptera</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="116"/> + <source>Open File</source> + <translation>Öppna fil</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="142"/> + <source>Save File</source> + <translation>Spara fil</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="153"/> + <source>Couldn't Open file: </source> + <translation>Kan inte öppna filen: </translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="180"/> + <source>Cannot write file %1: +%2.</source> + <translation>Kan inte skriva filen %1: +%2.</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="171"/> + <source>File exists! Do you want to overwrite it?</source> + <translation>Filen finns redan! Vill du skriva över den?</translation> + </message> +</context> +<context> + <name>GeneralTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="105"/> + <source>Remember Password</source> + <translation>Kom ihåg lösenord</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="107"/> + <source>Remember password until closing gpg4usb</source> + <translation>Kom ihåg lösenord tills gpg4usb avslutas</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="114"/> + <source>Save Checked Keys</source> + <translation>Spara förbockade nycklar</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="116"/> + <source>Save checked private keys on exit and restore them on next start.</source> + <translation>Spara förbockade nycklar vid avslut, och återställ dem vid nästa start.</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="123"/> + <source>Confirm drag'n'drop key import</source> + <translation>'Dra och släpp' nyckelimport</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="125"/> + <source>Import files dropped on the keylist without confirmation.</source> + <translation>Importera filer som släpps i nyckellistan utan bekräftelse.</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="132"/> + <source>Language</source> + <translation>Språk</translation> + </message> +</context> +<context> + <name>GpgME::GpgContext</name> + <message> + <location filename="../../gpgcontext.cpp" line="312"/> + <source>No Key Selected</source> + <translation>Ingen nyckel vald</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="384"/> + <source><br>No private key with id %1 present in keyring</source> + <translation><br>Det finns ingen nyckel med ID %1, i din nyckelring</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="392"/> + <source>Unsupported algorithm</source> + <translation>Algoritmen saknar stöd</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="402"/> + <source>Error decrypting:</source> + <translation>Fel vid dekryptering:</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="476"/> + <source>Wrong password</source> + <translation>Fel lösenord</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="484"/> + <source>Enter Password for</source> + <translation>Ange lösenord för</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="488"/> + <source>Enter Password</source> + <translation>Ange lösenord</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="649"/> + <source>Key Selection</source> + <translation>Nyckelsamling</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="649"/> + <source>No Private Key Selected</source> + <translation>Ingen privat nyckel vald</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="697"/> + <source>Error signing:</source> + <translation>Fel vid signering:</translation> + </message> +</context> +<context> + <name>ImportFromGnupgPage</name> + <message> + <location filename="../../wizard.cpp" line="288"/> + <source>Import keys...</source> + <translation>Importera nycklar...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="289"/> + <source>...from existing GnuPG installation</source> + <translation>...från befintlig GnuPG-installation</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="291"/> + <source>You can import keys from a locally installed GnuPG.<br><br> The location is read from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br></source> + <translation>Du kan importera nycklar från en lokalt installerad GnuPG.<br><br>Lagringsplatsen läses in från Windows register, eller antas vara .gnupg-katalogen i din home-katalog i Linux.<br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="295"/> + <source>Import keys from GnuPG</source> + <translation>Importera nycklar från GnuPG</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="310"/> + <source>Import Error</source> + <translation>Importfel</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="310"/> + <source>Couldn't locate GnuPG home directory</source> + <translation>Kunde inte hitta GnuPGs programmapp</translation> + </message> +</context> +<context> + <name>ImportFromGpg4usbPage</name> + <message> + <location filename="../../wizard.cpp" line="208"/> + <source>Import from...</source> + <translation>Importera från...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="209"/> + <source>...existing gpg4usb</source> + <translation>...befinlig gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="211"/> + <source>You can import keys and/or settings from existing gpg4usb. <br><br>Just check what you want to import, click the import button and choose the directory of your other gpg4usb in the appearing file dialog.</source> + <translation>Du kan importera nycklar och/eller inställningarfrån befintlig gpg4usb.<br><br>Bocka för det du vill importera, klicka på import-knappen och välj katalog för din andra gpg4usb i påföljande dialog.</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="218"/> + <source>Keys</source> + <translation>Nycklar</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="222"/> + <source>Configuration</source> + <translation>Inställningar</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="224"/> + <source>Import from gpg4usb</source> + <translation>Importera från gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="240"/> + <source>Other gpg4usb directory</source> + <translation>Annan gbg4usb-katalog</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="260"/> + <source>Configuration Imported</source> + <translation>Inställningar importerade</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="260"/> + <source>Imported Configuration from old gpg4usb.<br>Will now restart to activate the configuration.</source> + <translation>Inställningar importerade från gammal gpg4usb.<br>gpg4usb kommer nu att startas omför att aktivera inställningarna.</translation> + </message> +</context> +<context> + <name>IntroPage</name> + <message> + <location filename="../../wizard.cpp" line="106"/> + <source>Getting started...</source> + <translation>Kom igång...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="107"/> + <source>... with gpg4usb</source> + <translation>...med gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="109"/> + <source>To use gpg4usb for decrypting and signing messages, you need a private key. The next page will help you with key generation or import.<br><br>For more information have a look at the <a href='docu_concepts.html'>concepts</a> (by clicking the link, the page will open in the main window). <br></source> + <translation>För att kunna använda gpg4usb till att kryptera och signera meddelanden, behöver du en privat nyckel. Nästa sida hjälper dig att skapa eller importera en sådan nyckel.<br><br>För mer information, se <a href='docu_concepts.html'>konceptet</a> (klicka på länken för att öppna sidan i programfönstret). <br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="118"/> + <source>Choose a Language</source> + <translation>Väl ett språk</translation> + </message> +</context> +<context> + <name>KeyDetailsDialog</name> + <message> + <location filename="../../keydetailsdialog.cpp" line="30"/> + <source>Owner details</source> + <translation>Ägaruppgifter</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="31"/> + <source>Key details</source> + <translation>Nyckeluppgifter</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="32"/> + <source>Fingerprint</source> + <translation>Fingeravtryck</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="33"/> + <source>Additional Uids</source> + <translation>Ytterligare uid</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="81"/> + <source>Name:</source> + <translation>Namn: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="82"/> + <source>E-Mailaddress:</source> + <translation>E-postadress: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="83"/> + <source>Comment:</source> + <translation>Kommentar: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="89"/> + <source>Expires on: </source> + <translation>Upphör att gälla: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="91"/> + <source>Created on: </source> + <translation>Skapad: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="92"/> + <source>Key ID: </source> + <translation>Nyckel-ID: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="116"/> + <source>copy fingerprint to clipboard</source> + <translation>kopiera fingeravtryck till Urklipp</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="158"/> + <source>Warning: Key expired</source> + <translation>Varning! Nyckeln har upphört att gälla</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="161"/> + <source>Warning: Key revoked</source> + <translation>Varning! Nyckeln har dragits tillbaka</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="176"/> + <source>Keydetails</source> + <translation>Nyckeldetaljer</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="187"/> + <source>You are about to export your private key. +This is NOT your public key, so don't give it away. +Make sure you keep it save.Do you really want to export your private key?</source> + <translation>Du är på väg att exportera din privata nyckel. +Detta är INTE din publika nyckel, så lämna inte ut den! +Se till att förvara den säkert. Vill du exportera din privata nyckel?</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="199"/> + <source>Key Files</source> + <translation>Nyckelfiler</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="202"/> + <source>Export error</source> + <translation>Exportfel</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="202"/> + <source>Couldn't open %1 for writing</source> + <translation>Kunde inte öppna %1 för skrivning</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="88"/> + <source>Key size:</source> + <translation>Nyckelstorlek: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="90"/> + <source>Algorithm: </source> + <translation>Algoritm: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="50"/> + <source>Never</source> + <translation>Aldrig</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="62"/> + <source> / Never</source> + <translation> / Aldrig</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="139"/> + <source>Private Key</source> + <translation>Privat nyckel</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="142"/> + <source>Export Private Key</source> + <translation>Exportera privat nyckel</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="186"/> + <source>Exporting private Key</source> + <translation>Exporterar privat nyckel</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="199"/> + <source>Export Key To File</source> + <translation>Exportera nyckel till fil</translation> + </message> +</context> +<context> + <name>KeyGenDialog</name> + <message> + <location filename="../../keygendialog.cpp" line="31"/> + <source>Generate Key</source> + <translation>Skapa nyckel</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="68"/> + <source>Password Strength</source> + <translation>Lösenordsstyrka</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="73"/> + <source>Name:</source> + <translation>Namn:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="74"/> + <source>E-Mailaddress:</source> + <translation>E-postadress:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="75"/> + <source>Comment:</source> + <translation>Kommentar:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="76"/> + <source>Expiration Date:</source> + <translation>Upphör att gälla:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="77"/> + <source>Never Expire</source> + <translation>Upphör aldrig</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="78"/> + <source>KeySize (in Bit):</source> + <translation>Nyckelstorlek (i bitar):</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="79"/> + <source>Password:</source> + <translation>Lösenord:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="80"/> + <source>Password: Strength +Weak -> Strong</source> + <translation>Lösenordsstyrka +Svag -> Stark</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="81"/> + <source>Repeat Password:</source> + <translation>Upprepa lösenord:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="117"/> + <source> Name must contain at least five characters. +</source> + <translation>Namnet måste innehålla minst 5 tecken. +</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="120"/> + <source> Password and Repeat don't match. </source> + <translation>Lösenorden matchar inte varandra. </translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="157"/> + <source>Generating Key...</source> + <translation>Genererar nyckel...</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="159"/> + <source>Collecting random data for key generation. + This may take a while. + To speed up the process use your computer + (e.g. browse the net, listen to music,...)</source> + <translation>Samlar in slumpmässig data för nyckelgenerering. + Det här kan ta en stund. + Använd din dator för att snabba på processen + (Exempel: Surfa på nätet, lyssna på musik,...)</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="175"/> + <source>Success</source> + <translation>Åtgärden slutförd</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="175"/> + <source>New key created</source> + <translation>Ny nyckel skapad</translation> + </message> +</context> +<context> + <name>KeyGenPage</name> + <message> + <location filename="../../wizard.cpp" line="348"/> + <source>Create a keypair...</source> + <translation>Skapa ett nyckelpar...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="349"/> + <source>...for decrypting and signing messages</source> + <translation>...för dekryptering och signering av meddelanden</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="350"/> + <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> + <translation>Du skall skapa ett nytt nyckelpar. Paret består av en publik och en privat nyckel.<br>Andra användare kan använda din publika nyckel för att kryptera meddelanden till dig, och för att verifiera mededelanden signerade av dig. Du kan använda din privata nyckel för att dekryptera och signera meddelanden.<br>Se hjälpfilen för ytterligare informationl (finns i hjälpmenyn):</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="357"/> + <source>Offline tutorial</source> + <translation>Hjälpdokument</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="364"/> + <source>Create New Key</source> + <translation>Skapa ny nyckel</translation> + </message> +</context> +<context> + <name>KeyImportDetailDialog</name> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="31"/> + <location filename="../../keyimportdetaildialog.cpp" line="47"/> + <source>Key import details</source> + <translation>Importdetaljer</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="31"/> + <source>No keys found to import</source> + <translation>Hittade ingen nyckel att importera</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="56"/> + <source>Genral key import info</source> + <translation>Generell importinformation</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="59"/> + <source>Considered:</source> + <translation>Ansedd:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="63"/> + <source>Public unchanged:</source> + <translation>Publik oförändrad:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="68"/> + <source>Imported:</source> + <translation>Importerad:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="73"/> + <source>Not imported:</source> + <translation>Inte importerad:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="78"/> + <source>Private read:</source> + <translation>Privat inläst:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="83"/> + <source>Private imported:</source> + <translation>Privat importerad:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="88"/> + <source>Private unchanged:</source> + <translation>Privat oförändrad:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Name</source> + <translation>Namn</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Email</source> + <translation>E-postadress</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Status</source> + <translation>Status</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Fingerprint</source> + <translation>Fingeravtryck</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="128"/> + <source>private</source> + <translation>privat</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="131"/> + <source>public</source> + <translation>publik</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="134"/> + <source>unchanged</source> + <translation>oförändrad</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="137"/> + <source>new key</source> + <translation>ny nyckel</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="140"/> + <source>new subkey</source> + <translation>ny undernyckel</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="144"/> + <source>new signature</source> + <translation>ny signatur</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="148"/> + <source>new uid</source> + <translation>nytt uid</translation> + </message> +</context> +<context> + <name>KeyList</name> + <message> + <location filename="../../keylist.cpp" line="50"/> + <source>Name</source> + <translation>Namn</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="50"/> + <source>EMail</source> + <translation>E-postadress</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="193"/> + <source>Import Keys</source> + <translation>Importera nycklar</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="195"/> + <source>You've dropped something on the keylist. + gpg4usb will now try to import key(s).</source> + <translation>Du har släppt något på nyckellistan. gpg4usb kommer att försöka importera nycklar.</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="198"/> + <source>Always import without bothering.</source> + <translation>Importera alltid utan att fråga.</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="234"/> + <source>Couldn't Open File: </source> + <translation>Kunde inte öppna filen: </translation> + </message> +</context> +<context> + <name>KeyMgmt</name> + <message> + <location filename="../../keymgmt.cpp" line="61"/> + <source>Keymanagement</source> + <translation>Nyckelhantering</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="68"/> + <source>&Close Key Management</source> + <translation>&Stäng nyckelhanteraren</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="69"/> + <source>Ctrl+Q</source> + <translation>Ctrl+Q</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="71"/> + <source>Close Key Management</source> + <translation>Stäng nyckelhanteraren</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="76"/> + <source>Import New Key From File</source> + <translation>Importera ny nyckel från fil</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="81"/> + <source>Import New Key From Clipboard</source> + <translation>Importera ny nyckel från Urklipp</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="84"/> + <source>&Keyserver</source> + <translation>&Nyckelserver</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="86"/> + <source>Import New Key From Keyserver</source> + <translation>Importera ny nyckel från nyckelserver</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="89"/> + <source>Export To &Clipboard</source> + <translation>Exportera till &Urklipp</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="91"/> + <source>Export Selected Key(s) To Clipboard</source> + <translation>Exportera markerade nycklar till Urklipp</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="94"/> + <source>Export To &File</source> + <translation>Exportera till &fil</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="96"/> + <source>Export Selected Key(s) To File</source> + <translation>Exportera markerade nycklar till fil</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="99"/> + <source>Delete Selected Key(s)</source> + <translation>Ta bort markerade nycklar</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="100"/> + <source>Delete the Selected keys</source> + <translation>Ta bort markerade nycklar</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="103"/> + <source>Delete Checked Key(s)</source> + <translation>Ta bort förbockade nycklar</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="104"/> + <source>Delete the Checked keys</source> + <translation>Ta bort förbockade nycklar</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="108"/> + <source>Generate Key</source> + <translation>Skapa nyckel</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="109"/> + <source>Generate New Key</source> + <translation>Skapa ny nyckel</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="113"/> + <source>Show Keydetails</source> + <translation>Visa nyckeldetaljer</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="114"/> + <source>Show Details for this Key</source> + <translation>Visa uppgifter om denna nyckel</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="145"/> + <source>Import key</source> + <translation>Importera nyckel</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="146"/> + <source>Import key from</source> + <translation>Importera nyckel från</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="260"/> + <source>key(s) exported</source> + <translation>exporterade nycklar</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="74"/> + <location filename="../../keymgmt.cpp" line="120"/> + <source>&File</source> + <translation>&Arkiv</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="79"/> + <source>&Clipboard</source> + <translation>&Urklipp</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="123"/> + <source>&Key</source> + <translation>&Nyckel</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="124"/> + <source>&Import Key From...</source> + <translation>&Importera nyckel från...</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="137"/> + <source>Key</source> + <translation>Nyckel</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <source>Open Key</source> + <translation>Öppna nyckel</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <location filename="../../keymgmt.cpp" line="252"/> + <source>Key Files</source> + <translation>Nyckelfiler</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <source>Keyring files</source> + <translation>Nyckelringsfiler</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="172"/> + <source>Couldn't Open File: </source> + <translation>Kan inte öppna filen: </translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="221"/> + <source>Deleting Keys</source> + <translation>Tar bort nycklar</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="222"/> + <source><b>Are you sure that you want to delete the following keys?.</b><br/><br/></source> + <translation><b>Vill du verkligen ta bort följande nycklar?</b><br/><br/></translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="223"/> + <source><br/>The action can not be undone.</source> + <translation><br/>Åtgärden kan inte ångras.</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="252"/> + <source>Export Key To File</source> + <translation>Exportera nyckel till fil</translation> + </message> +</context> +<context> + <name>KeyServerImportDialog</name> + <message> + <location filename="../../keyserverimportdialog.cpp" line="31"/> + <source>&Close</source> + <translation>&Stäng</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="32"/> + <source>&Import</source> + <translation>&Importera</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="33"/> + <source>&Search</source> + <translation>&Sök</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="36"/> + <source>Search string:</source> + <translation>Söksträng:</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="40"/> + <source>Keyserver:</source> + <translation>Nyckelserver:</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="71"/> + <source>Import Keys from Keyserver</source> + <translation>Importera nycklar från nyckelserver</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>UID</source> + <translation>UID</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>Creation date</source> + <translation>Skapad</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>KeyID</source> + <translation>Nyckel-ID</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>Tag</source> + <translation>Tagg</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="154"/> + <source>Couldn't contact keyserver!</source> + <translation>Kunde inte ansluta till nyckelserver!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="162"/> + <source>Too many responses from keyserver!</source> + <translation>För många svar från nyckelservern!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="168"/> + <source>No keys found, input may be kexId, retrying search with 0x.</source> + <translation>Inga nycklar hittades, försöker söka på nytt med 0x.</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="172"/> + <source>No keys found containing the search string!</source> + <translation>Inga nycklar som innehåller söksträngen kan hittas!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="175"/> + <source>Insufficiently specific search string!</source> + <translation>Otillräckligt specificerad söksträng!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="203"/> + <source>revoked</source> + <translation>återkallad</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="206"/> + <source>disabled</source> + <translation>inaktiverad</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="245"/> + <source>%1 keys found. Doubleclick a key to import it.</source> + <translation>%1 nyckel/nycklar hittades. Dubbelklicka på en nyckel för att importera den.</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="291"/> + <source>Error while contacting keyserver!</source> + <translation>Ett fel upstod när nyckelservern kontaktades!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="295"/> + <source>Key imported</source> + <translation>Nyckel importerad</translation> + </message> +</context> +<context> + <name>KeyserverTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="404"/> + <source>Default Keyserver for import:</source> + <translation>Ordinarie nyckelserver för import:</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../../mainwindow.cpp" line="152"/> + <source>&New</source> + <translation>&Nytt</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="158"/> + <source>Open a new file</source> + <translation>Öppna ny fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="161"/> + <source>&Open...</source> + <translation>&Öppna...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="164"/> + <source>Open an existing file</source> + <translation>Öppna befintlig fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="167"/> + <source>&Save</source> + <translation>&Spara</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="170"/> + <source>Save the current File</source> + <translation>Spara aktuell fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="173"/> + <source>Save &As</source> + <translation>S&para som</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="176"/> + <source>Save the current File as...</source> + <translation>Spara aktuell fil som...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="179"/> + <source>&Print</source> + <translation>S&kriv ut</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="182"/> + <source>Print Document</source> + <translation>Skriv ut dokument</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="185"/> + <location filename="../../mainwindow.cpp" line="640"/> + <source>&Close</source> + <translation>S&täng</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="187"/> + <source>Close file</source> + <translation>Stäng fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="190"/> + <source>&Quit</source> + <translation>&Avsluta</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="193"/> + <source>Quit Program</source> + <translation>Avsluta programmet</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="198"/> + <source>&Undo</source> + <translation>&Ångra</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="200"/> + <source>Undo Last Edit Action</source> + <translation>Ångra senaste åtgärd</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="203"/> + <source>&Redo</source> + <translation>&Upprepa</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="205"/> + <source>Redo Last Edit Action</source> + <translation>Upprepa föregående åtgärd</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="208"/> + <source>Zoom In</source> + <translation>Zooma in</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="212"/> + <source>Zoom Out</source> + <translation>Zooma ut</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="216"/> + <source>&Paste</source> + <translation>&Klistra in</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="219"/> + <source>Paste Text From Clipboard</source> + <translation>Klistra in text från Urklipp</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="222"/> + <source>Cu&t</source> + <translation>K&lipp ut</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="225"/> + <source>Cut the current selection's contents to the clipboard</source> + <translation>Klipp ut markerat innehåll till Urklipp</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="229"/> + <source>&Copy</source> + <translation>Ko&piera</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="232"/> + <source>Copy the current selection's contents to the clipboard</source> + <translation>Kopiera markerat innehåll till Urklipp</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="236"/> + <source>&Quote</source> + <translation>&Citera</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="238"/> + <source>Quote whole text</source> + <translation>Citera text</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="241"/> + <source>Select &All</source> + <translation>&Markera allt</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="244"/> + <source>Select the whole text</source> + <translation>Markera hela texten</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="247"/> + <source>Remove &spacing</source> + <translation>Ta bort &tomma rader</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="250"/> + <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> + <translation>Ta bort dubbla radbrytningar. (Ex: Inklistrad text från e-post)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="253"/> + <source>Se&ttings</source> + <translation>&Inställningar</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="254"/> + <source>Open settings dialog</source> + <translation>Öppna inställningsdialogen</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="260"/> + <source>&Encrypt</source> + <translation>&Kryptera</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="263"/> + <source>Encrypt Message</source> + <translation>Kryptera meddelande</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="266"/> + <source>&Decrypt</source> + <translation>&Dekryptera</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="269"/> + <source>Decrypt Message</source> + <translation>Dekryptera meddelande</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="272"/> + <source>&File Encryption</source> + <translation>&Filkryptering</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="274"/> + <source>Encrypt/Decrypt File</source> + <translation>Kryptera/Dekryptera fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="280"/> + <source>&Encrypt File</source> + <translation>&Kryptera fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="282"/> + <source>Encrypt File</source> + <translation>Kryptera fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="285"/> + <source>&Decrypt File</source> + <translation>&Dekryptera fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="287"/> + <source>Decrypt File</source> + <translation>Dekryptera fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="290"/> + <source>&Sign</source> + <translation>&Signera</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="293"/> + <source>Sign Message</source> + <translation>Signera meddelande</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="296"/> + <source>&Verify</source> + <translation>&Verifiera</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="299"/> + <source>Verify Message</source> + <translation>Verifiera meddelande</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="305"/> + <source>&Editor</source> + <translation>&Redigerare</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="307"/> + <source>Import New Key From Editor</source> + <translation>Importera ny nyckel från redigerare</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="310"/> + <source>Manage &keys</source> + <translation>Hantera &nycklar</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="312"/> + <source>Open Keymanagement</source> + <translation>Öppna nyckelhanteringen</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="317"/> + <source>&About</source> + <translation>&Om</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="319"/> + <source>Show the application's About box</source> + <translation>Visa programmets Om-fönster</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="322"/> + <source>Integrated Help</source> + <translation>Hjälp</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="323"/> + <source>Open integrated Help</source> + <translation>Öppna hjälpfilen</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="326"/> + <source>Online &Tutorials</source> + <translation>Online-&hjälp</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="327"/> + <source>Open Online Tutorials</source> + <translation>Öppna hjälp i webbläsaren</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="330"/> + <source>Translate gpg4usb</source> + <translation>Översätt gpg4usb</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="331"/> + <source>Translate gpg4usb yourself</source> + <translation>Översätt gpg4usb själv</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="334"/> + <source>Open &Wizard</source> + <translation>Öppna &startguiden</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="335"/> + <source>Open the wizard</source> + <translation>Öppna startguiden</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="340"/> + <source>Append Selected Key(s) To Text</source> + <translation>Bifoga markerade nycklar till text</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="341"/> + <source>Append The Selected Keys To Text in Editor</source> + <translation>Bifoga de markerade nycklarna till texten</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="344"/> + <source>Copy EMail-address</source> + <translation>Kopiera e-postadress</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="345"/> + <source>Copy selected EMailaddress to clipboard</source> + <translation>Kopiera markerad e-postadress till Urklipp</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="349"/> + <source>Show Keydetails</source> + <translation>Visa nyckeldetaljer</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="350"/> + <source>Show Details for this Key</source> + <translation>Visa detaljerad info för denna nyckel</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="410"/> + <source>&File</source> + <translation>&Arkiv</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="422"/> + <source>&Edit</source> + <translation>&Redigera</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="438"/> + <source>&Crypt</source> + <translation>&Kryptering</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="448"/> + <source>&Keys</source> + <translation>&Nycklar</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="449"/> + <source>&Import Key From...</source> + <translation>&Importera nyckel från...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="458"/> + <source>&Steganography</source> + <translation>&Steganografi</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="365"/> + <source>Remove PGP Header</source> + <translation>Ta bort PGP-huvud</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="368"/> + <source>Add PGP Header</source> + <translation>Lägg till PGP-huvud</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="467"/> + <source>&View</source> + <translation>&Visa</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="469"/> + <source>&Help</source> + <translation>&Hjälp</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="482"/> + <source>File</source> + <translation>Arkiv</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="490"/> + <source>Crypt</source> + <translation>Kryptering</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="499"/> + <source>Key</source> + <translation>Nycklar</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="504"/> + <source>Edit</source> + <translation>Redigera</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="511"/> + <source>Special edit</source> + <translation>Specialredigering</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="522"/> + <source>Import key from...</source> + <translation>Importera nyckel från...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="523"/> + <source>Import key</source> + <translation>Importera nyckel</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="534"/> + <source>Encrypt or decrypt File</source> + <translation>Kryptera eller dekryptera fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="535"/> + <source>File..</source> + <translation>Fil</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="553"/> + <source>Ready</source> + <translation>Klar</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="561"/> + <source>Encrypt for:</source> + <translation>Nyckellista</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="580"/> + <source>Attached files:</source> + <translation>Bifogade filer:</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="620"/> + <source>About </source> + <translation>Om</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="623"/> + <source><center>This application allows simple encryption <br>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Viriato/Phol (es), <br>Serse (it), Russell (my),<br>Alessandro (pt_br), Kirill (ru), Tom (vi)<br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> + <translation><center>Detta program tillhandahåller enkel kryptering <br>och dekryptering av textmeddelanden och filer.<br>Det är licencierat under GPL v3<br><br><b>Utvecklarer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Översättning:</b><br>Viriato/Phol (es), <br>Serse (it), Russell (my),<br>Alessandro (pt_br), Kirill (ru), Tom (vi) Åke (sv)<br><br>Har du några frågor eller förslag, kan du använda vår<br/><a href="http://gpg4usb.cpunk.de/contact.php">kontaktsida</a> eller skicka e-post till vår<br/> e-postlista. <a href="mailto:[email protected]">[email protected]</a>.</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="635"/> + <source><br><br> Built with Qt </source> + <translation><br><br> Byggd med Qt </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="636"/> + <source> and GPGME </source> + <translation> och GPGME</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="741"/> + <source>There is one unencrypted file in attachment folder</source> + <translation>Det finns en okrypterad fil i bilagemappen</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="743"/> + <source>There are </source> + <translation>Det finns </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="743"/> + <source> unencrypted files in attachment folder</source> + <translation> okrypterade filer i bilagemappen</translation> + </message> +</context> +<context> + <name>MimeTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="204"/> + <source>Decode quoted printable</source> + <translation>Avkoda citerade utskrivbara</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="206"/> + <source>Try to recognize quoted printable.</source> + <translation>Försök att identifiera citerade utskrivbara.</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="210"/> + <source>Parse PGP/MIME (Experimental)</source> + <translation>Tolka PGP/MIME (Experimentellt)</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="212"/> + <source>Try to split attachments from PGP-MIME ecrypted messages.</source> + <translation>Försök dela upp bifogade filer från PGP/MIME-krypterade meddelanden.</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="216"/> + <source>Open with external application (Experimental)</source> + <translation>Öppna med externt program (Experimentellt)</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="218"/> + <source>Open attachments with default application for the filetype.<br> There are at least two possible problems with this behaviour:<ol><li>File needs to be saved unencrypted to attachments folder.<br> Its your job to clean this folder.</li><li>The external application may have its own temp files.</li></ol></source> + <translation>Öppna bilagor med standardprogrammet för filtypen.<br> Det finns minst två möjliga problem med detta uppförande:<ol><li>Filen måste sparas okrypterat i bilage-mappen.<br> Det blir ditt jobb att rensa den mappen.</li><li>Det externa programmet kanske har sina egna temporära filer.</li></ol></translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="225"/> + <source>Enable opening with external applications.</source> + <translatorcomment>Aktivera öppning med externa program</translatorcomment> + <translation></translation> + </message> +</context> +<context> + <name>QuitDialog</name> + <message> + <location filename="../../quitdialog.cpp" line="28"/> + <source>Unsaved files</source> + <translation>Osparade filer</translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="74"/> + <source><h3>%1 files contain unsaved information.<br/>Save the changes before closing?</h3></source> + <translation><h3>%1 filer innehåller osparad information.<br/>Vill du spara dessa ändringar före avslut?</h3></translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="85"/> + <source>Check the files you want to save:</source> + <translation>Markera de filer du vill spara:</translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="86"/> + <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> + <translation><b>OBS!</b> Om du inte sparar dessa filer kommer alla ändringar att förloras.<br/></translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../../settingsdialog.cpp" line="34"/> + <source>General</source> + <translation>Allmänt</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="35"/> + <source>Appearance</source> + <translation>Utseende</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="36"/> + <source>PGP/Mime</source> + <translation>PGP/Mime</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="37"/> + <source>Keyserver</source> + <translation>Nyckelserver</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="38"/> + <source>Advanced</source> + <translation>Avancerat</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="51"/> + <source>Settings</source> + <translation>Inställningar</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="72"/> + <source>System Default</source> + <translation>Systemstandard</translation> + </message> +</context> +<context> + <name>TextEdit</name> + <message> + <location filename="../../textedit.cpp" line="45"/> + <source>untitled</source> + <translation>ingenamn</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="66"/> + <source>Open file</source> + <translation>Öppna fil</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="90"/> + <location filename="../../textedit.cpp" line="378"/> + <source>Application</source> + <translation>Program</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="91"/> + <location filename="../../textedit.cpp" line="379"/> + <source>Cannot read file %1: +%2.</source> + <translation>Kan inte läsa filen %1: +%2.</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="142"/> + <source>File</source> + <translation>Fil</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="143"/> + <source>Cannot write file %1: +%2.</source> + <translation>Kan inte skriva filen %1: +%2.</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="165"/> + <source>Save file </source> + <translation>Spara fil </translation> + </message> + <message> + <location filename="../../textedit.cpp" line="231"/> + <source>Unsaved document</source> + <translation>Osparat dokument</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="232"/> + <source><h3>The document "%1" has been modified.<br/>Do you want to save your changes?</h3></source> + <translation><h3>Dokumentet "%1" har ändrats.<br/>Vill du spara ändringarna?</h3></translation> + </message> + <message> + <location filename="../../textedit.cpp" line="233"/> + <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> + <translation><b>OBS!</b> Om du inte sparar dessa filer kommer ändringarna att förloras.<br/></translation> + </message> +</context> +<context> + <name>VerifyDetailsDialog</name> + <message> + <location filename="../../verifydetailsdialog.cpp" line="30"/> + <source>Signaturedetails</source> + <translation>Signaturuppgifter</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="61"/> + <source>Error Validating signature</source> + <translation>Kunde inte validera signaturen</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="67"/> + <source>Text was completely signed on + %1 by: +</source> + <translation>Texten är signerad den + %1 av: +</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="72"/> + <source>Text was partially signed on + %1 by: +</source> + <translation>Texten är delvis signerad den + %1 av: +</translation> + </message> +</context> +<context> + <name>VerifyKeyDetailBox</name> + <message> + <location filename="../../verifykeydetailbox.cpp" line="37"/> + <source>Import from keyserver</source> + <translation>Importera från nyckelserver</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="42"/> + <location filename="../../verifykeydetailbox.cpp" line="57"/> + <location filename="../../verifykeydetailbox.cpp" line="72"/> + <source>Status:</source> + <translation>Status:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="56"/> + <location filename="../../verifykeydetailbox.cpp" line="73"/> + <source>Fingerprint:</source> + <translation>Fingeravtryck:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="44"/> + <source>Key not present in keylist</source> + <translation>Nyckel finns inte i nyckellistan</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="40"/> + <source>Key not present with id 0x</source> + <translation>Ingen befintlig nyckel med ID 0x</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="54"/> + <location filename="../../verifykeydetailbox.cpp" line="70"/> + <source>Name:</source> + <translation>Namn:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="55"/> + <location filename="../../verifykeydetailbox.cpp" line="71"/> + <source>EMail:</source> + <translation>E-postadress:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="62"/> + <source>OK</source> + <translation>OK</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="69"/> + <source>Error for key with id 0x</source> + <translation>Fel på nyckel med ID 0x</translation> + </message> +</context> +<context> + <name>VerifyNotification</name> + <message> + <location filename="../../verifynotification.cpp" line="35"/> + <source>Import missing key from Keyserver</source> + <translation>Importera saknad nyckel från nyckelserver</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="38"/> + <source>Show detailed verify information</source> + <translation>Visa detaljerad verifieringsinformation</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="47"/> + <source>Details</source> + <translation>Detaljer</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="117"/> + <source>Key not present with id 0x</source> + <translation>Ingen nyckel med ID 0x</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="159"/> + <source>Error validating signature by: </source> + <translation>Kunde inte validera signatur av: </translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="164"/> + <source>Text was completely signed by: </source> + <translation>Texten är signerad av: </translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="169"/> + <source>Text was partially signed by: </source> + <translation>Texten är delvis signerad av: </translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="147"/> + <source>Error for key with fingerprint </source> + <translation>Fel på nyckel med fingeravtrycket </translation> + </message> +</context> +<context> + <name>Wizard</name> + <message> + <location filename="../../wizard.cpp" line="40"/> + <source>First Start Wizard</source> + <translation>Startguide</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="73"/> + <source>Import Error</source> + <translation>Importfel</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="73"/> + <source>Couldn't locate any keyring file in %1</source> + <translation>Kunde inte hitta någon nyckelringsfil i %1</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="81"/> + <location filename="../../wizard.cpp" line="91"/> + <source>Import error</source> + <translation>Importfel</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="81"/> + <source>Couldn't open private keyringfile: %1</source> + <translation>Kunde inte öppna den private nyckelringsfilen: %1</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="91"/> + <source>Couldn't open public keyringfile: %1</source> + <translation>Kunde inte öppna den publika nyckelringsfilen: %1</translation> + </message> +</context> +</TS> diff --git a/release/ts/gpg4usb_vi.ts b/release/ts/gpg4usb_vi.ts index ba8a72a..4f7b9d7 100644 --- a/release/ts/gpg4usb_vi.ts +++ b/release/ts/gpg4usb_vi.ts @@ -208,10 +208,6 @@ <translation>Thực hiện</translation> </message> <message> - <source>...</source> - <translation type="obsolete">...</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="31"/> <source>Decrypt File</source> <translation type="unfinished"></translation> @@ -257,10 +253,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>couldn't open file: </source> - <translation type="obsolete">Không mở được tệp:</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="180"/> <source>Cannot write file %1: %2.</source> @@ -310,49 +302,6 @@ <source>Language</source> <translation>Ngôn ngữ</translation> </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">Thay đổi Ngôn ngữ được áp dụng sau khi khởi động lại chương trình.</translation> - </message> - <message> - <source>System Default</source> - <translation type="obsolete">Mặc định Hệ thống</translation> - </message> -</context> -<context> - <name>GpgME::Context</name> - <message> - <source>No Key Selected</source> - <translation type="obsolete">Không có Khóa được chọn</translation> - </message> - <message> - <source>Unsupported algorithm</source> - <translation type="obsolete">Thuật toán không được hỗ trợ</translation> - </message> - <message> - <source>Error decrypting:</source> - <translation type="obsolete">Lỗi giải mã hóa:</translation> - </message> - <message> - <source>Wrong password</source> - <translation type="obsolete">Mật khẩu không chính xác</translation> - </message> - <message> - <source>Enter Password</source> - <translation type="obsolete">Nhập Mật khẩu</translation> - </message> - <message> - <source>Key Selection</source> - <translation type="obsolete">Chọn Khóa</translation> - </message> - <message> - <source>No Private Key Selected</source> - <translation type="obsolete">Không có Khóa riêng được chọn</translation> - </message> - <message> - <source>Error signing:</source> - <translation type="obsolete">Lỗi tạo chữ ký số:</translation> - </message> </context> <context> <name>GpgME::GpgContext</name> @@ -408,337 +357,6 @@ </message> </context> <context> - <name>GpgWin</name> - <message> - <source>&Open...</source> - <translation type="obsolete">&Mở...</translation> - </message> - <message> - <source>Open an existing file</source> - <translation type="obsolete">Mở tệp đã tồn tại</translation> - </message> - <message> - <source>&Save</source> - <translation type="obsolete">&Lưu</translation> - </message> - <message> - <source>Save the current File</source> - <translation type="obsolete">Lưu Tệp hiện hành</translation> - </message> - <message> - <source>Save &As</source> - <translation type="obsolete">Lưu &như</translation> - </message> - <message> - <source>Save the current File as...</source> - <translation type="obsolete">Lưu Tệp hiện hành như...</translation> - </message> - <message> - <source>&Print</source> - <translation type="obsolete">&In</translation> - </message> - <message> - <source>Print Document</source> - <translation type="obsolete">In Tài liệu</translation> - </message> - <message> - <source>&Close</source> - <translation type="obsolete">&Đóng</translation> - </message> - <message> - <source>Close file</source> - <translation type="obsolete">Đóng tệp</translation> - </message> - <message> - <source>&Quit</source> - <translation type="obsolete">&Thoát</translation> - </message> - <message> - <source>Quit Program</source> - <translation type="obsolete">Thoát Chương trình</translation> - </message> - <message> - <source>&Undo</source> - <translation type="obsolete">&Hoàn tác</translation> - </message> - <message> - <source>Undo Last Edit Action</source> - <translation type="obsolete">Hoàn tác Thao tác Soạn thảo Sau cùng</translation> - </message> - <message> - <source>&Redo</source> - <translation type="obsolete">&Hủy hoàn tác</translation> - </message> - <message> - <source>Redo Last Edit Action</source> - <translation type="obsolete">Thực hiện lại Thao tác Soạn thảo Sau cùng</translation> - </message> - <message> - <source>&Paste</source> - <translation type="obsolete">&Dán</translation> - </message> - <message> - <source>Paste Text From Clipboard</source> - <translation type="obsolete">Chép Văn bản từ Clipboard</translation> - </message> - <message> - <source>Cu&t</source> - <translation type="obsolete">Cắ&t</translation> - </message> - <message> - <source>Cut the current selection's contents to the clipboard</source> - <translation type="obsolete">Cắt và sao nội dung được chọn vào clipboard</translation> - </message> - <message> - <source>&Copy</source> - <translation type="obsolete">&Sao chép</translation> - </message> - <message> - <source>Copy the current selection's contents to the clipboard</source> - <translation type="obsolete">Chép nội dung được chọn vào clipboard</translation> - </message> - <message> - <source>&Quote</source> - <translation type="obsolete">&Trích dẫn</translation> - </message> - <message> - <source>Quote whole text</source> - <translation type="obsolete">Trích dẫn toàn bộ đoạn văn bản</translation> - </message> - <message> - <source>Select &All</source> - <translation type="obsolete">Chọn &Toàn bộ</translation> - </message> - <message> - <source>Select the whole text</source> - <translation type="obsolete">Chọn toàn bộ đoạn văn bản</translation> - </message> - <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">Bỏ cách dòng và &Xuống dòng</translation> - </message> - <message> - <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> - <translation type="obsolete">Bỏ dấu cách dòng kép, ví dụ trong các đoạn văn bản sao chép từ thư từ trang web</translation> - </message> - <message> - <source>Open settings dialog</source> - <translation type="obsolete">Mở hộp thoại thiết đặt</translation> - </message> - <message> - <source>&Encrypt</source> - <translation type="obsolete">&Mã hóa</translation> - </message> - <message> - <source>Encrypt Message</source> - <translation type="obsolete">Mã hóa Tin nhắn</translation> - </message> - <message> - <source>&Decrypt</source> - <translation type="obsolete">&Giải Mã</translation> - </message> - <message> - <source>Decrypt Message</source> - <translation type="obsolete">Giải mã Tin nhắn</translation> - </message> - <message> - <source>&File Encryption</source> - <translation type="obsolete">&Mã hóa Tệp</translation> - </message> - <message> - <source>Encrypt/Decrypt File</source> - <translation type="obsolete">Mã hóa/Giải mã Tệp</translation> - </message> - <message> - <source>&Sign</source> - <translation type="obsolete">&Ký số</translation> - </message> - <message> - <source>Sign Message</source> - <translation type="obsolete">Ký Tin nhắn</translation> - </message> - <message> - <source>&Verify</source> - <translation type="obsolete">&Kiểm tra</translation> - </message> - <message> - <source>Verify Message</source> - <translation type="obsolete">Kiểm tra Tin nhắn</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Ứng dụng này cho phép mã hóa <br/>và giải mã văn bản hoặc tệp dữ liệu.<br>Bản quyền chương trình tuân thủ GPL v3<br><br><b>Nhóm phát triển:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Chuyển ngữ:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>Nếu bạn có bất kỳ thắc măc hay gợi ý nào hãy liên hệ với chúng tôi <br/>tại trang <a href="http://gpg4usb.cpunk.de/contact.php">liên hệ</a> hoặc qua<br/> địa chỉ thư <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">&Máy chủ Khóa</translation> - </message> - <message> - <source>Import New Key From Editor</source> - <translation type="obsolete">Nhập Khóa Mới Từ Trình Soạn Thảo</translation> - </message> - <message> - <source>Key Management</source> - <translation type="obsolete">Quản lý Khóa</translation> - </message> - <message> - <source>Open Keymanagement</source> - <translation type="obsolete">Mở Trình Quản lý Khóa</translation> - </message> - <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">Mở Hộp thoại Nhập Khóa mới</translation> - </message> - <message> - <source>&About</source> - <translation type="obsolete">&Thông tin</translation> - </message> - <message> - <source>Show the application's About box</source> - <translation type="obsolete">Hiện hộp Thông tin Ứng dụng</translation> - </message> - <message> - <source>&File</source> - <translation type="obsolete">&Tệp</translation> - </message> - <message> - <source>&Edit</source> - <translation type="obsolete">&Soạn thảo</translation> - </message> - <message> - <source>&Help</source> - <translation type="obsolete">&Trợ giúp</translation> - </message> - <message> - <source>Append Selected Key(s) To Text</source> - <translation type="obsolete">Nối tiếp Khóa Được Chọn vào Văn bản</translation> - </message> - <message> - <source>Se&ttings</source> - <translation type="obsolete">Thiế&t đặt</translation> - </message> - <message> - <source>&New</source> - <translation type="obsolete">&Tạo mới</translation> - </message> - <message> - <source>Open a new file</source> - <translation type="obsolete">Mở một tệp mới</translation> - </message> - <message> - <source>Online &Tutorial</source> - <translation type="obsolete">Hướng dẫn &Trực tuyến</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">Mở Hướng dẫn Trực tuyến</translation> - </message> - <message> - <source>Translate gpg4usb</source> - <translation type="obsolete">Chuyển ngữ cho gpg4usb</translation> - </message> - <message> - <source>Translate gpg4usb yourself</source> - <translation type="obsolete">Bạn hãy dịch gpg4usb sang ngôn ngữ khác</translation> - </message> - <message> - <source>Append The Selected Keys To Text in Editor</source> - <translation type="obsolete">Nối tiếp Khóa Được Chọn Vào Văn bản trong Trình Soạn Thảo</translation> - </message> - <message> - <source>Copy EMail-address</source> - <translation type="obsolete">Chép Địa chỉ EMail</translation> - </message> - <message> - <source>Copy selected EMailaddress to clipboard</source> - <translation type="obsolete">Chép Địa chỉ Email được chọn vào clipboard</translation> - </message> - <message> - <source>Show Keydetails</source> - <translation type="obsolete">Hiển thị thông tin Khóa</translation> - </message> - <message> - <source>Show Details for this Key</source> - <translation type="obsolete">Hiển thị Thông tin của Khóa này</translation> - </message> - <message> - <source>&Keys</source> - <translation type="obsolete">&Khóa mã hóa</translation> - </message> - <message> - <source>&Import Key From...</source> - <translation type="obsolete">&Nhập Khóa Từ...</translation> - </message> - <message> - <source>&View</source> - <translation type="obsolete">&Hiển thị</translation> - </message> - <message> - <source>Ready</source> - <translation type="obsolete">Sẵn sàng</translation> - </message> - <message> - <source>Encrypt for:</source> - <translation type="obsolete">Mã hóa cho:</translation> - </message> - <message> - <source>Attached files:</source> - <translation type="obsolete">Các tệp đính kèm:</translation> - </message> - <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v2.0<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>Ứng dụng này cho phép mã hóa <br/>và giải mã văn bản hoặc tệp dữ liệu.<br>Bản quyền chương trình tuân thủ GPL v2.0<br><br><b>Nhóm phát triển:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Chuyển ngữ:</b><br>Alessandro (pt_br), Kirill (ru), Viriato (es), Serse (it) <br><br>Nếu bạn có bất kỳ thắc măc hay gợi ý nào hãy liên hệ với chúng tôi <br/>tại trang <a href="http://gpg4usb.cpunk.de/contact.php">liên hệ</a> hoặc qua<br/> địa chỉ thư <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>There is one unencrypted file in attachment folder</source> - <translation type="obsolete">Có một tệp không được mã hóa trong phần đính kèm</translation> - </message> - <message> - <source>There are </source> - <translation type="obsolete">Có</translation> - </message> - <message> - <source> unencrypted files in attachment folder</source> - <translation type="obsolete">các tệp không được mã hóa trong phần đính kèm</translation> - </message> - <message> - <source>&Editor</source> - <translation type="obsolete">&Trình soạn thảo</translation> - </message> - <message> - <source>&Clipboard</source> - <translation type="obsolete">&Clipboard</translation> - </message> - <message> - <source>Import Key</source> - <translation type="obsolete">Nhập Khóa mã hóa</translation> - </message> - <message> - <source>&Crypt</source> - <translation type="obsolete">&Mã hóa</translation> - </message> - <message> - <source>Crypt</source> - <translation type="obsolete">Mã hóa</translation> - </message> - <message> - <source>Key</source> - <translation type="obsolete">Khóa</translation> - </message> - <message> - <source>Edit</source> - <translation type="obsolete">Soạn thảo</translation> - </message> - <message> - <source>About </source> - <translation type="obsolete">Thông tin</translation> - </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">Nhập Khóa từ...</translation> - </message> -</context> -<context> <name>ImportFromGnupgPage</name> <message> <location filename="../../wizard.cpp" line="288"/> @@ -972,14 +590,6 @@ Make sure you keep it save.Do you really want to export your private key?</sourc <translation>Đang xuất Khóa riêng</translation> </message> <message> - <source>You are about to export your private key. -This is NOT your public key, so don't give it away. -Make sure you keep it save.</source> - <translation type="obsolete">Bạn chuẩn bị xuất khóa riêng. -Đây KHÔNG' phải khóa công khai của bạn, đừng tiết lộ cho ai. -Hãy chắc chắn bạn cất giữ khóa riêng này an toàn.</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="199"/> <source>Export Key To File</source> <translation>Xuất Khóa ra Tệp</translation> @@ -1439,72 +1049,6 @@ Yếu -> Mạnh</translation> <source>Export Key To File</source> <translation>Xuất Khóa ra Tệp</translation> </message> - <message> - <source>Name:</source> - <translation type="obsolete">Tên:</translation> - </message> - <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">Địa chỉ Email:</translation> - </message> - <message> - <source>Comment:</source> - <translation type="obsolete">Nhận xét:</translation> - </message> - <message> - <source>KeySize (in Bit):</source> - <translation type="obsolete">Kích thước Khóa (Bit):</translation> - </message> - <message> - <source>Expiration Date:</source> - <translation type="obsolete">Ngày hết hạn:</translation> - </message> - <message> - <source>Password:</source> - <translation type="obsolete">Mật khẩu:</translation> - </message> - <message> - <source>Repeat Password:</source> - <translation type="obsolete">Nhập lại Mật khẩu:</translation> - </message> - <message> - <source>Never Expire</source> - <translation type="obsolete">Không bao giời hết hạn</translation> - </message> - <message> - <source>Password: Strength -Weak -> Strong</source> - <translation type="obsolete">Mật khẩu: Độ mạnh -Yếu -> Mạnh</translation> - </message> - <message> - <source>Password Strength</source> - <translation type="obsolete">Độ mạnh Mật khẩu</translation> - </message> - <message> - <source> Name must contain at least five characters. -</source> - <translation type="obsolete"> Tên phải gồm ít nhất năm ký tự. -</translation> - </message> - <message> - <source> Password and Repeat don't match. </source> - <translation type="obsolete">Mật khẩu và Xác nhận mật khẩu không khớp.</translation> - </message> - <message> - <source>Generating Key...</source> - <translation type="obsolete">Đang Tạo Khóa...</translation> - </message> - <message> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="obsolete">Đang lấy dữ liệu ngẫu nhiên để tạo khóa. - Thao tác này có thể mất chút thời gian. - Để đẩy nhanh tiến trình, hãy sử dụng máy tính - (ví dụ vào Internet, nghe nhạc,...)</translation> - </message> </context> <context> <name>KeyServerImportDialog</name> @@ -1559,52 +1103,52 @@ Yếu -> Mạnh</translation> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="153"/> + <location filename="../../keyserverimportdialog.cpp" line="154"/> <source>Couldn't contact keyserver!</source> <translation>Không thể kết nối máy chủ khóa!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="161"/> + <location filename="../../keyserverimportdialog.cpp" line="162"/> <source>Too many responses from keyserver!</source> <translation>Quá nhiều trả lời từ máy chủ khóa!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="167"/> + <location filename="../../keyserverimportdialog.cpp" line="168"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="171"/> + <location filename="../../keyserverimportdialog.cpp" line="172"/> <source>No keys found containing the search string!</source> <translation>Không tìm thấy khóa chứa chuỗi tìm kiếm!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="174"/> + <location filename="../../keyserverimportdialog.cpp" line="175"/> <source>Insufficiently specific search string!</source> <translation>Chuỗi tìm kiếm không đủ riêng biệt!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="201"/> + <location filename="../../keyserverimportdialog.cpp" line="203"/> <source>revoked</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="204"/> + <location filename="../../keyserverimportdialog.cpp" line="206"/> <source>disabled</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="243"/> + <location filename="../../keyserverimportdialog.cpp" line="245"/> <source>%1 keys found. Doubleclick a key to import it.</source> <translation>%1 khóa được tìm thấy. Nhấn đúp chuột để nhập khóa.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="288"/> + <location filename="../../keyserverimportdialog.cpp" line="291"/> <source>Error while contacting keyserver!</source> <translation>Lỗi kết nối máy chủ khóa!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="292"/> + <location filename="../../keyserverimportdialog.cpp" line="295"/> <source>Key imported</source> <translation>Khóa được nhập</translation> </message> @@ -2170,11 +1714,6 @@ Yếu -> Mạnh</translation> <context> <name>SettingsDialog</name> <message> - <source>English</source> - <comment>Insert local name of language here. This is used for the language menu of the settingsdialog</comment> - <translation type="obsolete">English</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="34"/> <source>General</source> <translation>Tổng quát</translation> @@ -2209,10 +1748,6 @@ Yếu -> Mạnh</translation> <source>System Default</source> <translation type="unfinished">Mặc định Hệ thống</translation> </message> - <message> - <source>English</source> - <translation type="obsolete">Tiếng Việt</translation> - </message> </context> <context> <name>TextEdit</name> @@ -2299,18 +1834,6 @@ Yếu -> Mạnh</translation> </source> <translation type="unfinished"></translation> </message> - <message> - <source>Text was completly signed on %1 by: -</source> - <translation type="obsolete">Văn bản đã được ký hoàn toàn vào %1 bởi: -</translation> - </message> - <message> - <source>Text was partially signed on %1 by: -</source> - <translation type="obsolete">Văn bản đã được ký từng phần vào %1 bởi: -</translation> - </message> </context> <context> <name>VerifyKeyDetailBox</name> @@ -2403,22 +1926,10 @@ Yếu -> Mạnh</translation> <translation type="unfinished"></translation> </message> <message> - <source>Key not present with Fingerprint: </source> - <translation type="obsolete">Khóa không gồm Vân tay số:</translation> - </message> - <message> <location filename="../../verifynotification.cpp" line="147"/> <source>Error for key with fingerprint </source> <translation>Lỗi khóa với Vân tay số</translation> </message> - <message> - <source>Text is completly signed by: </source> - <translation type="obsolete">Văn bản được ký số hoàn toàn bởi:</translation> - </message> - <message> - <source>Text is partially signed by: </source> - <translation type="obsolete">Văn bản được ký số từng phần bởi:</translation> - </message> </context> <context> <name>Wizard</name> diff --git a/release/ts/gpg4usb_zh.ts b/release/ts/gpg4usb_zh.ts index 20bcf40..9c36345 100644 --- a/release/ts/gpg4usb_zh.ts +++ b/release/ts/gpg4usb_zh.ts @@ -209,10 +209,6 @@ <translation type="unfinished">动作</translation> </message> <message> - <source>...</source> - <translation type="obsolete">...</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="31"/> <source>Decrypt File</source> <translation type="unfinished">解密文件</translation> @@ -258,10 +254,6 @@ <translation type="unfinished">无法打开文件</translation> </message> <message> - <source>couldn't open file: </source> - <translation type="obsolete">无法打开文件:</translation> - </message> - <message> <location filename="../../fileencryptiondialog.cpp" line="180"/> <source>Cannot write file %1: %2.</source> @@ -311,14 +303,6 @@ <source>Language</source> <translation type="unfinished">语言</translation> </message> - <message> - <source>Language change is applied after restarting program.</source> - <translation type="obsolete">修改界面语言重启后生效</translation> - </message> - <message> - <source>System Default</source> - <translation type="obsolete">系统默认</translation> - </message> </context> <context> <name>GpgME::GpgContext</name> @@ -609,14 +593,6 @@ Make sure you keep it save.Do you really want to export your private key?</sourc <translation type="unfinished">正在导出私钥</translation> </message> <message> - <source>You are about to export your private key. -This is NOT your public key, so don't give it away. -Make sure you keep it save.</source> - <translation type="obsolete">你正准备导出你的私人密钥. -此密钥不是你的公共密钥, 不要将它散发 -并确保此密钥的安全.</translation> - </message> - <message> <location filename="../../keydetailsdialog.cpp" line="199"/> <source>Export Key To File</source> <translation type="unfinished">导出密钥到文件</translation> @@ -1074,70 +1050,6 @@ gpg4usb将尝试导入密钥.</translation> <source>Export Key To File</source> <translation type="unfinished">导出密钥到文件</translation> </message> - <message> - <source>Name:</source> - <translation type="obsolete">名称</translation> - </message> - <message> - <source>E-Mailaddress::</source> - <translation type="obsolete">电邮地址</translation> - </message> - <message> - <source>Comment:</source> - <translation type="obsolete">备注</translation> - </message> - <message> - <source>KeySize (in Bit):</source> - <translation type="obsolete">密钥大小(字节):</translation> - </message> - <message> - <source>Expiration Date:</source> - <translation type="obsolete">失效日期:</translation> - </message> - <message> - <source>Password:</source> - <translation type="obsolete">密码:</translation> - </message> - <message> - <source>Repeat Password:</source> - <translation type="obsolete">重复密码:</translation> - </message> - <message> - <source>Never Expire</source> - <translation type="obsolete">永不失效</translation> - </message> - <message> - <source>Password: Strength -Weak -> Strong</source> - <translation type="obsolete">密码:强度 -弱->强</translation> - </message> - <message> - <source>Password Strength</source> - <translation type="obsolete">密码强度</translation> - </message> - <message> - <source> Name must contain at least five characters. -</source> - <translation type="obsolete">名称必须包含至少五个字符.</translation> - </message> - <message> - <source> Password and Repeat don't match. </source> - <translation type="obsolete">密码与重复密码内容不同.</translation> - </message> - <message> - <source>Generating Key...</source> - <translation type="obsolete">正在生成密钥...</translation> - </message> - <message> - <source>Collecting random data for key generation. - This may take a while. - To speed up the process use your computer - (e.g. browse the net, listen to music,...)</source> - <translation type="obsolete">正在为密钥采集随机数据. -这可能会花费一些时间. -使用电脑可加速此过程(如: 浏览网页,听音乐,...)</translation> - </message> </context> <context> <name>KeyServerImportDialog</name> @@ -1192,52 +1104,52 @@ Weak -> Strong</source> <translation type="unfinished">标记</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="153"/> + <location filename="../../keyserverimportdialog.cpp" line="154"/> <source>Couldn't contact keyserver!</source> <translation type="unfinished">无法与密钥服务器通讯!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="161"/> + <location filename="../../keyserverimportdialog.cpp" line="162"/> <source>Too many responses from keyserver!</source> <translation type="unfinished">密钥服务器回应过多!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="167"/> + <location filename="../../keyserverimportdialog.cpp" line="168"/> <source>No keys found, input may be kexId, retrying search with 0x.</source> <translation type="unfinished">未发现密钥, 输入kexid , 尝试用0x再次查找.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="171"/> + <location filename="../../keyserverimportdialog.cpp" line="172"/> <source>No keys found containing the search string!</source> <translation type="unfinished">没有找到含有查询字符串的密钥!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="174"/> + <location filename="../../keyserverimportdialog.cpp" line="175"/> <source>Insufficiently specific search string!</source> <translation type="unfinished">无效的查询字符串!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="201"/> + <location filename="../../keyserverimportdialog.cpp" line="203"/> <source>revoked</source> <translation type="unfinished">已失效</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="204"/> + <location filename="../../keyserverimportdialog.cpp" line="206"/> <source>disabled</source> <translation type="unfinished">已禁用</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="243"/> + <location filename="../../keyserverimportdialog.cpp" line="245"/> <source>%1 keys found. Doubleclick a key to import it.</source> <translation type="unfinished">找到%1个密钥. 双击密钥将其导入.</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="288"/> + <location filename="../../keyserverimportdialog.cpp" line="291"/> <source>Error while contacting keyserver!</source> <translation type="unfinished">与密钥服务器通讯时发生错误!</translation> </message> <message> - <location filename="../../keyserverimportdialog.cpp" line="292"/> + <location filename="../../keyserverimportdialog.cpp" line="295"/> <source>Key imported</source> <translation type="unfinished">密钥已导入</translation> </message> @@ -1399,10 +1311,6 @@ Weak -> Strong</source> <translation type="unfinished">管理密钥</translation> </message> <message> - <source>Remove double &Linebreaks</source> - <translation type="obsolete">删除双换行</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="250"/> <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> <translation type="unfinished">删除两换行符如从网页邮件中复制过来的文字</translation> @@ -1483,32 +1391,16 @@ Weak -> Strong</source> <translation type="unfinished">验证信息</translation> </message> <message> - <source><center>This application allows simple encryption <br/>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) <br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> - <translation type="obsolete"><center>本程序为加密程序 <br/>可对文字信息或是文件进行加密.<br>本程序遵循GPL v3授权协议<br><br><b>开发者:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>翻译:</b><br>Alessandro (pt_br), Kirill (ru), Phol (es), Viriato (es), Serse (it), Tom (vi) , Toughworm(zh)<br><br>如果你有任何疑问或建设请查看<br/>我们的<a href="http://gpg4usb.cpunk.de/contact.php">联系方式</a> 或是发送邮件给我们<br/> 邮件地址 <a href="mailto:[email protected]">[email protected]</a>.</translation> - </message> - <message> - <source>&Keyserver</source> - <translation type="obsolete">密钥服务器</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="307"/> <source>Import New Key From Editor</source> <translation type="unfinished">从编辑器中获得密钥</translation> </message> <message> - <source>Key Management</source> - <translation type="obsolete">密钥管理</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="312"/> <source>Open Keymanagement</source> <translation type="unfinished">打开密钥管理</translation> </message> <message> - <source>Open Import New Key Dialog</source> - <translation type="obsolete">打开导入新密钥对话框</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="317"/> <source>&About</source> <translation type="unfinished">关于</translation> @@ -1579,14 +1471,6 @@ Weak -> Strong</source> <translation type="unfinished">打新文件</translation> </message> <message> - <source>Online &Tutorial</source> - <translation type="obsolete">在线教程</translation> - </message> - <message> - <source>Open Online Tutorial</source> - <translation type="obsolete">打开在线教程</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="330"/> <source>Translate gpg4usb</source> <translation type="unfinished">翻译本软件</translation> @@ -1742,14 +1626,6 @@ Weak -> Strong</source> <translation type="unfinished">编辑器</translation> </message> <message> - <source>&Clipboard</source> - <translation type="obsolete">剪切板</translation> - </message> - <message> - <source>Import Key</source> - <translation type="obsolete">导入密钥</translation> - </message> - <message> <location filename="../../mainwindow.cpp" line="438"/> <source>&Crypt</source> <translation type="unfinished">加密</translation> @@ -1774,10 +1650,6 @@ Weak -> Strong</source> <source>About </source> <translation type="unfinished">关于</translation> </message> - <message> - <source>Import Key From...</source> - <translation type="obsolete">导入密钥</translation> - </message> </context> <context> <name>MimeTab</name> @@ -1843,11 +1715,6 @@ Weak -> Strong</source> <context> <name>SettingsDialog</name> <message> - <source>English</source> - <comment>Insert local name of language here. This is used for the language menu of the settingsdialog</comment> - <translation type="obsolete">English</translation> - </message> - <message> <location filename="../../settingsdialog.cpp" line="34"/> <source>General</source> <translation type="unfinished">普通</translation> @@ -1882,10 +1749,6 @@ Weak -> Strong</source> <source>System Default</source> <translation type="unfinished">系统默认</translation> </message> - <message> - <source>English</source> - <translation type="obsolete">中文</translation> - </message> </context> <context> <name>TextEdit</name> diff --git a/release/ts/gpg4usb_zh_tw.qm b/release/ts/gpg4usb_zh_tw.qm Binary files differnew file mode 100644 index 0000000..8b875bb --- /dev/null +++ b/release/ts/gpg4usb_zh_tw.qm diff --git a/release/ts/gpg4usb_zh_tw.ts b/release/ts/gpg4usb_zh_tw.ts new file mode 100644 index 0000000..c34c3e6 --- /dev/null +++ b/release/ts/gpg4usb_zh_tw.ts @@ -0,0 +1,1975 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="zh_TW" sourcelanguage="en_US"> +<context> + <name>AdvancedTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="448"/> + <source>Show Steganography Options [Advanced]</source> + <translation type="unfinished">顯示資訊偽裝選項 [進階]</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="450"/> + <source>Show Steganographic Options.</source> + <translation type="unfinished">顯示資訊偽裝選項。</translation> + </message> +</context> +<context> + <name>AppearanceTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="279"/> + <source>Iconsize</source> + <translation type="unfinished">圖示尺寸</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="281"/> + <source>small</source> + <translation type="unfinished">小</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="282"/> + <source>medium</source> + <translation type="unfinished">中</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="283"/> + <source>large</source> + <translation type="unfinished">大</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="299"/> + <source>Iconstyle</source> + <translation type="unfinished">圖示樣式</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="301"/> + <source>just text</source> + <translation type="unfinished">僅文字</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="302"/> + <source>just icons</source> + <translation type="unfinished">僅圖示</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="303"/> + <source>text and icons</source> + <translation type="unfinished">文字與圖示</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="319"/> + <source>Windowstate</source> + <translation type="unfinished">視窗狀態</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="321"/> + <source>Save window size and position on exit.</source> + <translation type="unfinished">離開時儲存視窗尺寸及位置。</translation> + </message> +</context> +<context> + <name>AttachmentTableModel</name> + <message> + <location filename="../../attachmenttablemodel.cpp" line="128"/> + <source>Filename</source> + <translation type="unfinished">檔案名稱</translation> + </message> + <message> + <location filename="../../attachmenttablemodel.cpp" line="131"/> + <source>Contenttype</source> + <translation type="unfinished">內容類型</translation> + </message> +</context> +<context> + <name>Attachments</name> + <message> + <location filename="../../attachments.cpp" line="78"/> + <location filename="../../attachments.cpp" line="115"/> + <source>Save File</source> + <translation type="unfinished">儲存檔案</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="79"/> + <source>Save this file</source> + <translation type="unfinished">儲存此檔案</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="83"/> + <source>Open File</source> + <translation type="unfinished">開啟檔案</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="84"/> + <source>Open this file</source> + <translation type="unfinished">開啟此檔案</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="121"/> + <location filename="../../attachments.cpp" line="166"/> + <source>File</source> + <translation type="unfinished">檔案</translation> + </message> + <message> + <location filename="../../attachments.cpp" line="122"/> + <location filename="../../attachments.cpp" line="167"/> + <source>Cannot write file %1: +%2.</source> + <translation type="unfinished">無法寫入檔案 %1: +%2。</translation> + </message> +</context> +<context> + <name>ChoosePage</name> + <message> + <location filename="../../wizard.cpp" line="159"/> + <source>Choose your action...</source> + <translation type="unfinished">請選擇你的行動...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="160"/> + <source>...點擊相對應的連結。</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="162"/> + <source>If you have never used gpg4usb before and also don't own a gpg key yet you may possibly want to </source> + <translation type="unfinished">如果你從未使用過 gpg4usb,也還沒有任何 gpg 金鑰,你可能會想要</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="164"/> + <source>create a new keypair</source> + <translation type="unfinished">打造新的金鑰對</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="168"/> + <source>If you upgrade from an older version of gpg4usb you may want to </source> + <translation type="unfinished">如果你是從舊版的 gpg4usb 升級上來,你可能會想要</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="170"/> + <source>import settings and/or keys from gpg4usb</source> + <translation type="unfinished">匯入 gpg4usb 的設定和金鑰</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="174"/> + <source>If you are already using GnuPG you may want to </source> + <translation type="unfinished">如果你已經在使用 GnuPG,你可能會想要</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="176"/> + <source>import keys from GnuPG</source> + <translation type="unfinished">匯入 GnuPG 的金鑰</translation> + </message> +</context> +<context> + <name>ConclusionPage</name> + <message> + <location filename="../../wizard.cpp" line="391"/> + <source>Ready.</source> + <translation type="unfinished">準備就緒。</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="392"/> + <source>Have fun with gpg4usb!</source> + <translation type="unfinished">祝你 gpg4usb 用得愉快!</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="394"/> + <source>You are ready to use gpg4usb now.<br><br>The offline help will get you started with gpg4usb. It will open in the main window.<br></source> + <translation type="unfinished">你已經準備好開始使用 gpg4usb 了。<br><br>離線說明文件將帶領你開始使用 gpg4usb。該說明文件將開啟於主視窗。<br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="399"/> + <source>Open offline help.</source> + <translation type="unfinished">開啟離線說明文件。</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="402"/> + <source>Dont show the wizard again.</source> + <translation type="unfinished">不要再顯示這個精靈。</translation> + </message> +</context> +<context> + <name>FileEncryptionDialog</name> + <message> + <location filename="../../fileencryptiondialog.cpp" line="36"/> + <source>Encrypt / Decrypt File</source> + <translation type="unfinished">檔案加密/解密</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="46"/> + <location filename="../../fileencryptiondialog.cpp" line="170"/> + <location filename="../../fileencryptiondialog.cpp" line="179"/> + <source>File</source> + <translation type="unfinished">檔案</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="47"/> + <source>Action</source> + <translation type="unfinished">行動</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="31"/> + <source>Decrypt File</source> + <translation type="unfinished">檔案解密</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="33"/> + <source>Encrypt File</source> + <translation type="unfinished">檔案加密</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="53"/> + <source>Input</source> + <translation type="unfinished">輸入</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="59"/> + <source>Output</source> + <translation type="unfinished">輸出</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="78"/> + <source>&Encrypt</source> + <translation type="unfinished">加密 (&E)</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="80"/> + <source>&Decrypt</source> + <translation type="unfinished">解密 (&D)</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="116"/> + <source>Open File</source> + <translation type="unfinished">開啟檔案</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="142"/> + <source>Save File</source> + <translation type="unfinished">儲存檔案</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="153"/> + <source>Couldn't Open file: </source> + <translation type="unfinished">無法開啟檔案: </translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="180"/> + <source>Cannot write file %1: +%2.</source> + <translation type="unfinished">無法寫入檔案 %1: +%2。</translation> + </message> + <message> + <location filename="../../fileencryptiondialog.cpp" line="171"/> + <source>File exists! Do you want to overwrite it?</source> + <translation type="unfinished">檔案已存在!請問你是否想要覆蓋掉原本的檔案?</translation> + </message> +</context> +<context> + <name>GeneralTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="105"/> + <source>Remember Password</source> + <translation type="unfinished">記住密碼</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="107"/> + <source>Remember password until closing gpg4usb</source> + <translation type="unfinished">關閉 gpg4usb 前記住密碼</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="114"/> + <source>Save Checked Keys</source> + <translation type="unfinished">儲存已核選的金鑰</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="116"/> + <source>Save checked private keys on exit and restore them on next start.</source> + <translation type="unfinished">離開時儲存已核選的私鑰,並於下次執行時加以還原。</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="123"/> + <source>Confirm drag'n'drop key import</source> + <translation type="unfinished">確認拖曳金鑰匯入的動作</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="125"/> + <source>Import files dropped on the keylist without confirmation.</source> + <translation type="unfinished">將檔案拖曳至金鑰清單時,不另確認即匯入</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="132"/> + <source>Language</source> + <translation type="unfinished">語言</translation> + </message> +</context> +<context> + <name>GpgME::GpgContext</name> + <message> + <location filename="../../gpgcontext.cpp" line="312"/> + <source>No Key Selected</source> + <translation type="unfinished">未選擇任何金鑰</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="384"/> + <source><br>No private key with id %1 present in keyring</source> + <translation type="unfinished"><br>金鑰鑰匙圈中沒有 ID 為 %1 的私鑰</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="392"/> + <source>Unsupported algorithm</source> + <translation type="unfinished">未支援的演算法</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="402"/> + <source>Error decrypting:</source> + <translation type="unfinished">解密時出錯:</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="476"/> + <source>Wrong password</source> + <translation type="unfinished">密碼錯誤</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="484"/> + <source>Enter Password for</source> + <translation type="unfinished">請輸入密碼: </translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="488"/> + <source>Enter Password</source> + <translation type="unfinished">輸入密碼</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="649"/> + <source>Key Selection</source> + <translation type="unfinished">金鑰選擇</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="649"/> + <source>No Private Key Selected</source> + <translation type="unfinished">未選擇任何私鑰</translation> + </message> + <message> + <location filename="../../gpgcontext.cpp" line="697"/> + <source>Error signing:</source> + <translation type="unfinished">簽署時出錯:</translation> + </message> +</context> +<context> + <name>ImportFromGnupgPage</name> + <message> + <location filename="../../wizard.cpp" line="288"/> + <source>Import keys...</source> + <translation type="unfinished">匯入金鑰...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="289"/> + <source>...from existing GnuPG installation</source> + <translation type="unfinished">...從既有安裝的 GnuPG</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="291"/> + <source>You can import keys from a locally installed GnuPG.<br><br> The location is read from registry in Windows or assumed to be the .gnupg folder in the your home directory in Linux.<br></source> + <translation type="unfinished">你可以從本地既有安裝的 GnuPG 匯入金鑰。<br><br>其安裝路徑會從 Windows 的登錄中讀取,或者假定為目前 Linux 使用者家目錄的 .gnupg 子目錄。<br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="295"/> + <source>Import keys from GnuPG</source> + <translation type="unfinished">從 GnuPG 匯入金鑰</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="310"/> + <source>Import Error</source> + <translation type="unfinished">匯入出錯</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="310"/> + <source>Couldn't locate GnuPG home directory</source> + <translation type="unfinished">無法找出 GnuPG 的家目錄</translation> + </message> +</context> +<context> + <name>ImportFromGpg4usbPage</name> + <message> + <location filename="../../wizard.cpp" line="208"/> + <source>Import from...</source> + <translation type="unfinished">由此匯入...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="209"/> + <source>...existing gpg4usb</source> + <translation type="unfinished">....從既有的 gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="211"/> + <source>You can import keys and/or settings from existing gpg4usb. <br><br>Just check what you want to import, click the import button and choose the directory of your other gpg4usb in the appearing file dialog.</source> + <translation type="unfinished">你可以從既有的 gpg4usb 匯入金鑰和設定。<br><br>只要核選想匯入的東西,按下匯入按鈕,然後從接下來出現的檔案對話框中,選擇其他 gpg4usb 目錄即可。</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="218"/> + <source>Keys</source> + <translation type="unfinished">金鑰</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="222"/> + <source>Configuration</source> + <translation type="unfinished">組態設定</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="224"/> + <source>Import from gpg4usb</source> + <translation type="unfinished">從 gpg4usb 匯入</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="240"/> + <source>Other gpg4usb directory</source> + <translation type="unfinished">其他的 gpg4usb 目錄</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="260"/> + <source>Configuration Imported</source> + <translation type="unfinished">已匯入組態設定</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="260"/> + <source>Imported Configuration from old gpg4usb.<br>Will now restart to activate the configuration.</source> + <translation type="unfinished">已匯入舊有 gpg4usb 的組態設定。<br>現在將重新啟動以啟用這些組態設定。</translation> + </message> +</context> +<context> + <name>IntroPage</name> + <message> + <location filename="../../wizard.cpp" line="106"/> + <source>Getting started...</source> + <translation type="unfinished">入門使用....</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="107"/> + <source>... with gpg4usb</source> + <translation type="unfinished">...gpg4usb</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="109"/> + <source>To use gpg4usb for decrypting and signing messages, you need a private key. The next page will help you with key generation or import.<br><br>For more information have a look at the <a href='docu_concepts.html'>concepts</a> (by clicking the link, the page will open in the main window). <br></source> + <translation type="unfinished">如欲使用 gpg4usb 解密和簽署訊息,將需要用到私鑰。下一頁將協助你產生或匯入金鑰。<br><br>更多資訊請參見<a href='docu_concepts.html'>概念說明文件</a>(按下連結後將在主視窗開出該頁面)。<br></translation> + </message> + <message> + <location filename="../../wizard.cpp" line="118"/> + <source>Choose a Language</source> + <translation type="unfinished">選擇語言</translation> + </message> +</context> +<context> + <name>KeyDetailsDialog</name> + <message> + <location filename="../../keydetailsdialog.cpp" line="30"/> + <source>Owner details</source> + <translation type="unfinished">持有人詳細資訊</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="31"/> + <source>Key details</source> + <translation type="unfinished">金鑰詳細資訊</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="32"/> + <source>Fingerprint</source> + <translation type="unfinished">指紋</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="33"/> + <source>Additional Uids</source> + <translation type="unfinished">附加的 UID</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="81"/> + <source>Name:</source> + <translation type="unfinished">姓名:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="82"/> + <source>E-Mailaddress:</source> + <translation type="unfinished">電子郵件地址:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="83"/> + <source>Comment:</source> + <translation type="unfinished">註解:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="89"/> + <source>Expires on: </source> + <translation type="unfinished">有效期限: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="91"/> + <source>Created on: </source> + <translation type="unfinished">打造日期: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="92"/> + <source>Key ID: </source> + <translation type="unfinished">金鑰 ID: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="116"/> + <source>copy fingerprint to clipboard</source> + <translation type="unfinished">將指紋複製到剪貼簿</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="158"/> + <source>Warning: Key expired</source> + <translation type="unfinished">警告:金鑰已過期</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="161"/> + <source>Warning: Key revoked</source> + <translation type="unfinished">警告:金鑰已撤銷</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="176"/> + <source>Keydetails</source> + <translation type="unfinished">金鑰詳細資訊</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="187"/> + <source>You are about to export your private key. +This is NOT your public key, so don't give it away. +Make sure you keep it save.Do you really want to export your private key?</source> + <translation type="unfinished">你正要匯出私鑰。 +私鑰可不是公鑰,請千萬不要交給任何其他人。 +請確保私鑰安全。請問你是否真的想要匯出私鑰?</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="199"/> + <source>Key Files</source> + <translation type="unfinished">金鑰檔案</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="202"/> + <source>Export error</source> + <translation type="unfinished">匯出出錯</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="202"/> + <source>Couldn't open %1 for writing</source> + <translation type="unfinished">無法開啟 %1 寫入</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="88"/> + <source>Key size:</source> + <translation type="unfinished">金鑰尺寸:</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="90"/> + <source>Algorithm: </source> + <translation type="unfinished">演算法: </translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="50"/> + <source>Never</source> + <translation type="unfinished">永遠不過期</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="62"/> + <source> / Never</source> + <translation type="unfinished"> / 永遠不過期</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="139"/> + <source>Private Key</source> + <translation type="unfinished">私鑰</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="142"/> + <source>Export Private Key</source> + <translation type="unfinished">匯出私鑰</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="186"/> + <source>Exporting private Key</source> + <translation type="unfinished">正在匯出私鑰</translation> + </message> + <message> + <location filename="../../keydetailsdialog.cpp" line="199"/> + <source>Export Key To File</source> + <translation type="unfinished">匯出金鑰至檔案</translation> + </message> +</context> +<context> + <name>KeyGenDialog</name> + <message> + <location filename="../../keygendialog.cpp" line="31"/> + <source>Generate Key</source> + <translation type="unfinished">產生金鑰</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="68"/> + <source>Password Strength</source> + <translation type="unfinished">密碼強度</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="73"/> + <source>Name:</source> + <translation type="unfinished">姓名:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="74"/> + <source>E-Mailaddress:</source> + <translation type="unfinished">電子郵件地址:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="75"/> + <source>Comment:</source> + <translation type="unfinished">註解:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="76"/> + <source>Expiration Date:</source> + <translation type="unfinished">有效期限:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="77"/> + <source>Never Expire</source> + <translation type="unfinished">永遠不會過期</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="78"/> + <source>KeySize (in Bit):</source> + <translation type="unfinished">金鑰尺寸 (位元):</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="79"/> + <source>Password:</source> + <translation type="unfinished">密碼:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="80"/> + <source>Password: Strength +Weak -> Strong</source> + <translation type="unfinished">密碼: 強度 +弱 -> 強</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="81"/> + <source>Repeat Password:</source> + <translation type="unfinished">再輸入一次密碼:</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="117"/> + <source> Name must contain at least five characters. +</source> + <translation type="unfinished"> 姓名至少要包含五個字符。 +</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="120"/> + <source> Password and Repeat don't match. </source> + <translation type="unfinished"> 兩次輸入的密碼不相符合。 </translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="157"/> + <source>Generating Key...</source> + <translation type="unfinished">正在產生金鑰...</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="159"/> + <source>Collecting random data for key generation. + This may take a while. + To speed up the process use your computer + (e.g. browse the net, listen to music,...)</source> + <translation type="unfinished">正在蒐集隨機資料以便產生金鑰。 +這可能會花上一段時間。 +如欲加速進行,請隨意使用電腦 +(例如瀏覽網頁、聽音樂等)</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="175"/> + <source>Success</source> + <translation type="unfinished">成功</translation> + </message> + <message> + <location filename="../../keygendialog.cpp" line="175"/> + <source>New key created</source> + <translation type="unfinished">已建立新的金鑰</translation> + </message> +</context> +<context> + <name>KeyGenPage</name> + <message> + <location filename="../../wizard.cpp" line="348"/> + <source>Create a keypair...</source> + <translation type="unfinished">建立金鑰對...</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="349"/> + <source>...for decrypting and signing messages</source> + <translation type="unfinished">...以便解密和簽署訊息</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="350"/> + <source>You should create a new keypair.The pair consists of a public and a private key.<br>Other users can use the public key to encrypt messages for you and verify messages signed by you.You can use the private key to decrypt and sign messages.<br>For more information have a look at the offline tutorial (which then is shown in the main window):</source> + <translation type="unfinished">你應該建立新的金鑰對。金鑰對由公鑰及私鑰組成。<br>其他使用者可以用你的公鑰,將訊息加密給你,並驗證由你所簽署的訊息;你則可以使用私鑰來解密及簽署訊息。<br>更多資訊請查看離線教學文件(會顯示在主視窗):</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="357"/> + <source>Offline tutorial</source> + <translation type="unfinished">離線教學</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="364"/> + <source>Create New Key</source> + <translation type="unfinished">建立新的金鑰</translation> + </message> +</context> +<context> + <name>KeyImportDetailDialog</name> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="31"/> + <location filename="../../keyimportdetaildialog.cpp" line="47"/> + <source>Key import details</source> + <translation type="unfinished">金鑰匯入詳細資訊</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="31"/> + <source>No keys found to import</source> + <translation type="unfinished">找不到可匯入的金鑰</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="56"/> + <source>Genral key import info</source> + <translation type="unfinished">一般金鑰匯入資訊</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="59"/> + <source>Considered:</source> + <translation type="unfinished">已處理:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="63"/> + <source>Public unchanged:</source> + <translation type="unfinished">公鑰未變更:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="68"/> + <source>Imported:</source> + <translation type="unfinished">已匯入:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="73"/> + <source>Not imported:</source> + <translation type="unfinished">未匯入:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="78"/> + <source>Private read:</source> + <translation type="unfinished">私鑰已讀取:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="83"/> + <source>Private imported:</source> + <translation type="unfinished">私鑰已匯入:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="88"/> + <source>Private unchanged:</source> + <translation type="unfinished">私鑰未變更:</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Name</source> + <translation type="unfinished">姓名</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Email</source> + <translation type="unfinished">電子郵件</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Status</source> + <translation type="unfinished">狀態</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="104"/> + <source>Fingerprint</source> + <translation type="unfinished">指紋</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="128"/> + <source>private</source> + <translation type="unfinished">私鑰</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="131"/> + <source>public</source> + <translation type="unfinished">公鑰</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="134"/> + <source>unchanged</source> + <translation type="unfinished">未變更</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="137"/> + <source>new key</source> + <translation type="unfinished">新金鑰</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="140"/> + <source>new subkey</source> + <translation type="unfinished">新子鑰</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="144"/> + <source>new signature</source> + <translation type="unfinished">新簽章</translation> + </message> + <message> + <location filename="../../keyimportdetaildialog.cpp" line="148"/> + <source>new uid</source> + <translation type="unfinished">新 UID</translation> + </message> +</context> +<context> + <name>KeyList</name> + <message> + <location filename="../../keylist.cpp" line="50"/> + <source>Name</source> + <translation type="unfinished">姓名</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="50"/> + <source>EMail</source> + <translation type="unfinished">電子郵件</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="193"/> + <source>Import Keys</source> + <translation type="unfinished">匯入金鑰</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="195"/> + <source>You've dropped something on the keylist. + gpg4usb will now try to import key(s).</source> + <translation type="unfinished">你拖曳了某些東西到金鑰清單上。 + 現在 gpg4usb 將嘗試匯入金鑰。</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="198"/> + <source>Always import without bothering.</source> + <translation type="unfinished">以後都直接匯入,別再煩我。</translation> + </message> + <message> + <location filename="../../keylist.cpp" line="234"/> + <source>Couldn't Open File: </source> + <translation type="unfinished">無法開啟檔案: </translation> + </message> +</context> +<context> + <name>KeyMgmt</name> + <message> + <location filename="../../keymgmt.cpp" line="61"/> + <source>Keymanagement</source> + <translation type="unfinished">金鑰管理</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="68"/> + <source>&Close Key Management</source> + <translation type="unfinished">關閉金鑰管理 (&C)</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="69"/> + <source>Ctrl+Q</source> + <translation type="unfinished">Ctrl+Q</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="71"/> + <source>Close Key Management</source> + <translation type="unfinished">關閉金鑰管理</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="76"/> + <source>Import New Key From File</source> + <translation type="unfinished">從檔案匯入新的金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="81"/> + <source>Import New Key From Clipboard</source> + <translation type="unfinished">從剪貼簿匯入新的金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="84"/> + <source>&Keyserver</source> + <translation type="unfinished">金鑰伺服器 (&K)</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="86"/> + <source>Import New Key From Keyserver</source> + <translation type="unfinished">從金鑰伺服器匯入新的金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="89"/> + <source>Export To &Clipboard</source> + <translation type="unfinished">匯出至剪貼簿 (&C)</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="91"/> + <source>Export Selected Key(s) To Clipboard</source> + <translation type="unfinished">匯出所選的金鑰至剪貼簿</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="94"/> + <source>Export To &File</source> + <translation type="unfinished">匯出至檔案 (&F)</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="96"/> + <source>Export Selected Key(s) To File</source> + <translation type="unfinished">匯出所選的金鑰至檔案</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="99"/> + <source>Delete Selected Key(s)</source> + <translation type="unfinished">刪除所選的金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="100"/> + <source>Delete the Selected keys</source> + <translation type="unfinished">刪除所選的金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="103"/> + <source>Delete Checked Key(s)</source> + <translation type="unfinished">刪除已核選的金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="104"/> + <source>Delete the Checked keys</source> + <translation type="unfinished">刪除已核選的金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="108"/> + <source>Generate Key</source> + <translation type="unfinished">產生金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="109"/> + <source>Generate New Key</source> + <translation type="unfinished">產生新的金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="113"/> + <source>Show Keydetails</source> + <translation type="unfinished">顯示金鑰詳細資訊</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="114"/> + <source>Show Details for this Key</source> + <translation type="unfinished">顯示此金鑰的詳細資訊</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="145"/> + <source>Import key</source> + <translation type="unfinished">匯入金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="146"/> + <source>Import key from</source> + <translation type="unfinished">由此匯入金鑰:</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="260"/> + <source>key(s) exported</source> + <translation type="unfinished">把金鑰已匯出</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="74"/> + <location filename="../../keymgmt.cpp" line="120"/> + <source>&File</source> + <translation type="unfinished">檔案 (&F)</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="79"/> + <source>&Clipboard</source> + <translation type="unfinished">剪貼簿 (&C)</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="123"/> + <source>&Key</source> + <translation type="unfinished">金鑰 (&K)</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="124"/> + <source>&Import Key From...</source> + <translation type="unfinished">由此匯入金鑰 (&I)...</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="137"/> + <source>Key</source> + <translation type="unfinished">金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <source>Open Key</source> + <translation type="unfinished">開放金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <location filename="../../keymgmt.cpp" line="252"/> + <source>Key Files</source> + <translation type="unfinished">金鑰檔案</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="167"/> + <source>Keyring files</source> + <translation type="unfinished">金鑰鑰匙圈檔案</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="172"/> + <source>Couldn't Open File: </source> + <translation type="unfinished">無法開啟檔案: </translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="221"/> + <source>Deleting Keys</source> + <translation type="unfinished">正在刪除金鑰</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="222"/> + <source><b>Are you sure that you want to delete the following keys?.</b><br/><br/></source> + <translation type="unfinished"><b>請問你是否確定要刪除下列金鑰?</b><br/><br/></translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="223"/> + <source><br/>The action can not be undone.</source> + <translation type="unfinished"><br/>這項操作的結果將無可挽回。</translation> + </message> + <message> + <location filename="../../keymgmt.cpp" line="252"/> + <source>Export Key To File</source> + <translation type="unfinished">匯出金鑰至檔案</translation> + </message> +</context> +<context> + <name>KeyServerImportDialog</name> + <message> + <location filename="../../keyserverimportdialog.cpp" line="31"/> + <source>&Close</source> + <translation type="unfinished">關閉 (&C)</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="32"/> + <source>&Import</source> + <translation type="unfinished">匯入 (&I)</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="33"/> + <source>&Search</source> + <translation type="unfinished">搜尋 (&S)</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="36"/> + <source>Search string:</source> + <translation type="unfinished">搜尋字串:</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="40"/> + <source>Keyserver:</source> + <translation type="unfinished">金鑰伺服器:</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="71"/> + <source>Import Keys from Keyserver</source> + <translation type="unfinished">從金鑰伺服器匯入金鑰</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>UID</source> + <translation type="unfinished">UID</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>Creation date</source> + <translation type="unfinished">建立日期</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>KeyID</source> + <translation type="unfinished">金鑰 ID</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="112"/> + <source>Tag</source> + <translation type="unfinished">標籤</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="154"/> + <source>Couldn't contact keyserver!</source> + <translation type="unfinished">無法連上金鑰伺服器!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="162"/> + <source>Too many responses from keyserver!</source> + <translation type="unfinished">金鑰伺服器傳回太多回應!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="168"/> + <source>No keys found, input may be kexId, retrying search with 0x.</source> + <translation type="unfinished">找不到金鑰,也許輸入值為金鑰 ID,正以 0x 開頭重新嘗試。</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="172"/> + <source>No keys found containing the search string!</source> + <translation type="unfinished">找不到含有搜尋字串的金鑰!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="175"/> + <source>Insufficiently specific search string!</source> + <translation type="unfinished">指定的搜尋字串不足!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="203"/> + <source>revoked</source> + <translation type="unfinished">已撤銷</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="206"/> + <source>disabled</source> + <translation type="unfinished">已停用</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="245"/> + <source>%1 keys found. Doubleclick a key to import it.</source> + <translation type="unfinished">找到 %1 把金鑰。雙擊金鑰即可匯入。</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="291"/> + <source>Error while contacting keyserver!</source> + <translation type="unfinished">聯繫金鑰伺服器時出錯!</translation> + </message> + <message> + <location filename="../../keyserverimportdialog.cpp" line="295"/> + <source>Key imported</source> + <translation type="unfinished">已匯入金鑰</translation> + </message> +</context> +<context> + <name>KeyserverTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="404"/> + <source>Default Keyserver for import:</source> + <translation type="unfinished">預設用來匯入的金鑰伺服器:</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../../mainwindow.cpp" line="152"/> + <source>&New</source> + <translation type="unfinished">新增 (&N)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="158"/> + <source>Open a new file</source> + <translation type="unfinished">開啟新檔</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="161"/> + <source>&Open...</source> + <translation type="unfinished">開啟 (&O)...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="164"/> + <source>Open an existing file</source> + <translation type="unfinished">開啟既有的檔案</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="167"/> + <source>&Save</source> + <translation type="unfinished">儲存 (&S)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="170"/> + <source>Save the current File</source> + <translation type="unfinished">儲存目前的檔案</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="173"/> + <source>Save &As</source> + <translation type="unfinished">另存新檔 (&A)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="176"/> + <source>Save the current File as...</source> + <translation type="unfinished">將目前的檔案另存為...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="179"/> + <source>&Print</source> + <translation type="unfinished">列印 (&P)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="182"/> + <source>Print Document</source> + <translation type="unfinished">列印文件</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="185"/> + <location filename="../../mainwindow.cpp" line="640"/> + <source>&Close</source> + <translation type="unfinished">關閉 (&C)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="187"/> + <source>Close file</source> + <translation type="unfinished">關閉檔案</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="190"/> + <source>&Quit</source> + <translation type="unfinished">離開 (&Q)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="193"/> + <source>Quit Program</source> + <translation type="unfinished">離開程式</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="198"/> + <source>&Undo</source> + <translation type="unfinished">還原 (&U)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="200"/> + <source>Undo Last Edit Action</source> + <translation type="unfinished">還原最後的編輯動作</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="203"/> + <source>&Redo</source> + <translation type="unfinished">重做 (&R)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="205"/> + <source>Redo Last Edit Action</source> + <translation type="unfinished">重做一次最後的編輯動作</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="208"/> + <source>Zoom In</source> + <translation type="unfinished">拉近</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="212"/> + <source>Zoom Out</source> + <translation type="unfinished">拉遠</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="216"/> + <source>&Paste</source> + <translation type="unfinished">貼上 (&P)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="219"/> + <source>Paste Text From Clipboard</source> + <translation type="unfinished">從剪貼簿貼上文字</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="222"/> + <source>Cu&t</source> + <translation type="unfinished">剪下 (&t)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="225"/> + <source>Cut the current selection's contents to the clipboard</source> + <translation type="unfinished">將目前選取的內容剪下並存放至剪貼簿</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="229"/> + <source>&Copy</source> + <translation type="unfinished">複製 (&C)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="232"/> + <source>Copy the current selection's contents to the clipboard</source> + <translation type="unfinished">將目前選取的內容複製到剪貼簿</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="236"/> + <source>&Quote</source> + <translation type="unfinished">引用 (&Q)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="238"/> + <source>Quote whole text</source> + <translation type="unfinished">引用整段文字</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="241"/> + <source>Select &All</source> + <translation type="unfinished">全選 (&A)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="244"/> + <source>Select the whole text</source> + <translation type="unfinished">選取整段文字</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="247"/> + <source>Remove &spacing</source> + <translation type="unfinished">移除空行 (&s)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="250"/> + <source>Remove double linebreaks, e.g. in pasted text from webmailer</source> + <translation type="unfinished">移除連續兩次的換列,可用於從網頁郵件服務貼上文字的時機</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="253"/> + <source>Se&ttings</source> + <translation type="unfinished">設定 (&t)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="254"/> + <source>Open settings dialog</source> + <translation type="unfinished">開啟設定對話框</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="260"/> + <source>&Encrypt</source> + <translation type="unfinished">加密 (&E)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="263"/> + <source>Encrypt Message</source> + <translation type="unfinished">訊息加密</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="266"/> + <source>&Decrypt</source> + <translation type="unfinished">解密 (&D)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="269"/> + <source>Decrypt Message</source> + <translation type="unfinished">訊息解密</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="272"/> + <source>&File Encryption</source> + <translation type="unfinished">檔案加密 (&F)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="274"/> + <source>Encrypt/Decrypt File</source> + <translation type="unfinished">檔案加密/解密</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="280"/> + <source>&Encrypt File</source> + <translation type="unfinished">檔案加密 (&E)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="282"/> + <source>Encrypt File</source> + <translation type="unfinished">檔案加密</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="285"/> + <source>&Decrypt File</source> + <translation type="unfinished">檔案解密 (&D)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="287"/> + <source>Decrypt File</source> + <translation type="unfinished">檔案解密</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="290"/> + <source>&Sign</source> + <translation type="unfinished">簽署 (&S)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="293"/> + <source>Sign Message</source> + <translation type="unfinished">簽署訊息</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="296"/> + <source>&Verify</source> + <translation type="unfinished">驗證 (&V)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="299"/> + <source>Verify Message</source> + <translation type="unfinished">驗證訊息</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="305"/> + <source>&Editor</source> + <translation type="unfinished">編輯器 (&E)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="307"/> + <source>Import New Key From Editor</source> + <translation type="unfinished">從編輯器匯入新的金鑰</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="310"/> + <source>Manage &keys</source> + <translation type="unfinished">管理金鑰 (&k)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="312"/> + <source>Open Keymanagement</source> + <translation type="unfinished">開啟金鑰管理</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="317"/> + <source>&About</source> + <translation type="unfinished">關於 (&A)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="319"/> + <source>Show the application's About box</source> + <translation type="unfinished">顯示應用程式的「關於」對話方塊</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="322"/> + <source>Integrated Help</source> + <translation type="unfinished">內建說明文件</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="323"/> + <source>Open integrated Help</source> + <translation type="unfinished">開啟內建說明文件</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="326"/> + <source>Online &Tutorials</source> + <translation type="unfinished">線上教學文件 (&T)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="327"/> + <source>Open Online Tutorials</source> + <translation type="unfinished">開啟線上教學文件</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="330"/> + <source>Translate gpg4usb</source> + <translation type="unfinished">翻譯 gpg4usb</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="331"/> + <source>Translate gpg4usb yourself</source> + <translation type="unfinished">自行翻譯 gpg4usb</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="334"/> + <source>Open &Wizard</source> + <translation type="unfinished">開啟精靈 (&W)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="335"/> + <source>Open the wizard</source> + <translation type="unfinished">開啟精靈</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="340"/> + <source>Append Selected Key(s) To Text</source> + <translation type="unfinished">將所選的金鑰附加至文字後</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="341"/> + <source>Append The Selected Keys To Text in Editor</source> + <translation type="unfinished">在編輯器中,將所選的金鑰附加至文字後</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="344"/> + <source>Copy EMail-address</source> + <translation type="unfinished">複製電子郵件地址</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="345"/> + <source>Copy selected EMailaddress to clipboard</source> + <translation type="unfinished">將所選的電子郵件地址複製到剪貼簿</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="349"/> + <source>Show Keydetails</source> + <translation type="unfinished">顯示金鑰詳細資訊</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="350"/> + <source>Show Details for this Key</source> + <translation type="unfinished">顯示此金鑰的詳細資訊</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="410"/> + <source>&File</source> + <translation type="unfinished">檔案 (&F)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="422"/> + <source>&Edit</source> + <translation type="unfinished">編輯 (&E)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="438"/> + <source>&Crypt</source> + <translation type="unfinished">編密 (&C)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="448"/> + <source>&Keys</source> + <translation type="unfinished">金鑰 (&K)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="449"/> + <source>&Import Key From...</source> + <translation type="unfinished">由此匯入金鑰 (&I)...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="458"/> + <source>&Steganography</source> + <translation type="unfinished">資訊偽裝 (&S)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="365"/> + <source>Remove PGP Header</source> + <translation type="unfinished">移除 PGP 標頭</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="368"/> + <source>Add PGP Header</source> + <translation type="unfinished">加上 PGP 標頭</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="467"/> + <source>&View</source> + <translation type="unfinished">檢視 (&V)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="469"/> + <source>&Help</source> + <translation type="unfinished">說明 (&H)</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="482"/> + <source>File</source> + <translation type="unfinished">檔案</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="490"/> + <source>Crypt</source> + <translation type="unfinished">編密</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="499"/> + <source>Key</source> + <translation type="unfinished">金鑰</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="504"/> + <source>Edit</source> + <translation type="unfinished">編輯</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="511"/> + <source>Special edit</source> + <translation type="unfinished">特殊編輯</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="522"/> + <source>Import key from...</source> + <translation type="unfinished">由此匯入金鑰...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="523"/> + <source>Import key</source> + <translation type="unfinished">匯入金鑰</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="534"/> + <source>Encrypt or decrypt File</source> + <translation type="unfinished">檔案加密或解密</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="535"/> + <source>File..</source> + <translation type="unfinished">檔案...</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="553"/> + <source>Ready</source> + <translation type="unfinished">就緒</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="561"/> + <source>Encrypt for:</source> + <translation type="unfinished">加密對象:</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="580"/> + <source>Attached files:</source> + <translation type="unfinished">附加檔案:</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="620"/> + <source>About </source> + <translation type="unfinished">關於 </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="623"/> + <source><center>This application allows simple encryption <br>and decryption of text messages or files.<br>It's licensed under the GPL v3<br><br><b>Developer:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Viriato/Phol (es), <br>Serse (it), Russell (my),<br>Alessandro (pt_br), Kirill (ru), Tom (vi)<br><br>If you have any questions or suggestions have a look<br/>at our <a href="http://gpg4usb.cpunk.de/contact.php">contact page</a> or send a mail to our<br/> mailing list at <a href="mailto:[email protected]">[email protected]</a>.</source> + <translation type="unfinished"><center>本應用程式讓你能夠輕鬆地對文字訊息和檔案<br>予以加密和解密。<br>本程式係採用 GPL v3 授權<br><br><b>開發者:</b><br>Bene, Heimer, Juergen, Nils, Ubbo<br><br><b>Translation:</b><br>Viriato/Phol (es), <br>Serse (it), Russell (my),<br>Alessandro (pt_br), Kirill (ru), Tom (vi), Jedi (zh_TW)<br><br>如果你有任何疑問或建議事項,請至我們的<br/><a href="http://gpg4usb.cpunk.de/contact.php">聯絡頁面</a>或寫信至我們的郵遞論壇: <br/><a href="mailto:[email protected]">[email protected]</a><br/>繁體中文翻譯方面的建議或更正事項,請直接<br/>與 Jedi 聯繫: <a href="mailto:[email protected]">[email protected]</a></translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="635"/> + <source><br><br> Built with Qt </source> + <translation type="unfinished"><br><br> 建造工具: Qt </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="636"/> + <source> and GPGME </source> + <translation type="unfinished"> 及 GPGME </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="741"/> + <source>There is one unencrypted file in attachment folder</source> + <translation type="unfinished">在附加檔案資料夾內有個未加密的檔案</translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="743"/> + <source>There are </source> + <translation type="unfinished">在附加檔案資料夾內有 </translation> + </message> + <message> + <location filename="../../mainwindow.cpp" line="743"/> + <source> unencrypted files in attachment folder</source> + <translation type="unfinished"> 個未加密的檔案</translation> + </message> +</context> +<context> + <name>MimeTab</name> + <message> + <location filename="../../settingsdialog.cpp" line="204"/> + <source>Decode quoted printable</source> + <translation type="unfinished">QP 解碼</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="206"/> + <source>Try to recognize quoted printable.</source> + <translation type="unfinished">嘗試辨認 QP 編碼過的內容。</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="210"/> + <source>Parse PGP/MIME (Experimental)</source> + <translation type="unfinished">剖析 PGP/MIME (實驗性功能)</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="212"/> + <source>Try to split attachments from PGP-MIME ecrypted messages.</source> + <translation type="unfinished">嘗試將附加檔案從 PGP/MIME 加密過的訊息中分離出來</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="216"/> + <source>Open with external application (Experimental)</source> + <translation type="unfinished">以外部應用程式開啟 (實驗性功能)</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="218"/> + <source>Open attachments with default application for the filetype.<br> There are at least two possible problems with this behaviour:<ol><li>File needs to be saved unencrypted to attachments folder.<br> Its your job to clean this folder.</li><li>The external application may have its own temp files.</li></ol></source> + <translation type="unfinished">按照附加檔案的檔案型別,以預設的應用程式開啟。<br>這個行為至少有兩種可能的問題:<ol><li>檔案需要先以未加密的型態儲存於附加檔案資料夾。<br>你必須要自己手動清理這個資料夾。</li><li>外部應用程式可能會自己產生暫存檔。</li></ol></translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="225"/> + <source>Enable opening with external applications.</source> + <translation type="unfinished">啟用以外部應用程式開啟檔案的功能。</translation> + </message> +</context> +<context> + <name>QuitDialog</name> + <message> + <location filename="../../quitdialog.cpp" line="28"/> + <source>Unsaved files</source> + <translation type="unfinished">未儲存的檔案</translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="74"/> + <source><h3>%1 files contain unsaved information.<br/>Save the changes before closing?</h3></source> + <translation type="unfinished"><h3>%1 個檔案含有未儲存的資訊。<br/>請問是否要在關閉前儲存這些變更?</h3></translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="85"/> + <source>Check the files you want to save:</source> + <translation type="unfinished">請核選欲儲存的檔案:</translation> + </message> + <message> + <location filename="../../quitdialog.cpp" line="86"/> + <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> + <translation type="unfinished"><b>注意:</b> 如果你不儲存這些檔案,將失去所有的變動。<br/></translation> + </message> +</context> +<context> + <name>SettingsDialog</name> + <message> + <location filename="../../settingsdialog.cpp" line="34"/> + <source>General</source> + <translation type="unfinished">一般</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="35"/> + <source>Appearance</source> + <translation type="unfinished">外觀</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="36"/> + <source>PGP/Mime</source> + <translation type="unfinished">PGP/MIME</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="37"/> + <source>Keyserver</source> + <translation type="unfinished">金鑰伺服器</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="38"/> + <source>Advanced</source> + <translation type="unfinished">進階</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="51"/> + <source>Settings</source> + <translation type="unfinished">設定</translation> + </message> + <message> + <location filename="../../settingsdialog.cpp" line="72"/> + <source>System Default</source> + <translation type="unfinished">系統預設</translation> + </message> +</context> +<context> + <name>TextEdit</name> + <message> + <location filename="../../textedit.cpp" line="45"/> + <source>untitled</source> + <translation type="unfinished">未命名</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="66"/> + <source>Open file</source> + <translation type="unfinished">開啟檔案</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="90"/> + <location filename="../../textedit.cpp" line="378"/> + <source>Application</source> + <translation type="unfinished">應用程式</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="91"/> + <location filename="../../textedit.cpp" line="379"/> + <source>Cannot read file %1: +%2.</source> + <translation type="unfinished">無法讀取檔案 %1: +%2。</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="142"/> + <source>File</source> + <translation type="unfinished">檔案</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="143"/> + <source>Cannot write file %1: +%2.</source> + <translation type="unfinished">無法寫入檔案 %1: +%2。</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="165"/> + <source>Save file </source> + <translation type="unfinished">儲存檔案 </translation> + </message> + <message> + <location filename="../../textedit.cpp" line="231"/> + <source>Unsaved document</source> + <translation type="unfinished">未儲存的文件</translation> + </message> + <message> + <location filename="../../textedit.cpp" line="232"/> + <source><h3>The document "%1" has been modified.<br/>Do you want to save your changes?</h3></source> + <translation type="unfinished"><h3>此文件 "%1" 業已更動。<br/>請問你是否想要儲存你所做的變更?</h3></translation> + </message> + <message> + <location filename="../../textedit.cpp" line="233"/> + <source><b>Note:</b> If you don't save these files, all changes are lost.<br/></source> + <translation type="unfinished"><b>注意:</b> 如果你不儲存這些檔案,將失去所有的變動。<br/></translation> + </message> +</context> +<context> + <name>VerifyDetailsDialog</name> + <message> + <location filename="../../verifydetailsdialog.cpp" line="30"/> + <source>Signaturedetails</source> + <translation type="unfinished">簽章詳細資訊</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="61"/> + <source>Error Validating signature</source> + <translation type="unfinished">驗證簽章時出錯</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="67"/> + <source>Text was completely signed on + %1 by: +</source> + <translation type="unfinished">文字係經完整簽署於 + %1 由: +</translation> + </message> + <message> + <location filename="../../verifydetailsdialog.cpp" line="72"/> + <source>Text was partially signed on + %1 by: +</source> + <translation type="unfinished">文字係經部分簽署於 + %1 由: +</translation> + </message> +</context> +<context> + <name>VerifyKeyDetailBox</name> + <message> + <location filename="../../verifykeydetailbox.cpp" line="37"/> + <source>Import from keyserver</source> + <translation type="unfinished">從金鑰伺服器匯入</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="42"/> + <location filename="../../verifykeydetailbox.cpp" line="57"/> + <location filename="../../verifykeydetailbox.cpp" line="72"/> + <source>Status:</source> + <translation type="unfinished">狀態:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="56"/> + <location filename="../../verifykeydetailbox.cpp" line="73"/> + <source>Fingerprint:</source> + <translation type="unfinished">指紋:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="44"/> + <source>Key not present in keylist</source> + <translation type="unfinished">金鑰不存在於金鑰清單</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="40"/> + <source>Key not present with id 0x</source> + <translation type="unfinished">具此 ID 的金鑰不存在: 0x</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="54"/> + <location filename="../../verifykeydetailbox.cpp" line="70"/> + <source>Name:</source> + <translation type="unfinished">姓名:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="55"/> + <location filename="../../verifykeydetailbox.cpp" line="71"/> + <source>EMail:</source> + <translation type="unfinished">電子郵件:</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="62"/> + <source>OK</source> + <translation type="unfinished">OK</translation> + </message> + <message> + <location filename="../../verifykeydetailbox.cpp" line="69"/> + <source>Error for key with id 0x</source> + <translation type="unfinished">具此 ID 的金鑰出錯: 0x</translation> + </message> +</context> +<context> + <name>VerifyNotification</name> + <message> + <location filename="../../verifynotification.cpp" line="35"/> + <source>Import missing key from Keyserver</source> + <translation type="unfinished">從金鑰伺服器匯入缺少的金鑰</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="38"/> + <source>Show detailed verify information</source> + <translation type="unfinished">顯示詳細的驗證資訊</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="47"/> + <source>Details</source> + <translation type="unfinished">詳細資訊</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="117"/> + <source>Key not present with id 0x</source> + <translation type="unfinished">具此 ID 之金鑰不存在: 0x</translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="159"/> + <source>Error validating signature by: </source> + <translation type="unfinished">驗證以下簽章時出錯: </translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="164"/> + <source>Text was completely signed by: </source> + <translation type="unfinished">文字係經此人完整簽署: </translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="169"/> + <source>Text was partially signed by: </source> + <translation type="unfinished">文字係經此人部分簽署: </translation> + </message> + <message> + <location filename="../../verifynotification.cpp" line="147"/> + <source>Error for key with fingerprint </source> + <translation type="unfinished">具此指紋之金鑰出錯: </translation> + </message> +</context> +<context> + <name>Wizard</name> + <message> + <location filename="../../wizard.cpp" line="40"/> + <source>First Start Wizard</source> + <translation type="unfinished">初次啟動精靈</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="73"/> + <source>Import Error</source> + <translation type="unfinished">匯入出錯</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="73"/> + <source>Couldn't locate any keyring file in %1</source> + <translation type="unfinished">無法在 %1 找到任何金鑰鑰匙圈</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="81"/> + <location filename="../../wizard.cpp" line="91"/> + <source>Import error</source> + <translation type="unfinished">匯入出錯</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="81"/> + <source>Couldn't open private keyringfile: %1</source> + <translation type="unfinished">無法開啟私鑰鑰匙圈檔案: %1</translation> + </message> + <message> + <location filename="../../wizard.cpp" line="91"/> + <source>Couldn't open public keyringfile: %1</source> + <translation type="unfinished">無法開啟公鑰鑰匙圈檔案: %1</translation> + </message> +</context> +</TS> diff --git a/release/ts/qt_linux_he.qm b/release/ts/qt_linux_he.qm Binary files differnew file mode 100644 index 0000000..4ff507e --- /dev/null +++ b/release/ts/qt_linux_he.qm diff --git a/release/ts/qt_linux_sv.qm b/release/ts/qt_linux_sv.qm Binary files differnew file mode 100644 index 0000000..f3556bc --- /dev/null +++ b/release/ts/qt_linux_sv.qm diff --git a/release/ts/qt_linux_zh_TW.qm b/release/ts/qt_linux_zh_TW.qm Binary files differnew file mode 100644 index 0000000..a9a25b2 --- /dev/null +++ b/release/ts/qt_linux_zh_TW.qm diff --git a/release/ts/qt_linux_zh_TW.ts b/release/ts/qt_linux_zh_TW.ts new file mode 100644 index 0000000..de0f888 --- /dev/null +++ b/release/ts/qt_linux_zh_TW.ts @@ -0,0 +1,8129 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="zh_TW"> +<context> + <name>MAC_APPLICATION_MENU</name> + <message> + <location filename="../src/gui/kernel/qapplication.cpp" line="+2316"/> + <source>Services</source> + <translation>服務</translation> + </message> + <message> + <location line="+1"/> + <source>Hide %1</source> + <translation>隱藏%1</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Others</source> + <translation>隱藏其他</translation> + </message> + <message> + <location line="+1"/> + <source>Show All</source> + <translation>顯示全部</translation> + </message> + <message> + <location line="+1"/> + <source>Preferences...</source> + <translation>偏好設定⋯</translation> + </message> + <message> + <location line="+1"/> + <source>Quit %1</source> + <translation>結束 %1</translation> + </message> + <message> + <location line="+1"/> + <source>About %1</source> + <translation>關於 %1</translation> + </message> +</context> +<context> + <name>AudioOutput</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/> + <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source> + <translation><html>音效播放裝置 <b>%1</b> 未能運作。<br/>改用預設裝置 <b>%2</b>。</html></translation> + </message> + <message> + <location line="+13"/> + <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source> + <translation><html>音效播放裝置 <b>%1</b> 已可使用,因為有較高優先權,因此將切換到該裝置。</html></translation> + </message> + <message> + <location line="+3"/> + <source>Revert back to device '%1'</source> + <translation>回復到裝置 %1</translation> + </message> +</context> +<context> + <name>CloseButton</name> + <message> + <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/> + <source>Close Tab</source> + <translation>關閉分頁</translation> + </message> +</context> +<context> + <name>PPDOptionsModel</name> + <message> + <source>Name</source> + <translation type="obsolete">名稱</translation> + </message> + <message> + <source>Value</source> + <translation type="obsolete">值</translation> + </message> +</context> +<context> + <name>Phonon::</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/> + <source>Notifications</source> + <translation>通知</translation> + </message> + <message> + <location line="+2"/> + <source>Music</source> + <translation>音樂</translation> + </message> + <message> + <location line="+2"/> + <source>Video</source> + <translation>影像</translation> + </message> + <message> + <location line="+2"/> + <source>Communication</source> + <translation>通訊</translation> + </message> + <message> + <location line="+2"/> + <source>Games</source> + <translation>遊戲</translation> + </message> + <message> + <location line="+2"/> + <source>Accessibility</source> + <translation>輔助裝置</translation> + </message> +</context> +<context> + <name>Phonon::Gstreamer::Backend</name> + <message> + <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/> + <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. + Some video features have been disabled.</source> + <translation>警告:您可能沒有安裝 gstreamer0.10-plugins-good。 + 有些影像的功能將被關閉。</translation> + </message> + <message> + <location line="+5"/> + <source>Warning: You do not seem to have the base GStreamer plugins installed. + All audio and video support has been disabled</source> + <translation>警告:您可能沒有安裝 GStreamer 外掛程式。 所有音效與影像支援將被關閉。</translation> + </message> +</context> +<context> + <name>Phonon::Gstreamer::MediaObject</name> + <message> + <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/> + <source>Cannot start playback. + +Check your Gstreamer installation and make sure you +have libgstreamer-plugins-base installed.</source> + <translation>無法開始播放。 + +請檢查您的 Gstreamer 安裝,並確定您有安裝 +libgstreamer-plugins-base 套件。</translation> + </message> + <message> + <location line="+113"/> + <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> + <translation>找不到需要的編解碼器。您需要安裝以下的套件來播放此內容:%0</translation> + </message> + <message> + <location line="+676"/> + <location line="+8"/> + <location line="+15"/> + <location line="+9"/> + <location line="+6"/> + <location line="+19"/> + <location line="+335"/> + <location line="+24"/> + <source>Could not open media source.</source> + <translation>無法開啟媒體來源。</translation> + </message> + <message> + <location line="-403"/> + <source>Invalid source type.</source> + <translation>不合法的來源型態。</translation> + </message> + <message> + <location line="+377"/> + <source>Could not locate media source.</source> + <translation>無法定位媒體來源。</translation> + </message> + <message> + <location line="+10"/> + <source>Could not open audio device. The device is already in use.</source> + <translation>無法開啟音效裝置。裝置已在使用中。</translation> + </message> + <message> + <location line="+13"/> + <source>Could not decode media source.</source> + <translation>無法解碼媒體來源。</translation> + </message> +</context> +<context> + <name>Phonon::VolumeSlider</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/> + <location line="+18"/> + <source>Volume: %1%</source> + <translation>音量:%1%</translation> + </message> + <message> + <location line="-15"/> + <location line="+18"/> + <location line="+54"/> + <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source> + <translation>使用此滑動器來調整音量。最左邊的位置為 0%,最右邊的為 %1%。</translation> + </message> +</context> +<context> + <name>Q3Accel</name> + <message> + <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/> + <source>%1, %2 not defined</source> + <translation>%1,%2 未定義</translation> + </message> + <message> + <location line="+36"/> + <source>Ambiguous %1 not handled</source> + <translation>不明確的 %1 尚未處理</translation> + </message> +</context> +<context> + <name>Q3DataTable</name> + <message> + <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/> + <source>True</source> + <translation>真</translation> + </message> + <message> + <location line="+1"/> + <source>False</source> + <translation>假</translation> + </message> + <message> + <location line="+505"/> + <source>Insert</source> + <translation>插入</translation> + </message> + <message> + <location line="+1"/> + <source>Update</source> + <translation>更新</translation> + </message> + <message> + <location line="+1"/> + <source>Delete</source> + <translation>刪除</translation> + </message> +</context> +<context> + <name>Q3FileDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/> + <source>Copy or Move a File</source> + <translation>複製或移動檔案</translation> + </message> + <message> + <location line="+8"/> + <source>Read: %1</source> + <translation>讀取:%1</translation> + </message> + <message> + <location line="+6"/> + <location line="+30"/> + <source>Write: %1</source> + <translation>寫入:%1</translation> + </message> + <message> + <location line="-22"/> + <location line="+1575"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="-157"/> + <location line="+49"/> + <location line="+2153"/> + <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location line="-2089"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location line="+1"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <translation>型態</translation> + </message> + <message> + <location line="+1"/> + <source>Date</source> + <translation>日期</translation> + </message> + <message> + <location line="+1"/> + <source>Attributes</source> + <translation>屬性</translation> + </message> + <message> + <location line="+35"/> + <location line="+2031"/> + <source>&OK</source> + <translation>確定(&O)</translation> + </message> + <message> + <location line="-1991"/> + <source>Look &in:</source> + <translation>尋找於(&I):</translation> + </message> + <message> + <location line="+1"/> + <location line="+1981"/> + <location line="+16"/> + <source>File &name:</source> + <translation>檔名(&N):</translation> + </message> + <message> + <location line="-1996"/> + <source>File &type:</source> + <translation>檔案型態(&T):</translation> + </message> + <message> + <location line="+7"/> + <source>Back</source> + <translation>返回</translation> + </message> + <message> + <location line="+7"/> + <source>One directory up</source> + <translation>往上一層目錄</translation> + </message> + <message> + <location line="+9"/> + <source>Create New Folder</source> + <translation>建立新資料夾</translation> + </message> + <message> + <location line="+18"/> + <source>List View</source> + <translation>列表檢視</translation> + </message> + <message> + <location line="+8"/> + <source>Detail View</source> + <translation>詳細檢視</translation> + </message> + <message> + <location line="+9"/> + <source>Preview File Info</source> + <translation>預覽檔案資訊</translation> + </message> + <message> + <location line="+23"/> + <source>Preview File Contents</source> + <translation>預覽檔案內容</translation> + </message> + <message> + <location line="+88"/> + <source>Read-write</source> + <translation>可讀寫</translation> + </message> + <message> + <location line="+1"/> + <source>Read-only</source> + <translation>唯讀</translation> + </message> + <message> + <location line="+1"/> + <source>Write-only</source> + <translation>唯寫</translation> + </message> + <message> + <location line="+1"/> + <source>Inaccessible</source> + <translation>無法存取</translation> + </message> + <message> + <location line="+2"/> + <source>Symlink to File</source> + <translation>到檔案的符號連結</translation> + </message> + <message> + <location line="+1"/> + <source>Symlink to Directory</source> + <translation>到目錄的符號連結</translation> + </message> + <message> + <location line="+1"/> + <source>Symlink to Special</source> + <translation>到特殊節點的符號連結</translation> + </message> + <message> + <location line="+1"/> + <source>File</source> + <translation>檔案</translation> + </message> + <message> + <location line="+1"/> + <source>Dir</source> + <translation>目錄</translation> + </message> + <message> + <location line="+1"/> + <source>Special</source> + <translation>特殊節點</translation> + </message> + <message> + <location line="+704"/> + <location line="+2100"/> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location line="-1990"/> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/> + <source>Save As</source> + <translation>另存新檔</translation> + </message> + <message> + <location line="+642"/> + <location line="+5"/> + <location line="+355"/> + <source>&Open</source> + <translation>開啟(&O)</translation> + </message> + <message> + <location line="-357"/> + <location line="+341"/> + <source>&Save</source> + <translation>儲存(&S)</translation> + </message> + <message> + <location line="-334"/> + <source>&Rename</source> + <translation>重新命名(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Delete</source> + <translation>刪除(&D)</translation> + </message> + <message> + <location line="+20"/> + <source>R&eload</source> + <translation>重新載入(&E)</translation> + </message> + <message> + <location line="+4"/> + <source>Sort by &Name</source> + <translation>依名稱排序(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Sort by &Size</source> + <translation>依大小排序(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Sort by &Date</source> + <translation>依日期排序(&D)</translation> + </message> + <message> + <location line="+2"/> + <source>&Unsorted</source> + <translation>未排序(&U)</translation> + </message> + <message> + <location line="+15"/> + <source>Sort</source> + <translation>排序</translation> + </message> + <message> + <location line="+4"/> + <source>Show &hidden files</source> + <translation>顯示隱藏檔(&H)</translation> + </message> + <message> + <location line="+31"/> + <source>the file</source> + <translation>此檔案</translation> + </message> + <message> + <location line="+2"/> + <source>the directory</source> + <translation>此目錄</translation> + </message> + <message> + <location line="+2"/> + <source>the symlink</source> + <translation>此符號連結</translation> + </message> + <message> + <location line="+3"/> + <source>Delete %1</source> + <translation>刪除 %1</translation> + </message> + <message> + <location line="+1"/> + <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> + <translation><qt>您確定要刪除 %1 "%2" 嗎?</qt></translation> + </message> + <message> + <location line="+2"/> + <source>&Yes</source> + <translation>是(&Y)</translation> + </message> + <message> + <location line="+0"/> + <source>&No</source> + <translation>否(&N)</translation> + </message> + <message> + <location line="+36"/> + <source>New Folder 1</source> + <translation>新資料夾 1</translation> + </message> + <message> + <location line="+5"/> + <source>New Folder</source> + <translation>新資料夾</translation> + </message> + <message> + <location line="+5"/> + <source>New Folder %1</source> + <translation>新資料夾 %1</translation> + </message> + <message> + <location line="+98"/> + <source>Find Directory</source> + <translation>尋找目錄</translation> + </message> + <message> + <location line="+5"/> + <location line="+108"/> + <source>Directories</source> + <translation>目錄</translation> + </message> + <message> + <location line="-2"/> + <source>Directory:</source> + <translation>目錄:</translation> + </message> + <message> + <location line="+40"/> + <location line="+1110"/> + <source>Error</source> + <translation>錯誤</translation> + </message> + <message> + <location line="-1109"/> + <source>%1 +File not found. +Check path and filename.</source> + <translation>%1 +找不到檔案。 +請檢查路徑與檔名。</translation> + </message> + <message> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/> + <source>All Files (*.*)</source> + <translation>所有檔案 (*.*)</translation> + </message> + <message> + <location line="+375"/> + <source>Open </source> + <translation>開啟 </translation> + </message> + <message> + <location line="+155"/> + <source>Select a Directory</source> + <translation>請選擇一個目錄</translation> + </message> +</context> +<context> + <name>Q3LocalFs</name> + <message> + <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/> + <location line="+10"/> + <source>Could not read directory +%1</source> + <translation>無法讀取目錄 +%1</translation> + </message> + <message> + <location line="+45"/> + <source>Could not create directory +%1</source> + <translation>無法建立目錄 +%1</translation> + </message> + <message> + <location line="+34"/> + <source>Could not remove file or directory +%1</source> + <translation>無法移除目錄 +%1</translation> + </message> + <message> + <location line="+27"/> + <source>Could not rename +%1 +to +%2</source> + <translation>無法將 +%1 +重新命名為 +%2</translation> + </message> + <message> + <location line="+25"/> + <source>Could not open +%1</source> + <translation>無法開啟 +%1</translation> + </message> + <message> + <location line="+68"/> + <source>Could not write +%1</source> + <translation>無法寫入 +%1</translation> + </message> +</context> +<context> + <name>Q3MainWindow</name> + <message> + <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/> + <source>Line up</source> + <translation>排列</translation> + </message> + <message> + <location line="+2"/> + <source>Customize...</source> + <translation>自訂...</translation> + </message> +</context> +<context> + <name>Q3NetworkProtocol</name> + <message> + <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/> + <source>Operation stopped by the user</source> + <translation>使用者已中止操作</translation> + </message> +</context> +<context> + <name>Q3ProgressDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/> + <location line="+61"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>Q3TabDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/> + <location line="+814"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location line="-356"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location line="+43"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="+45"/> + <source>Defaults</source> + <translation>預設</translation> + </message> + <message> + <location line="+50"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>Q3TextEdit</name> + <message> + <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/> + <source>&Undo</source> + <translation>復原(&U)</translation> + </message> + <message> + <location line="+1"/> + <source>&Redo</source> + <translation>重做(&R)</translation> + </message> + <message> + <location line="+5"/> + <source>Cu&t</source> + <translation>剪下(&T)</translation> + </message> + <message> + <location line="+1"/> + <source>&Copy</source> + <translation>複製(&C)</translation> + </message> + <message> + <location line="+2"/> + <source>&Paste</source> + <translation>貼上(&P)</translation> + </message> + <message> + <location line="+3"/> + <source>Clear</source> + <translation>清除</translation> + </message> + <message> + <location line="+4"/> + <location line="+2"/> + <source>Select All</source> + <translation>全部選擇</translation> + </message> +</context> +<context> + <name>Q3TitleBar</name> + <message> + <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/> + <source>System</source> + <translation>系統</translation> + </message> + <message> + <location line="+3"/> + <source>Restore up</source> + <translation>向上恢復</translation> + </message> + <message> + <location line="+1"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+3"/> + <source>Restore down</source> + <translation>向下恢復</translation> + </message> + <message> + <location line="+1"/> + <source>Maximize</source> + <translation>最大化</translation> + </message> + <message> + <location line="+2"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+18"/> + <source>Contains commands to manipulate the window</source> + <translation>包含要操作此視窗的指令</translation> + </message> + <message> + <location line="+3"/> + <source>Puts a minimized back to normal</source> + <translation>將最小化視窗放回原大小</translation> + </message> + <message> + <location line="+1"/> + <source>Moves the window out of the way</source> + <translation>把視窗移開</translation> + </message> + <message> + <location line="+3"/> + <source>Puts a maximized window back to normal</source> + <translation>將最大化視窗放回原大小</translation> + </message> + <message> + <location line="+1"/> + <source>Makes the window full screen</source> + <translation>將視窗放大到全畫面</translation> + </message> + <message> + <location line="+2"/> + <source>Closes the window</source> + <translation>關閉視窗</translation> + </message> + <message> + <location line="+2"/> + <source>Displays the name of the window and contains controls to manipulate it</source> + <translation>顯示視窗名稱,並包含操作它的控制元件</translation> + </message> +</context> +<context> + <name>Q3ToolBar</name> + <message> + <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/> + <source>More...</source> + <translation>更多...</translation> + </message> +</context> +<context> + <name>Q3UrlOperator</name> + <message> + <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/> + <location line="+260"/> + <location line="+4"/> + <source>The protocol `%1' is not supported</source> + <translation>協定 %1 未支援</translation> + </message> + <message> + <location line="-260"/> + <source>The protocol `%1' does not support listing directories</source> + <translation>協定 %1 未支援列出目錄</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support creating new directories</source> + <translation>協定 %1 未支援建立新目錄</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support removing files or directories</source> + <translation>協定 %1 未支援移除檔案或目錄</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support renaming files or directories</source> + <translation>協定 %1 未支援重新命名檔案或目錄</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support getting files</source> + <translation>協定 %1 未支援取得檔案</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support putting files</source> + <translation>協定 %1 未支援寫入檔案</translation> + </message> + <message> + <location line="+243"/> + <location line="+4"/> + <source>The protocol `%1' does not support copying or moving files or directories</source> + <translation>協定 %1 未支援複製或移動檔案或目錄</translation> + </message> + <message> + <location line="+237"/> + <location line="+1"/> + <source>(unknown)</source> + <translation>(未知)</translation> + </message> +</context> +<context> + <name>Q3Wizard</name> + <message> + <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location line="+1"/> + <source>< &Back</source> + <translation><返回(&B)</translation> + </message> + <message> + <location line="+1"/> + <source>&Next ></source> + <translation>下一個(&N)></translation> + </message> + <message> + <location line="+1"/> + <source>&Finish</source> + <translation>完成(&F)</translation> + </message> + <message> + <location line="+1"/> + <source>&Help</source> + <translation>說明(&H)</translation> + </message> +</context> +<context> + <name>QAbstractSocket</name> + <message> + <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/> + <location line="+26"/> + <source>Host not found</source> + <translation>找不到主機</translation> + </message> + <message> + <location line="+50"/> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/> + <source>Connection refused</source> + <translation>連線被拒</translation> + </message> + <message> + <location line="+141"/> + <source>Connection timed out</source> + <translation>連線逾時</translation> + </message> + <message> + <location line="-547"/> + <location line="+787"/> + <location line="+208"/> + <source>Operation on socket is not supported</source> + <translation>Socket 的操作未被支援</translation> + </message> + <message> + <location line="+137"/> + <source>Socket operation timed out</source> + <translation>Socket 操作逾時</translation> + </message> + <message> + <location line="+380"/> + <source>Socket is not connected</source> + <translation>Socket 未連線</translation> + </message> + <message> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/> + <source>Network unreachable</source> + <translation>無法使用網路</translation> + </message> +</context> +<context> + <name>QAbstractSpinBox</name> + <message> + <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/> + <source>&Step up</source> + <translation>單步向上(&S)</translation> + </message> + <message> + <location line="+2"/> + <source>Step &down</source> + <translation>單步向下(&D)</translation> + </message> + <message> + <location line="-8"/> + <source>&Select All</source> + <translation>全部選擇(&S)</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/> + <source>Activate</source> + <translation>啟動</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/> + <source>Executable '%1' requires Qt %2, found Qt %3.</source> + <translation>執行檔 %1 需要 Qt %2,但只找到 Qt %3。</translation> + </message> + <message> + <location line="+2"/> + <source>Incompatible Qt Library Error</source> + <translation>Qt 函式庫不相容的錯誤</translation> + </message> + <message> + <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation>LTR</translation> + </message> + <message> + <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+2"/> + <source>Activates the program's main window</source> + <translation>啟動程式的主視窗</translation> + </message> +</context> +<context> + <name>QAxSelect</name> + <message> + <location filename="../src/activeqt/container/qaxselect.ui"/> + <source>Select ActiveX Control</source> + <translation>選擇 ActiveX 控制</translation> + </message> + <message> + <location/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location/> + <source>COM &Object:</source> + <translation>COM 物件(&O)</translation> + </message> +</context> +<context> + <name>QCheckBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/> + <source>Uncheck</source> + <translation>取消勾選</translation> + </message> + <message> + <location line="+3"/> + <source>Check</source> + <translation>勾選</translation> + </message> + <message> + <location line="+1"/> + <source>Toggle</source> + <translation>切換</translation> + </message> +</context> +<context> + <name>QColorDialog</name> + <message> + <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/> + <source>Hu&e:</source> + <translation>色調(&E):</translation> + </message> + <message> + <location line="+1"/> + <source>&Sat:</source> + <translation>飽和度(&S):</translation> + </message> + <message> + <location line="+1"/> + <source>&Val:</source> + <translation>亮度(&V):</translation> + </message> + <message> + <location line="+1"/> + <source>&Red:</source> + <translation>紅(&R):</translation> + </message> + <message> + <location line="+1"/> + <source>&Green:</source> + <translation>綠(&G):</translation> + </message> + <message> + <location line="+1"/> + <source>Bl&ue:</source> + <translation>藍(&U):</translation> + </message> + <message> + <location line="+1"/> + <source>A&lpha channel:</source> + <translation>Alpha 色頻(&L):</translation> + </message> + <message> + <location line="+101"/> + <source>Select Color</source> + <translation>選擇顏色</translation> + </message> + <message> + <location line="+137"/> + <source>&Basic colors</source> + <translation>基本顏色(&B)</translation> + </message> + <message> + <location line="+1"/> + <source>&Custom colors</source> + <translation>自訂顏色(&C)</translation> + </message> + <message> + <source>&Define Custom Colors >></source> + <translation type="obsolete">定義自訂顏色(&D)>></translation> + </message> + <message> + <source>OK</source> + <translation type="obsolete">確定</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> + <message> + <location line="+1"/> + <source>&Add to Custom Colors</source> + <translation>新增到自訂顏色(&A)</translation> + </message> + <message> + <source>Select color</source> + <translation type="obsolete">選擇顏色</translation> + </message> +</context> +<context> + <name>QComboBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/> + <location line="+65"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/> + <source>False</source> + <translation>假</translation> + </message> + <message> + <location line="+1"/> + <source>True</source> + <translation>真</translation> + </message> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/> + <source>Close</source> + <translation>關閉</translation> + </message> +</context> +<context> + <name>QCoreApplication</name> + <message> + <source>%1: permission denied</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:存取被拒</translation> + </message> + <message> + <source>%1: already exists</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:已存在</translation> + </message> + <message> + <source>%1: doesn't exists</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:不存在</translation> + </message> + <message> + <source>%1: out of resources</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:資源不足</translation> + </message> + <message> + <source>%1: unknown error %2</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:未知的錯誤 %2</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/> + <source>%1: key is empty</source> + <comment>QSystemSemaphore</comment> + <translation>%1:鍵值是空的</translation> + </message> + <message> + <location line="+12"/> + <source>%1: unable to make key</source> + <comment>QSystemSemaphore</comment> + <translation>%1:無法產生鍵值</translation> + </message> + <message> + <location line="+9"/> + <source>%1: ftok failed</source> + <comment>QSystemSemaphore</comment> + <translation>%1:ftok 失敗</translation> + </message> +</context> +<context> + <name>QDB2Driver</name> + <message> + <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/> + <source>Unable to connect</source> + <translation>無法連接</translation> + </message> + <message> + <location line="+303"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to set autocommit</source> + <translation>無法設定自動提交</translation> + </message> +</context> +<context> + <name>QDB2Result</name> + <message> + <location line="-1043"/> + <location line="+243"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> + <message> + <location line="-206"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+196"/> + <source>Unable to bind variable</source> + <translation>無法結合變數</translation> + </message> + <message> + <location line="+92"/> + <source>Unable to fetch record %1</source> + <translation>無法抓取紀錄 %1</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to fetch next</source> + <translation>無法抓取下一筆</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to fetch first</source> + <translation>無法抓取第一筆</translation> + </message> +</context> +<context> + <name>QDateTimeEdit</name> + <message> + <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/> + <source>AM</source> + <translation>AM</translation> + </message> + <message> + <location line="+0"/> + <source>am</source> + <translation>am</translation> + </message> + <message> + <location line="+2"/> + <source>PM</source> + <translation>PM</translation> + </message> + <message> + <location line="+0"/> + <source>pm</source> + <translation>pm</translation> + </message> +</context> +<context> + <name>QDial</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/> + <source>QDial</source> + <translation>QDial</translation> + </message> + <message> + <location line="+2"/> + <source>SpeedoMeter</source> + <translation>SpeedoMeter</translation> + </message> + <message> + <location line="+2"/> + <source>SliderHandle</source> + <translation>SliderHandle</translation> + </message> +</context> +<context> + <name>QDialog</name> + <message> + <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/> + <source>What's This?</source> + <translation>這是什麼?</translation> + </message> + <message> + <location line="-115"/> + <source>Done</source> + <translation>完成</translation> + </message> +</context> +<context> + <name>QDialogButtonBox</name> + <message> + <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/> + <location line="+464"/> + <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/> + <source>Save</source> + <translation>儲存</translation> + </message> + <message> + <location line="+0"/> + <source>&Save</source> + <translation>儲存(&S)</translation> + </message> + <message> + <location line="+3"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location line="+3"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+0"/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location line="+3"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+0"/> + <source>&Close</source> + <translation>關閉(&C)</translation> + </message> + <message> + <location line="+3"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location line="+3"/> + <source>Reset</source> + <translation>重置</translation> + </message> + <message> + <location line="+3"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="+4"/> + <source>Don't Save</source> + <translation>不要儲存</translation> + </message> + <message> + <location line="+4"/> + <source>Discard</source> + <translation>丟棄</translation> + </message> + <message> + <location line="+3"/> + <source>&Yes</source> + <translation>是(&Y)</translation> + </message> + <message> + <location line="+3"/> + <source>Yes to &All</source> + <translation>全部回答是(&A)</translation> + </message> + <message> + <location line="+3"/> + <source>&No</source> + <translation>否(&N)</translation> + </message> + <message> + <location line="+3"/> + <source>N&o to All</source> + <translation>全部回答否(&O)</translation> + </message> + <message> + <location line="+3"/> + <source>Save All</source> + <translation>全部儲存</translation> + </message> + <message> + <location line="+3"/> + <source>Abort</source> + <translation>中止</translation> + </message> + <message> + <location line="+3"/> + <source>Retry</source> + <translation>重試</translation> + </message> + <message> + <location line="+3"/> + <source>Ignore</source> + <translation>忽略</translation> + </message> + <message> + <location line="+3"/> + <source>Restore Defaults</source> + <translation>回復預設值</translation> + </message> + <message> + <location line="-29"/> + <source>Close without Saving</source> + <translation>關閉而不儲存</translation> + </message> + <message> + <location line="-27"/> + <source>&OK</source> + <translation>確定(&O)</translation> + </message> +</context> +<context> + <name>QDirModel</name> + <message> + <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location line="+1"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+3"/> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>種類</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <comment>All other platforms</comment> + <translation>型態</translation> + </message> + <message> + <location line="+6"/> + <source>Date Modified</source> + <translation>變更日期</translation> + </message> +</context> +<context> + <name>QDockWidget</name> + <message> + <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+2"/> + <source>Dock</source> + <translation>嵌入</translation> + </message> + <message> + <location line="+1"/> + <source>Float</source> + <translation>飄浮</translation> + </message> +</context> +<context> + <name>QDoubleSpinBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/> + <source>More</source> + <translation>更多</translation> + </message> + <message> + <location line="+2"/> + <source>Less</source> + <translation>較少</translation> + </message> +</context> +<context> + <name>QErrorMessage</name> + <message> + <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+192"/> + <source>Debug Message:</source> + <translation>除錯訊息:</translation> + </message> + <message> + <location line="+3"/> + <source>Warning:</source> + <translation>警告:</translation> + </message> + <message> + <location line="+3"/> + <source>Fatal Error:</source> + <translation>嚴重錯誤:</translation> + </message> + <message> + <location line="+193"/> + <source>&Show this message again</source> + <translation>再度顯示此訊息(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>&OK</source> + <translation>確定(&O)</translation> + </message> +</context> +<context> + <name>QFile</name> + <message> + <location filename="../src/corelib/io/qfile.cpp" line="+708"/> + <location line="+141"/> + <source>Destination file exists</source> + <translation>目標檔已存在</translation> + </message> + <message> + <location line="-108"/> + <source>Cannot remove source file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+120"/> + <source>Cannot open %1 for input</source> + <translation>無法開啟 %1 以輸入</translation> + </message> + <message> + <location line="+17"/> + <source>Cannot open for output</source> + <translation>無法開啟 %1 以輸出</translation> + </message> + <message> + <location line="+10"/> + <source>Failure to write block</source> + <translation>寫入區塊時失敗</translation> + </message> + <message> + <location line="+13"/> + <source>Cannot create %1 for output</source> + <translation>無法建立 %1 以輸出</translation> + </message> +</context> +<context> + <name>QFileDialog</name> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/> + <location line="+444"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location line="+222"/> + <source>Directories</source> + <translation>目錄</translation> + </message> + <message> + <location line="-3"/> + <location line="+50"/> + <location line="+1471"/> + <location line="+75"/> + <source>&Open</source> + <translation>開啟(&O)</translation> + </message> + <message> + <location line="-1596"/> + <location line="+50"/> + <source>&Save</source> + <translation>儲存(&S)</translation> + </message> + <message> + <location line="-730"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location line="+1515"/> + <source>%1 already exists. +Do you want to replace it?</source> + <translation>%1 已存在 +您要取代它嗎?</translation> + </message> + <message> + <location line="+20"/> + <source>%1 +File not found. +Please verify the correct file name was given.</source> + <translation>%1 +找不到檔案。 +請檢查檔名是否正確。</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/> + <source>My Computer</source> + <translation>我的電腦</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1504"/> + <source>&Rename</source> + <translation>重新命名(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Delete</source> + <translation>刪除(&D)</translation> + </message> + <message> + <location line="+1"/> + <source>Show &hidden files</source> + <translation>顯示隱藏檔(&H)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Back</source> + <translation>返回</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Parent Directory</source> + <translation>父目錄</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>List View</source> + <translation>列表檢視</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Detail View</source> + <translation>詳細檢視</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Files of type:</source> + <translation>檔案型態:</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+6"/> + <location line="+648"/> + <source>Directory:</source> + <translation>目錄:</translation> + </message> + <message> + <source> +File not found. +Please verify the correct file name was given</source> + <translation type="obsolete"> +檔案找不到。 +請檢查檔名是否正確。</translation> + </message> + <message> + <location line="+794"/> + <location line="+862"/> + <source>%1 +Directory not found. +Please verify the correct directory name was given.</source> + <translation>%1 +找不到目錄。 +請檢查目錄名稱是否正確。</translation> + </message> + <message> + <location line="-218"/> + <source>'%1' is write protected. +Do you want to delete it anyway?</source> + <translation>%1 有寫入保護。 +您確定要刪除它嗎?</translation> + </message> + <message> + <location line="+5"/> + <source>Are sure you want to delete '%1'?</source> + <translation>您確定要刪除 %1 嗎?</translation> + </message> + <message> + <location line="+15"/> + <source>Could not delete directory.</source> + <translation>無法刪除目錄。</translation> + </message> + <message> + <location line="+407"/> + <source>Recent Places</source> + <translation>最近的地方</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/> + <source>All Files (*.*)</source> + <translation>所有檔案 (*.*)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2550"/> + <source>Save As</source> + <translation>另存新檔</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+411"/> + <source>Drive</source> + <translation>磁碟</translation> + </message> + <message> + <location line="+3"/> + <location line="+1"/> + <source>File</source> + <translation>檔案</translation> + </message> + <message> + <location line="+29"/> + <source>Unknown</source> + <translation>未知</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-4"/> + <source>Find Directory</source> + <translation>尋找目錄</translation> + </message> + <message> + <location line="+29"/> + <source>Show </source> + <translation>顯示 </translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Forward</source> + <translation>往前</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1970"/> + <source>New Folder</source> + <translation>新資料夾</translation> + </message> + <message> + <location line="-1963"/> + <source>&New Folder</source> + <translation>新增資料夾(&N)</translation> + </message> + <message> + <location line="+656"/> + <location line="+38"/> + <source>&Choose</source> + <translation>選擇(&C)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/> + <location line="+652"/> + <source>File &name:</source> + <translation>檔名(&N):</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Look in:</source> + <translation>尋找於:</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Create New Folder</source> + <translation>建立新資料夾</translation> + </message> +</context> +<context> + <name>QFileSystemModel</name> + <message> + <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+828"/> + <source>Invalid filename</source> + <translation>不合法的檔名</translation> + </message> + <message> + <location line="+1"/> + <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> + <translation><b>無法使用名稱 "%1"。</b><p>請使用其它名稱,字元數少一點,或是不要有標點符號。</translation> + </message> + <message> + <location line="+63"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location line="+2"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+4"/> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>種類</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <comment>All other platforms</comment> + <translation>型態</translation> + </message> + <message> + <location line="+7"/> + <source>Date Modified</source> + <translation>變更日期</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/> + <source>My Computer</source> + <translation>我的電腦</translation> + </message> + <message> + <location line="+2"/> + <source>Computer</source> + <translation>電腦</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="-163"/> + <source>%1 TB</source> + <translation>%1 TB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 GB</source> + <translation>%1 GB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 MB</source> + <translation>%1 MB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 KB</source> + <translation>%1 KB</translation> + </message> + <message> + <location line="+1"/> + <source>%1 bytes</source> + <translation>%1 位元組</translation> + </message> +</context> +<context> + <name>QFontDatabase</name> + <message> + <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/> + <location line="+1176"/> + <source>Normal</source> + <translation>正常</translation> + </message> + <message> + <location line="-1173"/> + <location line="+12"/> + <location line="+1149"/> + <source>Bold</source> + <translation>粗體</translation> + </message> + <message> + <location line="-1158"/> + <location line="+1160"/> + <source>Demi Bold</source> + <translation>半粗體</translation> + </message> + <message> + <location line="-1157"/> + <location line="+18"/> + <location line="+1135"/> + <source>Black</source> + <translation>黑體</translation> + </message> + <message> + <location line="-1145"/> + <source>Demi</source> + <translation>半體</translation> + </message> + <message> + <location line="+6"/> + <location line="+1145"/> + <source>Light</source> + <translation>輕體</translation> + </message> + <message> + <location line="-1004"/> + <location line="+1007"/> + <source>Italic</source> + <translation>斜體</translation> + </message> + <message> + <location line="-1004"/> + <location line="+1006"/> + <source>Oblique</source> + <translation>傾斜體</translation> + </message> + <message> + <location line="+705"/> + <source>Any</source> + <translation>任何</translation> + </message> + <message> + <location line="+3"/> + <source>Latin</source> + <translation>拉丁</translation> + </message> + <message> + <location line="+3"/> + <source>Greek</source> + <translation>希臘</translation> + </message> + <message> + <location line="+3"/> + <source>Cyrillic</source> + <translation>斯拉夫</translation> + </message> + <message> + <location line="+3"/> + <source>Armenian</source> + <translation>亞美尼亞</translation> + </message> + <message> + <location line="+3"/> + <source>Hebrew</source> + <translation>希伯來</translation> + </message> + <message> + <location line="+3"/> + <source>Arabic</source> + <translation>阿拉伯</translation> + </message> + <message> + <location line="+3"/> + <source>Syriac</source> + <translation>敘利亞</translation> + </message> + <message> + <location line="+3"/> + <source>Thaana</source> + <translation>Thaana</translation> + </message> + <message> + <location line="+3"/> + <source>Devanagari</source> + <translation>Devanagari</translation> + </message> + <message> + <location line="+3"/> + <source>Bengali</source> + <translation>孟加拉</translation> + </message> + <message> + <location line="+3"/> + <source>Gurmukhi</source> + <translation>Gurmukhi</translation> + </message> + <message> + <location line="+3"/> + <source>Gujarati</source> + <translation>Gujarati</translation> + </message> + <message> + <location line="+3"/> + <source>Oriya</source> + <translation>Oriya</translation> + </message> + <message> + <location line="+3"/> + <source>Tamil</source> + <translation>坦米爾</translation> + </message> + <message> + <location line="+3"/> + <source>Telugu</source> + <translation>Telugu</translation> + </message> + <message> + <location line="+3"/> + <source>Kannada</source> + <translation>坎達那</translation> + </message> + <message> + <location line="+3"/> + <source>Malayalam</source> + <translation>馬來語</translation> + </message> + <message> + <location line="+3"/> + <source>Sinhala</source> + <translation>錫蘭</translation> + </message> + <message> + <location line="+3"/> + <source>Thai</source> + <translation>泰語</translation> + </message> + <message> + <location line="+3"/> + <source>Lao</source> + <translation>寮國</translation> + </message> + <message> + <location line="+3"/> + <source>Tibetan</source> + <translation>西藏</translation> + </message> + <message> + <location line="+3"/> + <source>Myanmar</source> + <translation>緬甸</translation> + </message> + <message> + <location line="+3"/> + <source>Georgian</source> + <translation>喬治亞</translation> + </message> + <message> + <location line="+3"/> + <source>Khmer</source> + <translation>高棉</translation> + </message> + <message> + <location line="+3"/> + <source>Simplified Chinese</source> + <translation>簡體中文</translation> + </message> + <message> + <location line="+3"/> + <source>Traditional Chinese</source> + <translation>繁體中文</translation> + </message> + <message> + <location line="+3"/> + <source>Japanese</source> + <translation>日語</translation> + </message> + <message> + <location line="+3"/> + <source>Korean</source> + <translation>韓語</translation> + </message> + <message> + <location line="+3"/> + <source>Vietnamese</source> + <translation>越南</translation> + </message> + <message> + <location line="+3"/> + <source>Symbol</source> + <translation>符號</translation> + </message> + <message> + <location line="+3"/> + <source>Ogham</source> + <translation>歐甘</translation> + </message> + <message> + <location line="+3"/> + <source>Runic</source> + <translation>盧恩</translation> + </message> +</context> +<context> + <name>QFontDialog</name> + <message> + <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/> + <source>&Font</source> + <translation>字型(&F)</translation> + </message> + <message> + <location line="+1"/> + <source>Font st&yle</source> + <translation>字型樣式(&Y)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Effects</source> + <translation>效果</translation> + </message> + <message> + <location line="+1"/> + <source>Stri&keout</source> + <translation>刪除線(&K)</translation> + </message> + <message> + <location line="+1"/> + <source>&Underline</source> + <translation>底線(&U)</translation> + </message> + <message> + <location line="+1"/> + <source>Sample</source> + <translation>範例</translation> + </message> + <message> + <location line="+1"/> + <source>Wr&iting System</source> + <translation>寫入系統(&I)</translation> + </message> + <message> + <location line="-604"/> + <location line="+247"/> + <source>Select Font</source> + <translation>選擇字型</translation> + </message> +</context> +<context> + <name>QFtp</name> + <message> + <location filename="../src/network/access/qftp.cpp" line="+826"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+683"/> + <source>Not connected</source> + <translation>未連線</translation> + </message> + <message> + <location line="+65"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+65"/> + <source>Host %1 not found</source> + <translation>找不到主機 %1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/> + <source>Connection refused to host %1</source> + <translation>連線到主機 %1 被拒</translation> + </message> + <message> + <location line="+4"/> + <source>Connection timed out to host %1</source> + <translation>連線到主機 %1 逾時</translation> + </message> + <message> + <location line="+104"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+102"/> + <location line="+1451"/> + <source>Connected to host %1</source> + <translation>已連接到主機 %1</translation> + </message> + <message> + <location line="+219"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="-1290"/> + <source>Connection refused for data connection</source> + <translation>資料連線被拒</translation> + </message> + <message> + <location line="+178"/> + <location line="+29"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+195"/> + <location line="+728"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="+889"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/> + <source>Connecting to host failed: +%1</source> + <translation>連線到主機失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Login failed: +%1</source> + <translation>登入失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Listing directory failed: +%1</source> + <translation>列出目錄時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Changing directory failed: +%1</source> + <translation>變更目錄時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Downloading file failed: +%1</source> + <translation>下載檔案時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Uploading file failed: +%1</source> + <translation>上傳檔案時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Removing file failed: +%1</source> + <translation>移除檔案時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Creating directory failed: +%1</source> + <translation>建立目錄時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Removing directory failed: +%1</source> + <translation>移除目錄時失敗: +%1</translation> + </message> + <message> + <location line="+28"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+25"/> + <location line="+250"/> + <source>Connection closed</source> + <translation>連線已關閉</translation> + </message> + <message> + <location filename="../src/qt3support/network/q3ftp.cpp" line="-11"/> + <source>Host %1 found</source> + <translation>找到主機 %1</translation> + </message> + <message> + <location line="+4"/> + <source>Connection to %1 closed</source> + <translation>到 %1 的連線已關閉</translation> + </message> + <message> + <location line="+3"/> + <source>Host found</source> + <translation>找到主機</translation> + </message> + <message> + <location line="+2"/> + <source>Connected to host</source> + <translation>已連線到主機</translation> + </message> +</context> +<context> + <name>QHostInfo</name> + <message> + <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> +</context> +<context> + <name>QHostInfoAgent</name> + <message> + <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/> + <location line="+9"/> + <location line="+64"/> + <location line="+31"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/> + <location line="+9"/> + <location line="+40"/> + <location line="+27"/> + <source>Host not found</source> + <translation>找不到主機</translation> + </message> + <message> + <location line="-44"/> + <location line="+39"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/> + <location line="+29"/> + <source>Unknown address type</source> + <translation>未知的位址型態</translation> + </message> + <message> + <location line="+8"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/> + <location line="+27"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> +</context> +<context> + <name>QHttp</name> + <message> + <location filename="../src/network/access/qhttp.cpp" line="+1574"/> + <location line="+820"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+1160"/> + <location line="+567"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="-568"/> + <location filename="../src/qt3support/network/q3http.cpp" line="-370"/> + <source>Request aborted</source> + <translation>要求中止</translation> + </message> + <message> + <location line="+579"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+381"/> + <source>No server set to connect to</source> + <translation>沒有設定要連線到哪個伺服器</translation> + </message> + <message> + <location line="+164"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+56"/> + <source>Wrong content length</source> + <translation>錯誤的內容長度</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+4"/> + <source>Server closed connection unexpectedly</source> + <translation>伺服器無預警關閉連線</translation> + </message> + <message> + <location line="+179"/> + <source>Unknown authentication method</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+183"/> + <source>Error writing response to device</source> + <translation>寫入回應到裝置時發生錯誤</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+38"/> + <source>Connection refused</source> + <translation>連線被拒</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-304"/> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>Host %1 not found</source> + <translation>找不到主機 %1</translation> + </message> + <message> + <location line="+20"/> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/> + <location line="+19"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>HTTP request failed</source> + <translation>HTTP 要求失敗</translation> + </message> + <message> + <location line="+73"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+69"/> + <source>Invalid HTTP response header</source> + <translation>不合法的 HTTP 回覆標頭</translation> + </message> + <message> + <location line="+125"/> + <location line="+48"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+40"/> + <location line="+47"/> + <source>Invalid HTTP chunked body</source> + <translation>不合法的 HTTP 區塊主體</translation> + </message> + <message> + <location filename="../src/qt3support/network/q3http.cpp" line="+294"/> + <source>Host %1 found</source> + <translation>找到主機 %1</translation> + </message> + <message> + <location line="+3"/> + <source>Connected to host %1</source> + <translation>已連接到主機 %1</translation> + </message> + <message> + <location line="+3"/> + <source>Connection to %1 closed</source> + <translation>到 %1 的連線已關閉</translation> + </message> + <message> + <location line="+8"/> + <source>Host found</source> + <translation>找到主機</translation> + </message> + <message> + <location line="+3"/> + <source>Connected to host</source> + <translation>已連線到主機</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>Connection closed</source> + <translation>連線已關閉</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-135"/> + <source>Proxy authentication required</source> + <translation>代理伺服器需要認證</translation> + </message> + <message> + <location line="+4"/> + <source>Authentication required</source> + <translation>需要認證</translation> + </message> + <message> + <location line="-138"/> + <source>Connection refused (or timed out)</source> + <translation>連線被拒(或連線逾時)</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/> + <source>Proxy requires authentication</source> + <translation>代理伺服器需要認證</translation> + </message> + <message> + <location line="+3"/> + <source>Host requires authentication</source> + <translation>主機需要認證</translation> + </message> + <message> + <location line="+3"/> + <source>Data corrupted</source> + <translation>資料已損毀</translation> + </message> + <message> + <location line="+3"/> + <source>Unknown protocol specified</source> + <translation>指定了未知的協定</translation> + </message> + <message> + <location line="+3"/> + <source>SSL handshake failed</source> + <translation>SSL 溝通失敗</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-2263"/> + <source>HTTPS connection requested but SSL support not compiled in</source> + <translation>HTTPS 連線需要的 SSL 支援並未編譯進來</translation> + </message> +</context> +<context> + <name>QHttpSocketEngine</name> + <message> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/> + <source>Did not receive HTTP response from proxy</source> + <translation>未從代理伺服器接收到 HTTP 回應</translation> + </message> + <message> + <location line="+25"/> + <source>Error parsing authentication request from proxy</source> + <translation>剖析從代理伺服器傳來的認證要求時發生錯誤</translation> + </message> + <message> + <location line="+31"/> + <source>Authentication required</source> + <translation>需要認證</translation> + </message> + <message> + <location line="+27"/> + <source>Proxy denied connection</source> + <translation>代理伺服器拒絕連線</translation> + </message> + <message> + <location line="+10"/> + <source>Error communicating with HTTP proxy</source> + <translation>與 HTTP 代理伺服器聯繫時發生錯誤</translation> + </message> + <message> + <location line="+23"/> + <source>Proxy server not found</source> + <translation>找不到代理伺服器</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy connection refused</source> + <translation>代理伺服器連線被拒</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy server connection timed out</source> + <translation>代理伺服器連線逾時</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy connection closed prematurely</source> + <translation>代理伺服器連線已不正常關閉</translation> + </message> +</context> +<context> + <name>QIBaseDriver</name> + <message> + <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/> + <source>Error opening database</source> + <translation>開啟資料庫發生錯誤</translation> + </message> + <message> + <location line="+54"/> + <source>Could not start transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+13"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+13"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QIBaseResult</name> + <message> + <location line="-1097"/> + <source>Unable to create BLOB</source> + <translation>無法建立 BLOB</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to write BLOB</source> + <translation>無法寫入 BLOB</translation> + </message> + <message> + <location line="+14"/> + <source>Unable to open BLOB</source> + <translation>無法開啟 BLOB</translation> + </message> + <message> + <location line="+16"/> + <source>Unable to read BLOB</source> + <translation>無法讀取 BLOB</translation> + </message> + <message> + <location line="+125"/> + <location line="+189"/> + <source>Could not find array</source> + <translation>找不到陣列</translation> + </message> + <message> + <location line="-157"/> + <source>Could not get array data</source> + <translation>無法取得陣列資料</translation> + </message> + <message> + <location line="+212"/> + <source>Could not get query info</source> + <translation>無法取得查詢資訊</translation> + </message> + <message> + <location line="+20"/> + <source>Could not start transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+33"/> + <source>Could not allocate statement</source> + <translation>無法配置敘述</translation> + </message> + <message> + <location line="+5"/> + <source>Could not prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+5"/> + <location line="+7"/> + <source>Could not describe input statement</source> + <translation>無法描述輸入敘述</translation> + </message> + <message> + <location line="+10"/> + <source>Could not describe statement</source> + <translation>無法描述敘述</translation> + </message> + <message> + <location line="+115"/> + <source>Unable to close statement</source> + <translation>無法關閉敘述</translation> + </message> + <message> + <location line="+8"/> + <source>Unable to execute query</source> + <translation>無法執行查詢</translation> + </message> + <message> + <location line="+46"/> + <source>Could not fetch next item</source> + <translation>無法抓取下一個項目</translation> + </message> + <message> + <location line="+160"/> + <source>Could not get statement info</source> + <translation>無法取得敘述資訊</translation> + </message> +</context> +<context> + <name>QIODevice</name> + <message> + <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/> + <source>Permission denied</source> + <translation>權限不足</translation> + </message> + <message> + <location line="+3"/> + <source>Too many open files</source> + <translation>開啟過多檔案</translation> + </message> + <message> + <location line="+3"/> + <source>No such file or directory</source> + <translation>找不到該檔案或目錄</translation> + </message> + <message> + <location line="+3"/> + <source>No space left on device</source> + <translation>裝置上已無空間</translation> + </message> + <message> + <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> +</context> +<context> + <name>QInputContext</name> + <message> + <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/> + <source>XIM</source> + <translation>XIM</translation> + </message> + <message> + <location line="+23"/> + <source>XIM input method</source> + <translation>XIM 輸入法</translation> + </message> + <message> + <location line="+4"/> + <source>Windows input method</source> + <translation>Windows 輸入法</translation> + </message> + <message> + <location line="+4"/> + <source>Mac OS X input method</source> + <translation>Mac OS X 輸入法</translation> + </message> +</context> +<context> + <name>QInputDialog</name> + <message> + <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/> + <source>Enter a value:</source> + <translation>請輸入值:</translation> + </message> +</context> +<context> + <name>QLibrary</name> + <message> + <source>QLibrary::load_sys: Cannot load %1 (%2)</source> + <translation type="obsolete">QLibrary::load_sys: 無法載入 %1 (%2)</translation> + </message> + <message> + <source>QLibrary::unload_sys: Cannot unload %1 (%2)</source> + <translation type="obsolete">QLibrary::unload_sys: 無法卸載 %1 (%2)</translation> + </message> + <message> + <source>QLibrary::resolve_sys: Symbol "%1" undefined in %2 (%3)</source> + <translation type="obsolete">QLibrary::resolve_sys: 符號 "%1" 未定義於 %2 (%3)</translation> + </message> + <message> + <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/> + <source>Could not mmap '%1': %2</source> + <translation>無法 mmap '%1':%2</translation> + </message> + <message> + <location line="+22"/> + <source>Plugin verification data mismatch in '%1'</source> + <translation>在 %1 中的外掛程式確認資料不符合</translation> + </message> + <message> + <location line="+6"/> + <source>Could not unmap '%1': %2</source> + <translation>無法 unmap '%1':%2</translation> + </message> + <message> + <location line="+302"/> + <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> + <translation>外掛程式 %1 使用不相容的 Qt 函式庫(%2.%3.%4)【%5】</translation> + </message> + <message> + <location line="+20"/> + <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> + <translation>外掛程式 %1 使用不相容的 Qt 函式庫。預期建構鑰 %2,卻得到 %3</translation> + </message> + <message> + <location line="+340"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="-377"/> + <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/> + <source>The shared library was not found.</source> + <translation>找不到分享函式庫</translation> + </message> + <message> + <location line="+2"/> + <source>The file '%1' is not a valid Qt plugin.</source> + <translation>檔案 %1 不是合法的 Qt 外掛程式。</translation> + </message> + <message> + <location line="+43"/> + <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> + <translation>外掛程式 %1 使用不相容的 Qt 函式庫。(不能將除錯與釋出版的函式庫混在一起。)</translation> + </message> + <message> + <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/> + <source>Cannot load library %1: %2</source> + <translation>無法載入函式庫 %1:%2</translation> + </message> + <message> + <location line="+16"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/> + <source>Cannot unload library %1: %2</source> + <translation>無法卸載函式庫 %1:%2</translation> + </message> + <message> + <location line="+31"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/> + <source>Cannot resolve symbol "%1" in %2: %3</source> + <translation>無法反解 %2 內的符號 %1:%3</translation> + </message> +</context> +<context> + <name>QLineEdit</name> + <message> + <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/> + <source>&Undo</source> + <translation>復原(&U)</translation> + </message> + <message> + <location line="+4"/> + <source>&Redo</source> + <translation>重做(&R)</translation> + </message> + <message> + <location line="+7"/> + <source>Cu&t</source> + <translation>剪下(&T)</translation> + </message> + <message> + <location line="+4"/> + <source>&Copy</source> + <translation>複製(&C)</translation> + </message> + <message> + <location line="+4"/> + <source>&Paste</source> + <translation>貼上(&P)</translation> + </message> + <message> + <location line="+5"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location line="+6"/> + <source>Select All</source> + <translation>全部選擇</translation> + </message> +</context> +<context> + <name>QLocalServer</name> + <message> + <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/> + <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/> + <source>%1: Name error</source> + <translation>%1:名稱錯誤</translation> + </message> + <message> + <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/> + <source>%1: Permission denied</source> + <translation>%1:存取被拒</translation> + </message> + <message> + <location line="+12"/> + <source>%1: Address in use</source> + <translation>%1:位址使用中</translation> + </message> + <message> + <location line="+5"/> + <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/> + <source>%1: Unknown error %2</source> + <translation>%1:未知的錯誤 %2</translation> + </message> +</context> +<context> + <name>QLocalSocket</name> + <message> + <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/> + <source>%1: Connection refused</source> + <translation>%1:連線被拒</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Remote closed</source> + <translation>%1:遠端已關閉</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/> + <location line="+43"/> + <source>%1: Invalid name</source> + <translation>%1:不合法的名稱</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket access error</source> + <translation>%1:Socket 位址錯誤</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket resource error</source> + <translation>%1:Socket 資源錯誤</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket operation timed out</source> + <translation>%1:Socket 操作逾時</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Datagram too large</source> + <translation>%1:資料包過大</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/> + <source>%1: Connection error</source> + <translation>%1:連線錯誤</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: The socket operation is not supported</source> + <translation>%1:socket 操作未支援</translation> + </message> + <message> + <location line="+4"/> + <source>%1: Unknown error</source> + <translation>%1:未知的錯誤</translation> + </message> + <message> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/> + <source>%1: Unknown error %2</source> + <translation>%1:未知的錯誤 %2</translation> + </message> +</context> +<context> + <name>QMYSQLDriver</name> + <message> + <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/> + <source>Unable to open database '</source> + <translation>無法開啟資料庫</translation> + </message> + <message> + <location line="+7"/> + <source>Unable to connect</source> + <translation>無法連線</translation> + </message> + <message> + <location line="+127"/> + <source>Unable to begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QMYSQLResult</name> + <message> + <location line="-922"/> + <source>Unable to fetch data</source> + <translation>無法抓取資料</translation> + </message> + <message> + <location line="+176"/> + <source>Unable to execute query</source> + <translation>無法執行查詢</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to store result</source> + <translation>無法儲存結果</translation> + </message> + <message> + <location line="+190"/> + <location line="+8"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+34"/> + <source>Unable to reset statement</source> + <translation>無法重置敘述</translation> + </message> + <message> + <location line="+87"/> + <source>Unable to bind value</source> + <translation>無法結合數值</translation> + </message> + <message> + <location line="+11"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> + <message> + <location line="+14"/> + <location line="+21"/> + <source>Unable to bind outvalues</source> + <translation>無法結合輸出值</translation> + </message> + <message> + <location line="-12"/> + <source>Unable to store statement results</source> + <translation>無法儲存敘述結果</translation> + </message> + <message> + <location line="-253"/> + <source>Unable to execute next query</source> + <translation>無法執行下一個查詢</translation> + </message> + <message> + <location line="+10"/> + <source>Unable to store next result</source> + <translation>無法儲存下一個結果</translation> + </message> +</context> +<context> + <name>QMdiArea</name> + <message> + <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/> + <source>(Untitled)</source> + <translation>(未命名)</translation> + </message> +</context> +<context> + <name>QMdiSubWindow</name> + <message> + <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/> + <source>%1 - [%2]</source> + <translation>%1 - [%2]</translation> + </message> + <message> + <location line="+72"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="-18"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+13"/> + <source>Restore Down</source> + <translation>向下恢復</translation> + </message> + <message> + <location line="+707"/> + <source>&Restore</source> + <translation>回復(&R)</translation> + </message> + <message> + <location line="+3"/> + <source>&Move</source> + <translation>移動(&M)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Mi&nimize</source> + <translation>最小化(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Ma&ximize</source> + <translation>最大化(&X)</translation> + </message> + <message> + <location line="+2"/> + <source>Stay on &Top</source> + <translation>留在頂端(&T)</translation> + </message> + <message> + <location line="+3"/> + <source>&Close</source> + <translation>關閉(&C)</translation> + </message> + <message> + <location line="-787"/> + <source>- [%1]</source> + <translation>- [%1]</translation> + </message> + <message> + <location line="+58"/> + <source>Maximize</source> + <translation>最大化</translation> + </message> + <message> + <location line="+3"/> + <source>Unshade</source> + <translation>取消遮蔽</translation> + </message> + <message> + <location line="+3"/> + <source>Shade</source> + <translation>遮蔽</translation> + </message> + <message> + <location line="+6"/> + <source>Restore</source> + <translation>回復</translation> + </message> + <message> + <location line="+6"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="+3"/> + <source>Menu</source> + <translation>選單</translation> + </message> +</context> +<context> + <name>QMenu</name> + <message> + <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/> + <location line="+225"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="-224"/> + <location line="+225"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location line="-223"/> + <location line="+225"/> + <location line="+51"/> + <source>Execute</source> + <translation>執行</translation> + </message> +</context> +<context> + <name>QMenuBar</name> + <message> + <source>About</source> + <translation type="obsolete">關於</translation> + </message> + <message> + <source>Config</source> + <translation type="obsolete">設定</translation> + </message> + <message> + <source>Preference</source> + <translation type="obsolete">喜好設定</translation> + </message> + <message> + <source>Options</source> + <translation type="obsolete">選項</translation> + </message> + <message> + <source>Setting</source> + <translation type="obsolete">設定</translation> + </message> + <message> + <source>Setup</source> + <translation type="obsolete">設定</translation> + </message> + <message> + <source>Quit</source> + <translation type="obsolete">離開</translation> + </message> + <message> + <source>Exit</source> + <translation type="obsolete">離開</translation> + </message> + <message> + <source>About %1</source> + <translation type="obsolete">關於 %1</translation> + </message> + <message> + <source>About Qt</source> + <translation type="obsolete">關於 Qt</translation> + </message> + <message> + <source>Preferences</source> + <translation type="obsolete">喜好設定</translation> + </message> + <message> + <source>Quit %1</source> + <translation type="obsolete">離開 %1</translation> + </message> +</context> +<context> + <name>QMessageBox</name> + <message> + <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1111"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="-853"/> + <location line="+852"/> + <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/> + <location line="+8"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location line="+509"/> + <source>About Qt</source> + <translation>關於 Qt</translation> + </message> + <message> + <source><p>This program uses Qt version %1.</p></source> + <translation type="obsolete"><p> 這個程式使用 Qt 版本 %1</p></translation> + </message> + <message> + <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qtopia Core.</p><p>Qt is a Trolltech product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><h3>關於 Qt</h3>%1<p>Qt 為一個跨平台的 C++ 開發工具。</p><p>Qt 提供各平台相容機制,只要寫一份程式碼,就可以在 MS&nbsp;Windows、Mac&nbsp;OS&nbsp;X、Linux 與各主要的商業 Unix 平台上編譯。Qt 也可以用 Qtopia Core 用於嵌入式系統。</p><p>Qt 為 Trolltech 的產品。詳情請參考 <a href="http://qt.nokia.com/">qt.nokia.com</a>。</p></translation> + </message> + <message> + <location line="-1605"/> + <source>Show Details...</source> + <translation>顯示詳情...</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Details...</source> + <translation>隱藏詳情...</translation> + </message> + <message> + <location line="+1570"/> + <source><h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><h3>關於 Qt</h3>%1<p>Qt 為一個跨平台的 C++ 開發工具。</p><p>Qt 提供各平台相容機制,只要寫一份程式碼,就可以在 MS&nbsp;Windows、Mac&nbsp;OS&nbsp;X、Linux 與各主要的商業 Unix 平台上編譯。Qt 也有用於嵌入式 Linux 與 Windows CE 的版本。</p><p>Qt 為 Nokia 的產品。詳情請參考 <a href="http://qt.nokia.com/">qt.nokia.com</a>。</p></translation> + </message> + <message> + <source><p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://qt.nokia.com/company/model/">qt.nokia.com/company/model/</a> for an overview of Qt licensing.</p></source> + <translation type="obsolete"><p>這個程式使用了 Qt 開放源碼版本 %1。</p><p>Qt 開放源碼版本是專門為了開發開放源碼應用程式使用的版本。若是您要開發專利私有(封閉)軟體,您需要 Qt 的商業授權。</p><p>Qt 的授權概要請參考 <a href="http://qt.nokia.com/company/model/">qt.nokia.com/company/model/</a>。</p></translation> + </message> + <message> + <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt Embedded.</p><p>Qt is a Trolltech product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><h3>關於 Qt</h3>%1<p>Qt 為一個跨平台的 C++ 開發工具。</p><p>Qt 提供各平台相容機制,只要寫一份程式碼,就可以在 MS&nbsp;Windows、Mac&nbsp;OS&nbsp;X、Linux 與各主要的商業 Unix 平台上編譯。Qt 也可以用 Qtopia Core 用於嵌入式系統。</p><p>Qt 為 Trolltech 的產品。詳情請參考 <a href="http://qt.nokia.com/">qt.nokia.com</a>。</p></translation> + </message> +</context> +<context> + <name>QMultiInputContext</name> + <message> + <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/> + <source>Select IM</source> + <translation>選擇輸入法</translation> + </message> +</context> +<context> + <name>QMultiInputContextPlugin</name> + <message> + <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/> + <source>Multiple input method switcher</source> + <translation>多重輸入法切換器</translation> + </message> + <message> + <location line="+7"/> + <source>Multiple input method switcher that uses the context menu of the text widgets</source> + <translation>使用文字元件中的內文選單的多重輸入法切換器</translation> + </message> +</context> +<context> + <name>QNativeSocketEngine</name> + <message> + <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/> + <source>The remote host closed the connection</source> + <translation>遠端主機關閉了連線</translation> + </message> + <message> + <location line="+3"/> + <source>Network operation timed out</source> + <translation>網路操作逾時</translation> + </message> + <message> + <location line="+3"/> + <source>Out of resources</source> + <translation>資源不足</translation> + </message> + <message> + <location line="+3"/> + <source>Unsupported socket operation</source> + <translation>未支援的 socket 操作</translation> + </message> + <message> + <location line="+3"/> + <source>Protocol type not supported</source> + <translation>協定型態未支援</translation> + </message> + <message> + <location line="+3"/> + <source>Invalid socket descriptor</source> + <translation>不合法的 socket 描述子</translation> + </message> + <message> + <location line="+6"/> + <source>Network unreachable</source> + <translation>無法使用網路</translation> + </message> + <message> + <location line="+3"/> + <source>Permission denied</source> + <translation>權限不足</translation> + </message> + <message> + <location line="+3"/> + <source>Connection timed out</source> + <translation>連線逾時</translation> + </message> + <message> + <location line="+3"/> + <source>Connection refused</source> + <translation>連線被拒</translation> + </message> + <message> + <location line="+3"/> + <source>The bound address is already in use</source> + <translation>結合的位址已經在使用中</translation> + </message> + <message> + <location line="+3"/> + <source>The address is not available</source> + <translation>無法取得位址</translation> + </message> + <message> + <location line="+3"/> + <source>The address is protected</source> + <translation>此位址已被保護</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to send a message</source> + <translation>無法送出訊息</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to receive a message</source> + <translation>無法接收訊息</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to write</source> + <translation>無法寫入</translation> + </message> + <message> + <location line="+3"/> + <source>Network error</source> + <translation>網路錯誤</translation> + </message> + <message> + <location line="+3"/> + <source>Another socket is already listening on the same port</source> + <translation>另一個 socket 已經在監聽同一個連接埠</translation> + </message> + <message> + <location line="-66"/> + <source>Unable to initialize non-blocking socket</source> + <translation>無法初始化非阻擋性 socket</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to initialize broadcast socket</source> + <translation>無法初始化廣播 socket</translation> + </message> + <message> + <location line="+3"/> + <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> + <translation>試圖在沒有 IPv6 支援的平台上使用 IPv6 socket</translation> + </message> + <message> + <location line="+21"/> + <source>Host unreachable</source> + <translation>無法連線到主機</translation> + </message> + <message> + <location line="+24"/> + <source>Datagram was too large to send</source> + <translation>資料過大無法送出</translation> + </message> + <message> + <location line="+18"/> + <source>Operation on non-socket</source> + <translation>對非 socket 操作</translation> + </message> + <message> + <location line="+6"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="-3"/> + <source>The proxy type is invalid for this operation</source> + <translation>代理伺服器型態無法支援此操作</translation> + </message> +</context> +<context> + <name>QNetworkAccessCacheBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/> + <source>Error opening %1</source> + <translation>開啟 %1 發生錯誤</translation> + </message> +</context> +<context> + <name>QNetworkAccessFileBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/> + <source>Request for opening non-local file %1</source> + <translation>要求開啟非本地端檔案 %1</translation> + </message> + <message> + <location line="+42"/> + <source>Error opening %1: %2</source> + <translation>開啟 %1 發生錯誤:%2</translation> + </message> + <message> + <location line="+56"/> + <source>Write error writing to %1: %2</source> + <translation>寫入 %1 時發生錯誤:%2</translation> + </message> + <message> + <location line="+33"/> + <source>Cannot open %1: Path is a directory</source> + <translation>無法開啟 %1:此路徑是一個目錄</translation> + </message> + <message> + <location line="+21"/> + <source>Read error reading from %1: %2</source> + <translation>從 %1 讀取錯誤:%2</translation> + </message> +</context> +<context> + <name>QNetworkAccessFtpBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/> + <source>No suitable proxy found</source> + <translation>找不到合適的代理伺服器</translation> + </message> + <message> + <location line="+14"/> + <source>Cannot open %1: is a directory</source> + <translation>無法開啟 %1:是一個目錄</translation> + </message> + <message> + <location line="+130"/> + <source>Logging in to %1 failed: authentication required</source> + <translation>登入 %1 失敗:需要認證</translation> + </message> + <message> + <location line="+39"/> + <source>Error while downloading %1: %2</source> + <translation>下載 %1 時發生錯誤:%2</translation> + </message> + <message> + <location line="+2"/> + <source>Error while uploading %1: %2</source> + <translation>上傳 %1 時發生錯誤:%2</translation> + </message> +</context> +<context> + <name>QNetworkAccessHttpBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/> + <source>No suitable proxy found</source> + <translation>找不到合適的代理伺服器</translation> + </message> +</context> +<context> + <name>QNetworkReply</name> + <message> + <location line="+128"/> + <source>Error downloading %1 - server replied: %2</source> + <translation>下載 %1 時發生錯誤─伺服器回應:%2</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/> + <source>Protocol "%1" is unknown</source> + <translation>未知的協定 %1</translation> + </message> +</context> +<context> + <name>QNetworkReplyImpl</name> + <message> + <location line="+432"/> + <location line="+22"/> + <source>Operation canceled</source> + <translation>取消操作</translation> + </message> +</context> +<context> + <name>QOCIDriver</name> + <message> + <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/> + <source>Unable to logon</source> + <translation>無法登入</translation> + </message> + <message> + <location line="-144"/> + <source>Unable to initialize</source> + <comment>QOCIDriver</comment> + <translation>無法初始化</translation> + </message> + <message> + <location line="+215"/> + <source>Unable to begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QOCIResult</name> + <message> + <location line="-963"/> + <location line="+161"/> + <location line="+15"/> + <source>Unable to bind column for batch execute</source> + <translation>無法結合欄位以做批次執行</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to execute batch statement</source> + <translation>無法執行批次敘述</translation> + </message> + <message> + <location line="+302"/> + <source>Unable to goto next</source> + <translation>無法跳到下一個</translation> + </message> + <message> + <location line="+59"/> + <source>Unable to alloc statement</source> + <translation>無法配置敘述</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+36"/> + <source>Unable to bind value</source> + <translation>無法結合數值</translation> + </message> + <message> + <source>Unable to execute select statement</source> + <translation type="obsolete">無法執行選取的敘述</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> +</context> +<context> + <name>QODBCDriver</name> + <message> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/> + <source>Unable to connect</source> + <translation>無法連接</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to connect - Driver doesn't support all needed functionality</source> + <translation>無法連接─驅動程式無法支援所有需要的功能</translation> + </message> + <message> + <location line="+242"/> + <source>Unable to disable autocommit</source> + <translation>無法關閉自動提交功能</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to enable autocommit</source> + <translation>無法開啟自動提交功能</translation> + </message> +</context> +<context> + <name>QODBCResult</name> + <message> + <location line="-1218"/> + <location line="+349"/> + <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> + <translation>QODBCResult::reset: 無法設定 SQL_CURSOR_STATIC 做為敘述屬性。請檢查您的 ODBC 驅動程式的設定</translation> + </message> + <message> + <location line="-332"/> + <location line="+626"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> + <message> + <location line="-555"/> + <source>Unable to fetch next</source> + <translation>無法抓取下一筆</translation> + </message> + <message> + <location line="+279"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+268"/> + <source>Unable to bind variable</source> + <translation>無法結合變數</translation> + </message> + <message> + <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/> + <location line="+578"/> + <source>Unable to fetch last</source> + <translation>無法抓取最後一筆</translation> + </message> + <message> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/> + <source>Unable to fetch</source> + <translation>無法抓取</translation> + </message> + <message> + <location line="+44"/> + <source>Unable to fetch first</source> + <translation>無法抓取第一筆</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to fetch previous</source> + <translation>無法抓取前一筆</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/> + <source>Home</source> + <translation>首頁</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/> + <source>Operation not supported on %1</source> + <translation>在 %1 上不支援此操作</translation> + </message> + <message> + <location line="+53"/> + <source>Invalid URI: %1</source> + <translation>不合法的網址:%1</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/> + <source>Write error writing to %1: %2</source> + <translation>寫入 %1 時發生錯誤:%2</translation> + </message> + <message> + <location line="+57"/> + <source>Read error reading from %1: %2</source> + <translation>從 %1 讀取錯誤:%2</translation> + </message> + <message> + <location line="+31"/> + <source>Socket error on %1: %2</source> + <translation>%1 上發生 socket 錯誤:%2</translation> + </message> + <message> + <location line="+15"/> + <source>Remote host closed the connection prematurely on %1</source> + <translation>於 %1 上遠端主機關閉了不正常的連線</translation> + </message> + <message> + <location line="+53"/> + <source>Protocol error: packet of size 0 received</source> + <translation>協定錯誤:接收到大小為 0 的封包</translation> + </message> + <message> + <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/> + <location line="+57"/> + <source>No host name given</source> + <translation>未指定主機</translation> + </message> +</context> +<context> + <name>QPPDOptionsModel</name> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location line="+2"/> + <source>Value</source> + <translation>值</translation> + </message> +</context> +<context> + <name>QPSQLDriver</name> + <message> + <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/> + <source>Unable to connect</source> + <translation>無法連線</translation> + </message> + <message> + <location line="+49"/> + <source>Could not begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+17"/> + <source>Could not commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+16"/> + <source>Could not rollback transaction</source> + <translation>無法反轉事務</translation> + </message> + <message> + <location line="+358"/> + <source>Unable to subscribe</source> + <translation>無法訂閱</translation> + </message> + <message> + <location line="+32"/> + <source>Unable to unsubscribe</source> + <translation>無法取消訂閱</translation> + </message> +</context> +<context> + <name>QPSQLResult</name> + <message> + <location line="-1058"/> + <source>Unable to create query</source> + <translation>無法建立查詢</translation> + </message> + <message> + <location line="+374"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> +</context> +<context> + <name>QPageSetupWidget</name> + <message> + <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/> + <source>Centimeters (cm)</source> + <translation>公分</translation> + </message> + <message> + <location line="+0"/> + <source>Millimeters (mm)</source> + <translation>公厘</translation> + </message> + <message> + <location line="+0"/> + <source>Inches (in)</source> + <translation>英吋</translation> + </message> + <message> + <location line="+0"/> + <source>Points (pt)</source> + <translation>點</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/> + <source>Form</source> + <translation>表單</translation> + </message> + <message> + <location/> + <source>Paper</source> + <translation>紙張</translation> + </message> + <message> + <location/> + <source>Page size:</source> + <translation>紙張大小:</translation> + </message> + <message> + <location/> + <source>Width:</source> + <translation>寬度:</translation> + </message> + <message> + <location/> + <source>Height:</source> + <translation>高度:</translation> + </message> + <message> + <location/> + <source>Paper source:</source> + <translation>紙張來源:</translation> + </message> + <message> + <location/> + <source>Orientation</source> + <translation>方向</translation> + </message> + <message> + <location/> + <source>Portrait</source> + <translation>縱向</translation> + </message> + <message> + <location/> + <source>Landscape</source> + <translation>橫向</translation> + </message> + <message> + <location/> + <source>Reverse landscape</source> + <translation>反序橫向</translation> + </message> + <message> + <location/> + <source>Reverse portrait</source> + <translation>反序縱向</translation> + </message> + <message> + <location/> + <source>Margins</source> + <translation>邊緣</translation> + </message> + <message> + <location/> + <source>top margin</source> + <translation>上緣</translation> + </message> + <message> + <location/> + <source>left margin</source> + <translation>左緣</translation> + </message> + <message> + <location/> + <source>right margin</source> + <translation>右緣</translation> + </message> + <message> + <location/> + <source>bottom margin</source> + <translation>下緣</translation> + </message> +</context> +<context> + <name>QPluginLoader</name> + <message> + <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="-68"/> + <source>The plugin was not loaded.</source> + <translation>外掛程式未載入。</translation> + </message> +</context> +<context> + <name>QPrintDialog</name> + <message> + <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/> + <source>locally connected</source> + <translation>本地連接</translation> + </message> + <message> + <location line="+23"/> + <location line="+225"/> + <source>Aliases: %1</source> + <translation>別名:%1</translation> + </message> + <message> + <location line="+223"/> + <location line="+199"/> + <source>unknown</source> + <translation>未知</translation> + </message> + <message> + <source>Portrait</source> + <translation type="obsolete">縱向</translation> + </message> + <message> + <source>Landscape</source> + <translation type="obsolete">橫向</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+329"/> + <source>A0 (841 x 1189 mm)</source> + <translation>A0 (841 x 1189 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A1 (594 x 841 mm)</source> + <translation>A1 (594 x 841 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A2 (420 x 594 mm)</source> + <translation>A2 (420 x 594 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A3 (297 x 420 mm)</source> + <translation>A3 (297 x 420 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> + <translation>A4 (210 x 297 mm, 8.26 x 11.7 英吋)</translation> + </message> + <message> + <location line="+1"/> + <source>A5 (148 x 210 mm)</source> + <translation>A5 (148 x 210 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A6 (105 x 148 mm)</source> + <translation>A6 (105 x 148 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A7 (74 x 105 mm)</source> + <translation>A7 (74 x 105 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A8 (52 x 74 mm)</source> + <translation>A8 (52 x 74 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A9 (37 x 52 mm)</source> + <translation>A9 (37 x 52 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B0 (1000 x 1414 mm)</source> + <translation>B0 (1000 x 1414 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B1 (707 x 1000 mm)</source> + <translation>B1 (707 x 1000 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B2 (500 x 707 mm)</source> + <translation>B2 (500 x 707 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B3 (353 x 500 mm)</source> + <translation>B3 (353 x 500 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B4 (250 x 353 mm)</source> + <translation>B4 (250 x 353 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> + <translation>B5 (176 x 250 mm, 6.93 x 9.84 英吋)</translation> + </message> + <message> + <location line="+1"/> + <source>B6 (125 x 176 mm)</source> + <translation>B6 (125 x 176 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B7 (88 x 125 mm)</source> + <translation>B7 (88 x 125 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B8 (62 x 88 mm)</source> + <translation>B8 (62 x 88 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B9 (44 x 62 mm)</source> + <translation>B9 (44 x 62 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B10 (31 x 44 mm)</source> + <translation>B10 (31 x 44 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>C5E (163 x 229 mm)</source> + <translation>C5E (163 x 229 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>DLE (110 x 220 mm)</source> + <translation>DLE (110 x 220 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> + <translation>Executive (7.5 x 10 英吋, 191 x 254 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Folio (210 x 330 mm)</source> + <translation>對開 (210 x 330 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Ledger (432 x 279 mm)</source> + <translation>Ledger (432 x 279 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> + <translation>Legal (8.5 x 14 英吋, 216 x 356 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> + <translation>Letter (8.5 x 11 英吋, 216 x 279 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Tabloid (279 x 432 mm)</source> + <translation>Tabloid (279 x 432 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>US Common #10 Envelope (105 x 241 mm)</source> + <translation>US 常用 10 號信封 (105x241 mm)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> + <message> + <source>Page size:</source> + <translation type="obsolete">紙張大小:</translation> + </message> + <message> + <source>Orientation:</source> + <translation type="obsolete">方向:</translation> + </message> + <message> + <source>Paper source:</source> + <translation type="obsolete">紙張來源:</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/> + <location line="+13"/> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/> + <source>Print</source> + <translation>列印</translation> + </message> + <message> + <source>File</source> + <translation type="obsolete">檔案</translation> + </message> + <message> + <source>Printer</source> + <translation type="obsolete">印表機</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/> + <source>Print To File ...</source> + <translation>列印到檔案...</translation> + </message> + <message> + <source>Print dialog</source> + <translation type="obsolete">列印對話框</translation> + </message> + <message> + <source>Paper format</source> + <translation type="obsolete">紙張格式</translation> + </message> + <message> + <source>Size:</source> + <translation type="obsolete">大小:</translation> + </message> + <message> + <source>Properties</source> + <translation type="obsolete">內容</translation> + </message> + <message> + <source>Printer info:</source> + <translation type="obsolete">印表機資訊:</translation> + </message> + <message> + <source>Browse</source> + <translation type="obsolete">瀏覽</translation> + </message> + <message> + <source>Print to file</source> + <translation type="obsolete">列印到檔案</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+19"/> + <source>Print range</source> + <translation>列印範圍</translation> + </message> + <message> + <location line="-2"/> + <source>Print all</source> + <translation>全部列印</translation> + </message> + <message> + <source>Pages from</source> + <translation type="obsolete">指定頁面:從</translation> + </message> + <message> + <source>to</source> + <translation type="obsolete">到</translation> + </message> + <message> + <source>Selection</source> + <translation type="obsolete">選擇區</translation> + </message> + <message> + <source>Copies</source> + <translation type="obsolete">份數</translation> + </message> + <message> + <source>Number of copies:</source> + <translation type="obsolete">列印份數:</translation> + </message> + <message> + <source>Collate</source> + <translation type="obsolete">校對</translation> + </message> + <message> + <source>Print last page first</source> + <translation type="obsolete">從最後一頁印起</translation> + </message> + <message> + <source>Other</source> + <translation type="obsolete">其他</translation> + </message> + <message> + <source>Print in color if available</source> + <translation type="obsolete">可以的話用彩色列印</translation> + </message> + <message> + <source>Double side printing</source> + <translation type="obsolete">雙面列印</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+80"/> + <source>File %1 is not writable. +Please choose a different file name.</source> + <translation>檔案 %1 無法寫入。 +請選擇其它檔名。</translation> + </message> + <message> + <location line="+4"/> + <source>%1 already exists. +Do you want to overwrite it?</source> + <translation>%1 已存在。 +您要覆寫它嗎?</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-227"/> + <source>File exists</source> + <translation>檔案已存在</translation> + </message> + <message> + <location line="+1"/> + <source><qt>Do you want to overwrite it?</qt></source> + <translation><qt>您要覆寫它嗎?</qt></translation> + </message> + <message> + <location line="+227"/> + <source>Print selection</source> + <translation>列印選擇區</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/> + <source>%1 is a directory. +Please choose a different file name.</source> + <translation>%1 是一個目錄。 +請選擇其他檔名。</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/> + <source>A0</source> + <translation>A0</translation> + </message> + <message> + <location line="+1"/> + <source>A1</source> + <translation>A1</translation> + </message> + <message> + <location line="+1"/> + <source>A2</source> + <translation>A2</translation> + </message> + <message> + <location line="+1"/> + <source>A3</source> + <translation>A3</translation> + </message> + <message> + <location line="+1"/> + <source>A4</source> + <translation>A4</translation> + </message> + <message> + <location line="+1"/> + <source>A5</source> + <translation>A5</translation> + </message> + <message> + <location line="+1"/> + <source>A6</source> + <translation>A6</translation> + </message> + <message> + <location line="+1"/> + <source>A7</source> + <translation>A7</translation> + </message> + <message> + <location line="+1"/> + <source>A8</source> + <translation>A8</translation> + </message> + <message> + <location line="+1"/> + <source>A9</source> + <translation>A9</translation> + </message> + <message> + <location line="+1"/> + <source>B0</source> + <translation>B0</translation> + </message> + <message> + <location line="+1"/> + <source>B1</source> + <translation>B1</translation> + </message> + <message> + <location line="+1"/> + <source>B2</source> + <translation>B2</translation> + </message> + <message> + <location line="+1"/> + <source>B3</source> + <translation>B3</translation> + </message> + <message> + <location line="+1"/> + <source>B4</source> + <translation>B4</translation> + </message> + <message> + <location line="+1"/> + <source>B5</source> + <translation>B5</translation> + </message> + <message> + <location line="+1"/> + <source>B6</source> + <translation>B6</translation> + </message> + <message> + <location line="+1"/> + <source>B7</source> + <translation>B7</translation> + </message> + <message> + <location line="+1"/> + <source>B8</source> + <translation>B8</translation> + </message> + <message> + <location line="+1"/> + <source>B9</source> + <translation>B9</translation> + </message> + <message> + <location line="+1"/> + <source>B10</source> + <translation>B10</translation> + </message> + <message> + <location line="+1"/> + <source>C5E</source> + <translation>C5E</translation> + </message> + <message> + <location line="+1"/> + <source>DLE</source> + <translation>DLE</translation> + </message> + <message> + <location line="+1"/> + <source>Executive</source> + <translation>Executive</translation> + </message> + <message> + <location line="+1"/> + <source>Folio</source> + <translation>Folio</translation> + </message> + <message> + <location line="+1"/> + <source>Ledger</source> + <translation>Ledger</translation> + </message> + <message> + <location line="+1"/> + <source>Legal</source> + <translation>Legal</translation> + </message> + <message> + <location line="+1"/> + <source>Letter</source> + <translation>Letter</translation> + </message> + <message> + <location line="+1"/> + <source>Tabloid</source> + <translation>Tabloid</translation> + </message> + <message> + <location line="+1"/> + <source>US Common #10 Envelope</source> + <translation>US Common #10 Envelope</translation> + </message> + <message> + <location line="+1"/> + <source>Custom</source> + <translation>自訂</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/> + <location line="+68"/> + <source>&Options >></source> + <translation>操作 (&O) >></translation> + </message> + <message> + <location line="-63"/> + <source>&Print</source> + <translation>列印(&P)</translation> + </message> + <message> + <location line="+67"/> + <source>&Options <<</source> + <translation>操作 (&O) <<</translation> + </message> + <message> + <location line="+253"/> + <source>Print to File (PDF)</source> + <translation>列印到檔案(PDF)</translation> + </message> + <message> + <location line="+1"/> + <source>Print to File (Postscript)</source> + <translation>列印到檔案(Postscript)</translation> + </message> + <message> + <location line="+45"/> + <source>Local file</source> + <translation>本地端檔案</translation> + </message> + <message> + <location line="+1"/> + <source>Write %1 file</source> + <translation>寫入 %1 檔案</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/> + <source>The 'From' value cannot be greater than the 'To' value.</source> + <translation>起始數值不能大於結束數值</translation> + </message> +</context> +<context> + <name>QPrintPreviewDialog</name> + <message> + <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/> + <location line="+12"/> + <source>Page Setup</source> + <translation>頁面設定</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/> + <source>%1%</source> + <translation>%1%</translation> + </message> + <message> + <location line="+79"/> + <source>Print Preview</source> + <translation>列印預覽</translation> + </message> + <message> + <location line="+29"/> + <source>Next page</source> + <translation>下一頁</translation> + </message> + <message> + <location line="+1"/> + <source>Previous page</source> + <translation>前一頁</translation> + </message> + <message> + <location line="+1"/> + <source>First page</source> + <translation>第一頁</translation> + </message> + <message> + <location line="+1"/> + <source>Last page</source> + <translation>最後一頁</translation> + </message> + <message> + <location line="+9"/> + <source>Fit width</source> + <translation>符合寬度</translation> + </message> + <message> + <location line="+1"/> + <source>Fit page</source> + <translation>符合頁面</translation> + </message> + <message> + <location line="+11"/> + <source>Zoom in</source> + <translation>放大</translation> + </message> + <message> + <location line="+1"/> + <source>Zoom out</source> + <translation>縮小</translation> + </message> + <message> + <location line="+6"/> + <source>Portrait</source> + <translation>縱向</translation> + </message> + <message> + <location line="+1"/> + <source>Landscape</source> + <translation>橫向</translation> + </message> + <message> + <location line="+10"/> + <source>Show single page</source> + <translation>顯示單一頁面</translation> + </message> + <message> + <location line="+1"/> + <source>Show facing pages</source> + <translation>顯示封面</translation> + </message> + <message> + <location line="+1"/> + <source>Show overview of all pages</source> + <translation>顯示所有頁面預覽</translation> + </message> + <message> + <location line="+15"/> + <source>Print</source> + <translation>列印</translation> + </message> + <message> + <location line="+1"/> + <source>Page setup</source> + <translation>列印設定</translation> + </message> + <message> + <location line="+1"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+151"/> + <source>Export to PDF</source> + <translation>匯出到 PDF 檔</translation> + </message> + <message> + <location line="+3"/> + <source>Export to PostScript</source> + <translation>匯出到 PostScript 檔</translation> + </message> +</context> +<context> + <name>QPrintPropertiesDialog</name> + <message> + <source>PPD Properties</source> + <translation type="obsolete">PPD 內容</translation> + </message> + <message> + <source>Save</source> + <translation type="obsolete">儲存</translation> + </message> + <message> + <source>OK</source> + <translation type="obsolete">確定</translation> + </message> +</context> +<context> + <name>QPrintPropertiesWidget</name> + <message> + <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/> + <source>Form</source> + <translation>表單</translation> + </message> + <message> + <location/> + <source>Page</source> + <translation>頁面</translation> + </message> + <message> + <location/> + <source>Advanced</source> + <translation>進階</translation> + </message> +</context> +<context> + <name>QPrintSettingsOutput</name> + <message> + <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/> + <source>Form</source> + <translation>表單</translation> + </message> + <message> + <location/> + <source>Copies</source> + <translation>份數</translation> + </message> + <message> + <location/> + <source>Print range</source> + <translation>列印範圍</translation> + </message> + <message> + <location/> + <source>Print all</source> + <translation>全部列印</translation> + </message> + <message> + <location/> + <source>Pages from</source> + <translation>指定頁面:從</translation> + </message> + <message> + <location/> + <source>to</source> + <translation>到</translation> + </message> + <message> + <location/> + <source>Selection</source> + <translation>選擇區</translation> + </message> + <message> + <location/> + <source>Output Settings</source> + <translation>輸出設定</translation> + </message> + <message> + <location/> + <source>Copies:</source> + <translation>份數:</translation> + </message> + <message> + <location/> + <source>Collate</source> + <translation>校對</translation> + </message> + <message> + <location/> + <source>Reverse</source> + <translation>反向</translation> + </message> + <message> + <location/> + <source>Options</source> + <translation>選項</translation> + </message> + <message> + <location/> + <source>Color Mode</source> + <translation>顏色模式</translation> + </message> + <message> + <location/> + <source>Color</source> + <translation>顏色</translation> + </message> + <message> + <location/> + <source>Grayscale</source> + <translation>灰階</translation> + </message> + <message> + <location/> + <source>Duplex Printing</source> + <translation>雙工列印</translation> + </message> + <message> + <location/> + <source>None</source> + <translation>無</translation> + </message> + <message> + <location/> + <source>Long side</source> + <translation>長邊</translation> + </message> + <message> + <location/> + <source>Short side</source> + <translation>短邊</translation> + </message> +</context> +<context> + <name>QPrintWidget</name> + <message> + <location filename="../src/gui/dialogs/qprintwidget.ui"/> + <source>Form</source> + <translation>表單</translation> + </message> + <message> + <location/> + <source>Printer</source> + <translation>印表機</translation> + </message> + <message> + <location/> + <source>&Name:</source> + <translation>名稱(&N):</translation> + </message> + <message> + <location/> + <source>P&roperties</source> + <translation>屬性(&R)</translation> + </message> + <message> + <location/> + <source>Location:</source> + <translation>位置:</translation> + </message> + <message> + <location/> + <source>Preview</source> + <translation>預覽</translation> + </message> + <message> + <location/> + <source>Type:</source> + <translation>型態:</translation> + </message> + <message> + <location/> + <source>Output &file:</source> + <translation>輸出檔案(&F):</translation> + </message> + <message> + <location/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>QProcess</name> + <message> + <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/> + <source>Could not open input redirection for reading</source> + <translation>無法開啟輸入導向以讀取</translation> + </message> + <message> + <location line="+12"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/> + <source>Could not open output redirection for writing</source> + <translation>無法開啟輸出導向以寫入</translation> + </message> + <message> + <location line="+235"/> + <source>Resource error (fork failure): %1</source> + <translation>資源錯誤(fork 失敗):%1</translation> + </message> + <message> + <location line="+259"/> + <location line="+53"/> + <location line="+74"/> + <location line="+67"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/> + <location line="+50"/> + <location line="+75"/> + <location line="+42"/> + <location line="+54"/> + <source>Process operation timed out</source> + <translation>行程操作逾時</translation> + </message> + <message> + <location filename="../src/corelib/io/qprocess.cpp" line="+533"/> + <location line="+52"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/> + <location line="+50"/> + <source>Error reading from process</source> + <translation>從行程讀取時發生錯誤</translation> + </message> + <message> + <location line="+47"/> + <location line="+779"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/> + <source>Error writing to process</source> + <translation>寫入行程時發生錯誤</translation> + </message> + <message> + <location line="-709"/> + <source>Process crashed</source> + <translation>行程已崩潰</translation> + </message> + <message> + <location line="+912"/> + <source>No program defined</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/> + <source>Process failed to start</source> + <translation>啟動行程失敗</translation> + </message> +</context> +<context> + <name>QProgressDialog</name> + <message> + <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>QPushButton</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/> + <source>Open</source> + <translation>開啟</translation> + </message> +</context> +<context> + <name>QRadioButton</name> + <message> + <location line="+12"/> + <source>Check</source> + <translation>勾選</translation> + </message> +</context> +<context> + <name>QRegExp</name> + <message> + <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/> + <source>no error occurred</source> + <translation>沒有發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>disabled feature used</source> + <translation>使用已關閉的功能</translation> + </message> + <message> + <location line="+1"/> + <source>bad char class syntax</source> + <translation>錯誤的字元類別語法</translation> + </message> + <message> + <location line="+1"/> + <source>bad lookahead syntax</source> + <translation>錯誤的 lookahead 語法</translation> + </message> + <message> + <location line="+1"/> + <source>bad repetition syntax</source> + <translation>錯誤的重覆語法</translation> + </message> + <message> + <location line="+1"/> + <source>invalid octal value</source> + <translation>不合法的八進位值</translation> + </message> + <message> + <location line="+1"/> + <source>missing left delim</source> + <translation>少了左方的區隔符</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected end</source> + <translation>未預期遇到結尾</translation> + </message> + <message> + <location line="+1"/> + <source>met internal limit</source> + <translation>遇到內部限制</translation> + </message> +</context> +<context> + <name>QSQLite2Driver</name> + <message> + <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/> + <source>Error to open database</source> + <translation>開啟資料庫時發生錯誤</translation> + </message> + <message> + <location line="+41"/> + <source>Unable to begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback Transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QSQLite2Result</name> + <message> + <location line="-323"/> + <source>Unable to fetch results</source> + <translation>無法抓取結果</translation> + </message> + <message> + <location line="+147"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> +</context> +<context> + <name>QSQLiteDriver</name> + <message> + <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/> + <source>Error opening database</source> + <translation>開啟資料庫發生錯誤</translation> + </message> + <message> + <location line="+11"/> + <source>Error closing database</source> + <translation>關閉資料庫發生錯誤</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <source>Unable to roll back transaction</source> + <translation type="obsolete">無法反轉事務</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QSQLiteResult</name> + <message> + <location line="-400"/> + <location line="+66"/> + <location line="+8"/> + <source>Unable to fetch row</source> + <translation>無法抓取列</translation> + </message> + <message> + <location line="+63"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to reset statement</source> + <translation>無法重置敘述</translation> + </message> + <message> + <location line="+45"/> + <source>Unable to bind parameters</source> + <translation>無法結合參數</translation> + </message> + <message> + <location line="+7"/> + <source>Parameter count mismatch</source> + <translation>參數數量不符合</translation> + </message> + <message> + <location line="-208"/> + <source>No query</source> + <translation>沒有查詢</translation> + </message> +</context> +<context> + <name>QScrollBar</name> + <message> + <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/> + <source>Scroll here</source> + <translation>在此捲軸</translation> + </message> + <message> + <location line="+2"/> + <source>Left edge</source> + <translation>左邊緣</translation> + </message> + <message> + <location line="+0"/> + <source>Top</source> + <translation>頂端</translation> + </message> + <message> + <location line="+1"/> + <source>Right edge</source> + <translation>右邊緣</translation> + </message> + <message> + <location line="+0"/> + <source>Bottom</source> + <translation>底端</translation> + </message> + <message> + <location line="+2"/> + <source>Page left</source> + <translation>頁面左方</translation> + </message> + <message> + <location line="+0"/> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/> + <source>Page up</source> + <translation>頁面上方</translation> + </message> + <message> + <location line="+1"/> + <source>Page right</source> + <translation>頁面右方</translation> + </message> + <message> + <location line="+0"/> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/> + <source>Page down</source> + <translation>頁面下方</translation> + </message> + <message> + <location line="+2"/> + <source>Scroll left</source> + <translation>往左捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll up</source> + <translation>往上捲軸</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll right</source> + <translation>往右捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll down</source> + <translation>往下捲軸</translation> + </message> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/> + <source>Line up</source> + <translation>對上排列</translation> + </message> + <message> + <location line="+4"/> + <source>Position</source> + <translation>位置</translation> + </message> + <message> + <location line="+4"/> + <source>Line down</source> + <translation>對下排列</translation> + </message> +</context> +<context> + <name>QSharedMemory</name> + <message> + <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/> + <source>%1: unable to set key on lock</source> + <translation>%1:無法設定鍵值</translation> + </message> + <message> + <location line="+81"/> + <source>%1: create size is less then 0</source> + <translation>%1:建立大小小於 0</translation> + </message> + <message> + <location line="+168"/> + <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/> + <source>%1: unable to lock</source> + <translation>%1:無法鎖定</translation> + </message> + <message> + <location line="+22"/> + <source>%1: unable to unlock</source> + <translation>%1:無法解除鎖定</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/> + <source>%1: permission denied</source> + <translation>%1:存取被拒</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/> + <source>%1: already exists</source> + <translation>%1:已存在</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> + <source>%1: doesn't exists</source> + <translation>%1:不存在</translation> + </message> + <message> + <location line="+6"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> + <source>%1: out of resources</source> + <translation>%1:資源不足</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/> + <source>%1: unknown error %2</source> + <translation>%1:未知的錯誤 %2</translation> + </message> + <message> + <location line="+21"/> + <source>%1: key is empty</source> + <translation>%1:鍵值是空的</translation> + </message> + <message> + <location line="+8"/> + <source>%1: unix key file doesn't exists</source> + <translation>%1:unix 鍵值檔不存在</translation> + </message> + <message> + <location line="+7"/> + <source>%1: ftok failed</source> + <translation>%1:ftok 失敗</translation> + </message> + <message> + <location line="+51"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/> + <source>%1: unable to make key</source> + <translation>%1:無法產生鍵值</translation> + </message> + <message> + <location line="+20"/> + <source>%1: system-imposed size restrictions</source> + <translation>%1:系統大小限制</translation> + </message> + <message> + <location line="+53"/> + <source>%1: not attached</source> + <translation>%1:未附加</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/> + <source>%1: invalid size</source> + <translation>%1:不合法的大小</translation> + </message> + <message> + <location line="+68"/> + <source>%1: key error</source> + <translation>%1:鍵值錯誤</translation> + </message> + <message> + <location line="+38"/> + <source>%1: size query failed</source> + <translation>%1:大小查詢失敗</translation> + </message> +</context> +<context> + <name>QShortcut</name> + <message> + <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/> + <source>Space</source> + <translation>空白鍵</translation> + </message> + <message> + <location line="+1"/> + <source>Esc</source> + <translation>Esc</translation> + </message> + <message> + <location line="+1"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location line="+1"/> + <source>Backtab</source> + <translation>Backtab</translation> + </message> + <message> + <location line="+1"/> + <source>Backspace</source> + <translation>Backspace</translation> + </message> + <message> + <location line="+1"/> + <source>Return</source> + <translation>Return</translation> + </message> + <message> + <location line="+1"/> + <source>Enter</source> + <translation>Enter</translation> + </message> + <message> + <location line="+1"/> + <source>Ins</source> + <translation>Ins</translation> + </message> + <message> + <location line="+1"/> + <source>Del</source> + <translation>Del</translation> + </message> + <message> + <location line="+1"/> + <source>Pause</source> + <translation>Pause</translation> + </message> + <message> + <location line="+1"/> + <source>Print</source> + <translation>Print</translation> + </message> + <message> + <location line="+1"/> + <source>SysReq</source> + <translation>SysReq</translation> + </message> + <message> + <location line="+1"/> + <source>Home</source> + <translation>Home</translation> + </message> + <message> + <location line="+1"/> + <source>End</source> + <translation>End</translation> + </message> + <message> + <location line="+1"/> + <source>Left</source> + <translation>左鍵</translation> + </message> + <message> + <location line="+1"/> + <source>Up</source> + <translation>上鍵</translation> + </message> + <message> + <location line="+1"/> + <source>Right</source> + <translation>右鍵</translation> + </message> + <message> + <location line="+1"/> + <source>Down</source> + <translation>下鍵</translation> + </message> + <message> + <location line="+1"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location line="+1"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location line="+1"/> + <source>CapsLock</source> + <translation>大寫鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>NumLock</source> + <translation>數字鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>ScrollLock</source> + <translation>捲軸鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Menu</source> + <translation>選單</translation> + </message> + <message> + <location line="+1"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="+3"/> + <source>Back</source> + <translation>返回</translation> + </message> + <message> + <location line="+1"/> + <source>Forward</source> + <translation>往前</translation> + </message> + <message> + <location line="+1"/> + <source>Stop</source> + <translation>停止</translation> + </message> + <message> + <location line="+1"/> + <source>Refresh</source> + <translation>刷新</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Down</source> + <translation>音量降低</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Mute</source> + <translation>靜音</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Up</source> + <translation>音量提高</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Boost</source> + <translation>重低音</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Up</source> + <translation>Bass Up</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Down</source> + <translation>Bass Down</translation> + </message> + <message> + <location line="+1"/> + <source>Treble Up</source> + <translation>Treble Up</translation> + </message> + <message> + <location line="+1"/> + <source>Treble Down</source> + <translation>Treble Down</translation> + </message> + <message> + <location line="+1"/> + <source>Media Play</source> + <translation>媒體播放</translation> + </message> + <message> + <location line="+1"/> + <source>Media Stop</source> + <translation>媒體停止</translation> + </message> + <message> + <location line="+1"/> + <source>Media Previous</source> + <translation>媒體前一首</translation> + </message> + <message> + <location line="+1"/> + <source>Media Next</source> + <translation>媒體下一首</translation> + </message> + <message> + <location line="+1"/> + <source>Media Record</source> + <translation>媒體錄音</translation> + </message> + <message> + <location line="+2"/> + <source>Favorites</source> + <translation>我的最愛</translation> + </message> + <message> + <location line="+1"/> + <source>Search</source> + <translation>搜尋</translation> + </message> + <message> + <location line="+1"/> + <source>Standby</source> + <translation>待命</translation> + </message> + <message> + <location line="+1"/> + <source>Open URL</source> + <translation>開啟網址</translation> + </message> + <message> + <location line="+1"/> + <source>Launch Mail</source> + <translation>啟動郵件程式</translation> + </message> + <message> + <location line="+1"/> + <source>Launch Media</source> + <translation>啟動媒體程式</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (0)</source> + <translation>啟動(0)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (1)</source> + <translation>啟動(1)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (2)</source> + <translation>啟動(2)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (3)</source> + <translation>啟動(3)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (4)</source> + <translation>啟動(4)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (5)</source> + <translation>啟動(5)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (6)</source> + <translation>啟動(6)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (7)</source> + <translation>啟動(7)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (8)</source> + <translation>啟動(8)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (9)</source> + <translation>啟動(9)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (A)</source> + <translation>啟動(A)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (B)</source> + <translation>啟動(B)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (C)</source> + <translation>啟動(C)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (D)</source> + <translation>啟動(D)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (E)</source> + <translation>啟動(E)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (F)</source> + <translation>啟動(F)</translation> + </message> + <message> + <location line="+4"/> + <source>Print Screen</source> + <translation>列印螢幕</translation> + </message> + <message> + <location line="+1"/> + <source>Page Up</source> + <translation>往上一頁</translation> + </message> + <message> + <location line="+1"/> + <source>Page Down</source> + <translation>往下一頁</translation> + </message> + <message> + <location line="+1"/> + <source>Caps Lock</source> + <translation>大寫鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Num Lock</source> + <translation>數字鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Number Lock</source> + <translation>數字鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll Lock</source> + <translation>捲軸鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Insert</source> + <translation>插入</translation> + </message> + <message> + <location line="+1"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location line="+1"/> + <source>Escape</source> + <translation>Escape</translation> + </message> + <message> + <location line="+1"/> + <source>System Request</source> + <translation>系統要求 SysRq</translation> + </message> + <message> + <location line="+4"/> + <source>Select</source> + <translation>選擇</translation> + </message> + <message> + <location line="+1"/> + <source>Yes</source> + <translation>是</translation> + </message> + <message> + <location line="+1"/> + <source>No</source> + <translation>否</translation> + </message> + <message> + <location line="+4"/> + <source>Context1</source> + <translation>內文1</translation> + </message> + <message> + <location line="+1"/> + <source>Context2</source> + <translation>內文2</translation> + </message> + <message> + <location line="+1"/> + <source>Context3</source> + <translation>內文3</translation> + </message> + <message> + <location line="+1"/> + <source>Context4</source> + <translation>內文4</translation> + </message> + <message> + <location line="+1"/> + <source>Call</source> + <translation>呼叫</translation> + </message> + <message> + <location line="+1"/> + <source>Hangup</source> + <translation>掛斷</translation> + </message> + <message> + <location line="+1"/> + <source>Flip</source> + <translation>反轉</translation> + </message> + <message> + <location line="+527"/> + <location line="+122"/> + <source>Ctrl</source> + <translation>Ctrl</translation> + </message> + <message> + <location line="-121"/> + <location line="+125"/> + <source>Shift</source> + <translation>Shift</translation> + </message> + <message> + <location line="-124"/> + <location line="+122"/> + <source>Alt</source> + <translation>Alt</translation> + </message> + <message> + <location line="-121"/> + <location line="+117"/> + <source>Meta</source> + <translation>Meta</translation> + </message> + <message> + <location line="-25"/> + <source>+</source> + <translation>+</translation> + </message> + <message> + <location line="+46"/> + <source>F%1</source> + <translation>F%1</translation> + </message> + <message> + <location line="-720"/> + <source>Home Page</source> + <translation>首頁</translation> + </message> +</context> +<context> + <name>QSlider</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/> + <source>Page left</source> + <translation>頁面左方</translation> + </message> + <message> + <location line="+0"/> + <source>Page up</source> + <translation>頁面上方</translation> + </message> + <message> + <location line="+2"/> + <source>Position</source> + <translation>位置</translation> + </message> + <message> + <location line="+3"/> + <source>Page right</source> + <translation>頁面右方</translation> + </message> + <message> + <location line="+0"/> + <source>Page down</source> + <translation>頁面下方</translation> + </message> +</context> +<context> + <name>QSocks5SocketEngine</name> + <message> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/> + <source>Connection to proxy refused</source> + <translation>代理伺服器連線被拒</translation> + </message> + <message> + <location line="+4"/> + <source>Connection to proxy closed prematurely</source> + <translation>代理伺服器連線已不正常關閉</translation> + </message> + <message> + <location line="+4"/> + <source>Proxy host not found</source> + <translation>找不到代理伺服器</translation> + </message> + <message> + <location line="+5"/> + <source>Connection to proxy timed out</source> + <translation>代理伺服器連線逾時</translation> + </message> + <message> + <location line="+17"/> + <source>Proxy authentication failed</source> + <translation>代理伺服器認證失敗</translation> + </message> + <message> + <location line="+1"/> + <source>Proxy authentication failed: %1</source> + <translation>代理伺服器認證失敗:%1</translation> + </message> + <message> + <location line="+9"/> + <source>SOCKS version 5 protocol error</source> + <translation>SOCKS 5 的協定錯誤</translation> + </message> + <message> + <location line="+19"/> + <source>General SOCKSv5 server failure</source> + <translation>一般的 SOCKSv5 伺服器錯誤</translation> + </message> + <message> + <location line="+4"/> + <source>Connection not allowed by SOCKSv5 server</source> + <translation>連線未被 SOCKSv5 伺服器允許</translation> + </message> + <message> + <location line="+16"/> + <source>TTL expired</source> + <translation>TTL 逾時</translation> + </message> + <message> + <location line="+4"/> + <source>SOCKSv5 command not supported</source> + <translation>SOCKSv5 指令未被支援</translation> + </message> + <message> + <location line="+4"/> + <source>Address type not supported</source> + <translation>位址型態未被支援</translation> + </message> + <message> + <location line="+5"/> + <source>Unknown SOCKSv5 proxy error code 0x%1</source> + <translation>未知的 SOCKSv5 代理伺服器錯誤代碼 0x%1</translation> + </message> + <message> + <source>Socks5 timeout error connecting to socks server</source> + <translation type="obsolete">連接到 socks 伺服器時發生 socks5 逾時錯誤</translation> + </message> + <message> + <location line="+685"/> + <source>Network operation timed out</source> + <translation>網路操作逾時</translation> + </message> +</context> +<context> + <name>QSpinBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/> + <source>More</source> + <translation>更多</translation> + </message> + <message> + <location line="+2"/> + <source>Less</source> + <translation>較少</translation> + </message> +</context> +<context> + <name>QSql</name> + <message> + <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location line="+1"/> + <source>Delete this record?</source> + <translation>要刪除這筆紀錄嗎?</translation> + </message> + <message> + <location line="+1"/> + <location line="+16"/> + <location line="+36"/> + <source>Yes</source> + <translation>是</translation> + </message> + <message> + <location line="-51"/> + <location line="+16"/> + <location line="+36"/> + <source>No</source> + <translation>否</translation> + </message> + <message> + <location line="-44"/> + <source>Insert</source> + <translation>插入</translation> + </message> + <message> + <location line="+2"/> + <source>Update</source> + <translation>更新</translation> + </message> + <message> + <location line="+4"/> + <source>Save edits?</source> + <translation>要儲存編輯過的內容嗎?</translation> + </message> + <message> + <location line="+3"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+32"/> + <source>Confirm</source> + <translation>確認</translation> + </message> + <message> + <location line="+1"/> + <source>Cancel your edits?</source> + <translation>要取消編輯嗎?</translation> + </message> +</context> +<context> + <name>QSslSocket</name> + <message> + <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/> + <source>Unable to write data: %1</source> + <translation>無法寫入資料:%1</translation> + </message> + <message> + <location line="+119"/> + <source>Error while reading: %1</source> + <translation>讀取時發生錯誤:%1</translation> + </message> + <message> + <location line="+96"/> + <source>Error during SSL handshake: %1</source> + <translation>SSL 同步時發生錯誤:%1</translation> + </message> + <message> + <location line="-524"/> + <source>Error creating SSL context (%1)</source> + <translation>建立 SSL 內文時發生錯誤(%1)</translation> + </message> + <message> + <location line="+25"/> + <source>Invalid or empty cipher list (%1)</source> + <translation>不合法或空白的加密清單(%1)</translation> + </message> + <message> + <location line="+62"/> + <source>Error creating SSL session, %1</source> + <translation>建立 SSL 工作階段時發生錯誤:%1</translation> + </message> + <message> + <location line="+15"/> + <source>Error creating SSL session: %1</source> + <translation>建立 SSL 工作階段時發生錯誤:%1</translation> + </message> + <message> + <location line="-61"/> + <source>Cannot provide a certificate with no key, %1</source> + <translation>沒有金鑰無法提供憑證:%1</translation> + </message> + <message> + <location line="+7"/> + <source>Error loading local certificate, %1</source> + <translation>載入本地憑證時發生錯誤:%1</translation> + </message> + <message> + <location line="+12"/> + <source>Error loading private key, %1</source> + <translation>載入私鑰時發生錯誤:%1</translation> + </message> + <message> + <source>Private key do not certificate public key, %1</source> + <translation type="obsolete">私鑰與公鑰不符:%1</translation> + </message> + <message> + <location line="+7"/> + <source>Private key does not certificate public key, %1</source> + <translation>私密金鑰無法認證公開金鑰,%1</translation> + </message> +</context> +<context> + <name>QSystemSemaphore</name> + <message> + <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/> + <source>%1: out of resources</source> + <translation>%1:資源不足</translation> + </message> + <message> + <location line="-13"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/> + <source>%1: permission denied</source> + <translation>%1:存取被拒</translation> + </message> + <message> + <location line="+4"/> + <source>%1: already exists</source> + <translation>%1:已存在</translation> + </message> + <message> + <location line="+4"/> + <source>%1: does not exist</source> + <translation>%1:不存在</translation> + </message> + <message> + <location line="+9"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/> + <source>%1: unknown error %2</source> + <translation>%1:未知的錯誤 %2</translation> + </message> +</context> +<context> + <name>QTDSDriver</name> + <message> + <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/> + <source>Unable to open connection</source> + <translation>無法開啟連線</translation> + </message> + <message> + <location line="+5"/> + <source>Unable to use database</source> + <translation>無法使用資料庫</translation> + </message> +</context> +<context> + <name>QTabBar</name> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/> + <source>Scroll Left</source> + <translation>往左捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll Right</source> + <translation>往右捲軸</translation> + </message> +</context> +<context> + <name>QTcpServer</name> + <message> + <source>Socket operation unsupported</source> + <translation type="obsolete">未支援的 socket 操作</translation> + </message> + <message> + <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/> + <source>Operation on socket is not supported</source> + <translation>Socket 的操作未被支援</translation> + </message> +</context> +<context> + <name>QTextControl</name> + <message> + <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/> + <source>&Undo</source> + <translation>復原(&U)</translation> + </message> + <message> + <location line="+2"/> + <source>&Redo</source> + <translation>重做(&R)</translation> + </message> + <message> + <location line="+4"/> + <source>Cu&t</source> + <translation>剪下(&T)</translation> + </message> + <message> + <location line="+5"/> + <source>&Copy</source> + <translation>複製(&C)</translation> + </message> + <message> + <location line="+7"/> + <source>Copy &Link Location</source> + <translation>複製連結位址(&L)</translation> + </message> + <message> + <location line="+6"/> + <source>&Paste</source> + <translation>貼上(&P)</translation> + </message> + <message> + <location line="+3"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location line="+7"/> + <source>Select All</source> + <translation>全部選擇</translation> + </message> +</context> +<context> + <name>QToolButton</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/> + <location line="+6"/> + <source>Press</source> + <translation>按下</translation> + </message> + <message> + <location line="-4"/> + <location line="+8"/> + <source>Open</source> + <translation>開啟</translation> + </message> +</context> +<context> + <name>QUdpSocket</name> + <message> + <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/> + <source>This platform does not support IPv6</source> + <translation>此平台不支援 IPv6</translation> + </message> +</context> +<context> + <name>QUndoGroup</name> + <message> + <location filename="../src/gui/util/qundogroup.cpp" line="+386"/> + <source>Undo</source> + <translation>復原</translation> + </message> + <message> + <location line="+28"/> + <source>Redo</source> + <translation>重做</translation> + </message> +</context> +<context> + <name>QUndoModel</name> + <message> + <location filename="../src/gui/util/qundoview.cpp" line="+101"/> + <source><empty></source> + <translation><空白></translation> + </message> +</context> +<context> + <name>QUndoStack</name> + <message> + <location filename="../src/gui/util/qundostack.cpp" line="+834"/> + <source>Undo</source> + <translation>復原</translation> + </message> + <message> + <location line="+27"/> + <source>Redo</source> + <translation>重做</translation> + </message> +</context> +<context> + <name>QUnicodeControlCharacterMenu</name> + <message> + <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/> + <source>LRM Left-to-right mark</source> + <translation>LRM 左到右標記</translation> + </message> + <message> + <location line="+1"/> + <source>RLM Right-to-left mark</source> + <translation>RLM 右到左標記</translation> + </message> + <message> + <location line="+1"/> + <source>ZWJ Zero width joiner</source> + <translation>ZWJ 零寬度連接器</translation> + </message> + <message> + <location line="+1"/> + <source>ZWNJ Zero width non-joiner</source> + <translation>ZWNJ 零寬度非連接器</translation> + </message> + <message> + <location line="+1"/> + <source>ZWSP Zero width space</source> + <translation>ZWSP 零寬度空白</translation> + </message> + <message> + <location line="+1"/> + <source>LRE Start of left-to-right embedding</source> + <translation>LRE 左到右嵌入起點</translation> + </message> + <message> + <location line="+1"/> + <source>RLE Start of right-to-left embedding</source> + <translation>RLE 右到左嵌入起點</translation> + </message> + <message> + <location line="+1"/> + <source>LRO Start of left-to-right override</source> + <translation>LRO 左到右覆寫起點</translation> + </message> + <message> + <location line="+1"/> + <source>RLO Start of right-to-left override</source> + <translation>RLO 右到左覆寫起點</translation> + </message> + <message> + <location line="+1"/> + <source>PDF Pop directional formatting</source> + <translation>PDF 彈出方向格式</translation> + </message> + <message> + <location line="+6"/> + <source>Insert Unicode control character</source> + <translation>插入萬國碼控制字元</translation> + </message> +</context> +<context> + <name>QWebFrame</name> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/> + <source>Request cancelled</source> + <translation>請求已取消</translation> + </message> + <message> + <location line="+17"/> + <source>Request blocked</source> + <translation>請求已被阻擋</translation> + </message> + <message> + <location line="+7"/> + <source>Cannot show URL</source> + <translation>無法顯示網址</translation> + </message> + <message> + <location line="+6"/> + <source>Frame load interruped by policy change</source> + <translation>影像載入因政策變更而中斷</translation> + </message> + <message> + <location line="+6"/> + <source>Cannot show mimetype</source> + <translation>無法顯示 MIME 型態</translation> + </message> + <message> + <location line="+6"/> + <source>File does not exist</source> + <translation>檔案不存在</translation> + </message> +</context> +<context> + <name>QWebPage</name> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/> + <source>Bad HTTP request</source> + <translation>不良的 HTTP 請求</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/> + <source>Submit</source> + <comment>default label for Submit buttons in forms on web pages</comment> + <translation>提交</translation> + </message> + <message> + <location line="+5"/> + <source>Submit</source> + <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment> + <translation>提交</translation> + </message> + <message> + <location line="+5"/> + <source>Reset</source> + <comment>default label for Reset buttons in forms on web pages</comment> + <translation>重置</translation> + </message> + <message> + <location line="+10"/> + <source>This is a searchable index. Enter search keywords: </source> + <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> + <translation>這是可搜尋的索引。請輸入關鍵字: </translation> + </message> + <message> + <location line="+5"/> + <source>Choose File</source> + <comment>title for file button used in HTML forms</comment> + <translation>選擇檔案</translation> + </message> + <message> + <location line="+5"/> + <source>No file selected</source> + <comment>text to display in file button used in HTML forms when no file is selected</comment> + <translation>未選取任何檔案</translation> + </message> + <message> + <location line="+5"/> + <source>Open in New Window</source> + <comment>Open in New Window context menu item</comment> + <translation>在新視窗開啟</translation> + </message> + <message> + <location line="+5"/> + <source>Save Link...</source> + <comment>Download Linked File context menu item</comment> + <translation>儲存連結...</translation> + </message> + <message> + <location line="+5"/> + <source>Copy Link</source> + <comment>Copy Link context menu item</comment> + <translation>複製連結</translation> + </message> + <message> + <location line="+5"/> + <source>Open Image</source> + <comment>Open Image in New Window context menu item</comment> + <translation>開啟影像</translation> + </message> + <message> + <location line="+5"/> + <source>Save Image</source> + <comment>Download Image context menu item</comment> + <translation>儲存影像</translation> + </message> + <message> + <location line="+5"/> + <source>Copy Image</source> + <comment>Copy Link context menu item</comment> + <translation>複製影像</translation> + </message> + <message> + <location line="+5"/> + <source>Open Frame</source> + <comment>Open Frame in New Window context menu item</comment> + <translation>開啟框架</translation> + </message> + <message> + <location line="+5"/> + <source>Copy</source> + <comment>Copy context menu item</comment> + <translation>複製</translation> + </message> + <message> + <location line="+5"/> + <source>Go Back</source> + <comment>Back context menu item</comment> + <translation>往回</translation> + </message> + <message> + <location line="+5"/> + <source>Go Forward</source> + <comment>Forward context menu item</comment> + <translation>往前</translation> + </message> + <message> + <location line="+5"/> + <source>Stop</source> + <comment>Stop context menu item</comment> + <translation>停止</translation> + </message> + <message> + <location line="+5"/> + <source>Reload</source> + <comment>Reload context menu item</comment> + <translation>重新載入</translation> + </message> + <message> + <location line="+5"/> + <source>Cut</source> + <comment>Cut context menu item</comment> + <translation>剪下</translation> + </message> + <message> + <location line="+5"/> + <source>Paste</source> + <comment>Paste context menu item</comment> + <translation>貼上</translation> + </message> + <message> + <location line="+5"/> + <source>No Guesses Found</source> + <comment>No Guesses Found context menu item</comment> + <translation>找不到可能的內容</translation> + </message> + <message> + <location line="+5"/> + <source>Ignore</source> + <comment>Ignore Spelling context menu item</comment> + <translation>忽略</translation> + </message> + <message> + <location line="+5"/> + <source>Add To Dictionary</source> + <comment>Learn Spelling context menu item</comment> + <translation>新增到字典</translation> + </message> + <message> + <location line="+5"/> + <source>Search The Web</source> + <comment>Search The Web context menu item</comment> + <translation>搜尋站台</translation> + </message> + <message> + <location line="+5"/> + <source>Look Up In Dictionary</source> + <comment>Look Up in Dictionary context menu item</comment> + <translation>在字典裡搜尋</translation> + </message> + <message> + <location line="+5"/> + <source>Open Link</source> + <comment>Open Link context menu item</comment> + <translation>開啟連結</translation> + </message> + <message> + <location line="+5"/> + <source>Ignore</source> + <comment>Ignore Grammar context menu item</comment> + <translation>忽略</translation> + </message> + <message> + <location line="+5"/> + <source>Spelling</source> + <comment>Spelling and Grammar context sub-menu item</comment> + <translation>拼字</translation> + </message> + <message> + <location line="+5"/> + <source>Show Spelling and Grammar</source> + <comment>menu item title</comment> + <translation>顯示拼字與文法</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Spelling and Grammar</source> + <comment>menu item title</comment> + <translation>隱藏拼字與文法</translation> + </message> + <message> + <location line="+5"/> + <source>Check Spelling</source> + <comment>Check spelling context menu item</comment> + <translation>檢查拼字</translation> + </message> + <message> + <location line="+5"/> + <source>Check Spelling While Typing</source> + <comment>Check spelling while typing context menu item</comment> + <translation>打字時立即檢查拼字</translation> + </message> + <message> + <location line="+5"/> + <source>Check Grammar With Spelling</source> + <comment>Check grammar with spelling context menu item</comment> + <translation>檢查拼字與文法</translation> + </message> + <message> + <location line="+5"/> + <source>Fonts</source> + <comment>Font context sub-menu item</comment> + <translation>字型</translation> + </message> + <message> + <location line="+5"/> + <source>Bold</source> + <comment>Bold context menu item</comment> + <translation>粗體</translation> + </message> + <message> + <location line="+5"/> + <source>Italic</source> + <comment>Italic context menu item</comment> + <translation>斜體</translation> + </message> + <message> + <location line="+5"/> + <source>Underline</source> + <comment>Underline context menu item</comment> + <translation>底線</translation> + </message> + <message> + <location line="+5"/> + <source>Outline</source> + <comment>Outline context menu item</comment> + <translation>外框線</translation> + </message> + <message> + <location line="+5"/> + <source>Direction</source> + <comment>Writing direction context sub-menu item</comment> + <translation>方向</translation> + </message> + <message> + <location line="+5"/> + <source>Text Direction</source> + <comment>Text direction context sub-menu item</comment> + <translation>文字方向</translation> + </message> + <message> + <location line="+5"/> + <source>Default</source> + <comment>Default writing direction context menu item</comment> + <translation>預設</translation> + </message> + <message> + <location line="+5"/> + <source>LTR</source> + <comment>Left to Right context menu item</comment> + <translation>左到右</translation> + </message> + <message> + <location line="+5"/> + <source>RTL</source> + <comment>Right to Left context menu item</comment> + <translation>右到左</translation> + </message> + <message> + <location line="+5"/> + <source>Inspect</source> + <comment>Inspect Element context menu item</comment> + <translation>查驗</translation> + </message> + <message> + <location line="+5"/> + <source>No recent searches</source> + <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> + <translation>沒有最近的搜尋</translation> + </message> + <message> + <location line="+5"/> + <source>Recent searches</source> + <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> + <translation>最近的搜尋</translation> + </message> + <message> + <location line="+5"/> + <source>Clear recent searches</source> + <comment>menu item in Recent Searches menu that empties menu's contents</comment> + <translation>清除最近的搜尋</translation> + </message> + <message> + <location line="+75"/> + <source>Unknown</source> + <comment>Unknown filesize FTP directory listing item</comment> + <translation>未知</translation> + </message> + <message> + <location line="+5"/> + <source>%1 (%2x%3 pixels)</source> + <comment>Title string for images</comment> + <translation>%1(%2x%3 像素)</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/> + <source>Web Inspector - %2</source> + <translation>網站查驗器─%2</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/> + <source>Scroll here</source> + <translation>在此捲軸</translation> + </message> + <message> + <location line="+3"/> + <source>Left edge</source> + <translation>左邊緣</translation> + </message> + <message> + <location line="+0"/> + <source>Top</source> + <translation>頂端</translation> + </message> + <message> + <location line="+1"/> + <source>Right edge</source> + <translation>右邊緣</translation> + </message> + <message> + <location line="+0"/> + <source>Bottom</source> + <translation>底端</translation> + </message> + <message> + <location line="+3"/> + <source>Page left</source> + <translation>頁面左方</translation> + </message> + <message> + <location line="+0"/> + <source>Page up</source> + <translation>頁面上方</translation> + </message> + <message> + <location line="+1"/> + <source>Page right</source> + <translation>頁面右方</translation> + </message> + <message> + <location line="+0"/> + <source>Page down</source> + <translation>頁面下方</translation> + </message> + <message> + <location line="+3"/> + <source>Scroll left</source> + <translation>往左捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll up</source> + <translation>往上捲軸</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll right</source> + <translation>往右捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll down</source> + <translation>往下捲軸</translation> + </message> + <message numerus="yes"> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/> + <source>%n file(s)</source> + <comment>number of chosen file</comment> + <translation> + <numerusform>%n 個檔案</numerusform> + </translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/> + <source>JavaScript Alert - %1</source> + <translation>JavaScript 警告 ─ %1</translation> + </message> + <message> + <location line="+15"/> + <source>JavaScript Confirm - %1</source> + <translation>JavaScript 確認 ─ %1</translation> + </message> + <message> + <location line="+17"/> + <source>JavaScript Prompt - %1</source> + <translation>JavaScript 提示 ─ %1</translation> + </message> + <message> + <location line="+333"/> + <source>Move the cursor to the next character</source> + <translation>移動游標到下一個字元</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous character</source> + <translation>移動游標到前一個字元</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the next word</source> + <translation>移動游標到下一個單字</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous word</source> + <translation>移動游標到前一個單字</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the next line</source> + <translation>移動游標到下一行</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous line</source> + <translation>移動游標到前一行</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the line</source> + <translation>移動游標到這一行的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the line</source> + <translation>移動游標到這一行的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the block</source> + <translation>移動游標到這一個區塊的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the block</source> + <translation>移動游標到這一個區塊的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the document</source> + <translation>移動游標到這一個文件的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the document</source> + <translation>移動游標到這一個文件的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select all</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next character</source> + <translation>選擇到下一個字元</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous character</source> + <translation>選擇到前一個字元</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next word</source> + <translation>選擇到下一個單字</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous word</source> + <translation>選擇到前一個單字</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next line</source> + <translation>選擇到下一行</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous line</source> + <translation>選擇到前一行</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the line</source> + <translation>選擇到這一行的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the line</source> + <translation>選擇到這一行的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the block</source> + <translation>選擇到這一個區塊的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the block</source> + <translation>選擇到這一個區塊的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the document</source> + <translation>選擇到這一個文件的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the document</source> + <translation>選擇到這一個文件的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Delete to the start of the word</source> + <translation>刪除到此單字的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Delete to the end of the word</source> + <translation>刪除到此單字的結尾</translation> + </message> + <message> + <location line="+33"/> + <source>Insert a new paragraph</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Insert a new line</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QWhatsThisAction</name> + <message> + <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/> + <source>What's This?</source> + <translation>這是什麼?</translation> + </message> +</context> +<context> + <name>QWidget</name> + <message> + <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/> + <source>*</source> + <translation>+</translation> + </message> +</context> +<context> + <name>QWizard</name> + <message> + <location filename="../src/gui/dialogs/qwizard.cpp" line="+637"/> + <source>Go Back</source> + <translation>往回</translation> + </message> + <message> + <location line="+3"/> + <source>Continue</source> + <translation>繼續</translation> + </message> + <message> + <location line="+5"/> + <source>Commit</source> + <translation>提交</translation> + </message> + <message> + <location line="+2"/> + <source>Done</source> + <translation>完成</translation> + </message> + <message> + <source>Quit</source> + <translation type="obsolete">離開</translation> + </message> + <message> + <location line="+4"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="-14"/> + <source>< &Back</source> + <translation><返回(&B)</translation> + </message> + <message> + <location line="+10"/> + <source>&Finish</source> + <translation>完成(&F)</translation> + </message> + <message> + <location line="+2"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+2"/> + <source>&Help</source> + <translation>說明(&H)</translation> + </message> + <message> + <location line="-8"/> + <source>&Next</source> + <translation>下一個(&N)</translation> + </message> + <message> + <location line="+0"/> + <source>&Next ></source> + <translation>下一個(&N)></translation> + </message> +</context> +<context> + <name>QWorkspace</name> + <message> + <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/> + <source>&Restore</source> + <translation>回復(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Move</source> + <translation>移動(&M)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+2"/> + <source>Mi&nimize</source> + <translation>最小化(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Ma&ximize</source> + <translation>最大化(&X)</translation> + </message> + <message> + <location line="+2"/> + <source>&Close</source> + <translation>關閉(&C)</translation> + </message> + <message> + <location line="+6"/> + <source>Stay on &Top</source> + <translation>留在頂端(&T)</translation> + </message> + <message> + <location line="+3"/> + <location line="+1059"/> + <source>Sh&ade</source> + <translation>遮蔽(&A)</translation> + </message> + <message> + <location line="-278"/> + <location line="+60"/> + <source>%1 - [%2]</source> + <translation>%1 - [%2]</translation> + </message> + <message> + <location line="-1837"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+2"/> + <source>Restore Down</source> + <translation>向下恢復</translation> + </message> + <message> + <location line="-4"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+2053"/> + <source>&Unshade</source> + <translation>取消遮蔽(&U)</translation> + </message> +</context> +<context> + <name>QXml</name> + <message> + <location filename="../src/xml/sax/qxml.cpp" line="+58"/> + <source>no error occurred</source> + <translation>沒有發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>error triggered by consumer</source> + <translation>用戶觸發的錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected end of file</source> + <translation>未預期遇到檔案結尾</translation> + </message> + <message> + <location line="+1"/> + <source>more than one document type definition</source> + <translation>定義了一個以上的文件型態</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing element</source> + <translation>剖析元素時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>tag mismatch</source> + <translation>標籤不對稱</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing content</source> + <translation>剖析內容時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected character</source> + <translation>非預期的字元</translation> + </message> + <message> + <location line="+1"/> + <source>invalid name for processing instruction</source> + <translation>處理指令時的不合法名稱</translation> + </message> + <message> + <location line="+1"/> + <source>version expected while reading the XML declaration</source> + <translation>讀取 XML 宣告時應有版本號</translation> + </message> + <message> + <location line="+1"/> + <source>wrong value for standalone declaration</source> + <translation>獨立宣告時的值錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> + <translation>讀取 XML 宣告時應有編碼宣告或獨立宣告</translation> + </message> + <message> + <location line="+1"/> + <source>standalone declaration expected while reading the XML declaration</source> + <translation>讀取 XML 宣告時應有讀立宣告</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing document type definition</source> + <translation>剖析文件型態定義時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>letter is expected</source> + <translation>預期應為字母</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing comment</source> + <translation>剖析註解時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing reference</source> + <translation>剖析參考時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>internal general entity reference not allowed in DTD</source> + <translation>在 DTD 中不允許內部產生的實體參考</translation> + </message> + <message> + <location line="+1"/> + <source>external parsed general entity reference not allowed in attribute value</source> + <translation>在屬性值中不允許使用外部剖析的實體參考</translation> + </message> + <message> + <location line="+1"/> + <source>external parsed general entity reference not allowed in DTD</source> + <translation>在 DTD 中不允許使用外部剖析的實體參考</translation> + </message> + <message> + <location line="+1"/> + <source>unparsed entity reference in wrong context</source> + <translation>在錯誤的內文中有未剖析的實體參考</translation> + </message> + <message> + <location line="+1"/> + <source>recursive entities</source> + <translation>遞迴的實體</translation> + </message> + <message> + <location line="+1"/> + <source>error in the text declaration of an external entity</source> + <translation>在外部實體中的文字宣告有錯誤</translation> + </message> +</context> +<context> + <name>QXmlStream</name> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/> + <source>Extra content at end of document.</source> + <translation>文件尾端有多餘的內容。</translation> + </message> + <message> + <location line="+222"/> + <source>Invalid entity value.</source> + <translation>不合法的實體值</translation> + </message> + <message> + <location line="+107"/> + <source>Invalid XML character.</source> + <translation>不合法的 XML 字元。</translation> + </message> + <message> + <location line="+259"/> + <source>Sequence ']]>' not allowed in content.</source> + <translation>在內文中不允許有序列 "]]>"。</translation> + </message> + <message> + <location line="+309"/> + <source>Namespace prefix '%1' not declared</source> + <translation>命名空間的前置字串 %1 未宣告</translation> + </message> + <message> + <location line="+78"/> + <source>Attribute redefined.</source> + <translation>屬性重定義。</translation> + </message> + <message> + <location line="+115"/> + <source>Unexpected character '%1' in public id literal.</source> + <translation>在公開代碼字元中遇到非預期的字元 %1。</translation> + </message> + <message> + <location line="+28"/> + <source>Invalid XML version string.</source> + <translation>不合法的 XML 版本字串。</translation> + </message> + <message> + <location line="+2"/> + <source>Unsupported XML version.</source> + <translation>未支援的 XML 版本。</translation> + </message> + <message> + <location line="+23"/> + <source>%1 is an invalid encoding name.</source> + <translation>%1 為不合法的編碼名稱。</translation> + </message> + <message> + <location line="+7"/> + <source>Encoding %1 is unsupported</source> + <translation>編碼 %1 不支援。</translation> + </message> + <message> + <source>Invalid XML encoding name.</source> + <translation type="obsolete">不合法的 XML 編碼名稱。</translation> + </message> + <message> + <location line="+16"/> + <source>Standalone accepts only yes or no.</source> + <translation>獨立實體只接受 yes 或 no。</translation> + </message> + <message> + <location line="+2"/> + <source>Invalid attribute in XML declaration.</source> + <translation>XML 宣告中有不合法的屬性。</translation> + </message> + <message> + <location line="+16"/> + <source>Premature end of document.</source> + <translation>文件結尾不正確。</translation> + </message> + <message> + <location line="+2"/> + <source>Invalid document.</source> + <translation>不合法的文件。</translation> + </message> + <message> + <location line="+40"/> + <source>Expected </source> + <translation>預期應為 </translation> + </message> + <message> + <location line="+11"/> + <source>, but got '</source> + <translation>,但是看到的是 </translation> + </message> + <message> + <location line="+4"/> + <source>Unexpected '</source> + <translation>非預期</translation> + </message> + <message> + <location line="+210"/> + <source>Expected character data.</source> + <translation>預期的字元資料。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/> + <source>Recursive entity detected.</source> + <translation>偵測到遞迴實體。</translation> + </message> + <message> + <location line="+516"/> + <source>Start tag expected.</source> + <translation>預期應有開始標籤。</translation> + </message> + <message> + <location line="+222"/> + <source>XML declaration not at start of document.</source> + <translation>XML 宣告沒有在文件開始處。</translation> + </message> + <message> + <location line="-31"/> + <source>NDATA in parameter entity declaration.</source> + <translation>在參數實體宣告有 NDATA。</translation> + </message> + <message> + <location line="+34"/> + <source>%1 is an invalid processing instruction name.</source> + <translation>%1 是不合法的處理指令名稱。</translation> + </message> + <message> + <location line="+11"/> + <source>Invalid processing instruction name.</source> + <translation>不合法的處理指令名稱。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/> + <location line="+12"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/> + <location line="+53"/> + <source>Illegal namespace declaration.</source> + <translation>不合法的命名空間宣告。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/> + <source>Invalid XML name.</source> + <translation>不合法的 XML 名稱。</translation> + </message> + <message> + <location line="+23"/> + <source>Opening and ending tag mismatch.</source> + <translation>開啟與結束的標籤不對稱。</translation> + </message> + <message> + <location line="+18"/> + <source>Reference to unparsed entity '%1'.</source> + <translation>參考到未剖析的實體 %1。</translation> + </message> + <message> + <location line="-13"/> + <location line="+61"/> + <location line="+40"/> + <source>Entity '%1' not declared.</source> + <translation>實體 %1 未宣告。</translation> + </message> + <message> + <location line="-26"/> + <source>Reference to external entity '%1' in attribute value.</source> + <translation>在屬性值中參考到外部實體 %1。</translation> + </message> + <message> + <location line="+40"/> + <source>Invalid character reference.</source> + <translation>不合法的字元參考。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/> + <source>Encountered incorrectly encoded content.</source> + <translation>遇到不正確的編碼內容。</translation> + </message> + <message> + <location line="+274"/> + <source>The standalone pseudo attribute must appear after the encoding.</source> + <translation>獨立的虛擬屬性必須在編碼之後出現。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/> + <source>%1 is an invalid PUBLIC identifier.</source> + <translation>%1 為不合法的 PUBLIC 識別子。</translation> + </message> +</context> +<context> + <name>QtXmlPatterns</name> + <message> + <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/> + <source>An %1-attribute with value %2 has already been declared.</source> + <translation>已宣告屬性 %1 的值為 %2。</translation> + </message> + <message> + <location line="+13"/> + <source>An %1-attribute must have a valid %2 as value, which %3 isn't.</source> + <translation>屬性 %1 必須以合法的 %2 為值,而 %3 是不合法的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/> + <source>Network timeout.</source> + <translation>網路逾時。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/> + <source>Element %1 can't be serialized because it appears outside the document element.</source> + <translation>元素 %1 無法序列化,因為似乎是在文件元素之外。</translation> + </message> + <message> + <source>Attribute element %1 can't be serialized because it appears at the top level.</source> + <translation type="obsolete">屬性元素 %1 無法序列化,因為似乎是在頂層。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/> + <source>Year %1 is invalid because it begins with %2.</source> + <translation>年份 %1 不合法,因為是從 %2 開始的。</translation> + </message> + <message> + <location line="+19"/> + <source>Day %1 is outside the range %2..%3.</source> + <translation>日期 %1 已超出 %2 到 %3 的範圍。</translation> + </message> + <message> + <location line="+7"/> + <source>Month %1 is outside the range %2..%3.</source> + <translation>月份 %1 已超出 %2 到 %3 的範圍。</translation> + </message> + <message> + <location line="+10"/> + <source>Overflow: Can't represent date %1.</source> + <translation>溢位:無法表示日期 %1。</translation> + </message> + <message> + <location line="+9"/> + <source>Day %1 is invalid for month %2.</source> + <translation>月份 %2 中沒有日期 %1。</translation> + </message> + <message> + <location line="+49"/> + <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source> + <translation>時間 24:%1:%2.%3 不合法。小時為 24 則分、秒與毫秒都必須是 0。 +</translation> + </message> + <message> + <location line="+13"/> + <source>Time %1:%2:%3.%4 is invalid.</source> + <translation>時間 %1:%2:%3.%4 不合法。</translation> + </message> + <message> + <location line="+115"/> + <source>Overflow: Date can't be represented.</source> + <translation>溢位:無法表示日期。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/> + <location line="+15"/> + <source>At least one component must be present.</source> + <translation>必須表達至少一個組件。</translation> + </message> + <message> + <location line="-7"/> + <source>At least one time component must appear after the %1-delimiter.</source> + <translation>在分隔符 %1 後必須至少有一個時間組件。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/> + <source>No operand in an integer division, %1, can be %2.</source> + <translation>整數除法沒有運作對象,%1,可以是 %2</translation> + </message> + <message> + <location line="+7"/> + <source>The first operand in an integer division, %1, cannot be infinity (%2).</source> + <translation>整數除法的第一個運算對象 %1 不能是無限大(%2)。</translation> + </message> + <message> + <location line="+6"/> + <source>The second operand in a division, %1, cannot be zero (%2).</source> + <translation>整數除法的第二個運算對象 %1 不能是零(%2)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/> + <source>%1 is not a valid value of type %2.</source> + <translation>%1 不是合法的 %2 型態的值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/> + <source>When casting to %1 from %2, the source value cannot be %3.</source> + <translation>從 %2 轉換型態為 %1 的時候,來源數值不能是 %3。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/> + <source>Integer division (%1) by zero (%2) is undefined.</source> + <translation>整數除法 %1 除以零(%2)的行為未定義。</translation> + </message> + <message> + <location line="+7"/> + <source>Division (%1) by zero (%2) is undefined.</source> + <translation>除法 %1 除以零(%2)的行為未定義。</translation> + </message> + <message> + <location line="+7"/> + <source>Modulus division (%1) by zero (%2) is undefined.</source> + <translation>餘數除法 %1 除以零(%2)的行為未定義。</translation> + </message> + <message> + <location line="+122"/> + <location line="+32"/> + <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> + <translation>將型態 %1 除以 %2(非數值)是不允許的。</translation> + </message> + <message> + <location line="-20"/> + <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source> + <translation>將型態 %1 除以 %2 或 %3(正或負零)是不允許的。</translation> + </message> + <message> + <location line="+32"/> + <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source> + <translation>將型態 %1 乘以 %2 或 %3(正或負無限大)是不允許的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/> + <source>A value of type %1 cannot have an Effective Boolean Value.</source> + <translation>型態 %1 不能有實際布林值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/> + <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> + <translation>實際布林值(Effective Boolean)無法用在兩個或兩個以上的原數值(atomic value)的計算。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/> + <source>Value %1 of type %2 exceeds maximum (%3).</source> + <translation>型態 %2 的數值 %1 已超過最大值(%3)。</translation> + </message> + <message> + <location line="+9"/> + <source>Value %1 of type %2 is below minimum (%3).</source> + <translation>型態 %2 的數值 %1 已低過最小值(%3)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/> + <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source> + <translation>型態 %1 的值必須包含偶數個數字。數值 %2 未符合此條件。</translation> + </message> + <message> + <location line="+19"/> + <source>%1 is not valid as a value of type %2.</source> + <translation>%1 不是合法的 %2 型態的值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/> + <source>Operator %1 cannot be used on type %2.</source> + <translation>操作元 %1 不能用於型態 %2。</translation> + </message> + <message> + <location line="+17"/> + <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source> + <translation>操作元 %1 不能用於型態 %2 與 %3 的原數值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/> + <source>The namespace URI in the name for a computed attribute cannot be %1.</source> + <translation>在已計算屬性的名稱的命名空間網址不能是 %1。</translation> + </message> + <message> + <location line="+9"/> + <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source> + <translation>在已計算屬性的名稱不能同時有命名空間網址 %1 與本地端名稱 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/> + <source>Type error in cast, expected %1, received %2.</source> + <translation>轉換型態錯誤,應為 %1 但接收到 %2。</translation> + </message> + <message> + <location line="+29"/> + <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source> + <translation>轉換為型態 %1 或其衍生型態時,來源數值必須是相同型態,或者是字串。型態 %2 是不被允許的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/> + <source>No casting is possible with %1 as the target type.</source> + <translation>不能轉換到 %1 型態。</translation> + </message> + <message> + <location line="+15"/> + <source>It is not possible to cast from %1 to %2.</source> + <translation>不能從 %1 轉換到 %2。</translation> + </message> + <message> + <location line="+27"/> + <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source> + <translation>無法轉換到 %1 因為它是一個抽象型態,不能被實體化。</translation> + </message> + <message> + <location line="+23"/> + <source>It's not possible to cast the value %1 of type %2 to %3</source> + <translation>無法轉換型態 %2 的數值 %1 到 %3</translation> + </message> + <message> + <location line="+8"/> + <source>Failure when casting from %1 to %2: %3</source> + <translation>從 %1 轉換到 %2 時失敗:%3</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/> + <source>A comment cannot contain %1</source> + <translation>註解不能包含 %1</translation> + </message> + <message> + <location line="+6"/> + <source>A comment cannot end with a %1.</source> + <translation>註解不能以 %1 做結尾</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/> + <source>No comparisons can be done involving the type %1.</source> + <translation>包含型態 %1 時不能做比較。</translation> + </message> + <message> + <location line="+14"/> + <source>Operator %1 is not available between atomic values of type %2 and %3.</source> + <translation>操作元 %1 不能用於型態 %2 與 %3 的原數值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/> + <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source> + <translation>屬性點不能做為文件點的子節點。因此,屬性 %1 的位置不合適。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/> + <source>A library module cannot be evaluated directly. It must be imported from a main module.</source> + <translation>不能直接計算函式模組。必須要從主模組匯入。</translation> + </message> + <message> + <location line="+40"/> + <source>No template by name %1 exists.</source> + <translation>沒有名為 %1 的樣本存在。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/> + <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> + <translation>型態 %1 的值不能是謂詞(predicate)。謂詞必須是數值型態,或是實際布林值。</translation> + </message> + <message> + <location line="+32"/> + <source>A positional predicate must evaluate to a single numeric value.</source> + <translation>位置謂詞必須能計算出單一的數值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/> + <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source> + <translation>處理指令的目標名稱不能是任何大小寫組合的 %1。因此,%2 是不合法的值。</translation> + </message> + <message> + <location line="+24"/> + <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> + <translation>%1 不是一個合法的處理指令的目標名稱。必須是 %2 的值,例如 %3。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/> + <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> + <translation>路徑的最後一步必須是節點或原值,而不能在兩者之間。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/> + <source>The data of a processing instruction cannot contain the string %1</source> + <translation>處理指令的資料不能包含字串 %1</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/> + <source>No namespace binding exists for the prefix %1</source> + <translation>前置字串 %1 沒有結合命名空間</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/> + <source>No namespace binding exists for the prefix %1 in %2</source> + <translation>在 %2 的前置字串 %1 沒有結合命名空間</translation> + </message> + <message> + <location line="+12"/> + <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/> + <source>%1 is an invalid %2</source> + <translation>%1 是不合法的 %2</translation> + </message> + <message numerus="yes"> + <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/> + <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source> + <translation> + <numerusform>%1 最多只能有 %n 個參數,因此 %2 是不合法的。</numerusform> + </translation> + </message> + <message numerus="yes"> + <location line="+11"/> + <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source> + <translation> + <numerusform>%1 至少需要 %n 個參數,因此 %2 是不合法的。</numerusform> + </translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/> + <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source> + <translation>呼叫 %1 的第一個參數不能是 %2 型態。必須是數值型態,xs.yearMonthDuration 或 xs.dayTimeDuration。</translation> + </message> + <message> + <location line="+74"/> + <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> + <translation>呼叫 %1 的第一個參數不能是 %2 型態。必須是 %3、%4 或 %5 型態。</translation> + </message> + <message> + <location line="+91"/> + <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> + <translation>呼叫 %1 的第二個參數不能是 %2 型態。必須是 %3、%4 或 %5 型態。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/> + <source>%1 is not a valid XML 1.0 character.</source> + <translation>%1 不是合法的 XML 1.0 字元。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/> + <source>The first argument to %1 cannot be of type %2.</source> + <translation>呼叫 %1 的第一個參數不能是 %2 型態。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/> + <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source> + <translation>如果兩個值都有區域位移,則必須是相同的區域位移。%1 與 %2 並不相同。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/> + <source>%1 was called.</source> + <translation>%1 已被呼叫。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/> + <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> + <translation>%1 後面必須跟著 %2 或 %3,而非取代字串的結尾。</translation> + </message> + <message> + <location line="+39"/> + <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> + <translation>在取代字串中,在未脫逸的情形下 %1 必須至少跟著一位數字。</translation> + </message> + <message> + <location line="+26"/> + <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> + <translation>在取代字串中,%1 只能用於自身或 %2 的脫逸,而非 %3。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/> + <source>%1 matches newline characters</source> + <translation>%1 符合了換行字元</translation> + </message> + <message> + <location line="+4"/> + <source>%1 and %2 match the start and end of a line.</source> + <translation>%1 與 %2 符合了一行的開始與結尾。</translation> + </message> + <message> + <location line="+6"/> + <source>Matches are case insensitive</source> + <translation>比對為區分大小寫</translation> + </message> + <message> + <location line="+4"/> + <source>Whitespace characters are removed, except when they appear in character classes</source> + <translation>空白字元已移除,除非它們出現在字元類別</translation> + </message> + <message> + <location line="+99"/> + <source>%1 is an invalid regular expression pattern: %2</source> + <translation>%1 是不合法的正規表示式樣式:%2</translation> + </message> + <message> + <location line="+30"/> + <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> + <translation>%1 是正規表示式中不合法的旗標。合法的旗標有:</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/> + <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> + <translation>如果第一個參數是空序列,或是長度為 0 的字串(沒有命名空間),則無法指定前置字串。但是您指定了 %1。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/> + <source>It will not be possible to retrieve %1.</source> + <translation>無法取得 %1。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/> + <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> + <translation>函式 %1 的第二個參數的根節點必須是文件節點。%2 不是文件節點。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/> + <source>The default collection is undefined</source> + <translation>預設的收藏未定義</translation> + </message> + <message> + <location line="+13"/> + <source>%1 cannot be retrieved</source> + <translation>%1 無法取得</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/> + <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> + <translation>未支援常態化表單 %1。支援的表單有 %2、%3、%4、%5,以及無(也就是空字串,未常態化)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/> + <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> + <translation>區域位移必須是在 %1 到 %2 範圍之內。%3 已超出範圍。</translation> + </message> + <message> + <location line="+12"/> + <source>%1 is not a whole number of minutes.</source> + <translation>%1 不是分鐘的數值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/> + <source>Required cardinality is %1; got cardinality %2.</source> + <translation>需要的基數為 %1;得到的是 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/> + <source>The item %1 did not match the required type %2.</source> + <translation>項目 %1 未符合需要的型態 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/> + <location line="+7253"/> + <source>%1 is an unknown schema type.</source> + <translation>%1 是未知的機制型態。</translation> + </message> + <message> + <location line="-6971"/> + <source>Only one %1 declaration can occur in the query prolog.</source> + <translation>只有一個 %1 宣告可以在查詢中。</translation> + </message> + <message> + <location line="+188"/> + <source>The initialization of variable %1 depends on itself</source> + <translation>變數 %1 的初始化與自身相依。</translation> + </message> + <message> + <location line="+63"/> + <source>No variable by name %1 exists</source> + <translation>沒有名為 %1 的變數存在</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/> + <source>The variable %1 is unused</source> + <translation>變數 %1 未使用</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/> + <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> + <translation>版本 %1 未支援。支援的 XQuery 版本為 1.0。</translation> + </message> + <message> + <location line="+16"/> + <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> + <translation>編碼 %1 不合法。必須只能包含拉丁字元,不含空白,並且要符合正規表示式 %2。</translation> + </message> + <message> + <location line="+55"/> + <source>No function with signature %1 is available</source> + <translation>沒有簽章為 %1 的函式可使用</translation> + </message> + <message> + <location line="+72"/> + <location line="+10"/> + <source>A default namespace declaration must occur before function, variable, and option declarations.</source> + <translation>預設的命名空間宣告必須在函式、變數與選項宣告之前。</translation> + </message> + <message> + <location line="+10"/> + <source>Namespace declarations must occur before function, variable, and option declarations.</source> + <translation>命名空間宣告必須在函式、變數與選項宣告之前。</translation> + </message> + <message> + <location line="+11"/> + <source>Module imports must occur before function, variable, and option declarations.</source> + <translation>模組匯入必須在函式、變數與選項宣告之前。</translation> + </message> + <message> + <location line="+200"/> + <source>It is not possible to redeclare prefix %1.</source> + <translation>無法重宣告前置字串 %1。</translation> + </message> + <message> + <source>Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1.</source> + <translation type="obsolete">只有前置字串 %1 可以被宣告與命名空間 %2 結合。它預設已經與前置字串 %1 結合。</translation> + </message> + <message> + <location line="+18"/> + <source>Prefix %1 is already declared in the prolog.</source> + <translation>前置字串 %1 已在 prolog 中宣告。</translation> + </message> + <message> + <location line="+95"/> + <source>The name of an option must have a prefix. There is no default namespace for options.</source> + <translation>選項名稱必須有前置字串。沒有選項的預設命名空間。</translation> + </message> + <message> + <location line="+171"/> + <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> + <translation>機制匯入功能未支援,因此有 %1 個宣告無法達成。</translation> + </message> + <message> + <location line="+13"/> + <source>The target namespace of a %1 cannot be empty.</source> + <translation>%1 的目標命名空間不能是空的。</translation> + </message> + <message> + <location line="+8"/> + <source>The module import feature is not supported</source> + <translation>模組匯入功能未支援。</translation> + </message> + <message> + <source>A variable by name %1 has already been declared in the prolog.</source> + <translation type="obsolete">名稱為 %1 的變數已經在 prolog 中宣告。</translation> + </message> + <message> + <location line="+52"/> + <source>No value is available for the external variable by name %1.</source> + <translation>名為 %1 的外部變數沒有可用的值。</translation> + </message> + <message> + <source>The namespace for a user defined function cannot be empty(try the predefined prefix %1 which exists for cases like this)</source> + <translation type="obsolete">使用者定義的函式的命名空間不能是空的(請試試使用預定義前置字串 %1)</translation> + </message> + <message> + <location line="-4154"/> + <source>A construct was encountered which only is allowed in XQuery.</source> + <translation>遇到了建構,實際上只能允許在 XQuery 內。</translation> + </message> + <message> + <location line="+118"/> + <source>A template by name %1 has already been declared.</source> + <translation>名為 %1 的屬性已被宣告。</translation> + </message> + <message> + <location line="+3581"/> + <source>The keyword %1 cannot occur with any other mode name.</source> + <translation>關鍵字 %1 不能與任何其它模式名稱一起存在。</translation> + </message> + <message> + <location line="+29"/> + <source>The value of attribute %1 must of type %2, which %3 isn't.</source> + <translation>屬性 %1 的值必須為型態 %2,但 %3 不是。</translation> + </message> + <message> + <location line="+75"/> + <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source> + <translation>前置字串 %1 不能被結合。預設它已與命名空間 %2 結合。</translation> + </message> + <message> + <location line="+312"/> + <source>A variable by name %1 has already been declared.</source> + <translation>名為 %1 的變數已被宣告。</translation> + </message> + <message> + <location line="+135"/> + <source>A stylesheet function must have a prefixed name.</source> + <translation>樣式表函式必須有前置名稱。</translation> + </message> + <message> + <location line="+9"/> + <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> + <translation>使用者定義函式的命名空間不能為空白(請試著用預先定義的前置字串 %1)</translation> + </message> + <message> + <location line="+9"/> + <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> + <translation>命名空間 %1 已被保留,因此使用者定義函式不能使用它。請試試預定義前置字串 %2。</translation> + </message> + <message> + <location line="+12"/> + <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> + <translation>在函式模組中的使用者定義函式的命名空間必須與模組的命名空間相同。也就是,應該為 %1 而不是 %2。</translation> + </message> + <message> + <location line="+34"/> + <source>A function already exists with the signature %1.</source> + <translation>已經有簽章為 %1 的函式存在。</translation> + </message> + <message> + <location line="+23"/> + <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> + <translation>未支援外部函式。所有支援的含式可以直接使用而不需要先宣告為外部函式。</translation> + </message> + <message> + <location line="+37"/> + <source>An argument by name %1 has already been declared. Every argument name must be unique.</source> + <translation>名稱為 %1 的參數已被宣告。每個參數名稱必須唯一。</translation> + </message> + <message> + <location line="+179"/> + <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> + <translation>當函式 %1 用於樣式比對時,參數必須是變數參考或字串。</translation> + </message> + <message> + <location line="+11"/> + <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> + <translation>在 XSL-T 樣式內,函式 %1 的第一個參數必須是字串,以便用於比對。</translation> + </message> + <message> + <location line="+14"/> + <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> + <translation>在 XSL-T 樣式內,函式 %1 的第一個參數必須是文字或變數參考,以便用於比對。</translation> + </message> + <message> + <location line="+9"/> + <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> + <translation>在 XSL-T 樣式內,函式 %1 的不能有第三個參數。</translation> + </message> + <message> + <location line="+10"/> + <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> + <translation>在 XSL-T 樣式內,只有函式 %1,%2 可以用於比對。%3 不行。</translation> + </message> + <message> + <location line="+63"/> + <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> + <translation>在 XSL-T 樣式內,不能用 %1 軸,只能用 %2 或 %3。</translation> + </message> + <message> + <location line="+126"/> + <source>%1 is an invalid template mode name.</source> + <translation>%1 不是合法的樣本模式名稱。</translation> + </message> + <message> + <location line="+44"/> + <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> + <translation>與 for 敘述結合的變數名稱必須與位置變數不同。因此,有兩個名為 %1 的變數衝突了。</translation> + </message> + <message> + <location line="+758"/> + <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> + <translation>未支援機制確認功能。%1 敘述無法使用。</translation> + </message> + <message> + <location line="+39"/> + <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> + <translation>未支援 pragma 敘述。因次,必須有預設的敘述。</translation> + </message> + <message> + <location line="+267"/> + <source>Each name of a template parameter must be unique; %1 is duplicated.</source> + <translation>每個樣本參數的名稱必須唯一;%1 已經被使用。</translation> + </message> + <message> + <location line="+129"/> + <source>The %1-axis is unsupported in XQuery</source> + <translation>XQuery 中未支援 %1 軸</translation> + </message> + <message> + <location line="+1150"/> + <source>%1 is not a valid name for a processing-instruction.</source> + <translation>%1 不是處理指令的合法名稱。</translation> + </message> + <message> + <location line="-7029"/> + <source>%1 is not a valid numeric literal.</source> + <translation>%1 不是合法的數值。</translation> + </message> + <message> + <location line="+6165"/> + <source>No function by name %1 is available.</source> + <translation>沒有名為 %1 的函式。</translation> + </message> + <message> + <location line="+102"/> + <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> + <translation>要與前置字串 %1 結合的命名空間網址不能是空字串。</translation> + </message> + <message> + <location line="+7"/> + <source>%1 is an invalid namespace URI.</source> + <translation>%1 是不合法的命名空間網址。</translation> + </message> + <message> + <location line="+6"/> + <source>It is not possible to bind to the prefix %1</source> + <translation>無法與前置字串 %1 結合。</translation> + </message> + <message> + <location line="+7"/> + <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> + <translation>命名空間 %1 只能與 %2 結合(也就是說,要預先定義)。</translation> + </message> + <message> + <location line="+8"/> + <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> + <translation>前置字串 %1 只能與 %2 結合(也就是說,要預先定義)。</translation> + </message> + <message> + <location line="+15"/> + <source>Two namespace declaration attributes have the same name: %1.</source> + <translation>有兩個命名空間宣告的屬性有相同的名稱:%1</translation> + </message> + <message> + <location line="+89"/> + <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> + <translation>命名空間網址必須是常數,並且不能使用封閉敘述。</translation> + </message> + <message> + <location line="+16"/> + <source>An attribute by name %1 has already appeared on this element.</source> + <translation>名為 %1 的屬性已出現在此元素。</translation> + </message> + <message> + <location line="+61"/> + <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> + <translation>直接元素建構器沒有完整產生。%1 以 %2 結束。</translation> + </message> + <message> + <location line="+458"/> + <source>The name %1 does not refer to any schema type.</source> + <translation>名稱 %1 未指向任何機制型態。</translation> + </message> + <message> + <location line="+10"/> + <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> + <translation>%1 是複數型態,無法轉換成複數型態。然而,轉換為原型態,如 %2 是可行的。</translation> + </message> + <message> + <location line="+9"/> + <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> + <translation>%1 不是一個原型態。只能轉換為原型態。</translation> + </message> + <message> + <source>%1 is not a valid name for a processing-instruction. Therefore this name test will never match.</source> + <translation type="obsolete">%1 不是一個合法的處理指令的名稱。因此名稱測試永遠不會成功。</translation> + </message> + <message> + <location line="+145"/> + <location line="+71"/> + <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> + <translation>%1 不是範圍內屬性宣告。注意機制匯入功能未支援。</translation> + </message> + <message> + <location line="+48"/> + <source>The name of an extension expression must be in a namespace.</source> + <translation>延伸敘述的名稱必須在命名空間內。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/> + <source>empty</source> + <translation>空白</translation> + </message> + <message> + <location line="+2"/> + <source>zero or one</source> + <translation>0 或 1 個</translation> + </message> + <message> + <location line="+2"/> + <source>exactly one</source> + <translation>剛好一個</translation> + </message> + <message> + <location line="+2"/> + <source>one or more</source> + <translation>一個以上</translation> + </message> + <message> + <location line="+2"/> + <source>zero or more</source> + <translation>0 個以上</translation> + </message> + <message> + <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/> + <source>Required type is %1, but %2 was found.</source> + <translation>需要的型態為 %1,但找到 %2。</translation> + </message> + <message> + <location line="+44"/> + <source>Promoting %1 to %2 may cause loss of precision.</source> + <translation>將 %1 抬升為 %2 可能會失去精確度。</translation> + </message> + <message> + <location line="+49"/> + <source>The focus is undefined.</source> + <translation>焦點未定義。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/> + <source>It's not possible to add attributes after any other kind of node.</source> + <translation>不能在任何其它種類的節點後面加入屬性。</translation> + </message> + <message> + <location line="+7"/> + <source>An attribute by name %1 has already been created.</source> + <translation>名為 %1 的屬性已被建立。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/> + <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> + <translation>只支援 Unicode Codepoint Collation(%1)。%2 未支援。;</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+60"/> + <source>Attribute %1 can't be serialized because it appears at the top level.</source> + <translation>屬性元素 %1 無法序列化,因為似乎是在頂層。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/> + <source>%1 is an unsupported encoding.</source> + <translation>%1 是個未被支援的編碼。</translation> + </message> + <message> + <location line="+16"/> + <source>%1 contains octets which are disallowed in the requested encoding %2.</source> + <translation>%1 包含了在要求的編碼 %2 內不允許的八進位值。</translation> + </message> + <message> + <location line="+18"/> + <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> + <translation>在 %2 內的代碼點 %1(編碼 %3)是一個不合法的 XML 字元。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/> + <source>Ambiguous rule match.</source> + <translation>不明確的規則符合。</translation> + </message> + <message> + <source>In a namespace constructor, the value for a namespace value cannot be an empty string.</source> + <translation type="obsolete">在命名空間建構子中,命名空間的值不能是空字串。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/> + <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+11"/> + <source>The prefix must be a valid %1, which %2 is not.</source> + <translation>前置字串必須是合法的 %1,但 %2 不是。</translation> + </message> + <message> + <location line="+14"/> + <source>The prefix %1 cannot be bound.</source> + <translation>前置字串 %1 不能被結合。</translation> + </message> + <message> + <location line="+10"/> + <source>Only the prefix %1 can be bound to %2 and vice versa.</source> + <translation>只有前置字串 %1 能與 %2 結合。反之亦然。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/> + <source>Circularity detected</source> + <translation>偵測到環狀</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/> + <source>The parameter %1 is required, but no corresponding %2 is supplied.</source> + <translation>需要參數 %1,但是沒有提供相關的 %2。</translation> + </message> + <message> + <location line="-71"/> + <source>The parameter %1 is passed, but no corresponding %2 exists.</source> + <translation>參數 %1 已傳送,但找不到相關的 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/> + <source>The URI cannot have a fragment</source> + <translation>URI 不能有片段。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/> + <source>Element %1 is not allowed at this location.</source> + <translation>元素 %1 不能在此位置。</translation> + </message> + <message> + <location line="+9"/> + <source>Text nodes are not allowed at this location.</source> + <translation>文字節點不能在此位置。</translation> + </message> + <message> + <location line="+20"/> + <source>Parse error: %1</source> + <translation>剖析錯誤:%1</translation> + </message> + <message> + <location line="+62"/> + <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> + <translation>XLS-T 版本屬性的值必須是型態 %1 的值,而 %2 不是。</translation> + </message> + <message> + <location line="+20"/> + <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> + <translation>使用 2.0 處理器執行 XSL-T 1.0 樣式表中。</translation> + </message> + <message> + <location line="+108"/> + <source>Unknown XSL-T attribute %1.</source> + <translation>未知的 XSL-T 屬性 %1。</translation> + </message> + <message> + <location line="+23"/> + <source>Attribute %1 and %2 are mutually exclusive.</source> + <translation>屬性 %1 與 %2 彼此互斥。</translation> + </message> + <message> + <location line="+166"/> + <source>In a simplified stylesheet module, attribute %1 must be present.</source> + <translation>在簡化的樣式表模組中,屬性 %1 必須存在。</translation> + </message> + <message> + <location line="+72"/> + <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> + <translation>若元素 %1 沒有屬性 %2,則也不能有屬性 %3 或 %4。</translation> + </message> + <message> + <location line="+9"/> + <source>Element %1 must have at least one of the attributes %2 or %3.</source> + <translation>元素 %1 必須至少有屬性 %2 或 %3 其中一個。</translation> + </message> + <message> + <location line="+28"/> + <source>At least one mode must be specified in the %1-attribute on element %2.</source> + <translation>在元素 %2 的 %1 屬性中至少要指定一個模式。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/> + <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source> + <translation>屬性 %1 不能出現在元素 %2。只能有標準屬性。</translation> + </message> + <message> + <location line="+6"/> + <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source> + <translation>屬性 %1 不能出現在元素 %2。只能有 %3 以及標準屬性。</translation> + </message> + <message> + <location line="+8"/> + <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source> + <translation>屬性 %1 不能出現在元素 %2。只能有 %3,%4 以及標準屬性。</translation> + </message> + <message> + <location line="+9"/> + <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source> + <translation>屬性 %1 不能出現在元素 %2。只能有 %3 以及標準屬性。</translation> + </message> + <message> + <location line="+13"/> + <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source> + <translation>XSL-T 元素內的 XSL-T 屬性必須放在空(null)的命名空間,而不是像 %1 在 XSL-T 命名空間。</translation> + </message> + <message> + <location line="+12"/> + <source>The attribute %1 must appear on element %2.</source> + <translation>屬性 %1 必須在元素 %2 內出現。</translation> + </message> + <message> + <location line="+8"/> + <source>The element with local name %1 does not exist in XSL-T.</source> + <translation>有本地名稱 %1 的元素在 XSL-T 內不存在。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/> + <source>Element %1 must come last.</source> + <translation>元素 %1 必須最後出現。</translation> + </message> + <message> + <location line="+24"/> + <source>At least one %1-element must occur before %2.</source> + <translation>至少一個元素 %1 要出現在 %2 之前。</translation> + </message> + <message> + <location line="+7"/> + <source>Only one %1-element can appear.</source> + <translation>只能出現一個元素 %1。</translation> + </message> + <message> + <location line="+31"/> + <source>At least one %1-element must occur inside %2.</source> + <translation>至少一個元素 %1 要出現在 %2 之內。</translation> + </message> + <message> + <location line="+58"/> + <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> + <translation>當屬性 %1 出現在 %2 內時,不能使用序列建構子。</translation> + </message> + <message> + <location line="+13"/> + <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> + <translation>元素 %1 必須至少有一個屬性 %2 或一個序列建構子。</translation> + </message> + <message> + <location line="+125"/> + <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> + <translation>當需要參數時,不能透過屬性 %1 或序列建構子提供預設值。</translation> + </message> + <message> + <location line="+270"/> + <source>Element %1 cannot have children.</source> + <translation>元素 %1 不能有子元素。</translation> + </message> + <message> + <location line="+434"/> + <source>Element %1 cannot have a sequence constructor.</source> + <translation>元素 %1不能有序列建構子。</translation> + </message> + <message> + <location line="+86"/> + <location line="+9"/> + <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> + <translation>屬性 %1 不能出現在 %2,因為它是 %3 的子元素。</translation> + </message> + <message> + <location line="+15"/> + <source>A parameter in a function cannot be declared to be a tunnel.</source> + <translation>函式內的參數不能被宣告為通道(tunnel)。</translation> + </message> + <message> + <location line="+149"/> + <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> + <translation>此處理器不是 Schema-aware,因此不能使用 %1。</translation> + </message> + <message> + <location line="+57"/> + <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> + <translation>頂層樣式表元素必須是非空白的命名空間,而 %1 不是。</translation> + </message> + <message> + <location line="+48"/> + <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> + <translation>元素 %2 內屬性 %1 的值必須是 %3 或 %4,而不是 %5。</translation> + </message> + <message> + <location line="+20"/> + <source>Attribute %1 cannot have the value %2.</source> + <translation>屬性 %1 的值不能為 %2。</translation> + </message> + <message> + <location line="+58"/> + <source>The attribute %1 can only appear on the first %2 element.</source> + <translation>屬性 %1 只能出現在前 %2 個元素內。</translation> + </message> + <message> + <location line="+99"/> + <source>At least one %1 element must appear as child of %2.</source> + <translation>%2 必須至少有一個子元素 %1。</translation> + </message> +</context> +<context> + <name>VolumeSlider</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/> + <source>Muted</source> + <translation>靜音</translation> + </message> + <message> + <location line="+5"/> + <location line="+15"/> + <source>Volume: %1%</source> + <translation>音量:%1%</translation> + </message> +</context> +<context> + <name>WebCore::PlatformScrollbar</name> + <message> + <source>Scroll here</source> + <translation type="obsolete">在此捲軸</translation> + </message> + <message> + <source>Left edge</source> + <translation type="obsolete">左邊緣</translation> + </message> + <message> + <source>Top</source> + <translation type="obsolete">頂端</translation> + </message> + <message> + <source>Right edge</source> + <translation type="obsolete">右邊緣</translation> + </message> + <message> + <source>Bottom</source> + <translation type="obsolete">底端</translation> + </message> + <message> + <source>Page left</source> + <translation type="obsolete">頁面左方</translation> + </message> + <message> + <source>Page up</source> + <translation type="obsolete">頁面上方</translation> + </message> + <message> + <source>Page right</source> + <translation type="obsolete">頁面右方</translation> + </message> + <message> + <source>Page down</source> + <translation type="obsolete">頁面下方</translation> + </message> + <message> + <source>Scroll left</source> + <translation type="obsolete">往左捲軸</translation> + </message> + <message> + <source>Scroll up</source> + <translation type="obsolete">往上捲軸</translation> + </message> + <message> + <source>Scroll right</source> + <translation type="obsolete">往右捲軸</translation> + </message> + <message> + <source>Scroll down</source> + <translation type="obsolete">往下捲軸</translation> + </message> +</context> +</TS> diff --git a/release/ts/qt_windows_he.qm b/release/ts/qt_windows_he.qm Binary files differnew file mode 100644 index 0000000..4ff507e --- /dev/null +++ b/release/ts/qt_windows_he.qm diff --git a/release/ts/qt_windows_sv.qm b/release/ts/qt_windows_sv.qm Binary files differnew file mode 100644 index 0000000..f3556bc --- /dev/null +++ b/release/ts/qt_windows_sv.qm diff --git a/release/ts/qt_windows_zh.qm b/release/ts/qt_windows_zh.qm Binary files differnew file mode 100644 index 0000000..623b8e3 --- /dev/null +++ b/release/ts/qt_windows_zh.qm diff --git a/release/ts/qt_windows_zh.ts b/release/ts/qt_windows_zh.ts new file mode 100644 index 0000000..e84fe8e --- /dev/null +++ b/release/ts/qt_windows_zh.ts @@ -0,0 +1,7964 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="zh"> +<context> + <name>MAC_APPLICATION_MENU</name> + <message> + <location filename="../src/gui/kernel/qapplication.cpp" line="+2316"/> + <source>Services</source> + <translation>服务</translation> + </message> + <message> + <location line="+1"/> + <source>Hide %1</source> + <translation>隐藏%1</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Others</source> + <translation>隐藏其他</translation> + </message> + <message> + <location line="+1"/> + <source>Show All</source> + <translation>全部显示</translation> + </message> + <message> + <location line="+1"/> + <source>Preferences...</source> + <translation>偏好设置…</translation> + </message> + <message> + <location line="+1"/> + <source>Quit %1</source> + <translation>退出 %1</translation> + </message> + <message> + <location line="+1"/> + <source>About %1</source> + <translation>关于 %1</translation> + </message> +</context> +<context> + <name>AudioOutput</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/> + <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source> + <translation><html>音频回放设备 <b>%1</b> 没有工作。<br/>回滚到 <b>%2</b>。</html></translation> + </message> + <message> + <location line="+13"/> + <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source> + <translation><html>切换到音频回放设备 <b>%1</b>,<br/>它刚刚变为可用并且具有更高的优先级。</html></translation> + </message> + <message> + <location line="+3"/> + <source>Revert back to device '%1'</source> + <translation>恢复到设备“%1”</translation> + </message> +</context> +<context> + <name>CloseButton</name> + <message> + <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/> + <source>Close Tab</source> + <translation>关闭标签页</translation> + </message> +</context> +<context> + <name>Phonon::</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/> + <source>Notifications</source> + <translation>通知</translation> + </message> + <message> + <location line="+2"/> + <source>Music</source> + <translation>音乐</translation> + </message> + <message> + <location line="+2"/> + <source>Video</source> + <translation>视频</translation> + </message> + <message> + <location line="+2"/> + <source>Communication</source> + <translation>通讯</translation> + </message> + <message> + <location line="+2"/> + <source>Games</source> + <translation>游戏</translation> + </message> + <message> + <location line="+2"/> + <source>Accessibility</source> + <translation>无障碍环境</translation> + </message> +</context> +<context> + <name>Phonon::Gstreamer::Backend</name> + <message> + <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/> + <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. + Some video features have been disabled.</source> + <translation>警告:看起来,您没有安装 gstreamer0.10-plugins-good 包。 + 一些视频特性已经被关闭。</translation> + </message> + <message> + <location line="+5"/> + <source>Warning: You do not seem to have the base GStreamer plugins installed. + All audio and video support has been disabled</source> + <translation>警告:看起来,您没有安装基础的 GStreamer 插件。 + 所有的音频和视频支持都已经被关闭。</translation> + </message> +</context> +<context> + <name>Phonon::Gstreamer::MediaObject</name> + <message> + <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/> + <source>Cannot start playback. + +Check your Gstreamer installation and make sure you +have libgstreamer-plugins-base installed.</source> + <translation>不能开始回放。 + +请检查您的 Gstreamer 安装并且确认您 +已经安装 libgstreamer-plugins-base。</translation> + </message> + <message> + <location line="+113"/> + <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> + <translation>缺少一个需要的解码器。您需要安装如下解码器来播放这个内容:%0</translation> + </message> + <message> + <location line="+676"/> + <location line="+8"/> + <location line="+15"/> + <location line="+9"/> + <location line="+6"/> + <location line="+19"/> + <location line="+335"/> + <location line="+24"/> + <source>Could not open media source.</source> + <translation>不能打开媒体源。</translation> + </message> + <message> + <location line="-403"/> + <source>Invalid source type.</source> + <translation>无效的源类型。</translation> + </message> + <message> + <location line="+377"/> + <source>Could not locate media source.</source> + <translation>不能定位媒体源。</translation> + </message> + <message> + <location line="+10"/> + <source>Could not open audio device. The device is already in use.</source> + <translation>不能打开音频设备。这个设备正在被使用。</translation> + </message> + <message> + <location line="+13"/> + <source>Could not decode media source.</source> + <translation>不能解码媒体源。</translation> + </message> +</context> +<context> + <name>Phonon::VolumeSlider</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/> + <location line="+18"/> + <source>Volume: %1%</source> + <translation>音量:%1%</translation> + </message> + <message> + <location line="-15"/> + <location line="+18"/> + <location line="+54"/> + <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source> + <translation>请使用这个滑块调节音量。最左为%0,最右为%1%</translation> + </message> +</context> +<context> + <name>Q3Accel</name> + <message> + <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/> + <source>%1, %2 not defined</source> + <translation>%1,%2未定义</translation> + </message> + <message> + <location line="+36"/> + <source>Ambiguous %1 not handled</source> + <translation>不明确的%1没有被处理</translation> + </message> +</context> +<context> + <name>Q3DataTable</name> + <message> + <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/> + <source>True</source> + <translation>真</translation> + </message> + <message> + <location line="+1"/> + <source>False</source> + <translation>假</translation> + </message> + <message> + <location line="+505"/> + <source>Insert</source> + <translation>插入</translation> + </message> + <message> + <location line="+1"/> + <source>Update</source> + <translation>更新</translation> + </message> + <message> + <location line="+1"/> + <source>Delete</source> + <translation>删除</translation> + </message> +</context> +<context> + <name>Q3FileDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/> + <source>Copy or Move a File</source> + <translation>复制或者移动一个文件</translation> + </message> + <message> + <location line="+8"/> + <source>Read: %1</source> + <translation>读取:%1</translation> + </message> + <message> + <location line="+6"/> + <location line="+30"/> + <source>Write: %1</source> + <translation>写入:%1</translation> + </message> + <message> + <location line="-22"/> + <location line="+1575"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="-157"/> + <location line="+49"/> + <location line="+2153"/> + <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/> + <source>All Files (*)</source> + <translation>所有文件 (*)</translation> + </message> + <message> + <location line="-2089"/> + <source>Name</source> + <translation>名称</translation> + </message> + <message> + <location line="+1"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <translation>类型</translation> + </message> + <message> + <location line="+1"/> + <source>Date</source> + <translation>日期</translation> + </message> + <message> + <location line="+1"/> + <source>Attributes</source> + <translation>属性</translation> + </message> + <message> + <location line="+35"/> + <location line="+2031"/> + <source>&OK</source> + <translation>确定(&O)</translation> + </message> + <message> + <location line="-1991"/> + <source>Look &in:</source> + <translation>查找范围(&I):</translation> + </message> + <message> + <location line="+1"/> + <location line="+1981"/> + <location line="+16"/> + <source>File &name:</source> + <translation>文件名称(&N):</translation> + </message> + <message> + <location line="-1996"/> + <source>File &type:</source> + <translation>文件类型(&T):</translation> + </message> + <message> + <location line="+7"/> + <source>Back</source> + <translation>后退</translation> + </message> + <message> + <location line="+7"/> + <source>One directory up</source> + <translation>向上一级</translation> + </message> + <message> + <location line="+9"/> + <source>Create New Folder</source> + <translation>创建新文件夹</translation> + </message> + <message> + <location line="+18"/> + <source>List View</source> + <translation>列表视图</translation> + </message> + <message> + <location line="+8"/> + <source>Detail View</source> + <translation>详细视图</translation> + </message> + <message> + <location line="+9"/> + <source>Preview File Info</source> + <translation>预览文件信息</translation> + </message> + <message> + <location line="+23"/> + <source>Preview File Contents</source> + <translation>预览文件内容</translation> + </message> + <message> + <location line="+88"/> + <source>Read-write</source> + <translation>读写</translation> + </message> + <message> + <location line="+1"/> + <source>Read-only</source> + <translation>只读</translation> + </message> + <message> + <location line="+1"/> + <source>Write-only</source> + <translation>只写</translation> + </message> + <message> + <location line="+1"/> + <source>Inaccessible</source> + <translation>不可访问的</translation> + </message> + <message> + <location line="+2"/> + <source>Symlink to File</source> + <translation>文件的系统链接</translation> + </message> + <message> + <location line="+1"/> + <source>Symlink to Directory</source> + <translation>目录的系统链接</translation> + </message> + <message> + <location line="+1"/> + <source>Symlink to Special</source> + <translation>特殊的系统链接</translation> + </message> + <message> + <location line="+1"/> + <source>File</source> + <translation>文件</translation> + </message> + <message> + <location line="+1"/> + <source>Dir</source> + <translation>目录</translation> + </message> + <message> + <location line="+1"/> + <source>Special</source> + <translation>特殊</translation> + </message> + <message> + <location line="+704"/> + <location line="+2100"/> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/> + <source>Open</source> + <translation>打开</translation> + </message> + <message> + <location line="-1990"/> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/> + <source>Save As</source> + <translation>另存为</translation> + </message> + <message> + <location line="+642"/> + <location line="+5"/> + <location line="+355"/> + <source>&Open</source> + <translation>打开(&O)</translation> + </message> + <message> + <location line="-357"/> + <location line="+341"/> + <source>&Save</source> + <translation>保存(&S)</translation> + </message> + <message> + <location line="-334"/> + <source>&Rename</source> + <translation>重命名(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Delete</source> + <translation>删除(&D)</translation> + </message> + <message> + <location line="+20"/> + <source>R&eload</source> + <translation>重新载入(&E)</translation> + </message> + <message> + <location line="+4"/> + <source>Sort by &Name</source> + <translation>按名称排列(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Sort by &Size</source> + <translation>按大小排列(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Sort by &Date</source> + <translation>按日期排列(&D)</translation> + </message> + <message> + <location line="+2"/> + <source>&Unsorted</source> + <translation>未排列的(&U)</translation> + </message> + <message> + <location line="+15"/> + <source>Sort</source> + <translation>排列</translation> + </message> + <message> + <location line="+4"/> + <source>Show &hidden files</source> + <translation>显示隐藏文件(&H)</translation> + </message> + <message> + <location line="+31"/> + <source>the file</source> + <translation>文件</translation> + </message> + <message> + <location line="+2"/> + <source>the directory</source> + <translation>目录</translation> + </message> + <message> + <location line="+2"/> + <source>the symlink</source> + <translation>系统链接</translation> + </message> + <message> + <location line="+3"/> + <source>Delete %1</source> + <translation>删除%1</translation> + </message> + <message> + <location line="+1"/> + <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> + <translation><qt>你确认你想删除%1,“%2”?</qt></translation> + </message> + <message> + <location line="+2"/> + <source>&Yes</source> + <translation>是(&Y)</translation> + </message> + <message> + <location line="+0"/> + <source>&No</source> + <translation>否(&N)</translation> + </message> + <message> + <location line="+36"/> + <source>New Folder 1</source> + <translation>新建文件夹1</translation> + </message> + <message> + <location line="+5"/> + <source>New Folder</source> + <translation>新建文件夹</translation> + </message> + <message> + <location line="+5"/> + <source>New Folder %1</source> + <translation>新建文件夹%1</translation> + </message> + <message> + <location line="+98"/> + <source>Find Directory</source> + <translation>查找目录</translation> + </message> + <message> + <location line="+5"/> + <location line="+108"/> + <source>Directories</source> + <translation>目录</translation> + </message> + <message> + <location line="-2"/> + <source>Directory:</source> + <translation>目录:</translation> + </message> + <message> + <location line="+40"/> + <location line="+1110"/> + <source>Error</source> + <translation>错误</translation> + </message> + <message> + <location line="-1109"/> + <source>%1 +File not found. +Check path and filename.</source> + <translation>文件%1 +未找到。 +请检查路径和文件名。 +</translation> + </message> + <message> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/> + <source>All Files (*.*)</source> + <translation>所有文件 (*.*)</translation> + </message> + <message> + <location line="+375"/> + <source>Open </source> + <translation>打开</translation> + </message> + <message> + <location line="+155"/> + <source>Select a Directory</source> + <translation>选择一个目录</translation> + </message> +</context> +<context> + <name>Q3LocalFs</name> + <message> + <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/> + <location line="+10"/> + <source>Could not read directory +%1</source> + <translation>不能读取目录 +%1</translation> + </message> + <message> + <location line="+45"/> + <source>Could not create directory +%1</source> + <translation>不能创建目录 +%1</translation> + </message> + <message> + <location line="+34"/> + <source>Could not remove file or directory +%1</source> + <translation>不能移除文件或者目录 +%1</translation> + </message> + <message> + <location line="+27"/> + <source>Could not rename +%1 +to +%2</source> + <translation>不能把 +%1 +重命名为 +%2</translation> + </message> + <message> + <location line="+25"/> + <source>Could not open +%1</source> + <translation>不能打开 +%1</translation> + </message> + <message> + <location line="+68"/> + <source>Could not write +%1</source> + <translation>不能写入 +%1</translation> + </message> +</context> +<context> + <name>Q3MainWindow</name> + <message> + <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/> + <source>Line up</source> + <translation>排列</translation> + </message> + <message> + <location line="+2"/> + <source>Customize...</source> + <translation>自定义...</translation> + </message> +</context> +<context> + <name>Q3NetworkProtocol</name> + <message> + <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/> + <source>Operation stopped by the user</source> + <translation>操作被用户停止</translation> + </message> +</context> +<context> + <name>Q3ProgressDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/> + <location line="+61"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>Q3TabDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/> + <location line="+814"/> + <source>OK</source> + <translation>确认</translation> + </message> + <message> + <location line="-356"/> + <source>Apply</source> + <translation>应用</translation> + </message> + <message> + <location line="+43"/> + <source>Help</source> + <translation>帮助</translation> + </message> + <message> + <location line="+45"/> + <source>Defaults</source> + <translation>默认</translation> + </message> + <message> + <location line="+50"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>Q3TextEdit</name> + <message> + <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/> + <source>&Undo</source> + <translation>撤消(&U)</translation> + </message> + <message> + <location line="+1"/> + <source>&Redo</source> + <translation>恢复(&R)</translation> + </message> + <message> + <location line="+5"/> + <source>Cu&t</source> + <translation>剪切(&T)</translation> + </message> + <message> + <location line="+1"/> + <source>&Copy</source> + <translation>复制(&C)</translation> + </message> + <message> + <location line="+2"/> + <source>&Paste</source> + <translation>粘贴(&P)</translation> + </message> + <message> + <location line="+3"/> + <source>Clear</source> + <translation>清空</translation> + </message> + <message> + <location line="+4"/> + <location line="+2"/> + <source>Select All</source> + <translation>选择全部</translation> + </message> +</context> +<context> + <name>Q3TitleBar</name> + <message> + <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/> + <source>System</source> + <translation>系统</translation> + </message> + <message> + <location line="+3"/> + <source>Restore up</source> + <translation>向上恢复</translation> + </message> + <message> + <location line="+1"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+3"/> + <source>Restore down</source> + <translation>向下恢复</translation> + </message> + <message> + <location line="+1"/> + <source>Maximize</source> + <translation>最大化</translation> + </message> + <message> + <location line="+2"/> + <source>Close</source> + <translation>关闭</translation> + </message> + <message> + <location line="+18"/> + <source>Contains commands to manipulate the window</source> + <translation>包含操作窗口的命令。</translation> + </message> + <message> + <location line="+3"/> + <source>Puts a minimized back to normal</source> + <translation>把一个最小化窗口恢复为普通状态</translation> + </message> + <message> + <location line="+1"/> + <source>Moves the window out of the way</source> + <translation>把窗口移到外面</translation> + </message> + <message> + <location line="+3"/> + <source>Puts a maximized window back to normal</source> + <translation>把一个最大化窗口恢复为普通状态</translation> + </message> + <message> + <location line="+1"/> + <source>Makes the window full screen</source> + <translation>窗口全屏化</translation> + </message> + <message> + <location line="+2"/> + <source>Closes the window</source> + <translation>关闭窗口</translation> + </message> + <message> + <location line="+2"/> + <source>Displays the name of the window and contains controls to manipulate it</source> + <translation>显示窗口名称并且包含维护它的控件</translation> + </message> +</context> +<context> + <name>Q3ToolBar</name> + <message> + <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/> + <source>More...</source> + <translation>更多...</translation> + </message> +</context> +<context> + <name>Q3UrlOperator</name> + <message> + <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/> + <location line="+260"/> + <location line="+4"/> + <source>The protocol `%1' is not supported</source> + <translation>协议“%1”不被支持</translation> + </message> + <message> + <location line="-260"/> + <source>The protocol `%1' does not support listing directories</source> + <translation>协议“%1”不支持列出目录</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support creating new directories</source> + <translation>协议“%1”不支持创建新目录</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support removing files or directories</source> + <translation>协议“%1”不支持移除文件或者目录</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support renaming files or directories</source> + <translation>协议“%1”不支持重命名文件或者目录</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support getting files</source> + <translation>协议“%1”不支持获取文件</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support putting files</source> + <translation>协议“%1”不支持上传文件</translation> + </message> + <message> + <location line="+243"/> + <location line="+4"/> + <source>The protocol `%1' does not support copying or moving files or directories</source> + <translation>协议“%1”不支持复制或者移动文件或者目录</translation> + </message> + <message> + <location line="+237"/> + <location line="+1"/> + <source>(unknown)</source> + <translation>(未知的)</translation> + </message> +</context> +<context> + <name>Q3Wizard</name> + <message> + <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location line="+1"/> + <source>< &Back</source> + <translation>< 上一步(&B)</translation> + </message> + <message> + <location line="+1"/> + <source>&Next ></source> + <translation>下一步(&N) ></translation> + </message> + <message> + <location line="+1"/> + <source>&Finish</source> + <translation>完成(&F)</translation> + </message> + <message> + <location line="+1"/> + <source>&Help</source> + <translation>帮助(&H)</translation> + </message> +</context> +<context> + <name>QAbstractSocket</name> + <message> + <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/> + <location line="+26"/> + <source>Host not found</source> + <translation>主机未找到</translation> + </message> + <message> + <location line="+50"/> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/> + <source>Connection refused</source> + <translation>连接被拒绝</translation> + </message> + <message> + <location line="+141"/> + <source>Connection timed out</source> + <translation>连接超时</translation> + </message> + <message> + <location line="-547"/> + <location line="+787"/> + <location line="+208"/> + <source>Operation on socket is not supported</source> + <translation>Socket操作不被支持</translation> + </message> + <message> + <location line="+137"/> + <source>Socket operation timed out</source> + <translation>套接字操作超时</translation> + </message> + <message> + <location line="+380"/> + <source>Socket is not connected</source> + <translation>套接字没有被连接</translation> + </message> + <message> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/> + <source>Network unreachable</source> + <translation>网络不能访问</translation> + </message> +</context> +<context> + <name>QAbstractSpinBox</name> + <message> + <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/> + <source>&Step up</source> + <translation>增加(&S)</translation> + </message> + <message> + <location line="+2"/> + <source>Step &down</source> + <translation>减少(&D)</translation> + </message> + <message> + <location line="-8"/> + <source>&Select All</source> + <translation>选择全部(&S)</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/> + <source>Activate</source> + <translation>激活</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/> + <source>Executable '%1' requires Qt %2, found Qt %3.</source> + <translation>执行“%1”需要Qt %2,只找到了Qt %3。</translation> + </message> + <message> + <location line="+2"/> + <source>Incompatible Qt Library Error</source> + <translation>不兼容的Qt错误</translation> + </message> + <message> + <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation>LTR</translation> + </message> + <message> + <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+2"/> + <source>Activates the program's main window</source> + <translation>激活这个程序的主窗口</translation> + </message> +</context> +<context> + <name>QAxSelect</name> + <message> + <location filename="../src/activeqt/container/qaxselect.ui"/> + <source>Select ActiveX Control</source> + <translation>选择ActiveX控件</translation> + </message> + <message> + <location/> + <source>OK</source> + <translation>确定</translation> + </message> + <message> + <location/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location/> + <source>COM &Object:</source> + <translation>COM对象(&O):</translation> + </message> +</context> +<context> + <name>QCheckBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/> + <source>Uncheck</source> + <translation>取消选中</translation> + </message> + <message> + <location line="+3"/> + <source>Check</source> + <translation>选中</translation> + </message> + <message> + <location line="+1"/> + <source>Toggle</source> + <translation>切换</translation> + </message> +</context> +<context> + <name>QColorDialog</name> + <message> + <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/> + <source>Hu&e:</source> + <translation>色调(&E):</translation> + </message> + <message> + <location line="+1"/> + <source>&Sat:</source> + <translation>饱和度(&S):</translation> + </message> + <message> + <location line="+1"/> + <source>&Val:</source> + <translation>亮度(&V):</translation> + </message> + <message> + <location line="+1"/> + <source>&Red:</source> + <translation>红色(&R):</translation> + </message> + <message> + <location line="+1"/> + <source>&Green:</source> + <translation>绿色(&G):</translation> + </message> + <message> + <location line="+1"/> + <source>Bl&ue:</source> + <translation>蓝色(&U):</translation> + </message> + <message> + <location line="+1"/> + <source>A&lpha channel:</source> + <translation>Alpha通道(&A):</translation> + </message> + <message> + <location line="+101"/> + <source>Select Color</source> + <translation>选择颜色</translation> + </message> + <message> + <location line="+137"/> + <source>&Basic colors</source> + <translation>基本颜色(&B)</translation> + </message> + <message> + <location line="+1"/> + <source>&Custom colors</source> + <translation>自定义颜色(&C)</translation> + </message> + <message> + <location line="+1"/> + <source>&Add to Custom Colors</source> + <translation>添加到自定义颜色(&A)</translation> + </message> + <message> + <source>Select color</source> + <translation type="obsolete">选择颜色</translation> + </message> +</context> +<context> + <name>QComboBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/> + <location line="+65"/> + <source>Open</source> + <translation>打开</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/> + <source>False</source> + <translation>假</translation> + </message> + <message> + <location line="+1"/> + <source>True</source> + <translation>真</translation> + </message> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/> + <source>Close</source> + <translation>关闭</translation> + </message> +</context> +<context> + <name>QCoreApplication</name> + <message> + <source>%1: permission denied</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:权限被拒绝</translation> + </message> + <message> + <source>%1: already exists</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:已经存在</translation> + </message> + <message> + <source>%1: doesn't exists</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:不存在</translation> + </message> + <message> + <source>%1: out of resources</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:资源耗尽了</translation> + </message> + <message> + <source>%1: unknown error %2</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:未知错误 %2</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/> + <source>%1: key is empty</source> + <comment>QSystemSemaphore</comment> + <translation>%1:键是空的</translation> + </message> + <message> + <location line="+12"/> + <source>%1: unable to make key</source> + <comment>QSystemSemaphore</comment> + <translation>%1:不能制造键</translation> + </message> + <message> + <location line="+9"/> + <source>%1: ftok failed</source> + <comment>QSystemSemaphore</comment> + <translation>%1:ftok 失败</translation> + </message> +</context> +<context> + <name>QDB2Driver</name> + <message> + <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/> + <source>Unable to connect</source> + <translation>不能连接</translation> + </message> + <message> + <location line="+303"/> + <source>Unable to commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>不能回滚事务</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to set autocommit</source> + <translation>不能设置自动提交</translation> + </message> +</context> +<context> + <name>QDB2Result</name> + <message> + <location line="-1043"/> + <location line="+243"/> + <source>Unable to execute statement</source> + <translation>不能执行语句</translation> + </message> + <message> + <location line="-206"/> + <source>Unable to prepare statement</source> + <translation>不能准备语句</translation> + </message> + <message> + <location line="+196"/> + <source>Unable to bind variable</source> + <translation>不能帮定变量</translation> + </message> + <message> + <location line="+92"/> + <source>Unable to fetch record %1</source> + <translation>不能获取记录%1</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to fetch next</source> + <translation>不能获取下一个</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to fetch first</source> + <translation>不能获取第一个</translation> + </message> +</context> +<context> + <name>QDateTimeEdit</name> + <message> + <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/> + <source>AM</source> + <translation>AM</translation> + </message> + <message> + <location line="+0"/> + <source>am</source> + <translation>am</translation> + </message> + <message> + <location line="+2"/> + <source>PM</source> + <translation>PM</translation> + </message> + <message> + <location line="+0"/> + <source>pm</source> + <translation>pm</translation> + </message> +</context> +<context> + <name>QDial</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/> + <source>QDial</source> + <translation>QDial</translation> + </message> + <message> + <location line="+2"/> + <source>SpeedoMeter</source> + <translation>SpeedoMeter</translation> + </message> + <message> + <location line="+2"/> + <source>SliderHandle</source> + <translation>SliderHandle</translation> + </message> +</context> +<context> + <name>QDialog</name> + <message> + <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/> + <source>What's This?</source> + <translation>这是什么?</translation> + </message> + <message> + <location line="-115"/> + <source>Done</source> + <translation>完成</translation> + </message> +</context> +<context> + <name>QDialogButtonBox</name> + <message> + <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/> + <location line="+464"/> + <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/> + <source>OK</source> + <translation>确定</translation> + </message> + <message> + <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/> + <source>Save</source> + <translation>保存</translation> + </message> + <message> + <location line="+0"/> + <source>&Save</source> + <translation>保存(&S)</translation> + </message> + <message> + <location line="+3"/> + <source>Open</source> + <translation>打开</translation> + </message> + <message> + <location line="+3"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+0"/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location line="+3"/> + <source>Close</source> + <translation>关闭</translation> + </message> + <message> + <location line="+0"/> + <source>&Close</source> + <translation>关闭(&C)</translation> + </message> + <message> + <location line="+3"/> + <source>Apply</source> + <translation>应用</translation> + </message> + <message> + <location line="+3"/> + <source>Reset</source> + <translation>重置</translation> + </message> + <message> + <location line="+3"/> + <source>Help</source> + <translation>帮助</translation> + </message> + <message> + <location line="+4"/> + <source>Don't Save</source> + <translation>不保存</translation> + </message> + <message> + <location line="+4"/> + <source>Discard</source> + <translation>抛弃</translation> + </message> + <message> + <location line="+3"/> + <source>&Yes</source> + <translation>是(&Y)</translation> + </message> + <message> + <location line="+3"/> + <source>Yes to &All</source> + <translation>全部是(&A)</translation> + </message> + <message> + <location line="+3"/> + <source>&No</source> + <translation>否(&N)</translation> + </message> + <message> + <location line="+3"/> + <source>N&o to All</source> + <translation>全部否(&O)</translation> + </message> + <message> + <location line="+3"/> + <source>Save All</source> + <translation>保存全部</translation> + </message> + <message> + <location line="+3"/> + <source>Abort</source> + <translation>放弃</translation> + </message> + <message> + <location line="+3"/> + <source>Retry</source> + <translation>重试</translation> + </message> + <message> + <location line="+3"/> + <source>Ignore</source> + <translation>忽略</translation> + </message> + <message> + <location line="+3"/> + <source>Restore Defaults</source> + <translation>恢复默认</translation> + </message> + <message> + <location line="-29"/> + <source>Close without Saving</source> + <translation>不保存关闭</translation> + </message> + <message> + <location line="-27"/> + <source>&OK</source> + <translation>确定(&O)</translation> + </message> +</context> +<context> + <name>QDirModel</name> + <message> + <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/> + <source>Name</source> + <translation>名称</translation> + </message> + <message> + <location line="+1"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+3"/> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>类型</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <comment>All other platforms</comment> + <translation>类型</translation> + </message> + <message> + <location line="+6"/> + <source>Date Modified</source> + <translation>日期被修改</translation> + </message> +</context> +<context> + <name>QDockWidget</name> + <message> + <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/> + <source>Close</source> + <translation>关闭</translation> + </message> + <message> + <location line="+2"/> + <source>Dock</source> + <translation>锚接</translation> + </message> + <message> + <location line="+1"/> + <source>Float</source> + <translation>浮动</translation> + </message> +</context> +<context> + <name>QDoubleSpinBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/> + <source>More</source> + <translation>更多</translation> + </message> + <message> + <location line="+2"/> + <source>Less</source> + <translation>更少</translation> + </message> +</context> +<context> + <name>QErrorMessage</name> + <message> + <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+192"/> + <source>Debug Message:</source> + <translation>调试消息:</translation> + </message> + <message> + <location line="+3"/> + <source>Warning:</source> + <translation>警告:</translation> + </message> + <message> + <location line="+3"/> + <source>Fatal Error:</source> + <translation>致命错误:</translation> + </message> + <message> + <location line="+193"/> + <source>&Show this message again</source> + <translation>再次显示这个消息(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>&OK</source> + <translation>确定(&O)</translation> + </message> +</context> +<context> + <name>QFile</name> + <message> + <location filename="../src/corelib/io/qfile.cpp" line="+708"/> + <location line="+141"/> + <source>Destination file exists</source> + <translation>目标文件已存在</translation> + </message> + <message> + <location line="-108"/> + <source>Cannot remove source file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+120"/> + <source>Cannot open %1 for input</source> + <translation>无法输入 %1 </translation> + </message> + <message> + <location line="+17"/> + <source>Cannot open for output</source> + <translation>无法输出</translation> + </message> + <message> + <location line="+10"/> + <source>Failure to write block</source> + <translation>写块失败</translation> + </message> + <message> + <location line="+13"/> + <source>Cannot create %1 for output</source> + <translation>无法创建 %1 </translation> + </message> +</context> +<context> + <name>QFileDialog</name> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/> + <location line="+444"/> + <source>All Files (*)</source> + <translation>所有文件 (*)</translation> + </message> + <message> + <location line="+222"/> + <source>Directories</source> + <translation>目录</translation> + </message> + <message> + <location line="-3"/> + <location line="+50"/> + <location line="+1471"/> + <location line="+75"/> + <source>&Open</source> + <translation>打开(&O)</translation> + </message> + <message> + <location line="-1596"/> + <location line="+50"/> + <source>&Save</source> + <translation>保存(&S)</translation> + </message> + <message> + <location line="-730"/> + <source>Open</source> + <translation>打开</translation> + </message> + <message> + <location line="+1515"/> + <source>%1 already exists. +Do you want to replace it?</source> + <translation>%1已经存在。 +你想要替换它么?</translation> + </message> + <message> + <location line="+20"/> + <source>%1 +File not found. +Please verify the correct file name was given.</source> + <translation>文件%1 +没有找到。 +请核实已给定正确文件名。</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/> + <source>My Computer</source> + <translation>我的计算机</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1504"/> + <source>&Rename</source> + <translation>重命名(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Delete</source> + <translation>删除(&D)</translation> + </message> + <message> + <location line="+1"/> + <source>Show &hidden files</source> + <translation>显示隐藏文件(&H)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Back</source> + <translation>后退</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Parent Directory</source> + <translation>父目录</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>List View</source> + <translation>列表视图</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Detail View</source> + <translation>详细视图</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Files of type:</source> + <translation>文件类型:</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+6"/> + <location line="+648"/> + <source>Directory:</source> + <translation>目录:</translation> + </message> + <message> + <location line="+794"/> + <location line="+862"/> + <source>%1 +Directory not found. +Please verify the correct directory name was given.</source> + <translation>目录%1 +没有找到。 +请核实已给定正确目录名。</translation> + </message> + <message> + <location line="-218"/> + <source>'%1' is write protected. +Do you want to delete it anyway?</source> + <translation>“%1“是写保护的。 +你还是想删除它么?</translation> + </message> + <message> + <location line="+5"/> + <source>Are sure you want to delete '%1'?</source> + <translation>你确认你想删除“%1“?</translation> + </message> + <message> + <location line="+15"/> + <source>Could not delete directory.</source> + <translation>不能删除目录。</translation> + </message> + <message> + <location line="+407"/> + <source>Recent Places</source> + <translation>最近的地方</translation> + </message> + <message> + <location line="-2550"/> + <source>Save As</source> + <translation>另存为</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+411"/> + <source>Drive</source> + <translation>驱动器</translation> + </message> + <message> + <location line="+3"/> + <location line="+1"/> + <source>File</source> + <translation>文件</translation> + </message> + <message> + <location line="+29"/> + <source>Unknown</source> + <translation>未知的</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-4"/> + <source>Find Directory</source> + <translation>查找目录</translation> + </message> + <message> + <location line="+29"/> + <source>Show </source> + <translation>显示 </translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Forward</source> + <translation>前进</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1970"/> + <source>New Folder</source> + <translation>新建文件夹</translation> + </message> + <message> + <location line="-1963"/> + <source>&New Folder</source> + <translation>新建文件夹(&N)</translation> + </message> + <message> + <location line="+656"/> + <location line="+38"/> + <source>&Choose</source> + <translation>选择(&C)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/> + <location line="+652"/> + <source>File &name:</source> + <translation>文件名称(&N):</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Look in:</source> + <translation>查看:</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Create New Folder</source> + <translation>创建新文件夹</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/> + <source>All Files (*.*)</source> + <translation>所有文件 (*.*)</translation> + </message> +</context> +<context> + <name>QFileSystemModel</name> + <message> + <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+744"/> + <source>%1 TB</source> + <translation>%1 TB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 GB</source> + <translation>%1 GB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 MB</source> + <translation>%1 MB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 KB</source> + <translation>%1千字节</translation> + </message> + <message> + <location line="+1"/> + <source>%1 bytes</source> + <translation>%1字节</translation> + </message> + <message> + <location line="+77"/> + <source>Invalid filename</source> + <translation>无效文件名</translation> + </message> + <message> + <location line="+1"/> + <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> + <translation><b>名称“%1“不能被使用。</b><p>请使用另外一个包含更少字符或者不含有标点符号的名称。</translation> + </message> + <message> + <location line="+63"/> + <source>Name</source> + <translation>名称</translation> + </message> + <message> + <location line="+2"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+4"/> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>类型</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <comment>All other platforms</comment> + <translation>类型</translation> + </message> + <message> + <location line="+7"/> + <source>Date Modified</source> + <translation>日期被修改</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/> + <source>My Computer</source> + <translation>我的计算机</translation> + </message> + <message> + <location line="+2"/> + <source>Computer</source> + <translation>计算机</translation> + </message> +</context> +<context> + <name>QFontDatabase</name> + <message> + <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/> + <location line="+1176"/> + <source>Normal</source> + <translation>普通</translation> + </message> + <message> + <location line="-1173"/> + <location line="+12"/> + <location line="+1149"/> + <source>Bold</source> + <translation>粗体</translation> + </message> + <message> + <location line="-1158"/> + <location line="+1160"/> + <source>Demi Bold</source> + <translation>半粗体</translation> + </message> + <message> + <location line="-1157"/> + <location line="+18"/> + <location line="+1135"/> + <source>Black</source> + <translation>黑体</translation> + </message> + <message> + <location line="-1145"/> + <source>Demi</source> + <translation>半体</translation> + </message> + <message> + <location line="+6"/> + <location line="+1145"/> + <source>Light</source> + <translation>轻体</translation> + </message> + <message> + <location line="-1004"/> + <location line="+1007"/> + <source>Italic</source> + <translation>意大利体</translation> + </message> + <message> + <location line="-1004"/> + <location line="+1006"/> + <source>Oblique</source> + <translation>斜体</translation> + </message> + <message> + <location line="+705"/> + <source>Any</source> + <translation>任意</translation> + </message> + <message> + <location line="+3"/> + <source>Latin</source> + <translation>拉丁文</translation> + </message> + <message> + <location line="+3"/> + <source>Greek</source> + <translation>希腊文</translation> + </message> + <message> + <location line="+3"/> + <source>Cyrillic</source> + <translation>西里尔文</translation> + </message> + <message> + <location line="+3"/> + <source>Armenian</source> + <translation>亚美尼亚文</translation> + </message> + <message> + <location line="+3"/> + <source>Hebrew</source> + <translation>希伯来文</translation> + </message> + <message> + <location line="+3"/> + <source>Arabic</source> + <translation>阿拉伯文</translation> + </message> + <message> + <location line="+3"/> + <source>Syriac</source> + <translation>叙利亚文</translation> + </message> + <message> + <location line="+3"/> + <source>Thaana</source> + <translation>马尔代夫文</translation> + </message> + <message> + <location line="+3"/> + <source>Devanagari</source> + <translation>梵文</translation> + </message> + <message> + <location line="+3"/> + <source>Bengali</source> + <translation>孟加拉文</translation> + </message> + <message> + <location line="+3"/> + <source>Gurmukhi</source> + <translation>旁遮普文</translation> + </message> + <message> + <location line="+3"/> + <source>Gujarati</source> + <translation>古吉拉特文</translation> + </message> + <message> + <location line="+3"/> + <source>Oriya</source> + <translation>奥里雅文</translation> + </message> + <message> + <location line="+3"/> + <source>Tamil</source> + <translation>泰米尔文</translation> + </message> + <message> + <location line="+3"/> + <source>Telugu</source> + <translation>泰卢固文</translation> + </message> + <message> + <location line="+3"/> + <source>Kannada</source> + <translation>埃纳德文</translation> + </message> + <message> + <location line="+3"/> + <source>Malayalam</source> + <translation>马拉亚拉姆文</translation> + </message> + <message> + <location line="+3"/> + <source>Sinhala</source> + <translation>僧伽罗文</translation> + </message> + <message> + <location line="+3"/> + <source>Thai</source> + <translation>泰国文</translation> + </message> + <message> + <location line="+3"/> + <source>Lao</source> + <translation>老挝文</translation> + </message> + <message> + <location line="+3"/> + <source>Tibetan</source> + <translation>藏文</translation> + </message> + <message> + <location line="+3"/> + <source>Myanmar</source> + <translation>缅甸文</translation> + </message> + <message> + <location line="+3"/> + <source>Georgian</source> + <translation>格鲁吉亚文</translation> + </message> + <message> + <location line="+3"/> + <source>Khmer</source> + <translation>谷美尔文</translation> + </message> + <message> + <location line="+3"/> + <source>Simplified Chinese</source> + <translation>简体中文</translation> + </message> + <message> + <location line="+3"/> + <source>Traditional Chinese</source> + <translation>繁体中文</translation> + </message> + <message> + <location line="+3"/> + <source>Japanese</source> + <translation>日文</translation> + </message> + <message> + <location line="+3"/> + <source>Korean</source> + <translation>韩文</translation> + </message> + <message> + <location line="+3"/> + <source>Vietnamese</source> + <translation>越南文</translation> + </message> + <message> + <location line="+3"/> + <source>Symbol</source> + <translation>符号</translation> + </message> + <message> + <location line="+3"/> + <source>Ogham</source> + <translation>欧甘文</translation> + </message> + <message> + <location line="+3"/> + <source>Runic</source> + <translation>古北欧文</translation> + </message> +</context> +<context> + <name>QFontDialog</name> + <message> + <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/> + <source>&Font</source> + <translation>字体(&F)</translation> + </message> + <message> + <location line="+1"/> + <source>Font st&yle</source> + <translation>字体风格(&Y)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Effects</source> + <translation>效果</translation> + </message> + <message> + <location line="+1"/> + <source>Stri&keout</source> + <translation>删除线(&K)</translation> + </message> + <message> + <location line="+1"/> + <source>&Underline</source> + <translation>下划线(&U)</translation> + </message> + <message> + <location line="+1"/> + <source>Sample</source> + <translation>实例</translation> + </message> + <message> + <location line="+1"/> + <source>Wr&iting System</source> + <translation>书写系统(&I)</translation> + </message> + <message> + <location line="-604"/> + <location line="+247"/> + <source>Select Font</source> + <translation>选择字体</translation> + </message> +</context> +<context> + <name>QFtp</name> + <message> + <location filename="../src/network/access/qftp.cpp" line="+826"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+683"/> + <source>Not connected</source> + <translation>没有连接</translation> + </message> + <message> + <location line="+65"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+65"/> + <source>Host %1 not found</source> + <translation>主机%1没有找到</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/> + <source>Connection refused to host %1</source> + <translation>连接被主机 %1 拒绝</translation> + </message> + <message> + <location line="+4"/> + <source>Connection timed out to host %1</source> + <translation>主机%1连接超时</translation> + </message> + <message> + <location line="+104"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+102"/> + <location line="+1451"/> + <source>Connected to host %1</source> + <translation>连接到主机%1了</translation> + </message> + <message> + <location line="+219"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="-1290"/> + <source>Connection refused for data connection</source> + <translation>因为数据连接而被拒绝连接</translation> + </message> + <message> + <location line="+178"/> + <location line="+29"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+195"/> + <location line="+728"/> + <source>Unknown error</source> + <translation>未知的错误</translation> + </message> + <message> + <location line="+889"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/> + <source>Connecting to host failed: +%1</source> + <translation>连接主机失败: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Login failed: +%1</source> + <translation>登录失败: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Listing directory failed: +%1</source> + <translation>列出目录失败: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Changing directory failed: +%1</source> + <translation>改变目录失败: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Downloading file failed: +%1</source> + <translation>下载文件失败: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Uploading file failed: +%1</source> + <translation>上传文件失败: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Removing file failed: +%1</source> + <translation>移除文件失败: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Creating directory failed: +%1</source> + <translation>创建目录失败: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Removing directory failed: +%1</source> + <translation>移除目录失败: +%1</translation> + </message> + <message> + <location line="+28"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+25"/> + <location line="+250"/> + <source>Connection closed</source> + <translation>连接关闭了</translation> + </message> + <message> + <location filename="../src/qt3support/network/q3ftp.cpp" line="-11"/> + <source>Host %1 found</source> + <translation>主机%1找到了</translation> + </message> + <message> + <location line="+4"/> + <source>Connection to %1 closed</source> + <translation>到%1的连接关闭了</translation> + </message> + <message> + <location line="+3"/> + <source>Host found</source> + <translation>主机找到了</translation> + </message> + <message> + <location line="+2"/> + <source>Connected to host</source> + <translation>连接到主机了</translation> + </message> +</context> +<context> + <name>QHostInfo</name> + <message> + <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/> + <source>Unknown error</source> + <translation>未知的错误</translation> + </message> +</context> +<context> + <name>QHostInfoAgent</name> + <message> + <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/> + <location line="+9"/> + <location line="+64"/> + <location line="+31"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/> + <location line="+9"/> + <location line="+40"/> + <location line="+27"/> + <source>Host not found</source> + <translation>主机未找到</translation> + </message> + <message> + <location line="-44"/> + <location line="+39"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/> + <location line="+29"/> + <source>Unknown address type</source> + <translation>未知的地址类型</translation> + </message> + <message> + <location line="+8"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/> + <location line="+27"/> + <source>Unknown error</source> + <translation>未知的错误</translation> + </message> +</context> +<context> + <name>QHttp</name> + <message> + <location filename="../src/network/access/qhttp.cpp" line="+1574"/> + <location line="+820"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+1160"/> + <location line="+567"/> + <source>Unknown error</source> + <translation>未知的错误</translation> + </message> + <message> + <location line="-568"/> + <location filename="../src/qt3support/network/q3http.cpp" line="-370"/> + <source>Request aborted</source> + <translation>请求被放弃了</translation> + </message> + <message> + <location line="+579"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+381"/> + <source>No server set to connect to</source> + <translation>没有设置要连接的服务器</translation> + </message> + <message> + <location line="+164"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+56"/> + <source>Wrong content length</source> + <translation>错误的内容长度</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+4"/> + <source>Server closed connection unexpectedly</source> + <translation>服务器异常地关闭了连接</translation> + </message> + <message> + <location line="+179"/> + <source>Unknown authentication method</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+183"/> + <source>Error writing response to device</source> + <translation>向设备中进行写回复时发生错误</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+38"/> + <source>Connection refused</source> + <translation>连接被拒绝</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-304"/> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>Host %1 not found</source> + <translation>主机%1没有找到</translation> + </message> + <message> + <location line="+20"/> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/> + <location line="+19"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>HTTP request failed</source> + <translation>HTTP请求失败</translation> + </message> + <message> + <location line="+73"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+69"/> + <source>Invalid HTTP response header</source> + <translation>无效的HTTP响应头</translation> + </message> + <message> + <location line="+125"/> + <location line="+48"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+40"/> + <location line="+47"/> + <source>Invalid HTTP chunked body</source> + <translation>无效的HTTP臃肿体</translation> + </message> + <message> + <location filename="../src/qt3support/network/q3http.cpp" line="+294"/> + <source>Host %1 found</source> + <translation>主机%1找到了</translation> + </message> + <message> + <location line="+3"/> + <source>Connected to host %1</source> + <translation>连接到%1主机了</translation> + </message> + <message> + <location line="+3"/> + <source>Connection to %1 closed</source> + <translation>到%1的连接关闭了</translation> + </message> + <message> + <location line="+8"/> + <source>Host found</source> + <translation>主机找到了</translation> + </message> + <message> + <location line="+3"/> + <source>Connected to host</source> + <translation>连接到主机了</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>Connection closed</source> + <translation>连接关闭了</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-135"/> + <source>Proxy authentication required</source> + <translation>代理需要认证</translation> + </message> + <message> + <location line="+4"/> + <source>Authentication required</source> + <translation>需要认证</translation> + </message> + <message> + <location line="-138"/> + <source>Connection refused (or timed out)</source> + <translation>连接被拒绝(或者超时)</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/> + <source>Proxy requires authentication</source> + <translation>代理需要验证</translation> + </message> + <message> + <location line="+3"/> + <source>Host requires authentication</source> + <translation>主机需要验证</translation> + </message> + <message> + <location line="+3"/> + <source>Data corrupted</source> + <translation>数据错误</translation> + </message> + <message> + <location line="+3"/> + <source>Unknown protocol specified</source> + <translation>所指定的协议是未知的</translation> + </message> + <message> + <location line="+3"/> + <source>SSL handshake failed</source> + <translation>SSL 握手失败</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-2263"/> + <source>HTTPS connection requested but SSL support not compiled in</source> + <translation>HTTPS 连接需要 SSL,但它没有被编译进来</translation> + </message> +</context> +<context> + <name>QHttpSocketEngine</name> + <message> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/> + <source>Did not receive HTTP response from proxy</source> + <translation>未收到代理的HTTP响应</translation> + </message> + <message> + <location line="+25"/> + <source>Error parsing authentication request from proxy</source> + <translation>解析代理的认证请求出错</translation> + </message> + <message> + <location line="+31"/> + <source>Authentication required</source> + <translation>需要认证</translation> + </message> + <message> + <location line="+27"/> + <source>Proxy denied connection</source> + <translation>代理拒绝连接</translation> + </message> + <message> + <location line="+10"/> + <source>Error communicating with HTTP proxy</source> + <translation>和HTTP代理通讯时发生错误</translation> + </message> + <message> + <location line="+23"/> + <source>Proxy server not found</source> + <translation>未找到代理服务器</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy connection refused</source> + <translation>代理连接被拒绝</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy server connection timed out</source> + <translation>代理服务器连接超时</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy connection closed prematurely</source> + <translation>代理连接过早关闭</translation> + </message> +</context> +<context> + <name>QIBaseDriver</name> + <message> + <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/> + <source>Error opening database</source> + <translation>打开数据库错误</translation> + </message> + <message> + <location line="+54"/> + <source>Could not start transaction</source> + <translation>不能开始事务</translation> + </message> + <message> + <location line="+13"/> + <source>Unable to commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+13"/> + <source>Unable to rollback transaction</source> + <translation>不能回滚事务</translation> + </message> +</context> +<context> + <name>QIBaseResult</name> + <message> + <location line="-1097"/> + <source>Unable to create BLOB</source> + <translation>不能创建BLOB</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to write BLOB</source> + <translation>不能写入BLOB</translation> + </message> + <message> + <location line="+14"/> + <source>Unable to open BLOB</source> + <translation>不能打开BLOB</translation> + </message> + <message> + <location line="+16"/> + <source>Unable to read BLOB</source> + <translation>不能读取BLOB</translation> + </message> + <message> + <location line="+125"/> + <location line="+189"/> + <source>Could not find array</source> + <translation>不能找到数组</translation> + </message> + <message> + <location line="-157"/> + <source>Could not get array data</source> + <translation>不能得到数组数据</translation> + </message> + <message> + <location line="+212"/> + <source>Could not get query info</source> + <translation>不能得到查询信息</translation> + </message> + <message> + <location line="+20"/> + <source>Could not start transaction</source> + <translation>不能开始事务</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+33"/> + <source>Could not allocate statement</source> + <translation>不能分配语句</translation> + </message> + <message> + <location line="+5"/> + <source>Could not prepare statement</source> + <translation>不能准备语句</translation> + </message> + <message> + <location line="+5"/> + <location line="+7"/> + <source>Could not describe input statement</source> + <translation>不能描述输入语句</translation> + </message> + <message> + <location line="+10"/> + <source>Could not describe statement</source> + <translation>不能描述语句</translation> + </message> + <message> + <location line="+115"/> + <source>Unable to close statement</source> + <translation>不能关闭语句</translation> + </message> + <message> + <location line="+8"/> + <source>Unable to execute query</source> + <translation>不能执行查询</translation> + </message> + <message> + <location line="+46"/> + <source>Could not fetch next item</source> + <translation>不能获取下一项</translation> + </message> + <message> + <location line="+160"/> + <source>Could not get statement info</source> + <translation>不能得到语句信息</translation> + </message> +</context> +<context> + <name>QIODevice</name> + <message> + <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/> + <source>Permission denied</source> + <translation>权限被拒绝</translation> + </message> + <message> + <location line="+3"/> + <source>Too many open files</source> + <translation>太多打开的文件</translation> + </message> + <message> + <location line="+3"/> + <source>No such file or directory</source> + <translation>没有这个文件或者目录</translation> + </message> + <message> + <location line="+3"/> + <source>No space left on device</source> + <translation>设备上没有空间了</translation> + </message> + <message> + <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/> + <source>Unknown error</source> + <translation>未知的错误</translation> + </message> +</context> +<context> + <name>QInputContext</name> + <message> + <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/> + <source>XIM</source> + <translation>XIM</translation> + </message> + <message> + <location line="+23"/> + <source>XIM input method</source> + <translation>XIM输入法</translation> + </message> + <message> + <location line="+4"/> + <source>Windows input method</source> + <translation>Windows输入法</translation> + </message> + <message> + <location line="+4"/> + <source>Mac OS X input method</source> + <translation>Mac OS X输入法</translation> + </message> +</context> +<context> + <name>QInputDialog</name> + <message> + <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/> + <source>Enter a value:</source> + <translation>输入一个值:</translation> + </message> +</context> +<context> + <name>QLibrary</name> + <message> + <source>QLibrary::load_sys: Cannot load %1 (%2)</source> + <translation type="obsolete">QLibrary::load_sys: 不能载入%1 (%2)</translation> + </message> + <message> + <source>QLibrary::unload_sys: Cannot unload %1 (%2)</source> + <translation type="obsolete">QLibrary::unload_sys:不能卸载%1 (%2)</translation> + </message> + <message> + <source>QLibrary::resolve_sys: Symbol "%1" undefined in %2 (%3)</source> + <translation type="obsolete">QLibrary::resolve_sys: 符号“%1”在%2(%3)没有被定义</translation> + </message> + <message> + <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/> + <source>Could not mmap '%1': %2</source> + <translation>不能映射”%1“:%2</translation> + </message> + <message> + <location line="+22"/> + <source>Plugin verification data mismatch in '%1'</source> + <translation>“%1“中的插件验证数据不匹配</translation> + </message> + <message> + <location line="+6"/> + <source>Could not unmap '%1': %2</source> + <translation>不能取消映射“%1“:%2</translation> + </message> + <message> + <location line="+302"/> + <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> + <translation>插件“%1”使用了不兼容的Qt库。(%2.%3.%4) [%5]</translation> + </message> + <message> + <location line="+20"/> + <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> + <translation>插件“%1“使用了不兼容的Qt库。期待的构建键是“%2“,得到的却是”%3“</translation> + </message> + <message> + <location line="+340"/> + <source>Unknown error</source> + <translation>未知的错误</translation> + </message> + <message> + <location line="-377"/> + <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/> + <source>The shared library was not found.</source> + <translation>共享库没有被找到。</translation> + </message> + <message> + <location line="+2"/> + <source>The file '%1' is not a valid Qt plugin.</source> + <translation>文件“%1“不是有效的Qt插件。</translation> + </message> + <message> + <location line="+43"/> + <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> + <translation>插件“%1“使用了不兼容的Qt库。(不能混合使用库的调试版本和发布版本。)</translation> + </message> + <message> + <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/> + <source>Cannot load library %1: %2</source> + <translation>无法加载库%1:%2</translation> + </message> + <message> + <location line="+16"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/> + <source>Cannot unload library %1: %2</source> + <translation>无法卸载库%1:%2</translation> + </message> + <message> + <location line="+31"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/> + <source>Cannot resolve symbol "%1" in %2: %3</source> + <translation>无法解析%2中的符号“%2”:%3</translation> + </message> +</context> +<context> + <name>QLineEdit</name> + <message> + <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/> + <source>&Undo</source> + <translation>撤消(&U)</translation> + </message> + <message> + <location line="+4"/> + <source>&Redo</source> + <translation>恢复(&R)</translation> + </message> + <message> + <location line="+7"/> + <source>Cu&t</source> + <translation>剪切(&T)</translation> + </message> + <message> + <location line="+4"/> + <source>&Copy</source> + <translation>复制(&C)</translation> + </message> + <message> + <location line="+4"/> + <source>&Paste</source> + <translation>粘贴(&P)</translation> + </message> + <message> + <location line="+5"/> + <source>Delete</source> + <translation>删除</translation> + </message> + <message> + <location line="+6"/> + <source>Select All</source> + <translation>选择全部</translation> + </message> +</context> +<context> + <name>QLocalServer</name> + <message> + <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/> + <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/> + <source>%1: Name error</source> + <translation>%1: 名称错误</translation> + </message> + <message> + <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/> + <source>%1: Permission denied</source> + <translation>%1:权限被拒绝</translation> + </message> + <message> + <location line="+12"/> + <source>%1: Address in use</source> + <translation>%1:地址正在被使用</translation> + </message> + <message> + <location line="+5"/> + <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/> + <source>%1: Unknown error %2</source> + <translation>%1:未知错误 %2</translation> + </message> +</context> +<context> + <name>QLocalSocket</name> + <message> + <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/> + <source>%1: Connection refused</source> + <translation>%1:连接被拒绝</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Remote closed</source> + <translation>%1:远程已关闭</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/> + <location line="+43"/> + <source>%1: Invalid name</source> + <translation>%1:无效名称</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket access error</source> + <translation>%1:套接字访问错误</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket resource error</source> + <translation>%1:套接字资源错误</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket operation timed out</source> + <translation>%1:套接字操作超时</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Datagram too large</source> + <translation>%1:数据报太大</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/> + <source>%1: Connection error</source> + <translation>%1:连接错误</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: The socket operation is not supported</source> + <translation>%1:套接字操作不被支持</translation> + </message> + <message> + <location line="+4"/> + <source>%1: Unknown error</source> + <translation>%1:未知错误</translation> + </message> + <message> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/> + <source>%1: Unknown error %2</source> + <translation>%1:未知错误 %2</translation> + </message> +</context> +<context> + <name>QMYSQLDriver</name> + <message> + <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/> + <source>Unable to open database '</source> + <translation>不能打开数据库</translation> + </message> + <message> + <location line="+7"/> + <source>Unable to connect</source> + <translation>不能连接</translation> + </message> + <message> + <location line="+127"/> + <source>Unable to begin transaction</source> + <translation>不能开始事务</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>不能回滚事务</translation> + </message> +</context> +<context> + <name>QMYSQLResult</name> + <message> + <location line="-922"/> + <source>Unable to fetch data</source> + <translation>不能获取数据</translation> + </message> + <message> + <location line="+176"/> + <source>Unable to execute query</source> + <translation>不能执行查询</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to store result</source> + <translation>不能存储结果</translation> + </message> + <message> + <location line="+190"/> + <location line="+8"/> + <source>Unable to prepare statement</source> + <translation>不能准备语句</translation> + </message> + <message> + <location line="+34"/> + <source>Unable to reset statement</source> + <translation>不能重置语句</translation> + </message> + <message> + <location line="+87"/> + <source>Unable to bind value</source> + <translation>不能绑定值</translation> + </message> + <message> + <location line="+11"/> + <source>Unable to execute statement</source> + <translation>不能执行语句</translation> + </message> + <message> + <location line="+14"/> + <location line="+21"/> + <source>Unable to bind outvalues</source> + <translation>不能绑定外值</translation> + </message> + <message> + <location line="-12"/> + <source>Unable to store statement results</source> + <translation>不能存储语句结果</translation> + </message> + <message> + <location line="-253"/> + <source>Unable to execute next query</source> + <translation>不能执行下一个查询</translation> + </message> + <message> + <location line="+10"/> + <source>Unable to store next result</source> + <translation>不能存储下一个结果</translation> + </message> +</context> +<context> + <name>QMdiArea</name> + <message> + <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/> + <source>(Untitled)</source> + <translation>(未命名的)</translation> + </message> +</context> +<context> + <name>QMdiSubWindow</name> + <message> + <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/> + <source>%1 - [%2]</source> + <translation>%1 - [%2]</translation> + </message> + <message> + <location line="+72"/> + <source>Close</source> + <translation>关闭</translation> + </message> + <message> + <location line="-18"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+13"/> + <source>Restore Down</source> + <translation>向下恢复</translation> + </message> + <message> + <location line="+707"/> + <source>&Restore</source> + <translation>恢复(&R)</translation> + </message> + <message> + <location line="+3"/> + <source>&Move</source> + <translation>移动(&M)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Mi&nimize</source> + <translation>最小化(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Ma&ximize</source> + <translation>最大化(&X)</translation> + </message> + <message> + <location line="+2"/> + <source>Stay on &Top</source> + <translation>总在最前(&T)</translation> + </message> + <message> + <location line="+3"/> + <source>&Close</source> + <translation>关闭(&C)</translation> + </message> + <message> + <location line="-787"/> + <source>- [%1]</source> + <translation>- [%1]</translation> + </message> + <message> + <location line="+58"/> + <source>Maximize</source> + <translation>最大化</translation> + </message> + <message> + <location line="+3"/> + <source>Unshade</source> + <translation>取消遮蔽</translation> + </message> + <message> + <location line="+3"/> + <source>Shade</source> + <translation>遮蔽</translation> + </message> + <message> + <location line="+6"/> + <source>Restore</source> + <translation>恢复</translation> + </message> + <message> + <location line="+6"/> + <source>Help</source> + <translation>帮助</translation> + </message> + <message> + <location line="+3"/> + <source>Menu</source> + <translation>菜单</translation> + </message> +</context> +<context> + <name>QMenu</name> + <message> + <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/> + <location line="+225"/> + <source>Close</source> + <translation>关闭</translation> + </message> + <message> + <location line="-224"/> + <location line="+225"/> + <source>Open</source> + <translation>打开</translation> + </message> + <message> + <location line="-223"/> + <location line="+225"/> + <location line="+51"/> + <source>Execute</source> + <translation>执行</translation> + </message> +</context> +<context> + <name>QMenuBar</name> + <message> + <source>About</source> + <translation type="obsolete">关于</translation> + </message> + <message> + <source>Config</source> + <translation type="obsolete">配置</translation> + </message> + <message> + <source>Preference</source> + <translation type="obsolete">首选项</translation> + </message> + <message> + <source>Options</source> + <translation type="obsolete">选项</translation> + </message> + <message> + <source>Setting</source> + <translation type="obsolete">设置</translation> + </message> + <message> + <source>Setup</source> + <translation type="obsolete">安装</translation> + </message> + <message> + <source>Quit</source> + <translation type="obsolete">退出</translation> + </message> + <message> + <source>Exit</source> + <translation type="obsolete">退出</translation> + </message> + <message> + <source>About %1</source> + <translation type="obsolete">关于%1</translation> + </message> + <message> + <source>About Qt</source> + <translation type="obsolete">关于Qt</translation> + </message> + <message> + <source>Preferences</source> + <translation type="obsolete">首选项</translation> + </message> + <message> + <source>Quit %1</source> + <translation type="obsolete">退出%1</translation> + </message> +</context> +<context> + <name>QMessageBox</name> + <message> + <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1111"/> + <source>Help</source> + <translation>帮助</translation> + </message> + <message> + <location line="-853"/> + <location line="+852"/> + <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/> + <location line="+8"/> + <source>OK</source> + <translation>确定</translation> + </message> + <message> + <location line="+509"/> + <source>About Qt</source> + <translation>关于Qt</translation> + </message> + <message> + <source><p>This program uses Qt version %1.</p></source> + <translation type="obsolete"><p>这个程序使用的是Qt %1版。</p></translation> + </message> + <message> + <location line="-1605"/> + <source>Show Details...</source> + <translation>显示细节……</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Details...</source> + <translation>隐藏细节……</translation> + </message> + <message> + <location line="+1570"/> + <source><h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokiae.com</a> for more information.</p></source> + <translation type="obsolete"><h3>关于Qt</h3>%1<p>Qt是一个用于跨平台应用程序开发的C++工具包。</p><p>对于MS&nbsp;Windows、Mac&nbsp;OS&nbsp;X、Linux和所有主流商业Unix,Qt提供了单一源程序的可移植性。Qt也有用于嵌入式Linux和Windows CE的版本。</p><p>Qt是Nokia的产品。有关更多信息,请参考<a href="http://qt.nokia.com/">qt.nokia.com</a>。</p></translation> + </message> + <message> + <source><p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://qt.nokia.com/company/model/">qt.nokia.com/company/model/</a> for an overview of Qt licensing.</p></source> + <translation type="obsolete"><p>这个程序使用了Qt %1开源版本。</p><p>Qt开源版本只用于开源应用程序的开发。如果要开发私有(闭源)软件,你需要一个商业的Qt协议。</p><p>有关Qt协议的概览,请参考<a href="http://qt.nokia.com/company/model/">qt.nokia.com/company/model/</a>。</p></translation> + </message> + <message> + <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt Embedded.</p><p>Qt is a Trolltech product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><h3>关于Qt</h3>%1<p>Qt是一个用于跨平台应用程序开发的C++工具包。</p><p>对于MS&nbsp;Windows、Mac&nbsp;OS&nbsp;X、Linux和所有主流商业Unix,Qt提供了单一源程序的可移植性。Qt对于嵌入式平台也是可用的,在嵌入式平台上它被称为Qt Embedded。</p><p>Qt是Trolltech的产品。有关更多信息,请参考<a href="http://qt.nokia.com/">qt.nokia.com</a>。</p></translation> + </message> +</context> +<context> + <name>QMultiInputContext</name> + <message> + <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/> + <source>Select IM</source> + <translation>选择输入法</translation> + </message> +</context> +<context> + <name>QMultiInputContextPlugin</name> + <message> + <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/> + <source>Multiple input method switcher</source> + <translation>多输入法切换器</translation> + </message> + <message> + <location line="+7"/> + <source>Multiple input method switcher that uses the context menu of the text widgets</source> + <translation>使用文本窗口部件上下文菜单的多输入法切换器</translation> + </message> +</context> +<context> + <name>QNativeSocketEngine</name> + <message> + <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/> + <source>The remote host closed the connection</source> + <translation>远端主机关闭了这个连接</translation> + </message> + <message> + <location line="+3"/> + <source>Network operation timed out</source> + <translation>网络操作超时</translation> + </message> + <message> + <location line="+3"/> + <source>Out of resources</source> + <translation>资源耗尽了</translation> + </message> + <message> + <location line="+3"/> + <source>Unsupported socket operation</source> + <translation>不被支持的套接字操作</translation> + </message> + <message> + <location line="+3"/> + <source>Protocol type not supported</source> + <translation>协议类型不被支持</translation> + </message> + <message> + <location line="+3"/> + <source>Invalid socket descriptor</source> + <translation>无效的套接字描述符</translation> + </message> + <message> + <location line="+6"/> + <source>Network unreachable</source> + <translation>网络不能访问</translation> + </message> + <message> + <location line="+3"/> + <source>Permission denied</source> + <translation>权限被拒绝</translation> + </message> + <message> + <location line="+3"/> + <source>Connection timed out</source> + <translation>连接超时</translation> + </message> + <message> + <location line="+3"/> + <source>Connection refused</source> + <translation>连接被拒绝</translation> + </message> + <message> + <location line="+3"/> + <source>The bound address is already in use</source> + <translation>要启用的地址已经被使用</translation> + </message> + <message> + <location line="+3"/> + <source>The address is not available</source> + <translation>这个地址不可用</translation> + </message> + <message> + <location line="+3"/> + <source>The address is protected</source> + <translation>这个地址被保护了</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to send a message</source> + <translation>不能发送一个消息</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to receive a message</source> + <translation>不能接收一个消息</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to write</source> + <translation>不能写入</translation> + </message> + <message> + <location line="+3"/> + <source>Network error</source> + <translation>网络错误</translation> + </message> + <message> + <location line="+3"/> + <source>Another socket is already listening on the same port</source> + <translation>另一个套接字已经正在监听同一端口</translation> + </message> + <message> + <location line="-66"/> + <source>Unable to initialize non-blocking socket</source> + <translation>不能初始化非阻塞套接字</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to initialize broadcast socket</source> + <translation>不能初始化广播套接字</translation> + </message> + <message> + <location line="+3"/> + <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> + <translation>试图在不支持IPv6支持的平台上使用IPv6套接字</translation> + </message> + <message> + <location line="+21"/> + <source>Host unreachable</source> + <translation>主机不能访问</translation> + </message> + <message> + <location line="+24"/> + <source>Datagram was too large to send</source> + <translation>不能发送过大的数据报</translation> + </message> + <message> + <location line="+18"/> + <source>Operation on non-socket</source> + <translation>对非套接字操作</translation> + </message> + <message> + <location line="+6"/> + <source>Unknown error</source> + <translation>未知的错误</translation> + </message> + <message> + <location line="-3"/> + <source>The proxy type is invalid for this operation</source> + <translation>对于这个操作代理类型是无效的。</translation> + </message> +</context> +<context> + <name>QNetworkAccessCacheBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/> + <source>Error opening %1</source> + <translation>打开%1发生错误</translation> + </message> +</context> +<context> + <name>QNetworkAccessFileBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/> + <source>Request for opening non-local file %1</source> + <translation>正在打开非本地文件 %1 的请求</translation> + </message> + <message> + <location line="+42"/> + <source>Error opening %1: %2</source> + <translation>打开 %1 错误:%2</translation> + </message> + <message> + <location line="+56"/> + <source>Write error writing to %1: %2</source> + <translation>写入 %1 错误:%2</translation> + </message> + <message> + <location line="+33"/> + <source>Cannot open %1: Path is a directory</source> + <translation>无法打开 %1:路径是一个目录</translation> + </message> + <message> + <location line="+21"/> + <source>Read error reading from %1: %2</source> + <translation>读取 %1 错误:%2</translation> + </message> +</context> +<context> + <name>QNetworkAccessFtpBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/> + <source>No suitable proxy found</source> + <translation>未找到合适的代理</translation> + </message> + <message> + <location line="+14"/> + <source>Cannot open %1: is a directory</source> + <translation>无法读取 %1:是一个目录</translation> + </message> + <message> + <location line="+130"/> + <source>Logging in to %1 failed: authentication required</source> + <translation>登入 %1 失败:需要验证</translation> + </message> + <message> + <location line="+39"/> + <source>Error while downloading %1: %2</source> + <translation>下载 %1 时错误:%2</translation> + </message> + <message> + <location line="+2"/> + <source>Error while uploading %1: %2</source> + <translation>上载 %1 时错误:%2</translation> + </message> +</context> +<context> + <name>QNetworkAccessHttpBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/> + <source>No suitable proxy found</source> + <translation>未找到合适的代理</translation> + </message> +</context> +<context> + <name>QNetworkReply</name> + <message> + <location line="+128"/> + <source>Error downloading %1 - server replied: %2</source> + <translation>下载 %1 错误 - 服务器回复:%2</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/> + <source>Protocol "%1" is unknown</source> + <translation>协议“%1”是未知的</translation> + </message> +</context> +<context> + <name>QNetworkReplyImpl</name> + <message> + <location line="+432"/> + <location line="+22"/> + <source>Operation canceled</source> + <translation>操作被取消</translation> + </message> +</context> +<context> + <name>QOCIDriver</name> + <message> + <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/> + <source>Unable to logon</source> + <translation>不能登录</translation> + </message> + <message> + <location line="-144"/> + <source>Unable to initialize</source> + <comment>QOCIDriver</comment> + <translation>不能初始化</translation> + </message> + <message> + <location line="+215"/> + <source>Unable to begin transaction</source> + <translation>不能开始事务</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to rollback transaction</source> + <translation>不能回滚事务</translation> + </message> +</context> +<context> + <name>QOCIResult</name> + <message> + <location line="-963"/> + <location line="+161"/> + <location line="+15"/> + <source>Unable to bind column for batch execute</source> + <translation>不能绑定批处理执行的列</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to execute batch statement</source> + <translation>不能执行批处理语句</translation> + </message> + <message> + <location line="+302"/> + <source>Unable to goto next</source> + <translation>不能进入下一个</translation> + </message> + <message> + <location line="+59"/> + <source>Unable to alloc statement</source> + <translation>不能分配语句</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to prepare statement</source> + <translation>不能准备语句</translation> + </message> + <message> + <location line="+36"/> + <source>Unable to bind value</source> + <translation>不能绑定值</translation> + </message> + <message> + <source>Unable to execute select statement</source> + <translation type="obsolete">不能执行选择语句</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to execute statement</source> + <translation>不能执行语句</translation> + </message> +</context> +<context> + <name>QODBCDriver</name> + <message> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/> + <source>Unable to connect</source> + <translation>不能连接</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to connect - Driver doesn't support all needed functionality</source> + <translation>不能连接—驱动程序不支持所有功能</translation> + </message> + <message> + <location line="+242"/> + <source>Unable to disable autocommit</source> + <translation>不能禁止自动提交</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>不能回滚事务</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to enable autocommit</source> + <translation>不能打开自动提交</translation> + </message> +</context> +<context> + <name>QODBCResult</name> + <message> + <location line="-1218"/> + <location line="+349"/> + <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> + <translation>QODBCResult::reset: 不能把“SQL_CURSOR_STATIC”设置为语句属性。请检查你的ODBC驱动程序设置。</translation> + </message> + <message> + <location line="-332"/> + <location line="+626"/> + <source>Unable to execute statement</source> + <translation>不能执行语句</translation> + </message> + <message> + <location line="-555"/> + <source>Unable to fetch next</source> + <translation>不能获取下一个</translation> + </message> + <message> + <location line="+279"/> + <source>Unable to prepare statement</source> + <translation>不能准备语句</translation> + </message> + <message> + <location line="+268"/> + <source>Unable to bind variable</source> + <translation>不能帮定变量</translation> + </message> + <message> + <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/> + <location line="+578"/> + <source>Unable to fetch last</source> + <translation>不能获取最后一个</translation> + </message> + <message> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/> + <source>Unable to fetch</source> + <translation>不能获取</translation> + </message> + <message> + <location line="+44"/> + <source>Unable to fetch first</source> + <translation>不能获取第一个</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to fetch previous</source> + <translation>不能获取上一个</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/> + <source>Home</source> + <translation>家</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/> + <source>Operation not supported on %1</source> + <translation>在 %1 上不被支持的操作</translation> + </message> + <message> + <location line="+53"/> + <source>Invalid URI: %1</source> + <translation>无效的 URI:%1</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/> + <source>Write error writing to %1: %2</source> + <translation>写入 %1 错误:%2</translation> + </message> + <message> + <location line="+57"/> + <source>Read error reading from %1: %2</source> + <translation>读取 %1 错误:%2</translation> + </message> + <message> + <location line="+31"/> + <source>Socket error on %1: %2</source> + <translation>%1 上的套接字错误:%2</translation> + </message> + <message> + <location line="+15"/> + <source>Remote host closed the connection prematurely on %1</source> + <translation>远程主机过早地关闭了在 %1 上的这个连接</translation> + </message> + <message> + <location line="+53"/> + <source>Protocol error: packet of size 0 received</source> + <translation>协议错误:收到了大小为 0 的包</translation> + </message> + <message> + <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/> + <location line="+57"/> + <source>No host name given</source> + <translation>未指定主机名</translation> + </message> +</context> +<context> + <name>QPPDOptionsModel</name> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/> + <source>Name</source> + <translation>名称</translation> + </message> + <message> + <location line="+2"/> + <source>Value</source> + <translation>值</translation> + </message> +</context> +<context> + <name>QPSQLDriver</name> + <message> + <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/> + <source>Unable to connect</source> + <translation>不能连接</translation> + </message> + <message> + <location line="+49"/> + <source>Could not begin transaction</source> + <translation>不能开始事务</translation> + </message> + <message> + <location line="+17"/> + <source>Could not commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+16"/> + <source>Could not rollback transaction</source> + <translation>不能回滚事务</translation> + </message> + <message> + <location line="+358"/> + <source>Unable to subscribe</source> + <translation>不能订阅</translation> + </message> + <message> + <location line="+32"/> + <source>Unable to unsubscribe</source> + <translation>不能取消订阅</translation> + </message> +</context> +<context> + <name>QPSQLResult</name> + <message> + <location line="-1058"/> + <source>Unable to create query</source> + <translation>不能创建查询</translation> + </message> + <message> + <location line="+374"/> + <source>Unable to prepare statement</source> + <translation>不能准备语句</translation> + </message> +</context> +<context> + <name>QPageSetupWidget</name> + <message> + <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/> + <source>Centimeters (cm)</source> + <translation>厘米 (cm)</translation> + </message> + <message> + <location line="+0"/> + <source>Millimeters (mm)</source> + <translation>毫米 (mm)</translation> + </message> + <message> + <location line="+0"/> + <source>Inches (in)</source> + <translation>英寸 (in)</translation> + </message> + <message> + <location line="+0"/> + <source>Points (pt)</source> + <translation>点 (pt)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/> + <source>Form</source> + <translation>窗体</translation> + </message> + <message> + <location/> + <source>Paper</source> + <translation>纸张</translation> + </message> + <message> + <location/> + <source>Page size:</source> + <translation>纸张大小:</translation> + </message> + <message> + <location/> + <source>Width:</source> + <translation>宽度:</translation> + </message> + <message> + <location/> + <source>Height:</source> + <translation>高度:</translation> + </message> + <message> + <location/> + <source>Paper source:</source> + <translation>纸张源:</translation> + </message> + <message> + <location/> + <source>Orientation</source> + <translation>方向</translation> + </message> + <message> + <location/> + <source>Portrait</source> + <translation>纵向</translation> + </message> + <message> + <location/> + <source>Landscape</source> + <translation>横向</translation> + </message> + <message> + <location/> + <source>Reverse landscape</source> + <translation>反向横向</translation> + </message> + <message> + <location/> + <source>Reverse portrait</source> + <translation>反向纵向</translation> + </message> + <message> + <location/> + <source>Margins</source> + <translation>边距</translation> + </message> + <message> + <location/> + <source>top margin</source> + <translation>上边距</translation> + </message> + <message> + <location/> + <source>left margin</source> + <translation>左边距</translation> + </message> + <message> + <location/> + <source>right margin</source> + <translation>右边距</translation> + </message> + <message> + <location/> + <source>bottom margin</source> + <translation>下边距</translation> + </message> +</context> +<context> + <name>QPluginLoader</name> + <message> + <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/> + <source>Unknown error</source> + <translation>未知的错误</translation> + </message> + <message> + <location line="-68"/> + <source>The plugin was not loaded.</source> + <translation>插件没有被载入。</translation> + </message> +</context> +<context> + <name>QPrintDialog</name> + <message> + <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/> + <source>locally connected</source> + <translation>本地已经连接的</translation> + </message> + <message> + <location line="+23"/> + <location line="+225"/> + <source>Aliases: %1</source> + <translation>别名:%1</translation> + </message> + <message> + <location line="+223"/> + <location line="+199"/> + <source>unknown</source> + <translation>未知的</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+375"/> + <source>Print all</source> + <translation>打印全部</translation> + </message> + <message> + <location line="+1"/> + <source>Print selection</source> + <translation>打印选择</translation> + </message> + <message> + <location line="+1"/> + <source>Print range</source> + <translation>打印范围</translation> + </message> + <message> + <location line="-48"/> + <source>A0 (841 x 1189 mm)</source> + <translation>A0 (841 x 1189 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>A1 (594 x 841 mm)</source> + <translation>A1 (594 x 841 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>A2 (420 x 594 mm)</source> + <translation>A2 (420 x 594 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>A3 (297 x 420 mm)</source> + <translation>A3 (297 x 420 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> + <translation>A4 (210 x 297 毫米,8.26 x 11.7 英寸)</translation> + </message> + <message> + <location line="+1"/> + <source>A5 (148 x 210 mm)</source> + <translation>A5 (148 x 210 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>A6 (105 x 148 mm)</source> + <translation>A6 (105 x 148 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>A7 (74 x 105 mm)</source> + <translation>A7 (74 x 105 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>A8 (52 x 74 mm)</source> + <translation>A8 (52 x 74 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>A9 (37 x 52 mm)</source> + <translation>A9 (37 x 52 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B0 (1000 x 1414 mm)</source> + <translation>B0 (1000 x 1414 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B1 (707 x 1000 mm)</source> + <translation>B1 (707 x 1000 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B2 (500 x 707 mm)</source> + <translation>B2 (500 x 707 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B3 (353 x 500 mm)</source> + <translation>B3 (353 x 500 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B4 (250 x 353 mm)</source> + <translation>B4 (250 x 353 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> + <translation>B5 (176 x 250 毫米,6.93 x 9.84 英寸)</translation> + </message> + <message> + <location line="+1"/> + <source>B6 (125 x 176 mm)</source> + <translation>B6 (125 x 176 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B7 (88 x 125 mm)</source> + <translation>B7 (88 x 125 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B8 (62 x 88 mm)</source> + <translation>B8 (62 x 88 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B9 (44 x 62 mm)</source> + <translation>B9 (44 x 62 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>B10 (31 x 44 mm)</source> + <translation>B10 (31 x 44 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>C5E (163 x 229 mm)</source> + <translation>C5E (163 x 229 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>DLE (110 x 220 mm)</source> + <translation>DLE (110 x 220 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> + <translation>Executive (7.5 x 10 英寸,191 x 254 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>Folio (210 x 330 mm)</source> + <translation>Folio (210 x 330 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>Ledger (432 x 279 mm)</source> + <translation>Ledger (432 x 279 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> + <translation>Legal (8.5 x 14 英寸,216 x 356 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> + <translation>Letter (8.5 x 11 英寸,216 x 279 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>Tabloid (279 x 432 mm)</source> + <translation>Tabloid (279 x 432 毫米)</translation> + </message> + <message> + <location line="+1"/> + <source>US Common #10 Envelope (105 x 241 mm)</source> + <translation>美国普通10号信封 (105 x 241 毫米)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/> + <source>OK</source> + <translation>确定</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/> + <location line="+13"/> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/> + <source>Print</source> + <translation>打印</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/> + <source>Print To File ...</source> + <translation>打印到文件……</translation> + </message> + <message> + <location line="+80"/> + <source>File %1 is not writable. +Please choose a different file name.</source> + <translation>文件%1不可写。 +请选择一个不同的文件名。</translation> + </message> + <message> + <location line="+4"/> + <source>%1 already exists. +Do you want to overwrite it?</source> + <translation>%1已经存在。 +你想覆盖它么?</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-210"/> + <source>File exists</source> + <translation>文件存在</translation> + </message> + <message> + <location line="+1"/> + <source><qt>Do you want to overwrite it?</qt></source> + <translation><qt>你想覆盖它么?</qt></translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/> + <source>%1 is a directory. +Please choose a different file name.</source> + <translation>%1是目录。 +请选择一个不同的文件名。</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/> + <source>The 'From' value cannot be greater than the 'To' value.</source> + <translation>“从”的数值不能大于“到”的数值。</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/> + <source>A0</source> + <translation>A0</translation> + </message> + <message> + <location line="+1"/> + <source>A1</source> + <translation>A1</translation> + </message> + <message> + <location line="+1"/> + <source>A2</source> + <translation>A2</translation> + </message> + <message> + <location line="+1"/> + <source>A3</source> + <translation>A3</translation> + </message> + <message> + <location line="+1"/> + <source>A4</source> + <translation>A4</translation> + </message> + <message> + <location line="+1"/> + <source>A5</source> + <translation>A5</translation> + </message> + <message> + <location line="+1"/> + <source>A6</source> + <translation>A6</translation> + </message> + <message> + <location line="+1"/> + <source>A7</source> + <translation>A7</translation> + </message> + <message> + <location line="+1"/> + <source>A8</source> + <translation>A8</translation> + </message> + <message> + <location line="+1"/> + <source>A9</source> + <translation>A9</translation> + </message> + <message> + <location line="+1"/> + <source>B0</source> + <translation>B0</translation> + </message> + <message> + <location line="+1"/> + <source>B1</source> + <translation>B1</translation> + </message> + <message> + <location line="+1"/> + <source>B2</source> + <translation>B2</translation> + </message> + <message> + <location line="+1"/> + <source>B3</source> + <translation>B3</translation> + </message> + <message> + <location line="+1"/> + <source>B4</source> + <translation>B4</translation> + </message> + <message> + <location line="+1"/> + <source>B5</source> + <translation>B5</translation> + </message> + <message> + <location line="+1"/> + <source>B6</source> + <translation>B6</translation> + </message> + <message> + <location line="+1"/> + <source>B7</source> + <translation>B7</translation> + </message> + <message> + <location line="+1"/> + <source>B8</source> + <translation>B8</translation> + </message> + <message> + <location line="+1"/> + <source>B9</source> + <translation>B9</translation> + </message> + <message> + <location line="+1"/> + <source>B10</source> + <translation>B10</translation> + </message> + <message> + <location line="+1"/> + <source>C5E</source> + <translation>C5E</translation> + </message> + <message> + <location line="+1"/> + <source>DLE</source> + <translation>DLE</translation> + </message> + <message> + <location line="+1"/> + <source>Executive</source> + <translation>决策文书</translation> + </message> + <message> + <location line="+1"/> + <source>Folio</source> + <translation>对开纸</translation> + </message> + <message> + <location line="+1"/> + <source>Ledger</source> + <translation>帐页</translation> + </message> + <message> + <location line="+1"/> + <source>Legal</source> + <translation>法律文书</translation> + </message> + <message> + <location line="+1"/> + <source>Letter</source> + <translation>信纸</translation> + </message> + <message> + <location line="+1"/> + <source>Tabloid</source> + <translation>小型报纸</translation> + </message> + <message> + <location line="+1"/> + <source>US Common #10 Envelope</source> + <translation>美国普通10号信封</translation> + </message> + <message> + <location line="+1"/> + <source>Custom</source> + <translation>自定义</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/> + <location line="+68"/> + <source>&Options >></source> + <translation>选项(&O) >></translation> + </message> + <message> + <location line="-63"/> + <source>&Print</source> + <translation>打印(&P)</translation> + </message> + <message> + <location line="+67"/> + <source>&Options <<</source> + <translation>选项(&O) <<</translation> + </message> + <message> + <location line="+253"/> + <source>Print to File (PDF)</source> + <translation>打印到文件(PDF)</translation> + </message> + <message> + <location line="+1"/> + <source>Print to File (Postscript)</source> + <translation>打印到文件(Postscript)</translation> + </message> + <message> + <location line="+45"/> + <source>Local file</source> + <translation>本地文件</translation> + </message> + <message> + <location line="+1"/> + <source>Write %1 file</source> + <translation>写入 %1 文件</translation> + </message> +</context> +<context> + <name>QPrintPreviewDialog</name> + <message> + <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/> + <location line="+12"/> + <source>Page Setup</source> + <translation>页面设置</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/> + <source>%1%</source> + <translation>%1%</translation> + </message> + <message> + <location line="+79"/> + <source>Print Preview</source> + <translation>打印预览</translation> + </message> + <message> + <location line="+29"/> + <source>Next page</source> + <translation>下一页</translation> + </message> + <message> + <location line="+1"/> + <source>Previous page</source> + <translation>上一页</translation> + </message> + <message> + <location line="+1"/> + <source>First page</source> + <translation>第一页</translation> + </message> + <message> + <location line="+1"/> + <source>Last page</source> + <translation>最后一页</translation> + </message> + <message> + <location line="+9"/> + <source>Fit width</source> + <translation>适应宽度</translation> + </message> + <message> + <location line="+1"/> + <source>Fit page</source> + <translation>适应页面</translation> + </message> + <message> + <location line="+11"/> + <source>Zoom in</source> + <translation>放大</translation> + </message> + <message> + <location line="+1"/> + <source>Zoom out</source> + <translation>缩小</translation> + </message> + <message> + <location line="+6"/> + <source>Portrait</source> + <translation>纵向</translation> + </message> + <message> + <location line="+1"/> + <source>Landscape</source> + <translation>横向</translation> + </message> + <message> + <location line="+10"/> + <source>Show single page</source> + <translation>显示单页</translation> + </message> + <message> + <location line="+1"/> + <source>Show facing pages</source> + <translation>显示当前页</translation> + </message> + <message> + <location line="+1"/> + <source>Show overview of all pages</source> + <translation>显示所有页的概览</translation> + </message> + <message> + <location line="+15"/> + <source>Print</source> + <translation>打印</translation> + </message> + <message> + <location line="+1"/> + <source>Page setup</source> + <translation>打印设置</translation> + </message> + <message> + <location line="+1"/> + <source>Close</source> + <translation>关闭</translation> + </message> + <message> + <location line="+151"/> + <source>Export to PDF</source> + <translation>导出为PDF</translation> + </message> + <message> + <location line="+3"/> + <source>Export to PostScript</source> + <translation>导出为PostScript</translation> + </message> +</context> +<context> + <name>QPrintPropertiesWidget</name> + <message> + <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/> + <source>Form</source> + <translation>窗体</translation> + </message> + <message> + <location/> + <source>Page</source> + <translation>页</translation> + </message> + <message> + <location/> + <source>Advanced</source> + <translation>高级</translation> + </message> +</context> +<context> + <name>QPrintSettingsOutput</name> + <message> + <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/> + <source>Form</source> + <translation>窗体</translation> + </message> + <message> + <location/> + <source>Copies</source> + <translation>拷贝</translation> + </message> + <message> + <location/> + <source>Print range</source> + <translation>打印范围</translation> + </message> + <message> + <location/> + <source>Print all</source> + <translation>打印全部</translation> + </message> + <message> + <location/> + <source>Pages from</source> + <translation>页数从</translation> + </message> + <message> + <location/> + <source>to</source> + <translation>到</translation> + </message> + <message> + <location/> + <source>Selection</source> + <translation>选择</translation> + </message> + <message> + <location/> + <source>Output Settings</source> + <translation>输出设置</translation> + </message> + <message> + <location/> + <source>Copies:</source> + <translation>备份:</translation> + </message> + <message> + <location/> + <source>Collate</source> + <translation>校对</translation> + </message> + <message> + <location/> + <source>Reverse</source> + <translation>反向</translation> + </message> + <message> + <location/> + <source>Options</source> + <translation>选项</translation> + </message> + <message> + <location/> + <source>Color Mode</source> + <translation>彩色模式</translation> + </message> + <message> + <location/> + <source>Color</source> + <translation>彩色</translation> + </message> + <message> + <location/> + <source>Grayscale</source> + <translation>灰度</translation> + </message> + <message> + <location/> + <source>Duplex Printing</source> + <translation>两部分打印</translation> + </message> + <message> + <location/> + <source>None</source> + <translation>无</translation> + </message> + <message> + <location/> + <source>Long side</source> + <translation>长侧</translation> + </message> + <message> + <location/> + <source>Short side</source> + <translation>短侧</translation> + </message> +</context> +<context> + <name>QPrintWidget</name> + <message> + <location filename="../src/gui/dialogs/qprintwidget.ui"/> + <source>Form</source> + <translation>窗体</translation> + </message> + <message> + <location/> + <source>Printer</source> + <translation>打印机</translation> + </message> + <message> + <location/> + <source>&Name:</source> + <translation>名称(&N):</translation> + </message> + <message> + <location/> + <source>P&roperties</source> + <translation>属性(&R)</translation> + </message> + <message> + <location/> + <source>Location:</source> + <translation>位置:</translation> + </message> + <message> + <location/> + <source>Preview</source> + <translation>预览</translation> + </message> + <message> + <location/> + <source>Type:</source> + <translation>类型:</translation> + </message> + <message> + <location/> + <source>Output &file:</source> + <translation>输出文件(&F):</translation> + </message> + <message> + <location/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>QProcess</name> + <message> + <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/> + <source>Could not open input redirection for reading</source> + <translation>无法打开用于读取的输入重定向</translation> + </message> + <message> + <location line="+12"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/> + <source>Could not open output redirection for writing</source> + <translation>无法打开用于写入的输出重定向</translation> + </message> + <message> + <location line="+235"/> + <source>Resource error (fork failure): %1</source> + <translation>资源错误(fork失败):%1</translation> + </message> + <message> + <location line="+259"/> + <location line="+53"/> + <location line="+74"/> + <location line="+67"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/> + <location line="+50"/> + <location line="+75"/> + <location line="+42"/> + <location line="+54"/> + <source>Process operation timed out</source> + <translation>进程处理超时</translation> + </message> + <message> + <location filename="../src/corelib/io/qprocess.cpp" line="+533"/> + <location line="+52"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/> + <location line="+50"/> + <source>Error reading from process</source> + <translation>从进程中读取时发生错误</translation> + </message> + <message> + <location line="+47"/> + <location line="+779"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/> + <source>Error writing to process</source> + <translation>向进程写入时发生错误</translation> + </message> + <message> + <location line="-709"/> + <source>Process crashed</source> + <translation>进程已崩溃</translation> + </message> + <message> + <location line="+912"/> + <source>No program defined</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/> + <source>Process failed to start</source> + <translation>启动进程失败</translation> + </message> +</context> +<context> + <name>QProgressDialog</name> + <message> + <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/> + <source>Cancel</source> + <translation>撤消</translation> + </message> +</context> +<context> + <name>QPushButton</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/> + <source>Open</source> + <translation>打开</translation> + </message> +</context> +<context> + <name>QRadioButton</name> + <message> + <location line="+12"/> + <source>Check</source> + <translation>选中</translation> + </message> +</context> +<context> + <name>QRegExp</name> + <message> + <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/> + <source>no error occurred</source> + <translation>没有错误发生</translation> + </message> + <message> + <location line="+1"/> + <source>disabled feature used</source> + <translation>使用了失效的特效</translation> + </message> + <message> + <location line="+1"/> + <source>bad char class syntax</source> + <translation>错误的字符类语法</translation> + </message> + <message> + <location line="+1"/> + <source>bad lookahead syntax</source> + <translation>错误的预测语法</translation> + </message> + <message> + <location line="+1"/> + <source>bad repetition syntax</source> + <translation>错误的重复语法</translation> + </message> + <message> + <location line="+1"/> + <source>invalid octal value</source> + <translation>无效的八进制数值</translation> + </message> + <message> + <location line="+1"/> + <source>missing left delim</source> + <translation>找不到左分隔符</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected end</source> + <translation>意外的终止</translation> + </message> + <message> + <location line="+1"/> + <source>met internal limit</source> + <translation>遇到内部限制</translation> + </message> +</context> +<context> + <name>QSQLite2Driver</name> + <message> + <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/> + <source>Error to open database</source> + <translation>打开数据库错误</translation> + </message> + <message> + <location line="+41"/> + <source>Unable to begin transaction</source> + <translation>不能开始事务</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback Transaction</source> + <translation>不能回滚事务</translation> + </message> +</context> +<context> + <name>QSQLite2Result</name> + <message> + <location line="-323"/> + <source>Unable to fetch results</source> + <translation>不能获取结果</translation> + </message> + <message> + <location line="+147"/> + <source>Unable to execute statement</source> + <translation>不能执行语句</translation> + </message> +</context> +<context> + <name>QSQLiteDriver</name> + <message> + <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/> + <source>Error opening database</source> + <translation>打开数据库错误</translation> + </message> + <message> + <location line="+11"/> + <source>Error closing database</source> + <translation>关闭数据库错误</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to begin transaction</source> + <translation>不能开始事务</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to commit transaction</source> + <translation>不能提交事务</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to rollback transaction</source> + <translation>不能回滚事务</translation> + </message> +</context> +<context> + <name>QSQLiteResult</name> + <message> + <location line="-400"/> + <location line="+66"/> + <location line="+8"/> + <source>Unable to fetch row</source> + <translation>不能获取行</translation> + </message> + <message> + <location line="+63"/> + <source>Unable to execute statement</source> + <translation>不能执行语句</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to reset statement</source> + <translation>不能重置语句</translation> + </message> + <message> + <location line="+45"/> + <source>Unable to bind parameters</source> + <translation>不能绑定参数</translation> + </message> + <message> + <location line="+7"/> + <source>Parameter count mismatch</source> + <translation>参数数量不匹配</translation> + </message> + <message> + <location line="-208"/> + <source>No query</source> + <translation>没有查询</translation> + </message> +</context> +<context> + <name>QScrollBar</name> + <message> + <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/> + <source>Scroll here</source> + <translation>滚动到这里</translation> + </message> + <message> + <location line="+2"/> + <source>Left edge</source> + <translation>左边缘</translation> + </message> + <message> + <location line="+0"/> + <source>Top</source> + <translation>顶部</translation> + </message> + <message> + <location line="+1"/> + <source>Right edge</source> + <translation>右边缘</translation> + </message> + <message> + <location line="+0"/> + <source>Bottom</source> + <translation>底部</translation> + </message> + <message> + <location line="+2"/> + <source>Page left</source> + <translation>左一页</translation> + </message> + <message> + <location line="+0"/> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/> + <source>Page up</source> + <translation>上一页</translation> + </message> + <message> + <location line="+1"/> + <source>Page right</source> + <translation>右一页</translation> + </message> + <message> + <location line="+0"/> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/> + <source>Page down</source> + <translation>下一页</translation> + </message> + <message> + <location line="+2"/> + <source>Scroll left</source> + <translation>向左滚动</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll up</source> + <translation>向上滚动</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll right</source> + <translation>向右滚动</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll down</source> + <translation>向下滚动</translation> + </message> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/> + <source>Line up</source> + <translation>向上排列</translation> + </message> + <message> + <location line="+4"/> + <source>Position</source> + <translation>位置</translation> + </message> + <message> + <location line="+4"/> + <source>Line down</source> + <translation>向下排列</translation> + </message> +</context> +<context> + <name>QSharedMemory</name> + <message> + <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/> + <source>%1: unable to set key on lock</source> + <translation>%1:无法设置锁定的键</translation> + </message> + <message> + <location line="+81"/> + <source>%1: create size is less then 0</source> + <translation>%1:创建的大小小于 0</translation> + </message> + <message> + <location line="+168"/> + <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/> + <source>%1: unable to lock</source> + <translation>%1:无法锁定</translation> + </message> + <message> + <location line="+22"/> + <source>%1: unable to unlock</source> + <translation>%1:无法取消锁定</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/> + <source>%1: permission denied</source> + <translation>%1:权限被拒绝</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/> + <source>%1: already exists</source> + <translation>%1:已经存在</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> + <source>%1: doesn't exists</source> + <translation>%1:不存在</translation> + </message> + <message> + <location line="+6"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> + <source>%1: out of resources</source> + <translation>%1:资源耗尽了</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/> + <source>%1: unknown error %2</source> + <translation>%1:未知错误 %2</translation> + </message> + <message> + <location line="+21"/> + <source>%1: key is empty</source> + <translation>%1:键是空的</translation> + </message> + <message> + <location line="+8"/> + <source>%1: unix key file doesn't exists</source> + <translation>%1:Unix 键文件不存在</translation> + </message> + <message> + <location line="+7"/> + <source>%1: ftok failed</source> + <translation>%1:ftok 失败</translation> + </message> + <message> + <location line="+51"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/> + <source>%1: unable to make key</source> + <translation>%1:不能制造键</translation> + </message> + <message> + <location line="+20"/> + <source>%1: system-imposed size restrictions</source> + <translation>%1:系统预设大小限制</translation> + </message> + <message> + <location line="+53"/> + <source>%1: not attached</source> + <translation>%1:没有附加</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/> + <source>%1: invalid size</source> + <translation>%1:无效大小</translation> + </message> + <message> + <location line="+68"/> + <source>%1: key error</source> + <translation>%1: 键错误</translation> + </message> + <message> + <location line="+38"/> + <source>%1: size query failed</source> + <translation>%1:大小查询失败</translation> + </message> +</context> +<context> + <name>QShortcut</name> + <message> + <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/> + <source>Space</source> + <translation>空格</translation> + </message> + <message> + <location line="+1"/> + <source>Esc</source> + <translation>Esc</translation> + </message> + <message> + <location line="+1"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location line="+1"/> + <source>Backtab</source> + <translation>Backtab</translation> + </message> + <message> + <location line="+1"/> + <source>Backspace</source> + <translation>Backspace</translation> + </message> + <message> + <location line="+1"/> + <source>Return</source> + <translation>Return</translation> + </message> + <message> + <location line="+1"/> + <source>Enter</source> + <translation>Enter</translation> + </message> + <message> + <location line="+1"/> + <source>Ins</source> + <translation>Ins</translation> + </message> + <message> + <location line="+1"/> + <source>Del</source> + <translation>Del</translation> + </message> + <message> + <location line="+1"/> + <source>Pause</source> + <translation>Pause</translation> + </message> + <message> + <location line="+1"/> + <source>Print</source> + <translation>Print</translation> + </message> + <message> + <location line="+1"/> + <source>SysReq</source> + <translation>SysReq</translation> + </message> + <message> + <location line="+1"/> + <source>Home</source> + <translation>Home</translation> + </message> + <message> + <location line="+1"/> + <source>End</source> + <translation>End</translation> + </message> + <message> + <location line="+1"/> + <source>Left</source> + <translation>Left</translation> + </message> + <message> + <location line="+1"/> + <source>Up</source> + <translation>Up</translation> + </message> + <message> + <location line="+1"/> + <source>Right</source> + <translation>Right</translation> + </message> + <message> + <location line="+1"/> + <source>Down</source> + <translation>Down</translation> + </message> + <message> + <location line="+1"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location line="+1"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location line="+1"/> + <source>CapsLock</source> + <translation>CapsLock</translation> + </message> + <message> + <location line="+1"/> + <source>NumLock</source> + <translation>NumLock</translation> + </message> + <message> + <location line="+1"/> + <source>ScrollLock</source> + <translation>ScrollLock</translation> + </message> + <message> + <location line="+1"/> + <source>Menu</source> + <translation>Menu</translation> + </message> + <message> + <location line="+1"/> + <source>Help</source> + <translation>Help</translation> + </message> + <message> + <location line="+3"/> + <source>Back</source> + <translation>后退</translation> + </message> + <message> + <location line="+1"/> + <source>Forward</source> + <translation>前进</translation> + </message> + <message> + <location line="+1"/> + <source>Stop</source> + <translation>停止</translation> + </message> + <message> + <location line="+1"/> + <source>Refresh</source> + <translation>刷新</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Down</source> + <translation>调小音量</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Mute</source> + <translation>静音</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Up</source> + <translation>调大音量</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Boost</source> + <translation>低音增强</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Up</source> + <translation>调大低音</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Down</source> + <translation>调小低音</translation> + </message> + <message> + <location line="+1"/> + <source>Treble Up</source> + <translation>调大高音</translation> + </message> + <message> + <location line="+1"/> + <source>Treble Down</source> + <translation>调小高音</translation> + </message> + <message> + <location line="+1"/> + <source>Media Play</source> + <translation>多媒体播放</translation> + </message> + <message> + <location line="+1"/> + <source>Media Stop</source> + <translation>多媒体停止</translation> + </message> + <message> + <location line="+1"/> + <source>Media Previous</source> + <translation>上一个多媒体</translation> + </message> + <message> + <location line="+1"/> + <source>Media Next</source> + <translation>下一个多媒体</translation> + </message> + <message> + <location line="+1"/> + <source>Media Record</source> + <translation>多媒体记录</translation> + </message> + <message> + <location line="+2"/> + <source>Favorites</source> + <translation>最喜爱的</translation> + </message> + <message> + <location line="+1"/> + <source>Search</source> + <translation>搜索</translation> + </message> + <message> + <location line="+1"/> + <source>Standby</source> + <translation>等待</translation> + </message> + <message> + <location line="+1"/> + <source>Open URL</source> + <translation>打开URL</translation> + </message> + <message> + <location line="+1"/> + <source>Launch Mail</source> + <translation>启动邮件</translation> + </message> + <message> + <location line="+1"/> + <source>Launch Media</source> + <translation>启动多媒体</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (0)</source> + <translation>启动 (0)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (1)</source> + <translation>启动 (1)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (2)</source> + <translation>启动 (2)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (3)</source> + <translation>启动 (3)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (4)</source> + <translation>启动 (4)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (5)</source> + <translation>启动 (5)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (6)</source> + <translation>启动 (6)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (7)</source> + <translation>启动 (7)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (8)</source> + <translation>启动 (8)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (9)</source> + <translation>启动 (9)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (A)</source> + <translation>启动 (A)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (B)</source> + <translation>启动 (B)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (C)</source> + <translation>启动 (C)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (D)</source> + <translation>启动 (D)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (E)</source> + <translation>启动 (E)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (F)</source> + <translation>启动 (F)</translation> + </message> + <message> + <location line="+4"/> + <source>Print Screen</source> + <translation>Print Screen</translation> + </message> + <message> + <location line="+1"/> + <source>Page Up</source> + <translation>Page Up</translation> + </message> + <message> + <location line="+1"/> + <source>Page Down</source> + <translation>Page Down</translation> + </message> + <message> + <location line="+1"/> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <location line="+1"/> + <source>Num Lock</source> + <translation>Num Lock</translation> + </message> + <message> + <location line="+1"/> + <source>Number Lock</source> + <translation>Number Lock</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <location line="+1"/> + <source>Insert</source> + <translation>Insert</translation> + </message> + <message> + <location line="+1"/> + <source>Delete</source> + <translation>Delete</translation> + </message> + <message> + <location line="+1"/> + <source>Escape</source> + <translation>Escape</translation> + </message> + <message> + <location line="+1"/> + <source>System Request</source> + <translation>System Request</translation> + </message> + <message> + <location line="+4"/> + <source>Select</source> + <translation>选择</translation> + </message> + <message> + <location line="+1"/> + <source>Yes</source> + <translation>是</translation> + </message> + <message> + <location line="+1"/> + <source>No</source> + <translation>否</translation> + </message> + <message> + <location line="+4"/> + <source>Context1</source> + <translation>上下文1</translation> + </message> + <message> + <location line="+1"/> + <source>Context2</source> + <translation>上下文2</translation> + </message> + <message> + <location line="+1"/> + <source>Context3</source> + <translation>上下文3</translation> + </message> + <message> + <location line="+1"/> + <source>Context4</source> + <translation>上下文4</translation> + </message> + <message> + <location line="+1"/> + <source>Call</source> + <translation>呼叫</translation> + </message> + <message> + <location line="+1"/> + <source>Hangup</source> + <translation>挂起</translation> + </message> + <message> + <location line="+1"/> + <source>Flip</source> + <translation>翻转</translation> + </message> + <message> + <location line="+527"/> + <location line="+122"/> + <source>Ctrl</source> + <translation>Ctrl</translation> + </message> + <message> + <location line="-121"/> + <location line="+125"/> + <source>Shift</source> + <translation>Shift</translation> + </message> + <message> + <location line="-124"/> + <location line="+122"/> + <source>Alt</source> + <translation>Alt</translation> + </message> + <message> + <location line="-121"/> + <location line="+117"/> + <source>Meta</source> + <translation>Meta</translation> + </message> + <message> + <location line="-25"/> + <source>+</source> + <translation>+</translation> + </message> + <message> + <location line="+46"/> + <source>F%1</source> + <translation>F%1</translation> + </message> + <message> + <location line="-720"/> + <source>Home Page</source> + <translation>主页</translation> + </message> +</context> +<context> + <name>QSlider</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/> + <source>Page left</source> + <translation>左一页</translation> + </message> + <message> + <location line="+0"/> + <source>Page up</source> + <translation>上一页</translation> + </message> + <message> + <location line="+2"/> + <source>Position</source> + <translation>位置</translation> + </message> + <message> + <location line="+3"/> + <source>Page right</source> + <translation>右一页</translation> + </message> + <message> + <location line="+0"/> + <source>Page down</source> + <translation>下一页</translation> + </message> +</context> +<context> + <name>QSocks5SocketEngine</name> + <message> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/> + <source>Connection to proxy refused</source> + <translation>代理拒绝连接</translation> + </message> + <message> + <location line="+4"/> + <source>Connection to proxy closed prematurely</source> + <translation>代理连接过早关闭</translation> + </message> + <message> + <location line="+4"/> + <source>Proxy host not found</source> + <translation>代理主机未找到</translation> + </message> + <message> + <location line="+5"/> + <source>Connection to proxy timed out</source> + <translation>代理连接超时</translation> + </message> + <message> + <location line="+17"/> + <source>Proxy authentication failed</source> + <translation>代理认证失败</translation> + </message> + <message> + <location line="+1"/> + <source>Proxy authentication failed: %1</source> + <translation>代理认证失败: %1</translation> + </message> + <message> + <location line="+9"/> + <source>SOCKS version 5 protocol error</source> + <translation>SOCKS版本5协议错误</translation> + </message> + <message> + <location line="+19"/> + <source>General SOCKSv5 server failure</source> + <translation>常规服务器失败</translation> + </message> + <message> + <location line="+4"/> + <source>Connection not allowed by SOCKSv5 server</source> + <translation>连接不被SOCKSv5服务器允许</translation> + </message> + <message> + <location line="+16"/> + <source>TTL expired</source> + <translation>TTL已过期</translation> + </message> + <message> + <location line="+4"/> + <source>SOCKSv5 command not supported</source> + <translation>不支持的SOCKSv5命令</translation> + </message> + <message> + <location line="+4"/> + <source>Address type not supported</source> + <translation>不支持的地址类型</translation> + </message> + <message> + <location line="+5"/> + <source>Unknown SOCKSv5 proxy error code 0x%1</source> + <translation>未知SOCKSv5代理,错误代码 0x%1</translation> + </message> + <message> + <source>Socks5 timeout error connecting to socks server</source> + <translation type="obsolete">连接到套接字服务器的时候,Socks5超时错误</translation> + </message> + <message> + <location line="+685"/> + <source>Network operation timed out</source> + <translation>网络操作超时</translation> + </message> +</context> +<context> + <name>QSpinBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/> + <source>More</source> + <translation>更多</translation> + </message> + <message> + <location line="+2"/> + <source>Less</source> + <translation>更少</translation> + </message> +</context> +<context> + <name>QSql</name> + <message> + <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/> + <source>Delete</source> + <translation>删除</translation> + </message> + <message> + <location line="+1"/> + <source>Delete this record?</source> + <translation>删除这条记录?</translation> + </message> + <message> + <location line="+1"/> + <location line="+16"/> + <location line="+36"/> + <source>Yes</source> + <translation>是</translation> + </message> + <message> + <location line="-51"/> + <location line="+16"/> + <location line="+36"/> + <source>No</source> + <translation>否</translation> + </message> + <message> + <location line="-44"/> + <source>Insert</source> + <translation>插入</translation> + </message> + <message> + <location line="+2"/> + <source>Update</source> + <translation>更新</translation> + </message> + <message> + <location line="+4"/> + <source>Save edits?</source> + <translation>保存编辑?</translation> + </message> + <message> + <location line="+3"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+32"/> + <source>Confirm</source> + <translation>确认</translation> + </message> + <message> + <location line="+1"/> + <source>Cancel your edits?</source> + <translation>取消您的编辑?</translation> + </message> +</context> +<context> + <name>QSslSocket</name> + <message> + <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/> + <source>Unable to write data: %1</source> + <translation>不能写入数据:%1</translation> + </message> + <message> + <location line="+119"/> + <source>Error while reading: %1</source> + <translation>读取时错误:%1</translation> + </message> + <message> + <location line="+96"/> + <source>Error during SSL handshake: %1</source> + <translation>SSL握手错误:%1</translation> + </message> + <message> + <location line="-524"/> + <source>Error creating SSL context (%1)</source> + <translation>创建SSL上下文错误(%1)</translation> + </message> + <message> + <location line="+25"/> + <source>Invalid or empty cipher list (%1)</source> + <translation>无效或者空白的密码列表(%1)</translation> + </message> + <message> + <location line="+62"/> + <source>Error creating SSL session, %1</source> + <translation>创建SSL会话错误,%1</translation> + </message> + <message> + <location line="+15"/> + <source>Error creating SSL session: %1</source> + <translation>创建SSL会话错误:%1</translation> + </message> + <message> + <location line="-61"/> + <source>Cannot provide a certificate with no key, %1</source> + <translation>不能提供没有键的证书,%1</translation> + </message> + <message> + <location line="+7"/> + <source>Error loading local certificate, %1</source> + <translation>不能载入本地证书,%1</translation> + </message> + <message> + <location line="+12"/> + <source>Error loading private key, %1</source> + <translation>不能载入私有键,%1</translation> + </message> + <message> + <location line="+7"/> + <source>Private key does not certificate public key, %1</source> + <translation>私有键不能验证公有键,%1</translation> + </message> +</context> +<context> + <name>QSystemSemaphore</name> + <message> + <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/> + <source>%1: out of resources</source> + <translation>%1:资源耗尽了</translation> + </message> + <message> + <location line="-13"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/> + <source>%1: permission denied</source> + <translation>%1:权限被拒绝</translation> + </message> + <message> + <location line="+4"/> + <source>%1: already exists</source> + <translation>%1:已经存在</translation> + </message> + <message> + <location line="+4"/> + <source>%1: does not exist</source> + <translation>%1:不存在</translation> + </message> + <message> + <location line="+9"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/> + <source>%1: unknown error %2</source> + <translation>%1:未知错误 %2</translation> + </message> +</context> +<context> + <name>QTDSDriver</name> + <message> + <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/> + <source>Unable to open connection</source> + <translation>不能打开连接</translation> + </message> + <message> + <location line="+5"/> + <source>Unable to use database</source> + <translation>不能使用数据库</translation> + </message> +</context> +<context> + <name>QTabBar</name> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/> + <source>Scroll Left</source> + <translation>向左滚动</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll Right</source> + <translation>向右滚动</translation> + </message> +</context> +<context> + <name>QTcpServer</name> + <message> + <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/> + <source>Operation on socket is not supported</source> + <translation>socket操作不被支持</translation> + </message> +</context> +<context> + <name>QTextControl</name> + <message> + <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/> + <source>&Undo</source> + <translation>撤消(&U)</translation> + </message> + <message> + <location line="+2"/> + <source>&Redo</source> + <translation>恢复(&R)</translation> + </message> + <message> + <location line="+4"/> + <source>Cu&t</source> + <translation>剪切(&T)</translation> + </message> + <message> + <location line="+5"/> + <source>&Copy</source> + <translation>复制(&C)</translation> + </message> + <message> + <location line="+7"/> + <source>Copy &Link Location</source> + <translation>复制链接位置(&L)</translation> + </message> + <message> + <location line="+6"/> + <source>&Paste</source> + <translation>粘贴(&P)</translation> + </message> + <message> + <location line="+3"/> + <source>Delete</source> + <translation>删除</translation> + </message> + <message> + <location line="+7"/> + <source>Select All</source> + <translation>选择全部</translation> + </message> +</context> +<context> + <name>QToolButton</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/> + <location line="+6"/> + <source>Press</source> + <translation>按下</translation> + </message> + <message> + <location line="-4"/> + <location line="+8"/> + <source>Open</source> + <translation>打开</translation> + </message> +</context> +<context> + <name>QUdpSocket</name> + <message> + <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/> + <source>This platform does not support IPv6</source> + <translation>这个平台不支持IPv6</translation> + </message> +</context> +<context> + <name>QUndoGroup</name> + <message> + <location filename="../src/gui/util/qundogroup.cpp" line="+386"/> + <source>Undo</source> + <translation>撤销</translation> + </message> + <message> + <location line="+28"/> + <source>Redo</source> + <translation>恢复</translation> + </message> +</context> +<context> + <name>QUndoModel</name> + <message> + <location filename="../src/gui/util/qundoview.cpp" line="+101"/> + <source><empty></source> + <translation><空白></translation> + </message> +</context> +<context> + <name>QUndoStack</name> + <message> + <location filename="../src/gui/util/qundostack.cpp" line="+834"/> + <source>Undo</source> + <translation>撤销</translation> + </message> + <message> + <location line="+27"/> + <source>Redo</source> + <translation>恢复</translation> + </message> +</context> +<context> + <name>QUnicodeControlCharacterMenu</name> + <message> + <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/> + <source>LRM Left-to-right mark</source> + <translation>LRM 从左到右标记</translation> + </message> + <message> + <location line="+1"/> + <source>RLM Right-to-left mark</source> + <translation>RLM 从右向左标记</translation> + </message> + <message> + <location line="+1"/> + <source>ZWJ Zero width joiner</source> + <translation>ZWJ 零宽度连接器</translation> + </message> + <message> + <location line="+1"/> + <source>ZWNJ Zero width non-joiner</source> + <translation>ZWNJ 零宽度非连接器</translation> + </message> + <message> + <location line="+1"/> + <source>ZWSP Zero width space</source> + <translation>ZWSP 零宽度空格</translation> + </message> + <message> + <location line="+1"/> + <source>LRE Start of left-to-right embedding</source> + <translation>LRE 开始从左到右嵌入</translation> + </message> + <message> + <location line="+1"/> + <source>RLE Start of right-to-left embedding</source> + <translation>RLE 开始从右向左嵌入</translation> + </message> + <message> + <location line="+1"/> + <source>LRO Start of left-to-right override</source> + <translation>LRO 开始从左向右覆盖</translation> + </message> + <message> + <location line="+1"/> + <source>RLO Start of right-to-left override</source> + <translation>RLO 开始从右向左覆盖</translation> + </message> + <message> + <location line="+1"/> + <source>PDF Pop directional formatting</source> + <translation>PDF 弹出方向格式</translation> + </message> + <message> + <location line="+6"/> + <source>Insert Unicode control character</source> + <translation>插入Unicode控制字符</translation> + </message> +</context> +<context> + <name>QWebFrame</name> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/> + <source>Request cancelled</source> + <translation>请求被取消了</translation> + </message> + <message> + <location line="+17"/> + <source>Request blocked</source> + <translation>请求被阻塞了</translation> + </message> + <message> + <location line="+7"/> + <source>Cannot show URL</source> + <translation>无法显示 URL</translation> + </message> + <message> + <location line="+6"/> + <source>Frame load interruped by policy change</source> + <translation>因为策略调整打断了桢的加载</translation> + </message> + <message> + <location line="+6"/> + <source>Cannot show mimetype</source> + <translation>无法显示 MIMETYPE</translation> + </message> + <message> + <location line="+6"/> + <source>File does not exist</source> + <translation>文件不存在</translation> + </message> +</context> +<context> + <name>QWebPage</name> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/> + <source>Bad HTTP request</source> + <translation>错误的 HTTP 请求</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/> + <source>Submit</source> + <comment>default label for Submit buttons in forms on web pages</comment> + <translation>提交</translation> + </message> + <message> + <location line="+5"/> + <source>Submit</source> + <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment> + <translation>提交</translation> + </message> + <message> + <location line="+5"/> + <source>Reset</source> + <comment>default label for Reset buttons in forms on web pages</comment> + <translation>重置</translation> + </message> + <message> + <location line="+10"/> + <source>This is a searchable index. Enter search keywords: </source> + <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> + <translation>这是一个可以搜索的索引。请输入要搜索的关键字:</translation> + </message> + <message> + <location line="+5"/> + <source>Choose File</source> + <comment>title for file button used in HTML forms</comment> + <translation>选择文件</translation> + </message> + <message> + <location line="+5"/> + <source>No file selected</source> + <comment>text to display in file button used in HTML forms when no file is selected</comment> + <translation>没有文件被选择</translation> + </message> + <message> + <location line="+5"/> + <source>Open in New Window</source> + <comment>Open in New Window context menu item</comment> + <translation>在新窗口中打开</translation> + </message> + <message> + <location line="+5"/> + <source>Save Link...</source> + <comment>Download Linked File context menu item</comment> + <translation>保存链接...</translation> + </message> + <message> + <location line="+5"/> + <source>Copy Link</source> + <comment>Copy Link context menu item</comment> + <translation>复制链接</translation> + </message> + <message> + <location line="+5"/> + <source>Open Image</source> + <comment>Open Image in New Window context menu item</comment> + <translation>打开图片</translation> + </message> + <message> + <location line="+5"/> + <source>Save Image</source> + <comment>Download Image context menu item</comment> + <translation>保存图片</translation> + </message> + <message> + <location line="+5"/> + <source>Copy Image</source> + <comment>Copy Link context menu item</comment> + <translation>复制图片</translation> + </message> + <message> + <location line="+5"/> + <source>Open Frame</source> + <comment>Open Frame in New Window context menu item</comment> + <translation>打开框架</translation> + </message> + <message> + <location line="+5"/> + <source>Copy</source> + <comment>Copy context menu item</comment> + <translation>复制</translation> + </message> + <message> + <location line="+5"/> + <source>Go Back</source> + <comment>Back context menu item</comment> + <translation>后退</translation> + </message> + <message> + <location line="+5"/> + <source>Go Forward</source> + <comment>Forward context menu item</comment> + <translation>前进</translation> + </message> + <message> + <location line="+5"/> + <source>Stop</source> + <comment>Stop context menu item</comment> + <translation>停止</translation> + </message> + <message> + <location line="+5"/> + <source>Reload</source> + <comment>Reload context menu item</comment> + <translation>重新载入</translation> + </message> + <message> + <location line="+5"/> + <source>Cut</source> + <comment>Cut context menu item</comment> + <translation>剪切</translation> + </message> + <message> + <location line="+5"/> + <source>Paste</source> + <comment>Paste context menu item</comment> + <translation>粘贴</translation> + </message> + <message> + <location line="+5"/> + <source>No Guesses Found</source> + <comment>No Guesses Found context menu item</comment> + <translation>没有找到猜测</translation> + </message> + <message> + <location line="+5"/> + <source>Ignore</source> + <comment>Ignore Spelling context menu item</comment> + <translation>忽略</translation> + </message> + <message> + <location line="+5"/> + <source>Add To Dictionary</source> + <comment>Learn Spelling context menu item</comment> + <translation>添加到字典</translation> + </message> + <message> + <location line="+5"/> + <source>Search The Web</source> + <comment>Search The Web context menu item</comment> + <translation>搜索网页</translation> + </message> + <message> + <location line="+5"/> + <source>Look Up In Dictionary</source> + <comment>Look Up in Dictionary context menu item</comment> + <translation>在字典中查找</translation> + </message> + <message> + <location line="+5"/> + <source>Open Link</source> + <comment>Open Link context menu item</comment> + <translation>打开链接</translation> + </message> + <message> + <location line="+5"/> + <source>Ignore</source> + <comment>Ignore Grammar context menu item</comment> + <translation>忽略</translation> + </message> + <message> + <location line="+5"/> + <source>Spelling</source> + <comment>Spelling and Grammar context sub-menu item</comment> + <translation>拼写</translation> + </message> + <message> + <location line="+5"/> + <source>Show Spelling and Grammar</source> + <comment>menu item title</comment> + <translation>显示拼写和语法</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Spelling and Grammar</source> + <comment>menu item title</comment> + <translation>隐藏拼写和语法</translation> + </message> + <message> + <location line="+5"/> + <source>Check Spelling</source> + <comment>Check spelling context menu item</comment> + <translation>检查拼写</translation> + </message> + <message> + <location line="+5"/> + <source>Check Spelling While Typing</source> + <comment>Check spelling while typing context menu item</comment> + <translation>在输入时检查拼写</translation> + </message> + <message> + <location line="+5"/> + <source>Check Grammar With Spelling</source> + <comment>Check grammar with spelling context menu item</comment> + <translation>检查语法和拼写</translation> + </message> + <message> + <location line="+5"/> + <source>Fonts</source> + <comment>Font context sub-menu item</comment> + <translation>字体</translation> + </message> + <message> + <location line="+5"/> + <source>Bold</source> + <comment>Bold context menu item</comment> + <translation>粗体</translation> + </message> + <message> + <location line="+5"/> + <source>Italic</source> + <comment>Italic context menu item</comment> + <translation>意大利体</translation> + </message> + <message> + <location line="+5"/> + <source>Underline</source> + <comment>Underline context menu item</comment> + <translation>下划线</translation> + </message> + <message> + <location line="+5"/> + <source>Outline</source> + <comment>Outline context menu item</comment> + <translation>轮廓</translation> + </message> + <message> + <location line="+5"/> + <source>Direction</source> + <comment>Writing direction context sub-menu item</comment> + <translation>方向</translation> + </message> + <message> + <location line="+5"/> + <source>Text Direction</source> + <comment>Text direction context sub-menu item</comment> + <translation>文本方向</translation> + </message> + <message> + <location line="+5"/> + <source>Default</source> + <comment>Default writing direction context menu item</comment> + <translation>默认</translation> + </message> + <message> + <location line="+5"/> + <source>LTR</source> + <comment>Left to Right context menu item</comment> + <translation>LTR</translation> + </message> + <message> + <location line="+5"/> + <source>RTL</source> + <comment>Right to Left context menu item</comment> + <translation>RTL</translation> + </message> + <message> + <location line="+5"/> + <source>Inspect</source> + <comment>Inspect Element context menu item</comment> + <translation>检查</translation> + </message> + <message> + <location line="+5"/> + <source>No recent searches</source> + <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> + <translation>没有最近的搜索</translation> + </message> + <message> + <location line="+5"/> + <source>Recent searches</source> + <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> + <translation>最近的搜索</translation> + </message> + <message> + <location line="+5"/> + <source>Clear recent searches</source> + <comment>menu item in Recent Searches menu that empties menu's contents</comment> + <translation>清除最近的搜索</translation> + </message> + <message> + <location line="+75"/> + <source>Unknown</source> + <comment>Unknown filesize FTP directory listing item</comment> + <translation>未知的</translation> + </message> + <message> + <location line="+5"/> + <source>%1 (%2x%3 pixels)</source> + <comment>Title string for images</comment> + <translation>%1 (%2x%3 像素)</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/> + <source>Web Inspector - %2</source> + <translation>网页检查员 - %2</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/> + <source>Scroll here</source> + <translation>滚动到这里</translation> + </message> + <message> + <location line="+3"/> + <source>Left edge</source> + <translation>左边缘</translation> + </message> + <message> + <location line="+0"/> + <source>Top</source> + <translation>顶部</translation> + </message> + <message> + <location line="+1"/> + <source>Right edge</source> + <translation>右边缘</translation> + </message> + <message> + <location line="+0"/> + <source>Bottom</source> + <translation>底部</translation> + </message> + <message> + <location line="+3"/> + <source>Page left</source> + <translation>左一页</translation> + </message> + <message> + <location line="+0"/> + <source>Page up</source> + <translation>上一页</translation> + </message> + <message> + <location line="+1"/> + <source>Page right</source> + <translation>右一页</translation> + </message> + <message> + <location line="+0"/> + <source>Page down</source> + <translation>下一页</translation> + </message> + <message> + <location line="+3"/> + <source>Scroll left</source> + <translation>向左滚动</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll up</source> + <translation>向上滚动</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll right</source> + <translation>向右滚动</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll down</source> + <translation>向下滚动</translation> + </message> + <message numerus="yes"> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/> + <source>%n file(s)</source> + <comment>number of chosen file</comment> + <translation> + <numerusform>%n 个文件</numerusform> + </translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/> + <source>JavaScript Alert - %1</source> + <translation>JavaScript警告 - %1</translation> + </message> + <message> + <location line="+15"/> + <source>JavaScript Confirm - %1</source> + <translation>JavaScript确认 - %1</translation> + </message> + <message> + <location line="+17"/> + <source>JavaScript Prompt - %1</source> + <translation>JavaScript提示 - %1</translation> + </message> + <message> + <location line="+333"/> + <source>Move the cursor to the next character</source> + <translation>移动光标到下一个字符</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous character</source> + <translation>移动光标到上一个字符</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the next word</source> + <translation>移动光标到下一个单词</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous word</source> + <translation>移动光标到上一个单词</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the next line</source> + <translation>移动光标到下一行</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous line</source> + <translation>移动光标到上一行</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the line</source> + <translation>移动光标到行首</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the line</source> + <translation>移动光标到行尾</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the block</source> + <translation>移动光标到块首</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the block</source> + <translation>移动光标到块尾</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the document</source> + <translation>移动光标到文件开头</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the document</source> + <translation>移动光标到文件末尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select all</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next character</source> + <translation>选中到下一个字符</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous character</source> + <translation>选中到上一个字符</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next word</source> + <translation>选中到下一个单词</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous word</source> + <translation>选中到上一个单词</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next line</source> + <translation>选中到下一行</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous line</source> + <translation>选中到上一行</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the line</source> + <translation>选中到行首</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the line</source> + <translation>选中到行尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the block</source> + <translation>选中到块首</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the block</source> + <translation>选中到块尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the document</source> + <translation>选中到文件首</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the document</source> + <translation>选中到文件尾</translation> + </message> + <message> + <location line="+3"/> + <source>Delete to the start of the word</source> + <translation>删除到单词首</translation> + </message> + <message> + <location line="+3"/> + <source>Delete to the end of the word</source> + <translation>删除到单词尾</translation> + </message> + <message> + <location line="+33"/> + <source>Insert a new paragraph</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Insert a new line</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QWhatsThisAction</name> + <message> + <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/> + <source>What's This?</source> + <translation>这是什么?</translation> + </message> +</context> +<context> + <name>QWidget</name> + <message> + <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/> + <source>*</source> + <translation>*</translation> + </message> +</context> +<context> + <name>QWizard</name> + <message> + <location filename="../src/gui/dialogs/qwizard.cpp" line="+637"/> + <source>Go Back</source> + <translation>返回</translation> + </message> + <message> + <location line="+3"/> + <source>Continue</source> + <translation>继续</translation> + </message> + <message> + <location line="+5"/> + <source>Commit</source> + <translation>提交</translation> + </message> + <message> + <location line="+2"/> + <source>Done</source> + <translation>完成</translation> + </message> + <message> + <source>Quit</source> + <translation type="obsolete">退出</translation> + </message> + <message> + <location line="+4"/> + <source>Help</source> + <translation>帮助</translation> + </message> + <message> + <location line="-14"/> + <source>< &Back</source> + <translation>< 上一步(&B)</translation> + </message> + <message> + <location line="+10"/> + <source>&Finish</source> + <translation>完成(&F)</translation> + </message> + <message> + <location line="+2"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+2"/> + <source>&Help</source> + <translation>帮助(&H)</translation> + </message> + <message> + <location line="-8"/> + <source>&Next</source> + <translation>下一步(&N)</translation> + </message> + <message> + <location line="+0"/> + <source>&Next ></source> + <translation>下一步(&N) ></translation> + </message> +</context> +<context> + <name>QWorkspace</name> + <message> + <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/> + <source>&Restore</source> + <translation>恢复(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Move</source> + <translation>移动(&M)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+2"/> + <source>Mi&nimize</source> + <translation>最小化(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Ma&ximize</source> + <translation>最大化(&X)</translation> + </message> + <message> + <location line="+2"/> + <source>&Close</source> + <translation>关闭(&C)</translation> + </message> + <message> + <location line="+6"/> + <source>Stay on &Top</source> + <translation>总在最前(&T)</translation> + </message> + <message> + <location line="+3"/> + <location line="+1059"/> + <source>Sh&ade</source> + <translation>卷起(&A)</translation> + </message> + <message> + <location line="-278"/> + <location line="+60"/> + <source>%1 - [%2]</source> + <translation>%1 - [%2]</translation> + </message> + <message> + <location line="-1837"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+2"/> + <source>Restore Down</source> + <translation>恢复</translation> + </message> + <message> + <location line="-4"/> + <source>Close</source> + <translation>关闭</translation> + </message> + <message> + <location line="+2053"/> + <source>&Unshade</source> + <translation>展开(&U)</translation> + </message> +</context> +<context> + <name>QXml</name> + <message> + <location filename="../src/xml/sax/qxml.cpp" line="+58"/> + <source>no error occurred</source> + <translation>没有错误发生</translation> + </message> + <message> + <location line="+1"/> + <source>error triggered by consumer</source> + <translation>由消费者出发的错误</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected end of file</source> + <translation>意外的文件终止</translation> + </message> + <message> + <location line="+1"/> + <source>more than one document type definition</source> + <translation>多于一个的文档类型定义</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing element</source> + <translation>在解析元素的时候发生错误</translation> + </message> + <message> + <location line="+1"/> + <source>tag mismatch</source> + <translation>标记不匹配</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing content</source> + <translation>在解析内容的时候发生错误</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected character</source> + <translation>意外的字符</translation> + </message> + <message> + <location line="+1"/> + <source>invalid name for processing instruction</source> + <translation>无效的处理指令名称</translation> + </message> + <message> + <location line="+1"/> + <source>version expected while reading the XML declaration</source> + <translation>在读取XML声明的时候,版本被期待</translation> + </message> + <message> + <location line="+1"/> + <source>wrong value for standalone declaration</source> + <translation>错误的独立声明的值</translation> + </message> + <message> + <location line="+1"/> + <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> + <translation>在读取XML声明的时候,编码声明或者独立声明被期待</translation> + </message> + <message> + <location line="+1"/> + <source>standalone declaration expected while reading the XML declaration</source> + <translation>在读取XML声明的时候,独立声明被期待</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing document type definition</source> + <translation>在解析文档类型定义的时候发生错误</translation> + </message> + <message> + <location line="+1"/> + <source>letter is expected</source> + <translation>字符被期待</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing comment</source> + <translation>在解析注释的时候发生错误</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing reference</source> + <translation>在解析参考的时候发生错误</translation> + </message> + <message> + <location line="+1"/> + <source>internal general entity reference not allowed in DTD</source> + <translation>在DTD中不允许使用内部解析的通用实体参考</translation> + </message> + <message> + <location line="+1"/> + <source>external parsed general entity reference not allowed in attribute value</source> + <translation>在属性值中不允许使用外部解析的通用实体参考</translation> + </message> + <message> + <location line="+1"/> + <source>external parsed general entity reference not allowed in DTD</source> + <translation>在DTD中不允许使用外部解析的通用实体参考</translation> + </message> + <message> + <location line="+1"/> + <source>unparsed entity reference in wrong context</source> + <translation>没有解析的错误上下文中的实体参考</translation> + </message> + <message> + <location line="+1"/> + <source>recursive entities</source> + <translation>嵌套实体</translation> + </message> + <message> + <location line="+1"/> + <source>error in the text declaration of an external entity</source> + <translation>在一个外部实体的文本声明里有错误</translation> + </message> +</context> +<context> + <name>QXmlStream</name> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/> + <source>Extra content at end of document.</source> + <translation>文档末尾有额外内容。</translation> + </message> + <message> + <location line="+222"/> + <source>Invalid entity value.</source> + <translation>无效的实体值。</translation> + </message> + <message> + <location line="+107"/> + <source>Invalid XML character.</source> + <translation>无效的XML字符。</translation> + </message> + <message> + <location line="+259"/> + <source>Sequence ']]>' not allowed in content.</source> + <translation>内容中不允许有“]]>“序列。</translation> + </message> + <message> + <location line="+309"/> + <source>Namespace prefix '%1' not declared</source> + <translation>命名空间的”%1“前缀没有被声明</translation> + </message> + <message> + <location line="+78"/> + <source>Attribute redefined.</source> + <translation>属性重复定义。</translation> + </message> + <message> + <location line="+115"/> + <source>Unexpected character '%1' in public id literal.</source> + <translation>在公有标识文本中有意外的字符”%1“。</translation> + </message> + <message> + <location line="+28"/> + <source>Invalid XML version string.</source> + <translation>无效的XML版本字符串。</translation> + </message> + <message> + <location line="+2"/> + <source>Unsupported XML version.</source> + <translation>不被支持的XML版本。</translation> + </message> + <message> + <location line="+23"/> + <source>%1 is an invalid encoding name.</source> + <translation>%1是无效的编码名称。</translation> + </message> + <message> + <location line="+7"/> + <source>Encoding %1 is unsupported</source> + <translation>编码%1不被支持。</translation> + </message> + <message> + <location line="+16"/> + <source>Standalone accepts only yes or no.</source> + <translation>独立运行只允许是或者否。</translation> + </message> + <message> + <location line="+2"/> + <source>Invalid attribute in XML declaration.</source> + <translation>在XML声明中无效的属性。</translation> + </message> + <message> + <location line="+16"/> + <source>Premature end of document.</source> + <translation>文档过早的结束。</translation> + </message> + <message> + <location line="+2"/> + <source>Invalid document.</source> + <translation>无效的文档。</translation> + </message> + <message> + <location line="+40"/> + <source>Expected </source> + <translation>期待的 </translation> + </message> + <message> + <location line="+11"/> + <source>, but got '</source> + <translation>,但是得到的是“</translation> + </message> + <message> + <location line="+4"/> + <source>Unexpected '</source> + <translation>意外的“</translation> + </message> + <message> + <location line="+210"/> + <source>Expected character data.</source> + <translation>期待的字符数据。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/> + <source>Recursive entity detected.</source> + <translation>检测到嵌套实体。</translation> + </message> + <message> + <location line="+516"/> + <source>Start tag expected.</source> + <translation>开始期待的标记。</translation> + </message> + <message> + <location line="+222"/> + <source>XML declaration not at start of document.</source> + <translation>XML声明没有在文档的开始位置。</translation> + </message> + <message> + <location line="-31"/> + <source>NDATA in parameter entity declaration.</source> + <translation>在参数实体声明中有NDATA。</translation> + </message> + <message> + <location line="+34"/> + <source>%1 is an invalid processing instruction name.</source> + <translation>%1 是无效的处理指令名称。</translation> + </message> + <message> + <location line="+11"/> + <source>Invalid processing instruction name.</source> + <translation>无效的处理指令名称。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/> + <location line="+12"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/> + <location line="+53"/> + <source>Illegal namespace declaration.</source> + <translation>非法的命名空间声明。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/> + <source>Invalid XML name.</source> + <translation>无效的XML名称。</translation> + </message> + <message> + <location line="+23"/> + <source>Opening and ending tag mismatch.</source> + <translation>开始标记和结束标记不匹配。</translation> + </message> + <message> + <location line="+18"/> + <source>Reference to unparsed entity '%1'.</source> + <translation>未解析实体“%1“的引用。</translation> + </message> + <message> + <location line="-13"/> + <location line="+61"/> + <location line="+40"/> + <source>Entity '%1' not declared.</source> + <translation>实体”%1“没有被声明。</translation> + </message> + <message> + <location line="-26"/> + <source>Reference to external entity '%1' in attribute value.</source> + <translation>在属性值中的外部实体“%1”的引用。</translation> + </message> + <message> + <location line="+40"/> + <source>Invalid character reference.</source> + <translation>无效的字符引用。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/> + <source>Encountered incorrectly encoded content.</source> + <translation>遇到不正确的编码内容。</translation> + </message> + <message> + <location line="+274"/> + <source>The standalone pseudo attribute must appear after the encoding.</source> + <translation>独立运行伪属性必须出现在编码之后。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/> + <source>%1 is an invalid PUBLIC identifier.</source> + <translation>%1是一个无效的公有(PUBLIC)标识符。</translation> + </message> +</context> +<context> + <name>QtXmlPatterns</name> + <message> + <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/> + <source>An %1-attribute with value %2 has already been declared.</source> + <translation>带有值 %2 的 %1 属性已经声明过了。</translation> + </message> + <message> + <location line="+13"/> + <source>An %1-attribute must have a valid %2 as value, which %3 isn't.</source> + <translation>一个 %1 属性必须带有一个有效的 %2 作为值,但 %3 却不是。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/> + <source>Network timeout.</source> + <translation>网络超时。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/> + <source>Element %1 can't be serialized because it appears outside the document element.</source> + <translation>元素 %1 不能被串行化,因为它出现在文档元素之外。</translation> + </message> + <message> + <source>Attribute element %1 can't be serialized because it appears at the top level.</source> + <translation type="obsolete">属性元素 %1 不能被串行化,因为它出现在最顶层。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/> + <source>Year %1 is invalid because it begins with %2.</source> + <translation>%1 年是无效的,因为应该从 %2 开始。</translation> + </message> + <message> + <location line="+19"/> + <source>Day %1 is outside the range %2..%3.</source> + <translation>%1 日是在 %2...%3 范围之外的。</translation> + </message> + <message> + <location line="+7"/> + <source>Month %1 is outside the range %2..%3.</source> + <translation>%1 月是在 %2...%3 范围之外的。</translation> + </message> + <message> + <location line="+10"/> + <source>Overflow: Can't represent date %1.</source> + <translation>溢出:无法呈现数据 %1。</translation> + </message> + <message> + <location line="+9"/> + <source>Day %1 is invalid for month %2.</source> + <translation>%1 日对于 %2 月是无效的。</translation> + </message> + <message> + <location line="+49"/> + <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source> + <translation>时间 24:%1:%2.%3 是无效的。小时是 24,但是分钟、秒和毫秒不全为 0; </translation> + </message> + <message> + <location line="+13"/> + <source>Time %1:%2:%3.%4 is invalid.</source> + <translation>时间 %1:%2:%3.%4 是无效的。</translation> + </message> + <message> + <location line="+115"/> + <source>Overflow: Date can't be represented.</source> + <translation>溢出:数据无法被呈现。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/> + <location line="+15"/> + <source>At least one component must be present.</source> + <translation>至少有一个组件被呈现。</translation> + </message> + <message> + <location line="-7"/> + <source>At least one time component must appear after the %1-delimiter.</source> + <translation>至少一个时间组件必须出现在这个 %1 界限之后。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/> + <source>No operand in an integer division, %1, can be %2.</source> + <translation>在整数除法中没有操作数,%1,可以是 %2。</translation> + </message> + <message> + <location line="+7"/> + <source>The first operand in an integer division, %1, cannot be infinity (%2).</source> + <translation>除法中的第一个操作数,%1,不能是无穷(%2)。</translation> + </message> + <message> + <location line="+6"/> + <source>The second operand in a division, %1, cannot be zero (%2).</source> + <translation>除法中的第二个操作数,%1,不能是零(%2)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/> + <source>%1 is not a valid value of type %2.</source> + <translation>%1 不是类型为 %2 的有效值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/> + <source>When casting to %1 from %2, the source value cannot be %3.</source> + <translation>当从 %2 抛出到 %1 时,源值不能是 %3。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/> + <source>Integer division (%1) by zero (%2) is undefined.</source> + <translation>整数除法(%1)除零(%2)是未定义的。</translation> + </message> + <message> + <location line="+7"/> + <source>Division (%1) by zero (%2) is undefined.</source> + <translation>除法(%1)除零(%2)是未定义的。</translation> + </message> + <message> + <location line="+7"/> + <source>Modulus division (%1) by zero (%2) is undefined.</source> + <translation>求模除法(%1)除零(%2)是未定义的。</translation> + </message> + <message> + <location line="+122"/> + <location line="+32"/> + <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> + <translation>一个类型为 %1 的值除以 %2(不是一个数值)是不允许的。</translation> + </message> + <message> + <location line="-20"/> + <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source> + <translation>一个类型为 %1 的值除以 %2 或者 %3(正负零)是不允许的。</translation> + </message> + <message> + <location line="+32"/> + <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source> + <translation>一个类型为 %1 的值乘以 %2 或者 %3(正负无穷)是不允许的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/> + <source>A value of type %1 cannot have an Effective Boolean Value.</source> + <translation>一个类型为 %1 的值不能是一个有效的布尔值(Effective Boolean Value)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/> + <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> + <translation>有效的布尔值(Effective Boolean Value)不能被用于计算一个包含两个或者更多原子值的序列。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/> + <source>Value %1 of type %2 exceeds maximum (%3).</source> + <translation>类型为 %2 的值 %1 超过了最大值(%3)。</translation> + </message> + <message> + <location line="+9"/> + <source>Value %1 of type %2 is below minimum (%3).</source> + <translation>类型为 %2 的值 %1 超过了最小值(%3)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/> + <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source> + <translation>类型为 %1 的值必须包含偶数个数字。值 %2 不是这样的。</translation> + </message> + <message> + <location line="+19"/> + <source>%1 is not valid as a value of type %2.</source> + <translation>%1 不是类型为 %2 的有效值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/> + <source>Operator %1 cannot be used on type %2.</source> + <translation>操作符 %1 不能被用于类型 %2。</translation> + </message> + <message> + <location line="+17"/> + <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source> + <translation>操作符 %1 不能被用于类型为 %2 和 %3 的原子值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/> + <source>The namespace URI in the name for a computed attribute cannot be %1.</source> + <translation>一个被计算的属性的名称中的命名空间 URI 不能是 %1。</translation> + </message> + <message> + <location line="+9"/> + <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source> + <translation>一个被计算的属性的名称不能使用带有本地名称 %2 的命名空间 URI %1。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/> + <source>Type error in cast, expected %1, received %2.</source> + <translation>抛出类型错误,期望的是 %1,收到的是 %2。</translation> + </message> + <message> + <location line="+29"/> + <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source> + <translation>当抛出到 %1 或者它的派生类时,源类型必须是同一类型,或者它必须是一个字符串类型。类型 %2 是不被允许的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/> + <source>No casting is possible with %1 as the target type.</source> + <translation>无法以 %1 为目标类型进行抛出。</translation> + </message> + <message> + <location line="+15"/> + <source>It is not possible to cast from %1 to %2.</source> + <translation>无法从 %1 抛出到 %2。</translation> + </message> + <message> + <location line="+27"/> + <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source> + <translation>无法抛出到 %1,因为它是一个抽象类型,并且因此无法被实例化。</translation> + </message> + <message> + <location line="+23"/> + <source>It's not possible to cast the value %1 of type %2 to %3</source> + <translation>无法从类型为 %2 的值 %1 抛出到 %3</translation> + </message> + <message> + <location line="+8"/> + <source>Failure when casting from %1 to %2: %3</source> + <translation>从 %2 抛出到 %1 失败:%3</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/> + <source>A comment cannot contain %1</source> + <translation>注释不能包含 %1</translation> + </message> + <message> + <location line="+6"/> + <source>A comment cannot end with a %1.</source> + <translation>注释不能以 %1 结尾。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/> + <source>No comparisons can be done involving the type %1.</source> + <translation>对于类型 %1 不能进行比较。</translation> + </message> + <message> + <location line="+14"/> + <source>Operator %1 is not available between atomic values of type %2 and %3.</source> + <translation>在类型 %2 和 %3 的原子值之间,操作符 %1 是不可用的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/> + <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source> + <translation>一个属性节点不能是一个文档节点的子节点。因此,这个属性 %1 所在位置是不合适的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/> + <source>A library module cannot be evaluated directly. It must be imported from a main module.</source> + <translation>一个库模块不能被直接评估。它必须从一个主模块中导入。</translation> + </message> + <message> + <location line="+40"/> + <source>No template by name %1 exists.</source> + <translation>没有名为 %1 的模板存在。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/> + <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> + <translation>类型为 %1 的值不能被判断。一个判断必须是数值类型或者一个有效的布尔值(Effective Boolean Value)类型。</translation> + </message> + <message> + <location line="+32"/> + <source>A positional predicate must evaluate to a single numeric value.</source> + <translation>一个定位判断必须评估一个单一数值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/> + <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source> + <translation>一个处理指令中的目标名称不能是任何大小写混合的 %1。因此,%2 是无效的。</translation> + </message> + <message> + <location line="+24"/> + <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> + <translation>%1 不是处理指令的有效目标名称。它必须是值 %2,例如 %3。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/> + <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> + <translation>一个路径中的最后一步必须包含节点或者原子值。它不能是两者的一个组合。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/> + <source>The data of a processing instruction cannot contain the string %1</source> + <translation>处理指令的数据不能包含字符串 %1</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/> + <source>No namespace binding exists for the prefix %1</source> + <translation>对于前缀 %1,没有存在绑定的命名空间。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/> + <source>No namespace binding exists for the prefix %1 in %2</source> + <translation>对于 %2 中的前缀 %1,没有存在绑定的命名空间。</translation> + </message> + <message> + <location line="+12"/> + <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/> + <source>%1 is an invalid %2</source> + <translation>%1 是一个无效的 %2。</translation> + </message> + <message numerus="yes"> + <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/> + <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source> + <translation> + <numerusform>%1 最多可以有 %n 个参数。因此 %2 是无效的。</numerusform> + </translation> + </message> + <message numerus="yes"> + <location line="+11"/> + <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source> + <translation> + <numerusform>%1 需要至少 %n 个参数。因此 %2 是无效的。</numerusform> + </translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/> + <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source> + <translation>%1 的第一个参数不能是类型 %2 的。它必须是数字类型的,xs:yearMonthDuration 或者 xs:dayTimeDuration。</translation> + </message> + <message> + <location line="+74"/> + <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> + <translation>%1 的第一个参数不能是类型 %2 的。它必须是类型 %3、%4 或者 %5 的。</translation> + </message> + <message> + <location line="+91"/> + <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> + <translation>%1 的第二个参数不能是类型 %2 的。它必须是类型 %3、%4 或者 %5 的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/> + <source>%1 is not a valid XML 1.0 character.</source> + <translation>%1 不是一个有效的 XML 1.0 字符。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/> + <source>The first argument to %1 cannot be of type %2.</source> + <translation>%1 的第一个参数不能是类型 %2 的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/> + <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source> + <translation>如果两个值都有区偏移(zone offset),它们必须拥有相同的区偏移。%1 和 %2 的区偏移是不同的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/> + <source>%1 was called.</source> + <translation>%1 被调用了。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/> + <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> + <translation>%1 必须被 %2 或者 %3 跟随,不能在替换字符串的末尾。</translation> + </message> + <message> + <location line="+39"/> + <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> + <translation>在这个替换字符串中,%1 在没有被转义的时候必须被至少一个数字跟随。</translation> + </message> + <message> + <location line="+26"/> + <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> + <translation>在这个替换字符串中,%1 只能被用于转义它本身或者 %2,而不是 %3</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/> + <source>%1 matches newline characters</source> + <translation>%1 匹配了换行符</translation> + </message> + <message> + <location line="+4"/> + <source>%1 and %2 match the start and end of a line.</source> + <translation>%1 和 %2 匹配了一行的头和尾。</translation> + </message> + <message> + <location line="+6"/> + <source>Matches are case insensitive</source> + <translation>匹配是大小写不敏感的</translation> + </message> + <message> + <location line="+4"/> + <source>Whitespace characters are removed, except when they appear in character classes</source> + <translation>空白字符被移除了,除非当它们出现在字符类中</translation> + </message> + <message> + <location line="+99"/> + <source>%1 is an invalid regular expression pattern: %2</source> + <translation>%1 是正则表达式中的一个无效模式:%2</translation> + </message> + <message> + <location line="+30"/> + <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> + <translation>%1 是正则表达式中的一个无效标记。有效标记为:</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/> + <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> + <translation>如果第一个参数是空序列或者零长度字符串(无命名空间),那么就不能指定前缀。前缀 %1 被指定了。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/> + <source>It will not be possible to retrieve %1.</source> + <translation>将不能获取 %1。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/> + <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> + <translation>函数 %1 的第二个参数的根节点必须是一个文档节点。%2 不是一个文档节点。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/> + <source>The default collection is undefined</source> + <translation>默认收集(collection)是未定义的</translation> + </message> + <message> + <location line="+13"/> + <source>%1 cannot be retrieved</source> + <translation>无法获取 %1</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/> + <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> + <translation>不支持正规化(normalization)表单 %1。被支持的表单是 %2、%3、%4 和 %5,以及无,例如空字符串(无正规化)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/> + <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> + <translation>区偏移(zone offset)必须在 %1...%2 范围之内。%3 是在范围之外的。</translation> + </message> + <message> + <location line="+12"/> + <source>%1 is not a whole number of minutes.</source> + <translation>%1 不是分钟的整数。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/> + <source>Required cardinality is %1; got cardinality %2.</source> + <translation>所需要的表间关系是 %1;得到的表间关系却是 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/> + <source>The item %1 did not match the required type %2.</source> + <translation>项 %1 和所需的类型 %2 不匹配。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/> + <location line="+7253"/> + <source>%1 is an unknown schema type.</source> + <translation>%1 是一个未知的方案类型。</translation> + </message> + <message> + <location line="-6971"/> + <source>Only one %1 declaration can occur in the query prolog.</source> + <translation>只有一个 %1 的声明可以出现在查询序言中。</translation> + </message> + <message> + <location line="+188"/> + <source>The initialization of variable %1 depends on itself</source> + <translation>变量 %1 的初始化依赖于它本身</translation> + </message> + <message> + <location line="+63"/> + <source>No variable by name %1 exists</source> + <translation>没有名称为 %1 的变量存在。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/> + <source>The variable %1 is unused</source> + <translation>变量 %1 没有被使用</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/> + <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> + <translation>不支持版本 %1。被支持的 XQuery 版本是 1.0。</translation> + </message> + <message> + <location line="+16"/> + <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> + <translation>编码方式 %1 是无效的。它必须只包含拉丁字符,必须不包含空白符号,并且必须和正则表达式 %2 匹配。</translation> + </message> + <message> + <location line="+55"/> + <source>No function with signature %1 is available</source> + <translation>没有签名为 %1 的可用函数。</translation> + </message> + <message> + <location line="+72"/> + <location line="+10"/> + <source>A default namespace declaration must occur before function, variable, and option declarations.</source> + <translation>默认命名空间声明必须出现在函数、变量和选项声明之前。</translation> + </message> + <message> + <location line="+10"/> + <source>Namespace declarations must occur before function, variable, and option declarations.</source> + <translation>命名空间声明必须出现在函数、变量和选项声明之前。</translation> + </message> + <message> + <location line="+11"/> + <source>Module imports must occur before function, variable, and option declarations.</source> + <translation>模块导入不能出现在函数、变量和选项声明之前。</translation> + </message> + <message> + <location line="+200"/> + <source>It is not possible to redeclare prefix %1.</source> + <translation>不能重复声明前缀 %1。</translation> + </message> + <message> + <source>Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1.</source> + <translation type="obsolete">至于前缀 %1 可以被声明为和命名空间 %2 绑定。默认情况下,它已经被绑定到前缀 %1。</translation> + </message> + <message> + <location line="+18"/> + <source>Prefix %1 is already declared in the prolog.</source> + <translation>前缀 %1 在序言中已经声明过了。</translation> + </message> + <message> + <location line="+95"/> + <source>The name of an option must have a prefix. There is no default namespace for options.</source> + <translation>一个选项的名称必须带有前缀。对于选项没有默认命名空间。</translation> + </message> + <message> + <location line="+171"/> + <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> + <translation>不支持方案导入(Schema Import)特性,并且因此 %1 声明不能出现。</translation> + </message> + <message> + <location line="+13"/> + <source>The target namespace of a %1 cannot be empty.</source> + <translation>%1 的目标命名空间不能为空。</translation> + </message> + <message> + <location line="+8"/> + <source>The module import feature is not supported</source> + <translation>不支持模块导入特性</translation> + </message> + <message> + <source>A variable by name %1 has already been declared in the prolog.</source> + <translation type="obsolete">名称为 %1 的变量已经在序言中声明过了。</translation> + </message> + <message> + <location line="+52"/> + <source>No value is available for the external variable by name %1.</source> + <translation>名称为 %1 的外部变量并没有可用的值。</translation> + </message> + <message> + <source>The namespace for a user defined function cannot be empty(try the predefined prefix %1 which exists for cases like this)</source> + <translation type="obsolete">用户定义的函数的命名空间不能为空(请试试预定义的前缀 %1,它就是用于这种情况的)。</translation> + </message> + <message> + <location line="-4154"/> + <source>A construct was encountered which only is allowed in XQuery.</source> + <translation>遇到了一个只允许在XQuery中出现的构造。</translation> + </message> + <message> + <location line="+118"/> + <source>A template by name %1 has already been declared.</source> + <translation>模板%1已被声明</translation> + </message> + <message> + <location line="+3581"/> + <source>The keyword %1 cannot occur with any other mode name.</source> + <translation>任何其他模式名称不能出现关键字%1。</translation> + </message> + <message> + <location line="+29"/> + <source>The value of attribute %1 must of type %2, which %3 isn't.</source> + <translation>属性%1的值必须是类型%2,但%3不是。</translation> + </message> + <message> + <location line="+75"/> + <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source> + <translation>前缀%1不能被绑定。默认的,它已被绑定到名字空间%2。</translation> + </message> + <message> + <location line="+312"/> + <source>A variable by name %1 has already been declared.</source> + <translation>变量%1已被声明。</translation> + </message> + <message> + <location line="+135"/> + <source>A stylesheet function must have a prefixed name.</source> + <translation>样式表函数必须有一个前缀名。</translation> + </message> + <message> + <location line="+9"/> + <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> + <translation>用户定义函数的名字空间不能为空(试用为这种情况而存在的预定义前缀%1)</translation> + </message> + <message> + <location line="+9"/> + <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> + <translation>命名空间 %1 是保留的;因此用户定义的函数不能使用它。请试试预定义的前缀 %2,它就是用于这种情况的。</translation> + </message> + <message> + <location line="+12"/> + <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> + <translation>用户在一个库模块中定义的函数的命名空间必须和这个模块的命名空间一致。也就是说,它应该是 %1,而不是 %2</translation> + </message> + <message> + <location line="+34"/> + <source>A function already exists with the signature %1.</source> + <translation>一个带有签名 %1 的函数已经存在。</translation> + </message> + <message> + <location line="+23"/> + <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> + <translation>不支持外部函数。所有支持的函数必须可以被直接使用,不能把它们声明为外部的</translation> + </message> + <message> + <location line="+37"/> + <source>An argument by name %1 has already been declared. Every argument name must be unique.</source> + <translation>名称为 %1 的参数已经被声明了。每个参数名称必须唯一。</translation> + </message> + <message> + <location line="+179"/> + <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> + <translation>当函数%1被用于样式匹配时,参数必须是变量参考或者字符串。</translation> + </message> + <message> + <location line="+11"/> + <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> + <translation>在XSL-T样式中,函数%1的第一个参数必须是字符串,以便用于匹配。</translation> + </message> + <message> + <location line="+14"/> + <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> + <translation>在XSL-T样式中,函数%1的第一个参数必须是文字或者变量参考,以便用于匹配。</translation> + </message> + <message> + <location line="+9"/> + <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> + <translation>在XSL-T样式中,函数%1不能有第三个参数。</translation> + </message> + <message> + <location line="+10"/> + <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> + <translation>在XSL-T样式中,只用函数%1和%2可以用于匹配,%3不可以。</translation> + </message> + <message> + <location line="+63"/> + <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> + <translation>在XSL-T仰视中,不能使用%1轴,只能使用%2轴或者%3轴。</translation> + </message> + <message> + <location line="+126"/> + <source>%1 is an invalid template mode name.</source> + <translation>%1不是一个合法的模板模式名称。</translation> + </message> + <message> + <location line="+44"/> + <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> + <translation>一个在 for 表达式中绑定的变量的名称必须和这个定位变量不同。因此,这两个名称为 %1 的变量冲突。</translation> + </message> + <message> + <location line="+758"/> + <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> + <translation>不支持方案验证特性(Schema Validation Feature)。因此,也许不能使用 %1 表达式。</translation> + </message> + <message> + <location line="+39"/> + <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> + <translation>不支持任何编译指示表达式(pragma expression)。因此,必须呈现一个回调表达式(fallback expression)。</translation> + </message> + <message> + <location line="+267"/> + <source>Each name of a template parameter must be unique; %1 is duplicated.</source> + <translation>每一个模板参数的名称都必须是唯一的;%2是重复的。</translation> + </message> + <message> + <location line="+129"/> + <source>The %1-axis is unsupported in XQuery</source> + <translation>这个 %1 轴在 XQuery 中是不被支持的。</translation> + </message> + <message> + <location line="+1150"/> + <source>%1 is not a valid name for a processing-instruction.</source> + <translation>%1不是一个处理指令的合法名称。</translation> + </message> + <message> + <location line="-7029"/> + <source>%1 is not a valid numeric literal.</source> + <translation>%1 不是一个有效的数字语义。</translation> + </message> + <message> + <location line="+6165"/> + <source>No function by name %1 is available.</source> + <translation>没有名称为 %1 的可用函数。</translation> + </message> + <message> + <location line="+102"/> + <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> + <translation>当这个命名空间 URI 被绑定到一个前缀 %1 时,它不能是空字符串。</translation> + </message> + <message> + <location line="+7"/> + <source>%1 is an invalid namespace URI.</source> + <translation>%1 是一个无效的命名空间 URI。</translation> + </message> + <message> + <location line="+6"/> + <source>It is not possible to bind to the prefix %1</source> + <translation>无法绑定到这个前缀 %1。</translation> + </message> + <message> + <location line="+7"/> + <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> + <translation>命名空间 %1 只能和 %2 绑定(并且如果是这种情况,需要提前声明)。</translation> + </message> + <message> + <location line="+8"/> + <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> + <translation>前缀 %1 只能和 %2 绑定(并且如果是这种情况,需要提前声明)。</translation> + </message> + <message> + <location line="+15"/> + <source>Two namespace declaration attributes have the same name: %1.</source> + <translation>两个命名空间声明属性使用了相同的名称:%1。</translation> + </message> + <message> + <location line="+89"/> + <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> + <translation>命名空间 URI 必须是一个常量并且不能使用封闭的表达式。</translation> + </message> + <message> + <location line="+16"/> + <source>An attribute by name %1 has already appeared on this element.</source> + <translation>一个名称为 %1 的属性已经出现在这个元素中了。</translation> + </message> + <message> + <location line="+61"/> + <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> + <translation>一个直接元素构造器没有很好地形成。%1 后面跟着 %2。</translation> + </message> + <message> + <location line="+458"/> + <source>The name %1 does not refer to any schema type.</source> + <translation>名称 %1 没有指向任何方案类型。</translation> + </message> + <message> + <location line="+10"/> + <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> + <translation>%1 是一个复杂类型。无法抛出到复杂类型。因此,抛出到例如 %2 这样的原子类型是可以的。</translation> + </message> + <message> + <location line="+9"/> + <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> + <translation>%1 不是原子类型。只能抛出到原子类型。</translation> + </message> + <message> + <source>%1 is not a valid name for a processing-instruction. Therefore this name test will never match.</source> + <translation type="obsolete">%1 不是处理指令的有效名称。因此这个名称测试永远不会匹配。</translation> + </message> + <message> + <location line="+145"/> + <location line="+71"/> + <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> + <translation>%1 不是范围内属性声明。注意方案导入特性是不被支持的。</translation> + </message> + <message> + <location line="+48"/> + <source>The name of an extension expression must be in a namespace.</source> + <translation>一个扩展表达式的名称必须在一个命名空间中。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/> + <source>empty</source> + <translation>空白</translation> + </message> + <message> + <location line="+2"/> + <source>zero or one</source> + <translation>零或者一</translation> + </message> + <message> + <location line="+2"/> + <source>exactly one</source> + <translation>确切地一</translation> + </message> + <message> + <location line="+2"/> + <source>one or more</source> + <translation>一或者更多</translation> + </message> + <message> + <location line="+2"/> + <source>zero or more</source> + <translation>零或者更多</translation> + </message> + <message> + <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/> + <source>Required type is %1, but %2 was found.</source> + <translation>需要的类型是 %1,但是找到的是 %2。</translation> + </message> + <message> + <location line="+44"/> + <source>Promoting %1 to %2 may cause loss of precision.</source> + <translation>把 %1 升级为 %2 会导致精度的损失。</translation> + </message> + <message> + <location line="+49"/> + <source>The focus is undefined.</source> + <translation>焦点未定义。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/> + <source>It's not possible to add attributes after any other kind of node.</source> + <translation>不能在任何其它类型节点后添加属性。</translation> + </message> + <message> + <location line="+7"/> + <source>An attribute by name %1 has already been created.</source> + <translation>一个名称为 %1 的属性已经被创建。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/> + <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> + <translation>只支持 Unicode 代码点校验(Unicode Codepoint Collation)(%1)。%2 是不被支持的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+60"/> + <source>Attribute %1 can't be serialized because it appears at the top level.</source> + <translation>属性 %1 不能被串行化,因为它出现在最顶层。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/> + <source>%1 is an unsupported encoding.</source> + <translation> %1 是不被支持的编码。</translation> + </message> + <message> + <location line="+16"/> + <source>%1 contains octets which are disallowed in the requested encoding %2.</source> + <translation>%1包含了在请求编码%2中不允许的八进位值。</translation> + </message> + <message> + <location line="+18"/> + <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> + <translation>在使用编码%3的%2中出现的代码点%1不是一个有效的XML字符。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/> + <source>Ambiguous rule match.</source> + <translation>含糊规则匹配。</translation> + </message> + <message> + <source>In a namespace constructor, the value for a namespace value cannot be an empty string.</source> + <translation type="obsolete">在一个命名空间构造中,命名空间的值不能为空字符串。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/> + <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+11"/> + <source>The prefix must be a valid %1, which %2 is not.</source> + <translation>前缀必须是有效的%1,而%2不是。</translation> + </message> + <message> + <location line="+14"/> + <source>The prefix %1 cannot be bound.</source> + <translation>前缀%1不能被绑定。</translation> + </message> + <message> + <location line="+10"/> + <source>Only the prefix %1 can be bound to %2 and vice versa.</source> + <translation>只有前缀%1可以绑定到%2,反之也一样</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/> + <source>Circularity detected</source> + <translation>检测到环</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/> + <source>The parameter %1 is required, but no corresponding %2 is supplied.</source> + <translation>需要参数%1,但是没有提供对应的%2。</translation> + </message> + <message> + <location line="-71"/> + <source>The parameter %1 is passed, but no corresponding %2 exists.</source> + <translation>参数%1已传递,但没有相应的%2存在。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/> + <source>The URI cannot have a fragment</source> + <translation>URI不能有片段</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/> + <source>Element %1 is not allowed at this location.</source> + <translation>元素%1不能在这个位置。</translation> + </message> + <message> + <location line="+9"/> + <source>Text nodes are not allowed at this location.</source> + <translation>文本节点不能在这个位置。</translation> + </message> + <message> + <location line="+20"/> + <source>Parse error: %1</source> + <translation>解析错误:%1</translation> + </message> + <message> + <location line="+62"/> + <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> + <translation>XSL-T版本属性的值必须是%1类型的值,而%2不是。</translation> + </message> + <message> + <location line="+20"/> + <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> + <translation>在XSL-T 2.0处理器中运行一个1.0的样式表。</translation> + </message> + <message> + <location line="+108"/> + <source>Unknown XSL-T attribute %1.</source> + <translation>未知的XSL-T属性%1。</translation> + </message> + <message> + <location line="+23"/> + <source>Attribute %1 and %2 are mutually exclusive.</source> + <translation>属性%1和%2彼此互斥。</translation> + </message> + <message> + <location line="+166"/> + <source>In a simplified stylesheet module, attribute %1 must be present.</source> + <translation>在一个简化样式表模块中,属性%1必须存在。</translation> + </message> + <message> + <location line="+72"/> + <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> + <translation>如果元素%1没有属性%2,那么它也不能有属性%3或者%4。</translation> + </message> + <message> + <location line="+9"/> + <source>Element %1 must have at least one of the attributes %2 or %3.</source> + <translation>元素%1必须至少有属性%2或者%3其中一个。</translation> + </message> + <message> + <location line="+28"/> + <source>At least one mode must be specified in the %1-attribute on element %2.</source> + <translation>在元素%2的%1属性中至少要指定一个模式。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/> + <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source> + <translation>属性%1不能出现在元素%2上。只有标准属性可以出现。</translation> + </message> + <message> + <location line="+6"/> + <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source> + <translation>属性%1不能出现在元素%2上。只有%3和标准属性是允许的。</translation> + </message> + <message> + <location line="+8"/> + <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source> + <translation>属性%1不能出现在元素%2上。只有%3、%4和标准属性是允许的。</translation> + </message> + <message> + <location line="+9"/> + <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source> + <translation>属性%1不能出现在元素%2上。只有%3和标准属性是允许的。</translation> + </message> + <message> + <location line="+13"/> + <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source> + <translation>XSL-T元素中的XSL-T属性必须放在空(null)命名空间中,而不是在XSL-T命名空间中,%1却是这个样子。</translation> + </message> + <message> + <location line="+12"/> + <source>The attribute %1 must appear on element %2.</source> + <translation>属性%1必须出现在元素%2中。</translation> + </message> + <message> + <location line="+8"/> + <source>The element with local name %1 does not exist in XSL-T.</source> + <translation>有本地名称%1的元素在XSL-T中不存在。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/> + <source>Element %1 must come last.</source> + <translation>元素%1必须最后出现。</translation> + </message> + <message> + <location line="+24"/> + <source>At least one %1-element must occur before %2.</source> + <translation>至少一个元素%1要出现在%2之前。</translation> + </message> + <message> + <location line="+7"/> + <source>Only one %1-element can appear.</source> + <translation>只能出现一个元素%1。</translation> + </message> + <message> + <location line="+31"/> + <source>At least one %1-element must occur inside %2.</source> + <translation>至少一个元素%1要出现在%2之内。</translation> + </message> + <message> + <location line="+58"/> + <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> + <translation>当属性%1出现在%2中时,不能使用顺序构造。</translation> + </message> + <message> + <location line="+13"/> + <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> + <translation>元素%1必须有在一个%2属性或者顺序构造。</translation> + </message> + <message> + <location line="+125"/> + <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> + <translation>当需要参数时,不能通过属性%1或者顺序构造提供默认值。</translation> + </message> + <message> + <location line="+270"/> + <source>Element %1 cannot have children.</source> + <translation>元素%1不能有子元素。</translation> + </message> + <message> + <location line="+434"/> + <source>Element %1 cannot have a sequence constructor.</source> + <translation>元素%1不能有顺序构造。</translation> + </message> + <message> + <location line="+86"/> + <location line="+9"/> + <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> + <translation>属性%1不能出现在%2中,因为它是%3的子元素。</translation> + </message> + <message> + <location line="+15"/> + <source>A parameter in a function cannot be declared to be a tunnel.</source> + <translation>函数内的参数不能被声明为通道(tunnel)。</translation> + </message> + <message> + <location line="+149"/> + <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> + <translation>这个处理器不能感知Schema,因此%1不能被使用。</translation> + </message> + <message> + <location line="+57"/> + <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> + <translation>顶级样式表元素必须是在非空命名空间中的,而%1不是。</translation> + </message> + <message> + <location line="+48"/> + <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> + <translation>元素%2中属性%1的值必须是%3或者%4,而不是%5。</translation> + </message> + <message> + <location line="+20"/> + <source>Attribute %1 cannot have the value %2.</source> + <translation>属性%1的值不能是%2。</translation> + </message> + <message> + <location line="+58"/> + <source>The attribute %1 can only appear on the first %2 element.</source> + <translation>属性%1只能出现在前%2个元素中。</translation> + </message> + <message> + <location line="+99"/> + <source>At least one %1 element must appear as child of %2.</source> + <translation>%2必须至少又一个子元素%1。</translation> + </message> +</context> +<context> + <name>VolumeSlider</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/> + <source>Muted</source> + <translation>已静音</translation> + </message> + <message> + <location line="+5"/> + <location line="+15"/> + <source>Volume: %1%</source> + <translation>音量:%1%</translation> + </message> +</context> +<context> + <name>WebCore::PlatformScrollbar</name> + <message> + <source>Scroll here</source> + <translation type="obsolete">滚动到这里</translation> + </message> + <message> + <source>Left edge</source> + <translation type="obsolete">左边缘</translation> + </message> + <message> + <source>Top</source> + <translation type="obsolete">顶部</translation> + </message> + <message> + <source>Right edge</source> + <translation type="obsolete">右边缘</translation> + </message> + <message> + <source>Bottom</source> + <translation type="obsolete">底部</translation> + </message> + <message> + <source>Page left</source> + <translation type="obsolete">左一页</translation> + </message> + <message> + <source>Page up</source> + <translation type="obsolete">上一页</translation> + </message> + <message> + <source>Page right</source> + <translation type="obsolete">右一页</translation> + </message> + <message> + <source>Page down</source> + <translation type="obsolete">下一页</translation> + </message> + <message> + <source>Scroll left</source> + <translation type="obsolete">向左滚动</translation> + </message> + <message> + <source>Scroll up</source> + <translation type="obsolete">向上滚动</translation> + </message> + <message> + <source>Scroll right</source> + <translation type="obsolete">向右滚动</translation> + </message> + <message> + <source>Scroll down</source> + <translation type="obsolete">向下滚动</translation> + </message> +</context> +</TS> diff --git a/release/ts/qt_windows_zh_TW.qm b/release/ts/qt_windows_zh_TW.qm Binary files differnew file mode 100644 index 0000000..a9a25b2 --- /dev/null +++ b/release/ts/qt_windows_zh_TW.qm diff --git a/release/ts/qt_windows_zh_TW.ts b/release/ts/qt_windows_zh_TW.ts new file mode 100644 index 0000000..de0f888 --- /dev/null +++ b/release/ts/qt_windows_zh_TW.ts @@ -0,0 +1,8129 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.0" language="zh_TW"> +<context> + <name>MAC_APPLICATION_MENU</name> + <message> + <location filename="../src/gui/kernel/qapplication.cpp" line="+2316"/> + <source>Services</source> + <translation>服務</translation> + </message> + <message> + <location line="+1"/> + <source>Hide %1</source> + <translation>隱藏%1</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Others</source> + <translation>隱藏其他</translation> + </message> + <message> + <location line="+1"/> + <source>Show All</source> + <translation>顯示全部</translation> + </message> + <message> + <location line="+1"/> + <source>Preferences...</source> + <translation>偏好設定⋯</translation> + </message> + <message> + <location line="+1"/> + <source>Quit %1</source> + <translation>結束 %1</translation> + </message> + <message> + <location line="+1"/> + <source>About %1</source> + <translation>關於 %1</translation> + </message> +</context> +<context> + <name>AudioOutput</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/audiooutput.cpp" line="+375"/> + <source><html>The audio playback device <b>%1</b> does not work.<br/>Falling back to <b>%2</b>.</html></source> + <translation><html>音效播放裝置 <b>%1</b> 未能運作。<br/>改用預設裝置 <b>%2</b>。</html></translation> + </message> + <message> + <location line="+13"/> + <source><html>Switching to the audio playback device <b>%1</b><br/>which just became available and has higher preference.</html></source> + <translation><html>音效播放裝置 <b>%1</b> 已可使用,因為有較高優先權,因此將切換到該裝置。</html></translation> + </message> + <message> + <location line="+3"/> + <source>Revert back to device '%1'</source> + <translation>回復到裝置 %1</translation> + </message> +</context> +<context> + <name>CloseButton</name> + <message> + <location filename="../src/gui/widgets/qtabbar.cpp" line="+2251"/> + <source>Close Tab</source> + <translation>關閉分頁</translation> + </message> +</context> +<context> + <name>PPDOptionsModel</name> + <message> + <source>Name</source> + <translation type="obsolete">名稱</translation> + </message> + <message> + <source>Value</source> + <translation type="obsolete">值</translation> + </message> +</context> +<context> + <name>Phonon::</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/phononnamespace.cpp" line="+55"/> + <source>Notifications</source> + <translation>通知</translation> + </message> + <message> + <location line="+2"/> + <source>Music</source> + <translation>音樂</translation> + </message> + <message> + <location line="+2"/> + <source>Video</source> + <translation>影像</translation> + </message> + <message> + <location line="+2"/> + <source>Communication</source> + <translation>通訊</translation> + </message> + <message> + <location line="+2"/> + <source>Games</source> + <translation>遊戲</translation> + </message> + <message> + <location line="+2"/> + <source>Accessibility</source> + <translation>輔助裝置</translation> + </message> +</context> +<context> + <name>Phonon::Gstreamer::Backend</name> + <message> + <location filename="../src/3rdparty/phonon/gstreamer/backend.cpp" line="+171"/> + <source>Warning: You do not seem to have the package gstreamer0.10-plugins-good installed. + Some video features have been disabled.</source> + <translation>警告:您可能沒有安裝 gstreamer0.10-plugins-good。 + 有些影像的功能將被關閉。</translation> + </message> + <message> + <location line="+5"/> + <source>Warning: You do not seem to have the base GStreamer plugins installed. + All audio and video support has been disabled</source> + <translation>警告:您可能沒有安裝 GStreamer 外掛程式。 所有音效與影像支援將被關閉。</translation> + </message> +</context> +<context> + <name>Phonon::Gstreamer::MediaObject</name> + <message> + <location filename="../src/3rdparty/phonon/gstreamer/mediaobject.cpp" line="+90"/> + <source>Cannot start playback. + +Check your Gstreamer installation and make sure you +have libgstreamer-plugins-base installed.</source> + <translation>無法開始播放。 + +請檢查您的 Gstreamer 安裝,並確定您有安裝 +libgstreamer-plugins-base 套件。</translation> + </message> + <message> + <location line="+113"/> + <source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source> + <translation>找不到需要的編解碼器。您需要安裝以下的套件來播放此內容:%0</translation> + </message> + <message> + <location line="+676"/> + <location line="+8"/> + <location line="+15"/> + <location line="+9"/> + <location line="+6"/> + <location line="+19"/> + <location line="+335"/> + <location line="+24"/> + <source>Could not open media source.</source> + <translation>無法開啟媒體來源。</translation> + </message> + <message> + <location line="-403"/> + <source>Invalid source type.</source> + <translation>不合法的來源型態。</translation> + </message> + <message> + <location line="+377"/> + <source>Could not locate media source.</source> + <translation>無法定位媒體來源。</translation> + </message> + <message> + <location line="+10"/> + <source>Could not open audio device. The device is already in use.</source> + <translation>無法開啟音效裝置。裝置已在使用中。</translation> + </message> + <message> + <location line="+13"/> + <source>Could not decode media source.</source> + <translation>無法解碼媒體來源。</translation> + </message> +</context> +<context> + <name>Phonon::VolumeSlider</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+42"/> + <location line="+18"/> + <source>Volume: %1%</source> + <translation>音量:%1%</translation> + </message> + <message> + <location line="-15"/> + <location line="+18"/> + <location line="+54"/> + <source>Use this slider to adjust the volume. The leftmost position is 0%, the rightmost is %1%</source> + <translation>使用此滑動器來調整音量。最左邊的位置為 0%,最右邊的為 %1%。</translation> + </message> +</context> +<context> + <name>Q3Accel</name> + <message> + <location filename="../src/qt3support/other/q3accel.cpp" line="+481"/> + <source>%1, %2 not defined</source> + <translation>%1,%2 未定義</translation> + </message> + <message> + <location line="+36"/> + <source>Ambiguous %1 not handled</source> + <translation>不明確的 %1 尚未處理</translation> + </message> +</context> +<context> + <name>Q3DataTable</name> + <message> + <location filename="../src/qt3support/sql/q3datatable.cpp" line="+285"/> + <source>True</source> + <translation>真</translation> + </message> + <message> + <location line="+1"/> + <source>False</source> + <translation>假</translation> + </message> + <message> + <location line="+505"/> + <source>Insert</source> + <translation>插入</translation> + </message> + <message> + <location line="+1"/> + <source>Update</source> + <translation>更新</translation> + </message> + <message> + <location line="+1"/> + <source>Delete</source> + <translation>刪除</translation> + </message> +</context> +<context> + <name>Q3FileDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3filedialog.cpp" line="+864"/> + <source>Copy or Move a File</source> + <translation>複製或移動檔案</translation> + </message> + <message> + <location line="+8"/> + <source>Read: %1</source> + <translation>讀取:%1</translation> + </message> + <message> + <location line="+6"/> + <location line="+30"/> + <source>Write: %1</source> + <translation>寫入:%1</translation> + </message> + <message> + <location line="-22"/> + <location line="+1575"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="-157"/> + <location line="+49"/> + <location line="+2153"/> + <location filename="../src/qt3support/dialogs/q3filedialog_mac.cpp" line="+110"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location line="-2089"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location line="+1"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <translation>型態</translation> + </message> + <message> + <location line="+1"/> + <source>Date</source> + <translation>日期</translation> + </message> + <message> + <location line="+1"/> + <source>Attributes</source> + <translation>屬性</translation> + </message> + <message> + <location line="+35"/> + <location line="+2031"/> + <source>&OK</source> + <translation>確定(&O)</translation> + </message> + <message> + <location line="-1991"/> + <source>Look &in:</source> + <translation>尋找於(&I):</translation> + </message> + <message> + <location line="+1"/> + <location line="+1981"/> + <location line="+16"/> + <source>File &name:</source> + <translation>檔名(&N):</translation> + </message> + <message> + <location line="-1996"/> + <source>File &type:</source> + <translation>檔案型態(&T):</translation> + </message> + <message> + <location line="+7"/> + <source>Back</source> + <translation>返回</translation> + </message> + <message> + <location line="+7"/> + <source>One directory up</source> + <translation>往上一層目錄</translation> + </message> + <message> + <location line="+9"/> + <source>Create New Folder</source> + <translation>建立新資料夾</translation> + </message> + <message> + <location line="+18"/> + <source>List View</source> + <translation>列表檢視</translation> + </message> + <message> + <location line="+8"/> + <source>Detail View</source> + <translation>詳細檢視</translation> + </message> + <message> + <location line="+9"/> + <source>Preview File Info</source> + <translation>預覽檔案資訊</translation> + </message> + <message> + <location line="+23"/> + <source>Preview File Contents</source> + <translation>預覽檔案內容</translation> + </message> + <message> + <location line="+88"/> + <source>Read-write</source> + <translation>可讀寫</translation> + </message> + <message> + <location line="+1"/> + <source>Read-only</source> + <translation>唯讀</translation> + </message> + <message> + <location line="+1"/> + <source>Write-only</source> + <translation>唯寫</translation> + </message> + <message> + <location line="+1"/> + <source>Inaccessible</source> + <translation>無法存取</translation> + </message> + <message> + <location line="+2"/> + <source>Symlink to File</source> + <translation>到檔案的符號連結</translation> + </message> + <message> + <location line="+1"/> + <source>Symlink to Directory</source> + <translation>到目錄的符號連結</translation> + </message> + <message> + <location line="+1"/> + <source>Symlink to Special</source> + <translation>到特殊節點的符號連結</translation> + </message> + <message> + <location line="+1"/> + <source>File</source> + <translation>檔案</translation> + </message> + <message> + <location line="+1"/> + <source>Dir</source> + <translation>目錄</translation> + </message> + <message> + <location line="+1"/> + <source>Special</source> + <translation>特殊節點</translation> + </message> + <message> + <location line="+704"/> + <location line="+2100"/> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+337"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location line="-1990"/> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="+84"/> + <source>Save As</source> + <translation>另存新檔</translation> + </message> + <message> + <location line="+642"/> + <location line="+5"/> + <location line="+355"/> + <source>&Open</source> + <translation>開啟(&O)</translation> + </message> + <message> + <location line="-357"/> + <location line="+341"/> + <source>&Save</source> + <translation>儲存(&S)</translation> + </message> + <message> + <location line="-334"/> + <source>&Rename</source> + <translation>重新命名(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Delete</source> + <translation>刪除(&D)</translation> + </message> + <message> + <location line="+20"/> + <source>R&eload</source> + <translation>重新載入(&E)</translation> + </message> + <message> + <location line="+4"/> + <source>Sort by &Name</source> + <translation>依名稱排序(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Sort by &Size</source> + <translation>依大小排序(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Sort by &Date</source> + <translation>依日期排序(&D)</translation> + </message> + <message> + <location line="+2"/> + <source>&Unsorted</source> + <translation>未排序(&U)</translation> + </message> + <message> + <location line="+15"/> + <source>Sort</source> + <translation>排序</translation> + </message> + <message> + <location line="+4"/> + <source>Show &hidden files</source> + <translation>顯示隱藏檔(&H)</translation> + </message> + <message> + <location line="+31"/> + <source>the file</source> + <translation>此檔案</translation> + </message> + <message> + <location line="+2"/> + <source>the directory</source> + <translation>此目錄</translation> + </message> + <message> + <location line="+2"/> + <source>the symlink</source> + <translation>此符號連結</translation> + </message> + <message> + <location line="+3"/> + <source>Delete %1</source> + <translation>刪除 %1</translation> + </message> + <message> + <location line="+1"/> + <source><qt>Are you sure you wish to delete %1 "%2"?</qt></source> + <translation><qt>您確定要刪除 %1 "%2" 嗎?</qt></translation> + </message> + <message> + <location line="+2"/> + <source>&Yes</source> + <translation>是(&Y)</translation> + </message> + <message> + <location line="+0"/> + <source>&No</source> + <translation>否(&N)</translation> + </message> + <message> + <location line="+36"/> + <source>New Folder 1</source> + <translation>新資料夾 1</translation> + </message> + <message> + <location line="+5"/> + <source>New Folder</source> + <translation>新資料夾</translation> + </message> + <message> + <location line="+5"/> + <source>New Folder %1</source> + <translation>新資料夾 %1</translation> + </message> + <message> + <location line="+98"/> + <source>Find Directory</source> + <translation>尋找目錄</translation> + </message> + <message> + <location line="+5"/> + <location line="+108"/> + <source>Directories</source> + <translation>目錄</translation> + </message> + <message> + <location line="-2"/> + <source>Directory:</source> + <translation>目錄:</translation> + </message> + <message> + <location line="+40"/> + <location line="+1110"/> + <source>Error</source> + <translation>錯誤</translation> + </message> + <message> + <location line="-1109"/> + <source>%1 +File not found. +Check path and filename.</source> + <translation>%1 +找不到檔案。 +請檢查路徑與檔名。</translation> + </message> + <message> + <location filename="../src/qt3support/dialogs/q3filedialog_win.cpp" line="-289"/> + <source>All Files (*.*)</source> + <translation>所有檔案 (*.*)</translation> + </message> + <message> + <location line="+375"/> + <source>Open </source> + <translation>開啟 </translation> + </message> + <message> + <location line="+155"/> + <source>Select a Directory</source> + <translation>請選擇一個目錄</translation> + </message> +</context> +<context> + <name>Q3LocalFs</name> + <message> + <location filename="../src/qt3support/network/q3localfs.cpp" line="+130"/> + <location line="+10"/> + <source>Could not read directory +%1</source> + <translation>無法讀取目錄 +%1</translation> + </message> + <message> + <location line="+45"/> + <source>Could not create directory +%1</source> + <translation>無法建立目錄 +%1</translation> + </message> + <message> + <location line="+34"/> + <source>Could not remove file or directory +%1</source> + <translation>無法移除目錄 +%1</translation> + </message> + <message> + <location line="+27"/> + <source>Could not rename +%1 +to +%2</source> + <translation>無法將 +%1 +重新命名為 +%2</translation> + </message> + <message> + <location line="+25"/> + <source>Could not open +%1</source> + <translation>無法開啟 +%1</translation> + </message> + <message> + <location line="+68"/> + <source>Could not write +%1</source> + <translation>無法寫入 +%1</translation> + </message> +</context> +<context> + <name>Q3MainWindow</name> + <message> + <location filename="../src/qt3support/widgets/q3mainwindow.cpp" line="+2051"/> + <source>Line up</source> + <translation>排列</translation> + </message> + <message> + <location line="+2"/> + <source>Customize...</source> + <translation>自訂...</translation> + </message> +</context> +<context> + <name>Q3NetworkProtocol</name> + <message> + <location filename="../src/qt3support/network/q3networkprotocol.cpp" line="+854"/> + <source>Operation stopped by the user</source> + <translation>使用者已中止操作</translation> + </message> +</context> +<context> + <name>Q3ProgressDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3progressdialog.cpp" line="+224"/> + <location line="+61"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>Q3TabDialog</name> + <message> + <location filename="../src/qt3support/dialogs/q3tabdialog.cpp" line="+189"/> + <location line="+814"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location line="-356"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location line="+43"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="+45"/> + <source>Defaults</source> + <translation>預設</translation> + </message> + <message> + <location line="+50"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>Q3TextEdit</name> + <message> + <location filename="../src/qt3support/text/q3textedit.cpp" line="+5429"/> + <source>&Undo</source> + <translation>復原(&U)</translation> + </message> + <message> + <location line="+1"/> + <source>&Redo</source> + <translation>重做(&R)</translation> + </message> + <message> + <location line="+5"/> + <source>Cu&t</source> + <translation>剪下(&T)</translation> + </message> + <message> + <location line="+1"/> + <source>&Copy</source> + <translation>複製(&C)</translation> + </message> + <message> + <location line="+2"/> + <source>&Paste</source> + <translation>貼上(&P)</translation> + </message> + <message> + <location line="+3"/> + <source>Clear</source> + <translation>清除</translation> + </message> + <message> + <location line="+4"/> + <location line="+2"/> + <source>Select All</source> + <translation>全部選擇</translation> + </message> +</context> +<context> + <name>Q3TitleBar</name> + <message> + <location filename="../src/plugins/accessible/compat/q3complexwidgets.cpp" line="+246"/> + <source>System</source> + <translation>系統</translation> + </message> + <message> + <location line="+3"/> + <source>Restore up</source> + <translation>向上恢復</translation> + </message> + <message> + <location line="+1"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+3"/> + <source>Restore down</source> + <translation>向下恢復</translation> + </message> + <message> + <location line="+1"/> + <source>Maximize</source> + <translation>最大化</translation> + </message> + <message> + <location line="+2"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+18"/> + <source>Contains commands to manipulate the window</source> + <translation>包含要操作此視窗的指令</translation> + </message> + <message> + <location line="+3"/> + <source>Puts a minimized back to normal</source> + <translation>將最小化視窗放回原大小</translation> + </message> + <message> + <location line="+1"/> + <source>Moves the window out of the way</source> + <translation>把視窗移開</translation> + </message> + <message> + <location line="+3"/> + <source>Puts a maximized window back to normal</source> + <translation>將最大化視窗放回原大小</translation> + </message> + <message> + <location line="+1"/> + <source>Makes the window full screen</source> + <translation>將視窗放大到全畫面</translation> + </message> + <message> + <location line="+2"/> + <source>Closes the window</source> + <translation>關閉視窗</translation> + </message> + <message> + <location line="+2"/> + <source>Displays the name of the window and contains controls to manipulate it</source> + <translation>顯示視窗名稱,並包含操作它的控制元件</translation> + </message> +</context> +<context> + <name>Q3ToolBar</name> + <message> + <location filename="../src/qt3support/widgets/q3toolbar.cpp" line="+692"/> + <source>More...</source> + <translation>更多...</translation> + </message> +</context> +<context> + <name>Q3UrlOperator</name> + <message> + <location filename="../src/qt3support/network/q3urloperator.cpp" line="+386"/> + <location line="+260"/> + <location line="+4"/> + <source>The protocol `%1' is not supported</source> + <translation>協定 %1 未支援</translation> + </message> + <message> + <location line="-260"/> + <source>The protocol `%1' does not support listing directories</source> + <translation>協定 %1 未支援列出目錄</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support creating new directories</source> + <translation>協定 %1 未支援建立新目錄</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support removing files or directories</source> + <translation>協定 %1 未支援移除檔案或目錄</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support renaming files or directories</source> + <translation>協定 %1 未支援重新命名檔案或目錄</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support getting files</source> + <translation>協定 %1 未支援取得檔案</translation> + </message> + <message> + <location line="+3"/> + <source>The protocol `%1' does not support putting files</source> + <translation>協定 %1 未支援寫入檔案</translation> + </message> + <message> + <location line="+243"/> + <location line="+4"/> + <source>The protocol `%1' does not support copying or moving files or directories</source> + <translation>協定 %1 未支援複製或移動檔案或目錄</translation> + </message> + <message> + <location line="+237"/> + <location line="+1"/> + <source>(unknown)</source> + <translation>(未知)</translation> + </message> +</context> +<context> + <name>Q3Wizard</name> + <message> + <location filename="../src/qt3support/dialogs/q3wizard.cpp" line="+177"/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location line="+1"/> + <source>< &Back</source> + <translation><返回(&B)</translation> + </message> + <message> + <location line="+1"/> + <source>&Next ></source> + <translation>下一個(&N)></translation> + </message> + <message> + <location line="+1"/> + <source>&Finish</source> + <translation>完成(&F)</translation> + </message> + <message> + <location line="+1"/> + <source>&Help</source> + <translation>說明(&H)</translation> + </message> +</context> +<context> + <name>QAbstractSocket</name> + <message> + <location filename="../src/network/socket/qabstractsocket.cpp" line="+868"/> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+615"/> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+657"/> + <location line="+26"/> + <source>Host not found</source> + <translation>找不到主機</translation> + </message> + <message> + <location line="+50"/> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="+3"/> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="+4"/> + <source>Connection refused</source> + <translation>連線被拒</translation> + </message> + <message> + <location line="+141"/> + <source>Connection timed out</source> + <translation>連線逾時</translation> + </message> + <message> + <location line="-547"/> + <location line="+787"/> + <location line="+208"/> + <source>Operation on socket is not supported</source> + <translation>Socket 的操作未被支援</translation> + </message> + <message> + <location line="+137"/> + <source>Socket operation timed out</source> + <translation>Socket 操作逾時</translation> + </message> + <message> + <location line="+380"/> + <source>Socket is not connected</source> + <translation>Socket 未連線</translation> + </message> + <message> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-8"/> + <source>Network unreachable</source> + <translation>無法使用網路</translation> + </message> +</context> +<context> + <name>QAbstractSpinBox</name> + <message> + <location filename="../src/gui/widgets/qabstractspinbox.cpp" line="+1199"/> + <source>&Step up</source> + <translation>單步向上(&S)</translation> + </message> + <message> + <location line="+2"/> + <source>Step &down</source> + <translation>單步向下(&D)</translation> + </message> + <message> + <location line="-8"/> + <source>&Select All</source> + <translation>全部選擇(&S)</translation> + </message> +</context> +<context> + <name>QApplication</name> + <message> + <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+376"/> + <source>Activate</source> + <translation>啟動</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qmessagebox.h" line="+352"/> + <source>Executable '%1' requires Qt %2, found Qt %3.</source> + <translation>執行檔 %1 需要 Qt %2,但只找到 Qt %3。</translation> + </message> + <message> + <location line="+2"/> + <source>Incompatible Qt Library Error</source> + <translation>Qt 函式庫不相容的錯誤</translation> + </message> + <message> + <location filename="../src/gui/kernel/qapplication.cpp" line="+2248"/> + <source>QT_LAYOUT_DIRECTION</source> + <comment>Translate this string to the string 'LTR' in left-to-right languages or to 'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout.</comment> + <translation>LTR</translation> + </message> + <message> + <location filename="../src/gui/accessible/qaccessibleobject.cpp" line="+2"/> + <source>Activates the program's main window</source> + <translation>啟動程式的主視窗</translation> + </message> +</context> +<context> + <name>QAxSelect</name> + <message> + <location filename="../src/activeqt/container/qaxselect.ui"/> + <source>Select ActiveX Control</source> + <translation>選擇 ActiveX 控制</translation> + </message> + <message> + <location/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location/> + <source>COM &Object:</source> + <translation>COM 物件(&O)</translation> + </message> +</context> +<context> + <name>QCheckBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+114"/> + <source>Uncheck</source> + <translation>取消勾選</translation> + </message> + <message> + <location line="+3"/> + <source>Check</source> + <translation>勾選</translation> + </message> + <message> + <location line="+1"/> + <source>Toggle</source> + <translation>切換</translation> + </message> +</context> +<context> + <name>QColorDialog</name> + <message> + <location filename="../src/gui/dialogs/qcolordialog.cpp" line="+1253"/> + <source>Hu&e:</source> + <translation>色調(&E):</translation> + </message> + <message> + <location line="+1"/> + <source>&Sat:</source> + <translation>飽和度(&S):</translation> + </message> + <message> + <location line="+1"/> + <source>&Val:</source> + <translation>亮度(&V):</translation> + </message> + <message> + <location line="+1"/> + <source>&Red:</source> + <translation>紅(&R):</translation> + </message> + <message> + <location line="+1"/> + <source>&Green:</source> + <translation>綠(&G):</translation> + </message> + <message> + <location line="+1"/> + <source>Bl&ue:</source> + <translation>藍(&U):</translation> + </message> + <message> + <location line="+1"/> + <source>A&lpha channel:</source> + <translation>Alpha 色頻(&L):</translation> + </message> + <message> + <location line="+101"/> + <source>Select Color</source> + <translation>選擇顏色</translation> + </message> + <message> + <location line="+137"/> + <source>&Basic colors</source> + <translation>基本顏色(&B)</translation> + </message> + <message> + <location line="+1"/> + <source>&Custom colors</source> + <translation>自訂顏色(&C)</translation> + </message> + <message> + <source>&Define Custom Colors >></source> + <translation type="obsolete">定義自訂顏色(&D)>></translation> + </message> + <message> + <source>OK</source> + <translation type="obsolete">確定</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> + <message> + <location line="+1"/> + <source>&Add to Custom Colors</source> + <translation>新增到自訂顏色(&A)</translation> + </message> + <message> + <source>Select color</source> + <translation type="obsolete">選擇顏色</translation> + </message> +</context> +<context> + <name>QComboBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+1771"/> + <location line="+65"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qitemeditorfactory.cpp" line="+544"/> + <source>False</source> + <translation>假</translation> + </message> + <message> + <location line="+1"/> + <source>True</source> + <translation>真</translation> + </message> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="+0"/> + <source>Close</source> + <translation>關閉</translation> + </message> +</context> +<context> + <name>QCoreApplication</name> + <message> + <source>%1: permission denied</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:存取被拒</translation> + </message> + <message> + <source>%1: already exists</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:已存在</translation> + </message> + <message> + <source>%1: doesn't exists</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:不存在</translation> + </message> + <message> + <source>%1: out of resources</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:資源不足</translation> + </message> + <message> + <source>%1: unknown error %2</source> + <comment>QSystemSemaphore</comment> + <translation type="obsolete">%1:未知的錯誤 %2</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="+119"/> + <source>%1: key is empty</source> + <comment>QSystemSemaphore</comment> + <translation>%1:鍵值是空的</translation> + </message> + <message> + <location line="+12"/> + <source>%1: unable to make key</source> + <comment>QSystemSemaphore</comment> + <translation>%1:無法產生鍵值</translation> + </message> + <message> + <location line="+9"/> + <source>%1: ftok failed</source> + <comment>QSystemSemaphore</comment> + <translation>%1:ftok 失敗</translation> + </message> +</context> +<context> + <name>QDB2Driver</name> + <message> + <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+1276"/> + <source>Unable to connect</source> + <translation>無法連接</translation> + </message> + <message> + <location line="+303"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to set autocommit</source> + <translation>無法設定自動提交</translation> + </message> +</context> +<context> + <name>QDB2Result</name> + <message> + <location line="-1043"/> + <location line="+243"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> + <message> + <location line="-206"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+196"/> + <source>Unable to bind variable</source> + <translation>無法結合變數</translation> + </message> + <message> + <location line="+92"/> + <source>Unable to fetch record %1</source> + <translation>無法抓取紀錄 %1</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to fetch next</source> + <translation>無法抓取下一筆</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to fetch first</source> + <translation>無法抓取第一筆</translation> + </message> +</context> +<context> + <name>QDateTimeEdit</name> + <message> + <location filename="../src/gui/widgets/qdatetimeedit.cpp" line="+2295"/> + <source>AM</source> + <translation>AM</translation> + </message> + <message> + <location line="+0"/> + <source>am</source> + <translation>am</translation> + </message> + <message> + <location line="+2"/> + <source>PM</source> + <translation>PM</translation> + </message> + <message> + <location line="+0"/> + <source>pm</source> + <translation>pm</translation> + </message> +</context> +<context> + <name>QDial</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+951"/> + <source>QDial</source> + <translation>QDial</translation> + </message> + <message> + <location line="+2"/> + <source>SpeedoMeter</source> + <translation>SpeedoMeter</translation> + </message> + <message> + <location line="+2"/> + <source>SliderHandle</source> + <translation>SliderHandle</translation> + </message> +</context> +<context> + <name>QDialog</name> + <message> + <location filename="../src/gui/dialogs/qdialog.cpp" line="+597"/> + <source>What's This?</source> + <translation>這是什麼?</translation> + </message> + <message> + <location line="-115"/> + <source>Done</source> + <translation>完成</translation> + </message> +</context> +<context> + <name>QDialogButtonBox</name> + <message> + <location filename="../src/gui/dialogs/qmessagebox.cpp" line="+1866"/> + <location line="+464"/> + <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+561"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location filename="../src/gui/widgets/qdialogbuttonbox.cpp" line="+3"/> + <source>Save</source> + <translation>儲存</translation> + </message> + <message> + <location line="+0"/> + <source>&Save</source> + <translation>儲存(&S)</translation> + </message> + <message> + <location line="+3"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location line="+3"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+0"/> + <source>&Cancel</source> + <translation>取消(&C)</translation> + </message> + <message> + <location line="+3"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+0"/> + <source>&Close</source> + <translation>關閉(&C)</translation> + </message> + <message> + <location line="+3"/> + <source>Apply</source> + <translation>套用</translation> + </message> + <message> + <location line="+3"/> + <source>Reset</source> + <translation>重置</translation> + </message> + <message> + <location line="+3"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="+4"/> + <source>Don't Save</source> + <translation>不要儲存</translation> + </message> + <message> + <location line="+4"/> + <source>Discard</source> + <translation>丟棄</translation> + </message> + <message> + <location line="+3"/> + <source>&Yes</source> + <translation>是(&Y)</translation> + </message> + <message> + <location line="+3"/> + <source>Yes to &All</source> + <translation>全部回答是(&A)</translation> + </message> + <message> + <location line="+3"/> + <source>&No</source> + <translation>否(&N)</translation> + </message> + <message> + <location line="+3"/> + <source>N&o to All</source> + <translation>全部回答否(&O)</translation> + </message> + <message> + <location line="+3"/> + <source>Save All</source> + <translation>全部儲存</translation> + </message> + <message> + <location line="+3"/> + <source>Abort</source> + <translation>中止</translation> + </message> + <message> + <location line="+3"/> + <source>Retry</source> + <translation>重試</translation> + </message> + <message> + <location line="+3"/> + <source>Ignore</source> + <translation>忽略</translation> + </message> + <message> + <location line="+3"/> + <source>Restore Defaults</source> + <translation>回復預設值</translation> + </message> + <message> + <location line="-29"/> + <source>Close without Saving</source> + <translation>關閉而不儲存</translation> + </message> + <message> + <location line="-27"/> + <source>&OK</source> + <translation>確定(&O)</translation> + </message> +</context> +<context> + <name>QDirModel</name> + <message> + <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+453"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location line="+1"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+3"/> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>種類</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <comment>All other platforms</comment> + <translation>型態</translation> + </message> + <message> + <location line="+6"/> + <source>Date Modified</source> + <translation>變更日期</translation> + </message> +</context> +<context> + <name>QDockWidget</name> + <message> + <location filename="../src/plugins/accessible/widgets/qaccessiblewidgets.cpp" line="+1239"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+2"/> + <source>Dock</source> + <translation>嵌入</translation> + </message> + <message> + <location line="+1"/> + <source>Float</source> + <translation>飄浮</translation> + </message> +</context> +<context> + <name>QDoubleSpinBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-537"/> + <source>More</source> + <translation>更多</translation> + </message> + <message> + <location line="+2"/> + <source>Less</source> + <translation>較少</translation> + </message> +</context> +<context> + <name>QErrorMessage</name> + <message> + <location filename="../src/gui/dialogs/qerrormessage.cpp" line="+192"/> + <source>Debug Message:</source> + <translation>除錯訊息:</translation> + </message> + <message> + <location line="+3"/> + <source>Warning:</source> + <translation>警告:</translation> + </message> + <message> + <location line="+3"/> + <source>Fatal Error:</source> + <translation>嚴重錯誤:</translation> + </message> + <message> + <location line="+193"/> + <source>&Show this message again</source> + <translation>再度顯示此訊息(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>&OK</source> + <translation>確定(&O)</translation> + </message> +</context> +<context> + <name>QFile</name> + <message> + <location filename="../src/corelib/io/qfile.cpp" line="+708"/> + <location line="+141"/> + <source>Destination file exists</source> + <translation>目標檔已存在</translation> + </message> + <message> + <location line="-108"/> + <source>Cannot remove source file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+120"/> + <source>Cannot open %1 for input</source> + <translation>無法開啟 %1 以輸入</translation> + </message> + <message> + <location line="+17"/> + <source>Cannot open for output</source> + <translation>無法開啟 %1 以輸出</translation> + </message> + <message> + <location line="+10"/> + <source>Failure to write block</source> + <translation>寫入區塊時失敗</translation> + </message> + <message> + <location line="+13"/> + <source>Cannot create %1 for output</source> + <translation>無法建立 %1 以輸出</translation> + </message> +</context> +<context> + <name>QFileDialog</name> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+515"/> + <location line="+444"/> + <source>All Files (*)</source> + <translation>所有檔案 (*)</translation> + </message> + <message> + <location line="+222"/> + <source>Directories</source> + <translation>目錄</translation> + </message> + <message> + <location line="-3"/> + <location line="+50"/> + <location line="+1471"/> + <location line="+75"/> + <source>&Open</source> + <translation>開啟(&O)</translation> + </message> + <message> + <location line="-1596"/> + <location line="+50"/> + <source>&Save</source> + <translation>儲存(&S)</translation> + </message> + <message> + <location line="-730"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location line="+1515"/> + <source>%1 already exists. +Do you want to replace it?</source> + <translation>%1 已存在 +您要取代它嗎?</translation> + </message> + <message> + <location line="+20"/> + <source>%1 +File not found. +Please verify the correct file name was given.</source> + <translation>%1 +找不到檔案。 +請檢查檔名是否正確。</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qdirmodel.cpp" line="+402"/> + <source>My Computer</source> + <translation>我的電腦</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-1504"/> + <source>&Rename</source> + <translation>重新命名(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Delete</source> + <translation>刪除(&D)</translation> + </message> + <message> + <location line="+1"/> + <source>Show &hidden files</source> + <translation>顯示隱藏檔(&H)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Back</source> + <translation>返回</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Parent Directory</source> + <translation>父目錄</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>List View</source> + <translation>列表檢視</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Detail View</source> + <translation>詳細檢視</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Files of type:</source> + <translation>檔案型態:</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+6"/> + <location line="+648"/> + <source>Directory:</source> + <translation>目錄:</translation> + </message> + <message> + <source> +File not found. +Please verify the correct file name was given</source> + <translation type="obsolete"> +檔案找不到。 +請檢查檔名是否正確。</translation> + </message> + <message> + <location line="+794"/> + <location line="+862"/> + <source>%1 +Directory not found. +Please verify the correct directory name was given.</source> + <translation>%1 +找不到目錄。 +請檢查目錄名稱是否正確。</translation> + </message> + <message> + <location line="-218"/> + <source>'%1' is write protected. +Do you want to delete it anyway?</source> + <translation>%1 有寫入保護。 +您確定要刪除它嗎?</translation> + </message> + <message> + <location line="+5"/> + <source>Are sure you want to delete '%1'?</source> + <translation>您確定要刪除 %1 嗎?</translation> + </message> + <message> + <location line="+15"/> + <source>Could not delete directory.</source> + <translation>無法刪除目錄。</translation> + </message> + <message> + <location line="+407"/> + <source>Recent Places</source> + <translation>最近的地方</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog_win.cpp" line="+160"/> + <source>All Files (*.*)</source> + <translation>所有檔案 (*.*)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-2550"/> + <source>Save As</source> + <translation>另存新檔</translation> + </message> + <message> + <location filename="../src/gui/itemviews/qfileiconprovider.cpp" line="+411"/> + <source>Drive</source> + <translation>磁碟</translation> + </message> + <message> + <location line="+3"/> + <location line="+1"/> + <source>File</source> + <translation>檔案</translation> + </message> + <message> + <location line="+29"/> + <source>Unknown</source> + <translation>未知</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-4"/> + <source>Find Directory</source> + <translation>尋找目錄</translation> + </message> + <message> + <location line="+29"/> + <source>Show </source> + <translation>顯示 </translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Forward</source> + <translation>往前</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="+1970"/> + <source>New Folder</source> + <translation>新資料夾</translation> + </message> + <message> + <location line="-1963"/> + <source>&New Folder</source> + <translation>新增資料夾(&N)</translation> + </message> + <message> + <location line="+656"/> + <location line="+38"/> + <source>&Choose</source> + <translation>選擇(&C)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qsidebar.cpp" line="+418"/> + <source>Remove</source> + <translation>移除</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.cpp" line="-687"/> + <location line="+652"/> + <source>File &name:</source> + <translation>檔名(&N):</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfiledialog.ui"/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Look in:</source> + <translation>尋找於:</translation> + </message> + <message> + <location/> + <location filename="../src/gui/dialogs/qfiledialog_wince.ui"/> + <source>Create New Folder</source> + <translation>建立新資料夾</translation> + </message> +</context> +<context> + <name>QFileSystemModel</name> + <message> + <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="+828"/> + <source>Invalid filename</source> + <translation>不合法的檔名</translation> + </message> + <message> + <location line="+1"/> + <source><b>The name "%1" can not be used.</b><p>Try using another name, with fewer characters or no punctuations marks.</source> + <translation><b>無法使用名稱 "%1"。</b><p>請使用其它名稱,字元數少一點,或是不要有標點符號。</translation> + </message> + <message> + <location line="+63"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location line="+2"/> + <source>Size</source> + <translation>大小</translation> + </message> + <message> + <location line="+4"/> + <source>Kind</source> + <comment>Match OS X Finder</comment> + <translation>種類</translation> + </message> + <message> + <location line="+2"/> + <source>Type</source> + <comment>All other platforms</comment> + <translation>型態</translation> + </message> + <message> + <location line="+7"/> + <source>Date Modified</source> + <translation>變更日期</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfilesystemmodel_p.h" line="+234"/> + <source>My Computer</source> + <translation>我的電腦</translation> + </message> + <message> + <location line="+2"/> + <source>Computer</source> + <translation>電腦</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qfilesystemmodel.cpp" line="-163"/> + <source>%1 TB</source> + <translation>%1 TB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 GB</source> + <translation>%1 GB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 MB</source> + <translation>%1 MB</translation> + </message> + <message> + <location line="+2"/> + <source>%1 KB</source> + <translation>%1 KB</translation> + </message> + <message> + <location line="+1"/> + <source>%1 bytes</source> + <translation>%1 位元組</translation> + </message> +</context> +<context> + <name>QFontDatabase</name> + <message> + <location filename="../src/gui/text/qfontdatabase.cpp" line="+90"/> + <location line="+1176"/> + <source>Normal</source> + <translation>正常</translation> + </message> + <message> + <location line="-1173"/> + <location line="+12"/> + <location line="+1149"/> + <source>Bold</source> + <translation>粗體</translation> + </message> + <message> + <location line="-1158"/> + <location line="+1160"/> + <source>Demi Bold</source> + <translation>半粗體</translation> + </message> + <message> + <location line="-1157"/> + <location line="+18"/> + <location line="+1135"/> + <source>Black</source> + <translation>黑體</translation> + </message> + <message> + <location line="-1145"/> + <source>Demi</source> + <translation>半體</translation> + </message> + <message> + <location line="+6"/> + <location line="+1145"/> + <source>Light</source> + <translation>輕體</translation> + </message> + <message> + <location line="-1004"/> + <location line="+1007"/> + <source>Italic</source> + <translation>斜體</translation> + </message> + <message> + <location line="-1004"/> + <location line="+1006"/> + <source>Oblique</source> + <translation>傾斜體</translation> + </message> + <message> + <location line="+705"/> + <source>Any</source> + <translation>任何</translation> + </message> + <message> + <location line="+3"/> + <source>Latin</source> + <translation>拉丁</translation> + </message> + <message> + <location line="+3"/> + <source>Greek</source> + <translation>希臘</translation> + </message> + <message> + <location line="+3"/> + <source>Cyrillic</source> + <translation>斯拉夫</translation> + </message> + <message> + <location line="+3"/> + <source>Armenian</source> + <translation>亞美尼亞</translation> + </message> + <message> + <location line="+3"/> + <source>Hebrew</source> + <translation>希伯來</translation> + </message> + <message> + <location line="+3"/> + <source>Arabic</source> + <translation>阿拉伯</translation> + </message> + <message> + <location line="+3"/> + <source>Syriac</source> + <translation>敘利亞</translation> + </message> + <message> + <location line="+3"/> + <source>Thaana</source> + <translation>Thaana</translation> + </message> + <message> + <location line="+3"/> + <source>Devanagari</source> + <translation>Devanagari</translation> + </message> + <message> + <location line="+3"/> + <source>Bengali</source> + <translation>孟加拉</translation> + </message> + <message> + <location line="+3"/> + <source>Gurmukhi</source> + <translation>Gurmukhi</translation> + </message> + <message> + <location line="+3"/> + <source>Gujarati</source> + <translation>Gujarati</translation> + </message> + <message> + <location line="+3"/> + <source>Oriya</source> + <translation>Oriya</translation> + </message> + <message> + <location line="+3"/> + <source>Tamil</source> + <translation>坦米爾</translation> + </message> + <message> + <location line="+3"/> + <source>Telugu</source> + <translation>Telugu</translation> + </message> + <message> + <location line="+3"/> + <source>Kannada</source> + <translation>坎達那</translation> + </message> + <message> + <location line="+3"/> + <source>Malayalam</source> + <translation>馬來語</translation> + </message> + <message> + <location line="+3"/> + <source>Sinhala</source> + <translation>錫蘭</translation> + </message> + <message> + <location line="+3"/> + <source>Thai</source> + <translation>泰語</translation> + </message> + <message> + <location line="+3"/> + <source>Lao</source> + <translation>寮國</translation> + </message> + <message> + <location line="+3"/> + <source>Tibetan</source> + <translation>西藏</translation> + </message> + <message> + <location line="+3"/> + <source>Myanmar</source> + <translation>緬甸</translation> + </message> + <message> + <location line="+3"/> + <source>Georgian</source> + <translation>喬治亞</translation> + </message> + <message> + <location line="+3"/> + <source>Khmer</source> + <translation>高棉</translation> + </message> + <message> + <location line="+3"/> + <source>Simplified Chinese</source> + <translation>簡體中文</translation> + </message> + <message> + <location line="+3"/> + <source>Traditional Chinese</source> + <translation>繁體中文</translation> + </message> + <message> + <location line="+3"/> + <source>Japanese</source> + <translation>日語</translation> + </message> + <message> + <location line="+3"/> + <source>Korean</source> + <translation>韓語</translation> + </message> + <message> + <location line="+3"/> + <source>Vietnamese</source> + <translation>越南</translation> + </message> + <message> + <location line="+3"/> + <source>Symbol</source> + <translation>符號</translation> + </message> + <message> + <location line="+3"/> + <source>Ogham</source> + <translation>歐甘</translation> + </message> + <message> + <location line="+3"/> + <source>Runic</source> + <translation>盧恩</translation> + </message> +</context> +<context> + <name>QFontDialog</name> + <message> + <location filename="../src/gui/dialogs/qfontdialog.cpp" line="+772"/> + <source>&Font</source> + <translation>字型(&F)</translation> + </message> + <message> + <location line="+1"/> + <source>Font st&yle</source> + <translation>字型樣式(&Y)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Effects</source> + <translation>效果</translation> + </message> + <message> + <location line="+1"/> + <source>Stri&keout</source> + <translation>刪除線(&K)</translation> + </message> + <message> + <location line="+1"/> + <source>&Underline</source> + <translation>底線(&U)</translation> + </message> + <message> + <location line="+1"/> + <source>Sample</source> + <translation>範例</translation> + </message> + <message> + <location line="+1"/> + <source>Wr&iting System</source> + <translation>寫入系統(&I)</translation> + </message> + <message> + <location line="-604"/> + <location line="+247"/> + <source>Select Font</source> + <translation>選擇字型</translation> + </message> +</context> +<context> + <name>QFtp</name> + <message> + <location filename="../src/network/access/qftp.cpp" line="+826"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+683"/> + <source>Not connected</source> + <translation>未連線</translation> + </message> + <message> + <location line="+65"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+65"/> + <source>Host %1 not found</source> + <translation>找不到主機 %1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+4"/> + <source>Connection refused to host %1</source> + <translation>連線到主機 %1 被拒</translation> + </message> + <message> + <location line="+4"/> + <source>Connection timed out to host %1</source> + <translation>連線到主機 %1 逾時</translation> + </message> + <message> + <location line="+104"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+102"/> + <location line="+1451"/> + <source>Connected to host %1</source> + <translation>已連接到主機 %1</translation> + </message> + <message> + <location line="+219"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="-1290"/> + <source>Connection refused for data connection</source> + <translation>資料連線被拒</translation> + </message> + <message> + <location line="+178"/> + <location line="+29"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+195"/> + <location line="+728"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="+889"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+77"/> + <source>Connecting to host failed: +%1</source> + <translation>連線到主機失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Login failed: +%1</source> + <translation>登入失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Listing directory failed: +%1</source> + <translation>列出目錄時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Changing directory failed: +%1</source> + <translation>變更目錄時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Downloading file failed: +%1</source> + <translation>下載檔案時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Uploading file failed: +%1</source> + <translation>上傳檔案時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Removing file failed: +%1</source> + <translation>移除檔案時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Creating directory failed: +%1</source> + <translation>建立目錄時失敗: +%1</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+3"/> + <source>Removing directory failed: +%1</source> + <translation>移除目錄時失敗: +%1</translation> + </message> + <message> + <location line="+28"/> + <location filename="../src/qt3support/network/q3ftp.cpp" line="+25"/> + <location line="+250"/> + <source>Connection closed</source> + <translation>連線已關閉</translation> + </message> + <message> + <location filename="../src/qt3support/network/q3ftp.cpp" line="-11"/> + <source>Host %1 found</source> + <translation>找到主機 %1</translation> + </message> + <message> + <location line="+4"/> + <source>Connection to %1 closed</source> + <translation>到 %1 的連線已關閉</translation> + </message> + <message> + <location line="+3"/> + <source>Host found</source> + <translation>找到主機</translation> + </message> + <message> + <location line="+2"/> + <source>Connected to host</source> + <translation>已連線到主機</translation> + </message> +</context> +<context> + <name>QHostInfo</name> + <message> + <location filename="../src/network/kernel/qhostinfo_p.h" line="+183"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> +</context> +<context> + <name>QHostInfoAgent</name> + <message> + <location filename="../src/network/kernel/qhostinfo_unix.cpp" line="+178"/> + <location line="+9"/> + <location line="+64"/> + <location line="+31"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="+180"/> + <location line="+9"/> + <location line="+40"/> + <location line="+27"/> + <source>Host not found</source> + <translation>找不到主機</translation> + </message> + <message> + <location line="-44"/> + <location line="+39"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-34"/> + <location line="+29"/> + <source>Unknown address type</source> + <translation>未知的位址型態</translation> + </message> + <message> + <location line="+8"/> + <location filename="../src/network/kernel/qhostinfo_win.cpp" line="-19"/> + <location line="+27"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> +</context> +<context> + <name>QHttp</name> + <message> + <location filename="../src/network/access/qhttp.cpp" line="+1574"/> + <location line="+820"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+1160"/> + <location line="+567"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="-568"/> + <location filename="../src/qt3support/network/q3http.cpp" line="-370"/> + <source>Request aborted</source> + <translation>要求中止</translation> + </message> + <message> + <location line="+579"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+381"/> + <source>No server set to connect to</source> + <translation>沒有設定要連線到哪個伺服器</translation> + </message> + <message> + <location line="+164"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+56"/> + <source>Wrong content length</source> + <translation>錯誤的內容長度</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+4"/> + <source>Server closed connection unexpectedly</source> + <translation>伺服器無預警關閉連線</translation> + </message> + <message> + <location line="+179"/> + <source>Unknown authentication method</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+183"/> + <source>Error writing response to device</source> + <translation>寫入回應到裝置時發生錯誤</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+876"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+38"/> + <source>Connection refused</source> + <translation>連線被拒</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-304"/> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-4"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>Host %1 not found</source> + <translation>找不到主機 %1</translation> + </message> + <message> + <location line="+20"/> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+10"/> + <location line="+19"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>HTTP request failed</source> + <translation>HTTP 要求失敗</translation> + </message> + <message> + <location line="+73"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+69"/> + <source>Invalid HTTP response header</source> + <translation>不合法的 HTTP 回覆標頭</translation> + </message> + <message> + <location line="+125"/> + <location line="+48"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+40"/> + <location line="+47"/> + <source>Invalid HTTP chunked body</source> + <translation>不合法的 HTTP 區塊主體</translation> + </message> + <message> + <location filename="../src/qt3support/network/q3http.cpp" line="+294"/> + <source>Host %1 found</source> + <translation>找到主機 %1</translation> + </message> + <message> + <location line="+3"/> + <source>Connected to host %1</source> + <translation>已連接到主機 %1</translation> + </message> + <message> + <location line="+3"/> + <source>Connection to %1 closed</source> + <translation>到 %1 的連線已關閉</translation> + </message> + <message> + <location line="+8"/> + <source>Host found</source> + <translation>找到主機</translation> + </message> + <message> + <location line="+3"/> + <source>Connected to host</source> + <translation>已連線到主機</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="-22"/> + <location filename="../src/qt3support/network/q3http.cpp" line="+3"/> + <source>Connection closed</source> + <translation>連線已關閉</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-135"/> + <source>Proxy authentication required</source> + <translation>代理伺服器需要認證</translation> + </message> + <message> + <location line="+4"/> + <source>Authentication required</source> + <translation>需要認證</translation> + </message> + <message> + <location line="-138"/> + <source>Connection refused (or timed out)</source> + <translation>連線被拒(或連線逾時)</translation> + </message> + <message> + <location filename="../src/network/access/qhttpnetworkconnection.cpp" line="+6"/> + <source>Proxy requires authentication</source> + <translation>代理伺服器需要認證</translation> + </message> + <message> + <location line="+3"/> + <source>Host requires authentication</source> + <translation>主機需要認證</translation> + </message> + <message> + <location line="+3"/> + <source>Data corrupted</source> + <translation>資料已損毀</translation> + </message> + <message> + <location line="+3"/> + <source>Unknown protocol specified</source> + <translation>指定了未知的協定</translation> + </message> + <message> + <location line="+3"/> + <source>SSL handshake failed</source> + <translation>SSL 溝通失敗</translation> + </message> + <message> + <location filename="../src/network/access/qhttp.cpp" line="-2263"/> + <source>HTTPS connection requested but SSL support not compiled in</source> + <translation>HTTPS 連線需要的 SSL 支援並未編譯進來</translation> + </message> +</context> +<context> + <name>QHttpSocketEngine</name> + <message> + <location filename="../src/network/socket/qhttpsocketengine.cpp" line="-89"/> + <source>Did not receive HTTP response from proxy</source> + <translation>未從代理伺服器接收到 HTTP 回應</translation> + </message> + <message> + <location line="+25"/> + <source>Error parsing authentication request from proxy</source> + <translation>剖析從代理伺服器傳來的認證要求時發生錯誤</translation> + </message> + <message> + <location line="+31"/> + <source>Authentication required</source> + <translation>需要認證</translation> + </message> + <message> + <location line="+27"/> + <source>Proxy denied connection</source> + <translation>代理伺服器拒絕連線</translation> + </message> + <message> + <location line="+10"/> + <source>Error communicating with HTTP proxy</source> + <translation>與 HTTP 代理伺服器聯繫時發生錯誤</translation> + </message> + <message> + <location line="+23"/> + <source>Proxy server not found</source> + <translation>找不到代理伺服器</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy connection refused</source> + <translation>代理伺服器連線被拒</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy server connection timed out</source> + <translation>代理伺服器連線逾時</translation> + </message> + <message> + <location line="+2"/> + <source>Proxy connection closed prematurely</source> + <translation>代理伺服器連線已不正常關閉</translation> + </message> +</context> +<context> + <name>QIBaseDriver</name> + <message> + <location filename="../src/sql/drivers/ibase/qsql_ibase.cpp" line="+1428"/> + <source>Error opening database</source> + <translation>開啟資料庫發生錯誤</translation> + </message> + <message> + <location line="+54"/> + <source>Could not start transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+13"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+13"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QIBaseResult</name> + <message> + <location line="-1097"/> + <source>Unable to create BLOB</source> + <translation>無法建立 BLOB</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to write BLOB</source> + <translation>無法寫入 BLOB</translation> + </message> + <message> + <location line="+14"/> + <source>Unable to open BLOB</source> + <translation>無法開啟 BLOB</translation> + </message> + <message> + <location line="+16"/> + <source>Unable to read BLOB</source> + <translation>無法讀取 BLOB</translation> + </message> + <message> + <location line="+125"/> + <location line="+189"/> + <source>Could not find array</source> + <translation>找不到陣列</translation> + </message> + <message> + <location line="-157"/> + <source>Could not get array data</source> + <translation>無法取得陣列資料</translation> + </message> + <message> + <location line="+212"/> + <source>Could not get query info</source> + <translation>無法取得查詢資訊</translation> + </message> + <message> + <location line="+20"/> + <source>Could not start transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+33"/> + <source>Could not allocate statement</source> + <translation>無法配置敘述</translation> + </message> + <message> + <location line="+5"/> + <source>Could not prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+5"/> + <location line="+7"/> + <source>Could not describe input statement</source> + <translation>無法描述輸入敘述</translation> + </message> + <message> + <location line="+10"/> + <source>Could not describe statement</source> + <translation>無法描述敘述</translation> + </message> + <message> + <location line="+115"/> + <source>Unable to close statement</source> + <translation>無法關閉敘述</translation> + </message> + <message> + <location line="+8"/> + <source>Unable to execute query</source> + <translation>無法執行查詢</translation> + </message> + <message> + <location line="+46"/> + <source>Could not fetch next item</source> + <translation>無法抓取下一個項目</translation> + </message> + <message> + <location line="+160"/> + <source>Could not get statement info</source> + <translation>無法取得敘述資訊</translation> + </message> +</context> +<context> + <name>QIODevice</name> + <message> + <location filename="../src/corelib/global/qglobal.cpp" line="+1869"/> + <source>Permission denied</source> + <translation>權限不足</translation> + </message> + <message> + <location line="+3"/> + <source>Too many open files</source> + <translation>開啟過多檔案</translation> + </message> + <message> + <location line="+3"/> + <source>No such file or directory</source> + <translation>找不到該檔案或目錄</translation> + </message> + <message> + <location line="+3"/> + <source>No space left on device</source> + <translation>裝置上已無空間</translation> + </message> + <message> + <location filename="../src/corelib/io/qiodevice.cpp" line="+1536"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> +</context> +<context> + <name>QInputContext</name> + <message> + <location filename="../src/gui/inputmethod/qinputcontextfactory.cpp" line="+242"/> + <source>XIM</source> + <translation>XIM</translation> + </message> + <message> + <location line="+23"/> + <source>XIM input method</source> + <translation>XIM 輸入法</translation> + </message> + <message> + <location line="+4"/> + <source>Windows input method</source> + <translation>Windows 輸入法</translation> + </message> + <message> + <location line="+4"/> + <source>Mac OS X input method</source> + <translation>Mac OS X 輸入法</translation> + </message> +</context> +<context> + <name>QInputDialog</name> + <message> + <location filename="../src/gui/dialogs/qinputdialog.cpp" line="+223"/> + <source>Enter a value:</source> + <translation>請輸入值:</translation> + </message> +</context> +<context> + <name>QLibrary</name> + <message> + <source>QLibrary::load_sys: Cannot load %1 (%2)</source> + <translation type="obsolete">QLibrary::load_sys: 無法載入 %1 (%2)</translation> + </message> + <message> + <source>QLibrary::unload_sys: Cannot unload %1 (%2)</source> + <translation type="obsolete">QLibrary::unload_sys: 無法卸載 %1 (%2)</translation> + </message> + <message> + <source>QLibrary::resolve_sys: Symbol "%1" undefined in %2 (%3)</source> + <translation type="obsolete">QLibrary::resolve_sys: 符號 "%1" 未定義於 %2 (%3)</translation> + </message> + <message> + <location filename="../src/corelib/plugin/qlibrary.cpp" line="+378"/> + <source>Could not mmap '%1': %2</source> + <translation>無法 mmap '%1':%2</translation> + </message> + <message> + <location line="+22"/> + <source>Plugin verification data mismatch in '%1'</source> + <translation>在 %1 中的外掛程式確認資料不符合</translation> + </message> + <message> + <location line="+6"/> + <source>Could not unmap '%1': %2</source> + <translation>無法 unmap '%1':%2</translation> + </message> + <message> + <location line="+302"/> + <source>The plugin '%1' uses incompatible Qt library. (%2.%3.%4) [%5]</source> + <translation>外掛程式 %1 使用不相容的 Qt 函式庫(%2.%3.%4)【%5】</translation> + </message> + <message> + <location line="+20"/> + <source>The plugin '%1' uses incompatible Qt library. Expected build key "%2", got "%3"</source> + <translation>外掛程式 %1 使用不相容的 Qt 函式庫。預期建構鑰 %2,卻得到 %3</translation> + </message> + <message> + <location line="+340"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="-377"/> + <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+280"/> + <source>The shared library was not found.</source> + <translation>找不到分享函式庫</translation> + </message> + <message> + <location line="+2"/> + <source>The file '%1' is not a valid Qt plugin.</source> + <translation>檔案 %1 不是合法的 Qt 外掛程式。</translation> + </message> + <message> + <location line="+43"/> + <source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source> + <translation>外掛程式 %1 使用不相容的 Qt 函式庫。(不能將除錯與釋出版的函式庫混在一起。)</translation> + </message> + <message> + <location filename="../src/corelib/plugin/qlibrary_unix.cpp" line="+209"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+99"/> + <source>Cannot load library %1: %2</source> + <translation>無法載入函式庫 %1:%2</translation> + </message> + <message> + <location line="+16"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+26"/> + <source>Cannot unload library %1: %2</source> + <translation>無法卸載函式庫 %1:%2</translation> + </message> + <message> + <location line="+31"/> + <location filename="../src/corelib/plugin/qlibrary_win.cpp" line="+15"/> + <source>Cannot resolve symbol "%1" in %2: %3</source> + <translation>無法反解 %2 內的符號 %1:%3</translation> + </message> +</context> +<context> + <name>QLineEdit</name> + <message> + <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/> + <source>&Undo</source> + <translation>復原(&U)</translation> + </message> + <message> + <location line="+4"/> + <source>&Redo</source> + <translation>重做(&R)</translation> + </message> + <message> + <location line="+7"/> + <source>Cu&t</source> + <translation>剪下(&T)</translation> + </message> + <message> + <location line="+4"/> + <source>&Copy</source> + <translation>複製(&C)</translation> + </message> + <message> + <location line="+4"/> + <source>&Paste</source> + <translation>貼上(&P)</translation> + </message> + <message> + <location line="+5"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location line="+6"/> + <source>Select All</source> + <translation>全部選擇</translation> + </message> +</context> +<context> + <name>QLocalServer</name> + <message> + <location filename="../src/network/socket/qlocalserver.cpp" line="+226"/> + <location filename="../src/network/socket/qlocalserver_unix.cpp" line="+231"/> + <source>%1: Name error</source> + <translation>%1:名稱錯誤</translation> + </message> + <message> + <location filename="../src/network/socket/qlocalserver_unix.cpp" line="-8"/> + <source>%1: Permission denied</source> + <translation>%1:存取被拒</translation> + </message> + <message> + <location line="+12"/> + <source>%1: Address in use</source> + <translation>%1:位址使用中</translation> + </message> + <message> + <location line="+5"/> + <location filename="../src/network/socket/qlocalserver_win.cpp" line="+158"/> + <source>%1: Unknown error %2</source> + <translation>%1:未知的錯誤 %2</translation> + </message> +</context> +<context> + <name>QLocalSocket</name> + <message> + <location filename="../src/network/socket/qlocalsocket_tcp.cpp" line="+132"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+134"/> + <source>%1: Connection refused</source> + <translation>%1:連線被拒</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Remote closed</source> + <translation>%1:遠端已關閉</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+80"/> + <location line="+43"/> + <source>%1: Invalid name</source> + <translation>%1:不合法的名稱</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket access error</source> + <translation>%1:Socket 位址錯誤</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket resource error</source> + <translation>%1:Socket 資源錯誤</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Socket operation timed out</source> + <translation>%1:Socket 操作逾時</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: Datagram too large</source> + <translation>%1:資料包過大</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="-48"/> + <source>%1: Connection error</source> + <translation>%1:連線錯誤</translation> + </message> + <message> + <location line="+3"/> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+3"/> + <source>%1: The socket operation is not supported</source> + <translation>%1:socket 操作未支援</translation> + </message> + <message> + <location line="+4"/> + <source>%1: Unknown error</source> + <translation>%1:未知的錯誤</translation> + </message> + <message> + <location filename="../src/network/socket/qlocalsocket_unix.cpp" line="+4"/> + <location filename="../src/network/socket/qlocalsocket_win.cpp" line="+10"/> + <source>%1: Unknown error %2</source> + <translation>%1:未知的錯誤 %2</translation> + </message> +</context> +<context> + <name>QMYSQLDriver</name> + <message> + <location filename="../src/sql/drivers/mysql/qsql_mysql.cpp" line="+1231"/> + <source>Unable to open database '</source> + <translation>無法開啟資料庫</translation> + </message> + <message> + <location line="+7"/> + <source>Unable to connect</source> + <translation>無法連線</translation> + </message> + <message> + <location line="+127"/> + <source>Unable to begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QMYSQLResult</name> + <message> + <location line="-922"/> + <source>Unable to fetch data</source> + <translation>無法抓取資料</translation> + </message> + <message> + <location line="+176"/> + <source>Unable to execute query</source> + <translation>無法執行查詢</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to store result</source> + <translation>無法儲存結果</translation> + </message> + <message> + <location line="+190"/> + <location line="+8"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+34"/> + <source>Unable to reset statement</source> + <translation>無法重置敘述</translation> + </message> + <message> + <location line="+87"/> + <source>Unable to bind value</source> + <translation>無法結合數值</translation> + </message> + <message> + <location line="+11"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> + <message> + <location line="+14"/> + <location line="+21"/> + <source>Unable to bind outvalues</source> + <translation>無法結合輸出值</translation> + </message> + <message> + <location line="-12"/> + <source>Unable to store statement results</source> + <translation>無法儲存敘述結果</translation> + </message> + <message> + <location line="-253"/> + <source>Unable to execute next query</source> + <translation>無法執行下一個查詢</translation> + </message> + <message> + <location line="+10"/> + <source>Unable to store next result</source> + <translation>無法儲存下一個結果</translation> + </message> +</context> +<context> + <name>QMdiArea</name> + <message> + <location filename="../src/gui/widgets/qmdiarea.cpp" line="+290"/> + <source>(Untitled)</source> + <translation>(未命名)</translation> + </message> +</context> +<context> + <name>QMdiSubWindow</name> + <message> + <location filename="../src/gui/widgets/qmdisubwindow.cpp" line="+280"/> + <source>%1 - [%2]</source> + <translation>%1 - [%2]</translation> + </message> + <message> + <location line="+72"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="-18"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+13"/> + <source>Restore Down</source> + <translation>向下恢復</translation> + </message> + <message> + <location line="+707"/> + <source>&Restore</source> + <translation>回復(&R)</translation> + </message> + <message> + <location line="+3"/> + <source>&Move</source> + <translation>移動(&M)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+1"/> + <source>Mi&nimize</source> + <translation>最小化(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Ma&ximize</source> + <translation>最大化(&X)</translation> + </message> + <message> + <location line="+2"/> + <source>Stay on &Top</source> + <translation>留在頂端(&T)</translation> + </message> + <message> + <location line="+3"/> + <source>&Close</source> + <translation>關閉(&C)</translation> + </message> + <message> + <location line="-787"/> + <source>- [%1]</source> + <translation>- [%1]</translation> + </message> + <message> + <location line="+58"/> + <source>Maximize</source> + <translation>最大化</translation> + </message> + <message> + <location line="+3"/> + <source>Unshade</source> + <translation>取消遮蔽</translation> + </message> + <message> + <location line="+3"/> + <source>Shade</source> + <translation>遮蔽</translation> + </message> + <message> + <location line="+6"/> + <source>Restore</source> + <translation>回復</translation> + </message> + <message> + <location line="+6"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="+3"/> + <source>Menu</source> + <translation>選單</translation> + </message> +</context> +<context> + <name>QMenu</name> + <message> + <location filename="../src/plugins/accessible/widgets/qaccessiblemenu.cpp" line="+157"/> + <location line="+225"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="-224"/> + <location line="+225"/> + <source>Open</source> + <translation>開啟</translation> + </message> + <message> + <location line="-223"/> + <location line="+225"/> + <location line="+51"/> + <source>Execute</source> + <translation>執行</translation> + </message> +</context> +<context> + <name>QMenuBar</name> + <message> + <source>About</source> + <translation type="obsolete">關於</translation> + </message> + <message> + <source>Config</source> + <translation type="obsolete">設定</translation> + </message> + <message> + <source>Preference</source> + <translation type="obsolete">喜好設定</translation> + </message> + <message> + <source>Options</source> + <translation type="obsolete">選項</translation> + </message> + <message> + <source>Setting</source> + <translation type="obsolete">設定</translation> + </message> + <message> + <source>Setup</source> + <translation type="obsolete">設定</translation> + </message> + <message> + <source>Quit</source> + <translation type="obsolete">離開</translation> + </message> + <message> + <source>Exit</source> + <translation type="obsolete">離開</translation> + </message> + <message> + <source>About %1</source> + <translation type="obsolete">關於 %1</translation> + </message> + <message> + <source>About Qt</source> + <translation type="obsolete">關於 Qt</translation> + </message> + <message> + <source>Preferences</source> + <translation type="obsolete">喜好設定</translation> + </message> + <message> + <source>Quit %1</source> + <translation type="obsolete">離開 %1</translation> + </message> +</context> +<context> + <name>QMessageBox</name> + <message> + <location filename="../src/gui/dialogs/qmessagebox.cpp" line="-1111"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="-853"/> + <location line="+852"/> + <location filename="../src/gui/dialogs/qmessagebox.h" line="-52"/> + <location line="+8"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <location line="+509"/> + <source>About Qt</source> + <translation>關於 Qt</translation> + </message> + <message> + <source><p>This program uses Qt version %1.</p></source> + <translation type="obsolete"><p> 這個程式使用 Qt 版本 %1</p></translation> + </message> + <message> + <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qtopia Core.</p><p>Qt is a Trolltech product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><h3>關於 Qt</h3>%1<p>Qt 為一個跨平台的 C++ 開發工具。</p><p>Qt 提供各平台相容機制,只要寫一份程式碼,就可以在 MS&nbsp;Windows、Mac&nbsp;OS&nbsp;X、Linux 與各主要的商業 Unix 平台上編譯。Qt 也可以用 Qtopia Core 用於嵌入式系統。</p><p>Qt 為 Trolltech 的產品。詳情請參考 <a href="http://qt.nokia.com/">qt.nokia.com</a>。</p></translation> + </message> + <message> + <location line="-1605"/> + <source>Show Details...</source> + <translation>顯示詳情...</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Details...</source> + <translation>隱藏詳情...</translation> + </message> + <message> + <location line="+1570"/> + <source><h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><h3>關於 Qt</h3>%1<p>Qt 為一個跨平台的 C++ 開發工具。</p><p>Qt 提供各平台相容機制,只要寫一份程式碼,就可以在 MS&nbsp;Windows、Mac&nbsp;OS&nbsp;X、Linux 與各主要的商業 Unix 平台上編譯。Qt 也有用於嵌入式 Linux 與 Windows CE 的版本。</p><p>Qt 為 Nokia 的產品。詳情請參考 <a href="http://qt.nokia.com/">qt.nokia.com</a>。</p></translation> + </message> + <message> + <source><p>This program uses Qt Open Source Edition version %1.</p><p>Qt Open Source Edition is intended for the development of Open Source applications. You need a commercial Qt license for development of proprietary (closed source) applications.</p><p>Please see <a href="http://qt.nokia.com/company/model/">qt.nokia.com/company/model/</a> for an overview of Qt licensing.</p></source> + <translation type="obsolete"><p>這個程式使用了 Qt 開放源碼版本 %1。</p><p>Qt 開放源碼版本是專門為了開發開放源碼應用程式使用的版本。若是您要開發專利私有(封閉)軟體,您需要 Qt 的商業授權。</p><p>Qt 的授權概要請參考 <a href="http://qt.nokia.com/company/model/">qt.nokia.com/company/model/</a>。</p></translation> + </message> + <message> + <source><h3>About Qt</h3>%1<p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt Embedded.</p><p>Qt is a Trolltech product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p></source> + <translation type="obsolete"><h3>關於 Qt</h3>%1<p>Qt 為一個跨平台的 C++ 開發工具。</p><p>Qt 提供各平台相容機制,只要寫一份程式碼,就可以在 MS&nbsp;Windows、Mac&nbsp;OS&nbsp;X、Linux 與各主要的商業 Unix 平台上編譯。Qt 也可以用 Qtopia Core 用於嵌入式系統。</p><p>Qt 為 Trolltech 的產品。詳情請參考 <a href="http://qt.nokia.com/">qt.nokia.com</a>。</p></translation> + </message> +</context> +<context> + <name>QMultiInputContext</name> + <message> + <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontext.cpp" line="+88"/> + <source>Select IM</source> + <translation>選擇輸入法</translation> + </message> +</context> +<context> + <name>QMultiInputContextPlugin</name> + <message> + <location filename="../src/plugins/inputmethods/imsw-multi/qmultiinputcontextplugin.cpp" line="+95"/> + <source>Multiple input method switcher</source> + <translation>多重輸入法切換器</translation> + </message> + <message> + <location line="+7"/> + <source>Multiple input method switcher that uses the context menu of the text widgets</source> + <translation>使用文字元件中的內文選單的多重輸入法切換器</translation> + </message> +</context> +<context> + <name>QNativeSocketEngine</name> + <message> + <location filename="../src/network/socket/qnativesocketengine.cpp" line="+206"/> + <source>The remote host closed the connection</source> + <translation>遠端主機關閉了連線</translation> + </message> + <message> + <location line="+3"/> + <source>Network operation timed out</source> + <translation>網路操作逾時</translation> + </message> + <message> + <location line="+3"/> + <source>Out of resources</source> + <translation>資源不足</translation> + </message> + <message> + <location line="+3"/> + <source>Unsupported socket operation</source> + <translation>未支援的 socket 操作</translation> + </message> + <message> + <location line="+3"/> + <source>Protocol type not supported</source> + <translation>協定型態未支援</translation> + </message> + <message> + <location line="+3"/> + <source>Invalid socket descriptor</source> + <translation>不合法的 socket 描述子</translation> + </message> + <message> + <location line="+6"/> + <source>Network unreachable</source> + <translation>無法使用網路</translation> + </message> + <message> + <location line="+3"/> + <source>Permission denied</source> + <translation>權限不足</translation> + </message> + <message> + <location line="+3"/> + <source>Connection timed out</source> + <translation>連線逾時</translation> + </message> + <message> + <location line="+3"/> + <source>Connection refused</source> + <translation>連線被拒</translation> + </message> + <message> + <location line="+3"/> + <source>The bound address is already in use</source> + <translation>結合的位址已經在使用中</translation> + </message> + <message> + <location line="+3"/> + <source>The address is not available</source> + <translation>無法取得位址</translation> + </message> + <message> + <location line="+3"/> + <source>The address is protected</source> + <translation>此位址已被保護</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to send a message</source> + <translation>無法送出訊息</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to receive a message</source> + <translation>無法接收訊息</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to write</source> + <translation>無法寫入</translation> + </message> + <message> + <location line="+3"/> + <source>Network error</source> + <translation>網路錯誤</translation> + </message> + <message> + <location line="+3"/> + <source>Another socket is already listening on the same port</source> + <translation>另一個 socket 已經在監聽同一個連接埠</translation> + </message> + <message> + <location line="-66"/> + <source>Unable to initialize non-blocking socket</source> + <translation>無法初始化非阻擋性 socket</translation> + </message> + <message> + <location line="+3"/> + <source>Unable to initialize broadcast socket</source> + <translation>無法初始化廣播 socket</translation> + </message> + <message> + <location line="+3"/> + <source>Attempt to use IPv6 socket on a platform with no IPv6 support</source> + <translation>試圖在沒有 IPv6 支援的平台上使用 IPv6 socket</translation> + </message> + <message> + <location line="+21"/> + <source>Host unreachable</source> + <translation>無法連線到主機</translation> + </message> + <message> + <location line="+24"/> + <source>Datagram was too large to send</source> + <translation>資料過大無法送出</translation> + </message> + <message> + <location line="+18"/> + <source>Operation on non-socket</source> + <translation>對非 socket 操作</translation> + </message> + <message> + <location line="+6"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="-3"/> + <source>The proxy type is invalid for this operation</source> + <translation>代理伺服器型態無法支援此操作</translation> + </message> +</context> +<context> + <name>QNetworkAccessCacheBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccesscachebackend.cpp" line="+65"/> + <source>Error opening %1</source> + <translation>開啟 %1 發生錯誤</translation> + </message> +</context> +<context> + <name>QNetworkAccessFileBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccessfilebackend.cpp" line="+99"/> + <source>Request for opening non-local file %1</source> + <translation>要求開啟非本地端檔案 %1</translation> + </message> + <message> + <location line="+42"/> + <source>Error opening %1: %2</source> + <translation>開啟 %1 發生錯誤:%2</translation> + </message> + <message> + <location line="+56"/> + <source>Write error writing to %1: %2</source> + <translation>寫入 %1 時發生錯誤:%2</translation> + </message> + <message> + <location line="+33"/> + <source>Cannot open %1: Path is a directory</source> + <translation>無法開啟 %1:此路徑是一個目錄</translation> + </message> + <message> + <location line="+21"/> + <source>Read error reading from %1: %2</source> + <translation>從 %1 讀取錯誤:%2</translation> + </message> +</context> +<context> + <name>QNetworkAccessFtpBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccessftpbackend.cpp" line="+165"/> + <source>No suitable proxy found</source> + <translation>找不到合適的代理伺服器</translation> + </message> + <message> + <location line="+14"/> + <source>Cannot open %1: is a directory</source> + <translation>無法開啟 %1:是一個目錄</translation> + </message> + <message> + <location line="+130"/> + <source>Logging in to %1 failed: authentication required</source> + <translation>登入 %1 失敗:需要認證</translation> + </message> + <message> + <location line="+39"/> + <source>Error while downloading %1: %2</source> + <translation>下載 %1 時發生錯誤:%2</translation> + </message> + <message> + <location line="+2"/> + <source>Error while uploading %1: %2</source> + <translation>上傳 %1 時發生錯誤:%2</translation> + </message> +</context> +<context> + <name>QNetworkAccessHttpBackend</name> + <message> + <location filename="../src/network/access/qnetworkaccesshttpbackend.cpp" line="+597"/> + <source>No suitable proxy found</source> + <translation>找不到合適的代理伺服器</translation> + </message> +</context> +<context> + <name>QNetworkReply</name> + <message> + <location line="+128"/> + <source>Error downloading %1 - server replied: %2</source> + <translation>下載 %1 時發生錯誤─伺服器回應:%2</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkreplyimpl.cpp" line="+68"/> + <source>Protocol "%1" is unknown</source> + <translation>未知的協定 %1</translation> + </message> +</context> +<context> + <name>QNetworkReplyImpl</name> + <message> + <location line="+432"/> + <location line="+22"/> + <source>Operation canceled</source> + <translation>取消操作</translation> + </message> +</context> +<context> + <name>QOCIDriver</name> + <message> + <location filename="../src/sql/drivers/oci/qsql_oci.cpp" line="+2069"/> + <source>Unable to logon</source> + <translation>無法登入</translation> + </message> + <message> + <location line="-144"/> + <source>Unable to initialize</source> + <comment>QOCIDriver</comment> + <translation>無法初始化</translation> + </message> + <message> + <location line="+215"/> + <source>Unable to begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QOCIResult</name> + <message> + <location line="-963"/> + <location line="+161"/> + <location line="+15"/> + <source>Unable to bind column for batch execute</source> + <translation>無法結合欄位以做批次執行</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to execute batch statement</source> + <translation>無法執行批次敘述</translation> + </message> + <message> + <location line="+302"/> + <source>Unable to goto next</source> + <translation>無法跳到下一個</translation> + </message> + <message> + <location line="+59"/> + <source>Unable to alloc statement</source> + <translation>無法配置敘述</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+36"/> + <source>Unable to bind value</source> + <translation>無法結合數值</translation> + </message> + <message> + <source>Unable to execute select statement</source> + <translation type="obsolete">無法執行選取的敘述</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> +</context> +<context> + <name>QODBCDriver</name> + <message> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="+1785"/> + <source>Unable to connect</source> + <translation>無法連接</translation> + </message> + <message> + <location line="+6"/> + <source>Unable to connect - Driver doesn't support all needed functionality</source> + <translation>無法連接─驅動程式無法支援所有需要的功能</translation> + </message> + <message> + <location line="+242"/> + <source>Unable to disable autocommit</source> + <translation>無法關閉自動提交功能</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to enable autocommit</source> + <translation>無法開啟自動提交功能</translation> + </message> +</context> +<context> + <name>QODBCResult</name> + <message> + <location line="-1218"/> + <location line="+349"/> + <source>QODBCResult::reset: Unable to set 'SQL_CURSOR_STATIC' as statement attribute. Please check your ODBC driver configuration</source> + <translation>QODBCResult::reset: 無法設定 SQL_CURSOR_STATIC 做為敘述屬性。請檢查您的 ODBC 驅動程式的設定</translation> + </message> + <message> + <location line="-332"/> + <location line="+626"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> + <message> + <location line="-555"/> + <source>Unable to fetch next</source> + <translation>無法抓取下一筆</translation> + </message> + <message> + <location line="+279"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> + <message> + <location line="+268"/> + <source>Unable to bind variable</source> + <translation>無法結合變數</translation> + </message> + <message> + <location filename="../src/sql/drivers/db2/qsql_db2.cpp" line="+194"/> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-475"/> + <location line="+578"/> + <source>Unable to fetch last</source> + <translation>無法抓取最後一筆</translation> + </message> + <message> + <location filename="../src/sql/drivers/odbc/qsql_odbc.cpp" line="-672"/> + <source>Unable to fetch</source> + <translation>無法抓取</translation> + </message> + <message> + <location line="+44"/> + <source>Unable to fetch first</source> + <translation>無法抓取第一筆</translation> + </message> + <message> + <location line="+19"/> + <source>Unable to fetch previous</source> + <translation>無法抓取前一筆</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../src/gui/util/qdesktopservices_mac.cpp" line="+165"/> + <source>Home</source> + <translation>首頁</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkaccessdatabackend.cpp" line="+74"/> + <source>Operation not supported on %1</source> + <translation>在 %1 上不支援此操作</translation> + </message> + <message> + <location line="+53"/> + <source>Invalid URI: %1</source> + <translation>不合法的網址:%1</translation> + </message> + <message> + <location filename="../src/network/access/qnetworkaccessdebugpipebackend.cpp" line="+175"/> + <source>Write error writing to %1: %2</source> + <translation>寫入 %1 時發生錯誤:%2</translation> + </message> + <message> + <location line="+57"/> + <source>Read error reading from %1: %2</source> + <translation>從 %1 讀取錯誤:%2</translation> + </message> + <message> + <location line="+31"/> + <source>Socket error on %1: %2</source> + <translation>%1 上發生 socket 錯誤:%2</translation> + </message> + <message> + <location line="+15"/> + <source>Remote host closed the connection prematurely on %1</source> + <translation>於 %1 上遠端主機關閉了不正常的連線</translation> + </message> + <message> + <location line="+53"/> + <source>Protocol error: packet of size 0 received</source> + <translation>協定錯誤:接收到大小為 0 的封包</translation> + </message> + <message> + <location filename="../src/network/kernel/qhostinfo.cpp" line="+177"/> + <location line="+57"/> + <source>No host name given</source> + <translation>未指定主機</translation> + </message> +</context> +<context> + <name>QPPDOptionsModel</name> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+1195"/> + <source>Name</source> + <translation>名稱</translation> + </message> + <message> + <location line="+2"/> + <source>Value</source> + <translation>值</translation> + </message> +</context> +<context> + <name>QPSQLDriver</name> + <message> + <location filename="../src/sql/drivers/psql/qsql_psql.cpp" line="+763"/> + <source>Unable to connect</source> + <translation>無法連線</translation> + </message> + <message> + <location line="+49"/> + <source>Could not begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+17"/> + <source>Could not commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+16"/> + <source>Could not rollback transaction</source> + <translation>無法反轉事務</translation> + </message> + <message> + <location line="+358"/> + <source>Unable to subscribe</source> + <translation>無法訂閱</translation> + </message> + <message> + <location line="+32"/> + <source>Unable to unsubscribe</source> + <translation>無法取消訂閱</translation> + </message> +</context> +<context> + <name>QPSQLResult</name> + <message> + <location line="-1058"/> + <source>Unable to create query</source> + <translation>無法建立查詢</translation> + </message> + <message> + <location line="+374"/> + <source>Unable to prepare statement</source> + <translation>無法準備敘述</translation> + </message> +</context> +<context> + <name>QPageSetupWidget</name> + <message> + <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="+304"/> + <source>Centimeters (cm)</source> + <translation>公分</translation> + </message> + <message> + <location line="+0"/> + <source>Millimeters (mm)</source> + <translation>公厘</translation> + </message> + <message> + <location line="+0"/> + <source>Inches (in)</source> + <translation>英吋</translation> + </message> + <message> + <location line="+0"/> + <source>Points (pt)</source> + <translation>點</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qpagesetupwidget.ui"/> + <source>Form</source> + <translation>表單</translation> + </message> + <message> + <location/> + <source>Paper</source> + <translation>紙張</translation> + </message> + <message> + <location/> + <source>Page size:</source> + <translation>紙張大小:</translation> + </message> + <message> + <location/> + <source>Width:</source> + <translation>寬度:</translation> + </message> + <message> + <location/> + <source>Height:</source> + <translation>高度:</translation> + </message> + <message> + <location/> + <source>Paper source:</source> + <translation>紙張來源:</translation> + </message> + <message> + <location/> + <source>Orientation</source> + <translation>方向</translation> + </message> + <message> + <location/> + <source>Portrait</source> + <translation>縱向</translation> + </message> + <message> + <location/> + <source>Landscape</source> + <translation>橫向</translation> + </message> + <message> + <location/> + <source>Reverse landscape</source> + <translation>反序橫向</translation> + </message> + <message> + <location/> + <source>Reverse portrait</source> + <translation>反序縱向</translation> + </message> + <message> + <location/> + <source>Margins</source> + <translation>邊緣</translation> + </message> + <message> + <location/> + <source>top margin</source> + <translation>上緣</translation> + </message> + <message> + <location/> + <source>left margin</source> + <translation>左緣</translation> + </message> + <message> + <location/> + <source>right margin</source> + <translation>右緣</translation> + </message> + <message> + <location/> + <source>bottom margin</source> + <translation>下緣</translation> + </message> +</context> +<context> + <name>QPluginLoader</name> + <message> + <location filename="../src/corelib/plugin/qpluginloader.cpp" line="+24"/> + <source>Unknown error</source> + <translation>未知的錯誤</translation> + </message> + <message> + <location line="-68"/> + <source>The plugin was not loaded.</source> + <translation>外掛程式未載入。</translation> + </message> +</context> +<context> + <name>QPrintDialog</name> + <message> + <location filename="../src/gui/painting/qprinterinfo_unix.cpp" line="+98"/> + <source>locally connected</source> + <translation>本地連接</translation> + </message> + <message> + <location line="+23"/> + <location line="+225"/> + <source>Aliases: %1</source> + <translation>別名:%1</translation> + </message> + <message> + <location line="+223"/> + <location line="+199"/> + <source>unknown</source> + <translation>未知</translation> + </message> + <message> + <source>Portrait</source> + <translation type="obsolete">縱向</translation> + </message> + <message> + <source>Landscape</source> + <translation type="obsolete">橫向</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+329"/> + <source>A0 (841 x 1189 mm)</source> + <translation>A0 (841 x 1189 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A1 (594 x 841 mm)</source> + <translation>A1 (594 x 841 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A2 (420 x 594 mm)</source> + <translation>A2 (420 x 594 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A3 (297 x 420 mm)</source> + <translation>A3 (297 x 420 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A4 (210 x 297 mm, 8.26 x 11.7 inches)</source> + <translation>A4 (210 x 297 mm, 8.26 x 11.7 英吋)</translation> + </message> + <message> + <location line="+1"/> + <source>A5 (148 x 210 mm)</source> + <translation>A5 (148 x 210 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A6 (105 x 148 mm)</source> + <translation>A6 (105 x 148 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A7 (74 x 105 mm)</source> + <translation>A7 (74 x 105 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A8 (52 x 74 mm)</source> + <translation>A8 (52 x 74 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>A9 (37 x 52 mm)</source> + <translation>A9 (37 x 52 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B0 (1000 x 1414 mm)</source> + <translation>B0 (1000 x 1414 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B1 (707 x 1000 mm)</source> + <translation>B1 (707 x 1000 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B2 (500 x 707 mm)</source> + <translation>B2 (500 x 707 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B3 (353 x 500 mm)</source> + <translation>B3 (353 x 500 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B4 (250 x 353 mm)</source> + <translation>B4 (250 x 353 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B5 (176 x 250 mm, 6.93 x 9.84 inches)</source> + <translation>B5 (176 x 250 mm, 6.93 x 9.84 英吋)</translation> + </message> + <message> + <location line="+1"/> + <source>B6 (125 x 176 mm)</source> + <translation>B6 (125 x 176 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B7 (88 x 125 mm)</source> + <translation>B7 (88 x 125 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B8 (62 x 88 mm)</source> + <translation>B8 (62 x 88 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B9 (44 x 62 mm)</source> + <translation>B9 (44 x 62 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>B10 (31 x 44 mm)</source> + <translation>B10 (31 x 44 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>C5E (163 x 229 mm)</source> + <translation>C5E (163 x 229 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>DLE (110 x 220 mm)</source> + <translation>DLE (110 x 220 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Executive (7.5 x 10 inches, 191 x 254 mm)</source> + <translation>Executive (7.5 x 10 英吋, 191 x 254 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Folio (210 x 330 mm)</source> + <translation>對開 (210 x 330 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Ledger (432 x 279 mm)</source> + <translation>Ledger (432 x 279 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Legal (8.5 x 14 inches, 216 x 356 mm)</source> + <translation>Legal (8.5 x 14 英吋, 216 x 356 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Letter (8.5 x 11 inches, 216 x 279 mm)</source> + <translation>Letter (8.5 x 11 英吋, 216 x 279 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>Tabloid (279 x 432 mm)</source> + <translation>Tabloid (279 x 432 mm)</translation> + </message> + <message> + <location line="+1"/> + <source>US Common #10 Envelope (105 x 241 mm)</source> + <translation>US 常用 10 號信封 (105x241 mm)</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+268"/> + <source>OK</source> + <translation>確定</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> + <message> + <source>Page size:</source> + <translation type="obsolete">紙張大小:</translation> + </message> + <message> + <source>Orientation:</source> + <translation type="obsolete">方向:</translation> + </message> + <message> + <source>Paper source:</source> + <translation type="obsolete">紙張來源:</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qabstractprintdialog.cpp" line="+110"/> + <location line="+13"/> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="-2"/> + <source>Print</source> + <translation>列印</translation> + </message> + <message> + <source>File</source> + <translation type="obsolete">檔案</translation> + </message> + <message> + <source>Printer</source> + <translation type="obsolete">印表機</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-357"/> + <source>Print To File ...</source> + <translation>列印到檔案...</translation> + </message> + <message> + <source>Print dialog</source> + <translation type="obsolete">列印對話框</translation> + </message> + <message> + <source>Paper format</source> + <translation type="obsolete">紙張格式</translation> + </message> + <message> + <source>Size:</source> + <translation type="obsolete">大小:</translation> + </message> + <message> + <source>Properties</source> + <translation type="obsolete">內容</translation> + </message> + <message> + <source>Printer info:</source> + <translation type="obsolete">印表機資訊:</translation> + </message> + <message> + <source>Browse</source> + <translation type="obsolete">瀏覽</translation> + </message> + <message> + <source>Print to file</source> + <translation type="obsolete">列印到檔案</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="+19"/> + <source>Print range</source> + <translation>列印範圍</translation> + </message> + <message> + <location line="-2"/> + <source>Print all</source> + <translation>全部列印</translation> + </message> + <message> + <source>Pages from</source> + <translation type="obsolete">指定頁面:從</translation> + </message> + <message> + <source>to</source> + <translation type="obsolete">到</translation> + </message> + <message> + <source>Selection</source> + <translation type="obsolete">選擇區</translation> + </message> + <message> + <source>Copies</source> + <translation type="obsolete">份數</translation> + </message> + <message> + <source>Number of copies:</source> + <translation type="obsolete">列印份數:</translation> + </message> + <message> + <source>Collate</source> + <translation type="obsolete">校對</translation> + </message> + <message> + <source>Print last page first</source> + <translation type="obsolete">從最後一頁印起</translation> + </message> + <message> + <source>Other</source> + <translation type="obsolete">其他</translation> + </message> + <message> + <source>Print in color if available</source> + <translation type="obsolete">可以的話用彩色列印</translation> + </message> + <message> + <source>Double side printing</source> + <translation type="obsolete">雙面列印</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="+80"/> + <source>File %1 is not writable. +Please choose a different file name.</source> + <translation>檔案 %1 無法寫入。 +請選擇其它檔名。</translation> + </message> + <message> + <location line="+4"/> + <source>%1 already exists. +Do you want to overwrite it?</source> + <translation>%1 已存在。 +您要覆寫它嗎?</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_qws.cpp" line="-227"/> + <source>File exists</source> + <translation>檔案已存在</translation> + </message> + <message> + <location line="+1"/> + <source><qt>Do you want to overwrite it?</qt></source> + <translation><qt>您要覆寫它嗎?</qt></translation> + </message> + <message> + <location line="+227"/> + <source>Print selection</source> + <translation>列印選擇區</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-8"/> + <source>%1 is a directory. +Please choose a different file name.</source> + <translation>%1 是一個目錄。 +請選擇其他檔名。</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qpagesetupdialog_unix.cpp" line="-232"/> + <source>A0</source> + <translation>A0</translation> + </message> + <message> + <location line="+1"/> + <source>A1</source> + <translation>A1</translation> + </message> + <message> + <location line="+1"/> + <source>A2</source> + <translation>A2</translation> + </message> + <message> + <location line="+1"/> + <source>A3</source> + <translation>A3</translation> + </message> + <message> + <location line="+1"/> + <source>A4</source> + <translation>A4</translation> + </message> + <message> + <location line="+1"/> + <source>A5</source> + <translation>A5</translation> + </message> + <message> + <location line="+1"/> + <source>A6</source> + <translation>A6</translation> + </message> + <message> + <location line="+1"/> + <source>A7</source> + <translation>A7</translation> + </message> + <message> + <location line="+1"/> + <source>A8</source> + <translation>A8</translation> + </message> + <message> + <location line="+1"/> + <source>A9</source> + <translation>A9</translation> + </message> + <message> + <location line="+1"/> + <source>B0</source> + <translation>B0</translation> + </message> + <message> + <location line="+1"/> + <source>B1</source> + <translation>B1</translation> + </message> + <message> + <location line="+1"/> + <source>B2</source> + <translation>B2</translation> + </message> + <message> + <location line="+1"/> + <source>B3</source> + <translation>B3</translation> + </message> + <message> + <location line="+1"/> + <source>B4</source> + <translation>B4</translation> + </message> + <message> + <location line="+1"/> + <source>B5</source> + <translation>B5</translation> + </message> + <message> + <location line="+1"/> + <source>B6</source> + <translation>B6</translation> + </message> + <message> + <location line="+1"/> + <source>B7</source> + <translation>B7</translation> + </message> + <message> + <location line="+1"/> + <source>B8</source> + <translation>B8</translation> + </message> + <message> + <location line="+1"/> + <source>B9</source> + <translation>B9</translation> + </message> + <message> + <location line="+1"/> + <source>B10</source> + <translation>B10</translation> + </message> + <message> + <location line="+1"/> + <source>C5E</source> + <translation>C5E</translation> + </message> + <message> + <location line="+1"/> + <source>DLE</source> + <translation>DLE</translation> + </message> + <message> + <location line="+1"/> + <source>Executive</source> + <translation>Executive</translation> + </message> + <message> + <location line="+1"/> + <source>Folio</source> + <translation>Folio</translation> + </message> + <message> + <location line="+1"/> + <source>Ledger</source> + <translation>Ledger</translation> + </message> + <message> + <location line="+1"/> + <source>Legal</source> + <translation>Legal</translation> + </message> + <message> + <location line="+1"/> + <source>Letter</source> + <translation>Letter</translation> + </message> + <message> + <location line="+1"/> + <source>Tabloid</source> + <translation>Tabloid</translation> + </message> + <message> + <location line="+1"/> + <source>US Common #10 Envelope</source> + <translation>US Common #10 Envelope</translation> + </message> + <message> + <location line="+1"/> + <source>Custom</source> + <translation>自訂</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_unix.cpp" line="-522"/> + <location line="+68"/> + <source>&Options >></source> + <translation>操作 (&O) >></translation> + </message> + <message> + <location line="-63"/> + <source>&Print</source> + <translation>列印(&P)</translation> + </message> + <message> + <location line="+67"/> + <source>&Options <<</source> + <translation>操作 (&O) <<</translation> + </message> + <message> + <location line="+253"/> + <source>Print to File (PDF)</source> + <translation>列印到檔案(PDF)</translation> + </message> + <message> + <location line="+1"/> + <source>Print to File (Postscript)</source> + <translation>列印到檔案(Postscript)</translation> + </message> + <message> + <location line="+45"/> + <source>Local file</source> + <translation>本地端檔案</translation> + </message> + <message> + <location line="+1"/> + <source>Write %1 file</source> + <translation>寫入 %1 檔案</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintdialog_win.cpp" line="+1"/> + <source>The 'From' value cannot be greater than the 'To' value.</source> + <translation>起始數值不能大於結束數值</translation> + </message> +</context> +<context> + <name>QPrintPreviewDialog</name> + <message> + <location filename="../src/gui/dialogs/qabstractpagesetupdialog.cpp" line="+68"/> + <location line="+12"/> + <source>Page Setup</source> + <translation>頁面設定</translation> + </message> + <message> + <location filename="../src/gui/dialogs/qprintpreviewdialog.cpp" line="+252"/> + <source>%1%</source> + <translation>%1%</translation> + </message> + <message> + <location line="+79"/> + <source>Print Preview</source> + <translation>列印預覽</translation> + </message> + <message> + <location line="+29"/> + <source>Next page</source> + <translation>下一頁</translation> + </message> + <message> + <location line="+1"/> + <source>Previous page</source> + <translation>前一頁</translation> + </message> + <message> + <location line="+1"/> + <source>First page</source> + <translation>第一頁</translation> + </message> + <message> + <location line="+1"/> + <source>Last page</source> + <translation>最後一頁</translation> + </message> + <message> + <location line="+9"/> + <source>Fit width</source> + <translation>符合寬度</translation> + </message> + <message> + <location line="+1"/> + <source>Fit page</source> + <translation>符合頁面</translation> + </message> + <message> + <location line="+11"/> + <source>Zoom in</source> + <translation>放大</translation> + </message> + <message> + <location line="+1"/> + <source>Zoom out</source> + <translation>縮小</translation> + </message> + <message> + <location line="+6"/> + <source>Portrait</source> + <translation>縱向</translation> + </message> + <message> + <location line="+1"/> + <source>Landscape</source> + <translation>橫向</translation> + </message> + <message> + <location line="+10"/> + <source>Show single page</source> + <translation>顯示單一頁面</translation> + </message> + <message> + <location line="+1"/> + <source>Show facing pages</source> + <translation>顯示封面</translation> + </message> + <message> + <location line="+1"/> + <source>Show overview of all pages</source> + <translation>顯示所有頁面預覽</translation> + </message> + <message> + <location line="+15"/> + <source>Print</source> + <translation>列印</translation> + </message> + <message> + <location line="+1"/> + <source>Page setup</source> + <translation>列印設定</translation> + </message> + <message> + <location line="+1"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+151"/> + <source>Export to PDF</source> + <translation>匯出到 PDF 檔</translation> + </message> + <message> + <location line="+3"/> + <source>Export to PostScript</source> + <translation>匯出到 PostScript 檔</translation> + </message> +</context> +<context> + <name>QPrintPropertiesDialog</name> + <message> + <source>PPD Properties</source> + <translation type="obsolete">PPD 內容</translation> + </message> + <message> + <source>Save</source> + <translation type="obsolete">儲存</translation> + </message> + <message> + <source>OK</source> + <translation type="obsolete">確定</translation> + </message> +</context> +<context> + <name>QPrintPropertiesWidget</name> + <message> + <location filename="../src/gui/dialogs/qprintpropertieswidget.ui"/> + <source>Form</source> + <translation>表單</translation> + </message> + <message> + <location/> + <source>Page</source> + <translation>頁面</translation> + </message> + <message> + <location/> + <source>Advanced</source> + <translation>進階</translation> + </message> +</context> +<context> + <name>QPrintSettingsOutput</name> + <message> + <location filename="../src/gui/dialogs/qprintsettingsoutput.ui"/> + <source>Form</source> + <translation>表單</translation> + </message> + <message> + <location/> + <source>Copies</source> + <translation>份數</translation> + </message> + <message> + <location/> + <source>Print range</source> + <translation>列印範圍</translation> + </message> + <message> + <location/> + <source>Print all</source> + <translation>全部列印</translation> + </message> + <message> + <location/> + <source>Pages from</source> + <translation>指定頁面:從</translation> + </message> + <message> + <location/> + <source>to</source> + <translation>到</translation> + </message> + <message> + <location/> + <source>Selection</source> + <translation>選擇區</translation> + </message> + <message> + <location/> + <source>Output Settings</source> + <translation>輸出設定</translation> + </message> + <message> + <location/> + <source>Copies:</source> + <translation>份數:</translation> + </message> + <message> + <location/> + <source>Collate</source> + <translation>校對</translation> + </message> + <message> + <location/> + <source>Reverse</source> + <translation>反向</translation> + </message> + <message> + <location/> + <source>Options</source> + <translation>選項</translation> + </message> + <message> + <location/> + <source>Color Mode</source> + <translation>顏色模式</translation> + </message> + <message> + <location/> + <source>Color</source> + <translation>顏色</translation> + </message> + <message> + <location/> + <source>Grayscale</source> + <translation>灰階</translation> + </message> + <message> + <location/> + <source>Duplex Printing</source> + <translation>雙工列印</translation> + </message> + <message> + <location/> + <source>None</source> + <translation>無</translation> + </message> + <message> + <location/> + <source>Long side</source> + <translation>長邊</translation> + </message> + <message> + <location/> + <source>Short side</source> + <translation>短邊</translation> + </message> +</context> +<context> + <name>QPrintWidget</name> + <message> + <location filename="../src/gui/dialogs/qprintwidget.ui"/> + <source>Form</source> + <translation>表單</translation> + </message> + <message> + <location/> + <source>Printer</source> + <translation>印表機</translation> + </message> + <message> + <location/> + <source>&Name:</source> + <translation>名稱(&N):</translation> + </message> + <message> + <location/> + <source>P&roperties</source> + <translation>屬性(&R)</translation> + </message> + <message> + <location/> + <source>Location:</source> + <translation>位置:</translation> + </message> + <message> + <location/> + <source>Preview</source> + <translation>預覽</translation> + </message> + <message> + <location/> + <source>Type:</source> + <translation>型態:</translation> + </message> + <message> + <location/> + <source>Output &file:</source> + <translation>輸出檔案(&F):</translation> + </message> + <message> + <location/> + <source>...</source> + <translation>...</translation> + </message> +</context> +<context> + <name>QProcess</name> + <message> + <location filename="../src/corelib/io/qprocess_unix.cpp" line="+475"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+147"/> + <source>Could not open input redirection for reading</source> + <translation>無法開啟輸入導向以讀取</translation> + </message> + <message> + <location line="+12"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+36"/> + <source>Could not open output redirection for writing</source> + <translation>無法開啟輸出導向以寫入</translation> + </message> + <message> + <location line="+235"/> + <source>Resource error (fork failure): %1</source> + <translation>資源錯誤(fork 失敗):%1</translation> + </message> + <message> + <location line="+259"/> + <location line="+53"/> + <location line="+74"/> + <location line="+67"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+422"/> + <location line="+50"/> + <location line="+75"/> + <location line="+42"/> + <location line="+54"/> + <source>Process operation timed out</source> + <translation>行程操作逾時</translation> + </message> + <message> + <location filename="../src/corelib/io/qprocess.cpp" line="+533"/> + <location line="+52"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="-211"/> + <location line="+50"/> + <source>Error reading from process</source> + <translation>從行程讀取時發生錯誤</translation> + </message> + <message> + <location line="+47"/> + <location line="+779"/> + <location filename="../src/corelib/io/qprocess_win.cpp" line="+140"/> + <source>Error writing to process</source> + <translation>寫入行程時發生錯誤</translation> + </message> + <message> + <location line="-709"/> + <source>Process crashed</source> + <translation>行程已崩潰</translation> + </message> + <message> + <location line="+912"/> + <source>No program defined</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/corelib/io/qprocess_win.cpp" line="-341"/> + <source>Process failed to start</source> + <translation>啟動行程失敗</translation> + </message> +</context> +<context> + <name>QProgressDialog</name> + <message> + <location filename="../src/gui/dialogs/qprogressdialog.cpp" line="+182"/> + <source>Cancel</source> + <translation>取消</translation> + </message> +</context> +<context> + <name>QPushButton</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="-8"/> + <source>Open</source> + <translation>開啟</translation> + </message> +</context> +<context> + <name>QRadioButton</name> + <message> + <location line="+12"/> + <source>Check</source> + <translation>勾選</translation> + </message> +</context> +<context> + <name>QRegExp</name> + <message> + <location filename="../src/corelib/tools/qregexp.cpp" line="+64"/> + <source>no error occurred</source> + <translation>沒有發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>disabled feature used</source> + <translation>使用已關閉的功能</translation> + </message> + <message> + <location line="+1"/> + <source>bad char class syntax</source> + <translation>錯誤的字元類別語法</translation> + </message> + <message> + <location line="+1"/> + <source>bad lookahead syntax</source> + <translation>錯誤的 lookahead 語法</translation> + </message> + <message> + <location line="+1"/> + <source>bad repetition syntax</source> + <translation>錯誤的重覆語法</translation> + </message> + <message> + <location line="+1"/> + <source>invalid octal value</source> + <translation>不合法的八進位值</translation> + </message> + <message> + <location line="+1"/> + <source>missing left delim</source> + <translation>少了左方的區隔符</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected end</source> + <translation>未預期遇到結尾</translation> + </message> + <message> + <location line="+1"/> + <source>met internal limit</source> + <translation>遇到內部限制</translation> + </message> +</context> +<context> + <name>QSQLite2Driver</name> + <message> + <location filename="../src/sql/drivers/sqlite2/qsql_sqlite2.cpp" line="+396"/> + <source>Error to open database</source> + <translation>開啟資料庫時發生錯誤</translation> + </message> + <message> + <location line="+41"/> + <source>Unable to begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <location line="+17"/> + <source>Unable to rollback Transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QSQLite2Result</name> + <message> + <location line="-323"/> + <source>Unable to fetch results</source> + <translation>無法抓取結果</translation> + </message> + <message> + <location line="+147"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> +</context> +<context> + <name>QSQLiteDriver</name> + <message> + <location filename="../src/sql/drivers/sqlite/qsql_sqlite.cpp" line="+528"/> + <source>Error opening database</source> + <translation>開啟資料庫發生錯誤</translation> + </message> + <message> + <location line="+11"/> + <source>Error closing database</source> + <translation>關閉資料庫發生錯誤</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to begin transaction</source> + <translation>無法開始事務</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to commit transaction</source> + <translation>無法提交事務</translation> + </message> + <message> + <source>Unable to roll back transaction</source> + <translation type="obsolete">無法反轉事務</translation> + </message> + <message> + <location line="+15"/> + <source>Unable to rollback transaction</source> + <translation>無法反轉事務</translation> + </message> +</context> +<context> + <name>QSQLiteResult</name> + <message> + <location line="-400"/> + <location line="+66"/> + <location line="+8"/> + <source>Unable to fetch row</source> + <translation>無法抓取列</translation> + </message> + <message> + <location line="+63"/> + <source>Unable to execute statement</source> + <translation>無法執行敘述</translation> + </message> + <message> + <location line="+20"/> + <source>Unable to reset statement</source> + <translation>無法重置敘述</translation> + </message> + <message> + <location line="+45"/> + <source>Unable to bind parameters</source> + <translation>無法結合參數</translation> + </message> + <message> + <location line="+7"/> + <source>Parameter count mismatch</source> + <translation>參數數量不符合</translation> + </message> + <message> + <location line="-208"/> + <source>No query</source> + <translation>沒有查詢</translation> + </message> +</context> +<context> + <name>QScrollBar</name> + <message> + <location filename="../src/gui/widgets/qscrollbar.cpp" line="+448"/> + <source>Scroll here</source> + <translation>在此捲軸</translation> + </message> + <message> + <location line="+2"/> + <source>Left edge</source> + <translation>左邊緣</translation> + </message> + <message> + <location line="+0"/> + <source>Top</source> + <translation>頂端</translation> + </message> + <message> + <location line="+1"/> + <source>Right edge</source> + <translation>右邊緣</translation> + </message> + <message> + <location line="+0"/> + <source>Bottom</source> + <translation>底端</translation> + </message> + <message> + <location line="+2"/> + <source>Page left</source> + <translation>頁面左方</translation> + </message> + <message> + <location line="+0"/> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+143"/> + <source>Page up</source> + <translation>頁面上方</translation> + </message> + <message> + <location line="+1"/> + <source>Page right</source> + <translation>頁面右方</translation> + </message> + <message> + <location line="+0"/> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+4"/> + <source>Page down</source> + <translation>頁面下方</translation> + </message> + <message> + <location line="+2"/> + <source>Scroll left</source> + <translation>往左捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll up</source> + <translation>往上捲軸</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll right</source> + <translation>往右捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll down</source> + <translation>往下捲軸</translation> + </message> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-6"/> + <source>Line up</source> + <translation>對上排列</translation> + </message> + <message> + <location line="+4"/> + <source>Position</source> + <translation>位置</translation> + </message> + <message> + <location line="+4"/> + <source>Line down</source> + <translation>對下排列</translation> + </message> +</context> +<context> + <name>QSharedMemory</name> + <message> + <location filename="../src/corelib/kernel/qsharedmemory.cpp" line="+207"/> + <source>%1: unable to set key on lock</source> + <translation>%1:無法設定鍵值</translation> + </message> + <message> + <location line="+81"/> + <source>%1: create size is less then 0</source> + <translation>%1:建立大小小於 0</translation> + </message> + <message> + <location line="+168"/> + <location filename="../src/corelib/kernel/qsharedmemory_p.h" line="+148"/> + <source>%1: unable to lock</source> + <translation>%1:無法鎖定</translation> + </message> + <message> + <location line="+22"/> + <source>%1: unable to unlock</source> + <translation>%1:無法解除鎖定</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsharedmemory_unix.cpp" line="+78"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+87"/> + <source>%1: permission denied</source> + <translation>%1:存取被拒</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-22"/> + <source>%1: already exists</source> + <translation>%1:已存在</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> + <source>%1: doesn't exists</source> + <translation>%1:不存在</translation> + </message> + <message> + <location line="+6"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+9"/> + <source>%1: out of resources</source> + <translation>%1:資源不足</translation> + </message> + <message> + <location line="+4"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+7"/> + <source>%1: unknown error %2</source> + <translation>%1:未知的錯誤 %2</translation> + </message> + <message> + <location line="+21"/> + <source>%1: key is empty</source> + <translation>%1:鍵值是空的</translation> + </message> + <message> + <location line="+8"/> + <source>%1: unix key file doesn't exists</source> + <translation>%1:unix 鍵值檔不存在</translation> + </message> + <message> + <location line="+7"/> + <source>%1: ftok failed</source> + <translation>%1:ftok 失敗</translation> + </message> + <message> + <location line="+51"/> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="+15"/> + <source>%1: unable to make key</source> + <translation>%1:無法產生鍵值</translation> + </message> + <message> + <location line="+20"/> + <source>%1: system-imposed size restrictions</source> + <translation>%1:系統大小限制</translation> + </message> + <message> + <location line="+53"/> + <source>%1: not attached</source> + <translation>%1:未附加</translation> + </message> + <message> + <location filename="../src/corelib/kernel/qsharedmemory_win.cpp" line="-27"/> + <source>%1: invalid size</source> + <translation>%1:不合法的大小</translation> + </message> + <message> + <location line="+68"/> + <source>%1: key error</source> + <translation>%1:鍵值錯誤</translation> + </message> + <message> + <location line="+38"/> + <source>%1: size query failed</source> + <translation>%1:大小查詢失敗</translation> + </message> +</context> +<context> + <name>QShortcut</name> + <message> + <location filename="../src/gui/kernel/qkeysequence.cpp" line="+373"/> + <source>Space</source> + <translation>空白鍵</translation> + </message> + <message> + <location line="+1"/> + <source>Esc</source> + <translation>Esc</translation> + </message> + <message> + <location line="+1"/> + <source>Tab</source> + <translation>Tab</translation> + </message> + <message> + <location line="+1"/> + <source>Backtab</source> + <translation>Backtab</translation> + </message> + <message> + <location line="+1"/> + <source>Backspace</source> + <translation>Backspace</translation> + </message> + <message> + <location line="+1"/> + <source>Return</source> + <translation>Return</translation> + </message> + <message> + <location line="+1"/> + <source>Enter</source> + <translation>Enter</translation> + </message> + <message> + <location line="+1"/> + <source>Ins</source> + <translation>Ins</translation> + </message> + <message> + <location line="+1"/> + <source>Del</source> + <translation>Del</translation> + </message> + <message> + <location line="+1"/> + <source>Pause</source> + <translation>Pause</translation> + </message> + <message> + <location line="+1"/> + <source>Print</source> + <translation>Print</translation> + </message> + <message> + <location line="+1"/> + <source>SysReq</source> + <translation>SysReq</translation> + </message> + <message> + <location line="+1"/> + <source>Home</source> + <translation>Home</translation> + </message> + <message> + <location line="+1"/> + <source>End</source> + <translation>End</translation> + </message> + <message> + <location line="+1"/> + <source>Left</source> + <translation>左鍵</translation> + </message> + <message> + <location line="+1"/> + <source>Up</source> + <translation>上鍵</translation> + </message> + <message> + <location line="+1"/> + <source>Right</source> + <translation>右鍵</translation> + </message> + <message> + <location line="+1"/> + <source>Down</source> + <translation>下鍵</translation> + </message> + <message> + <location line="+1"/> + <source>PgUp</source> + <translation>PgUp</translation> + </message> + <message> + <location line="+1"/> + <source>PgDown</source> + <translation>PgDown</translation> + </message> + <message> + <location line="+1"/> + <source>CapsLock</source> + <translation>大寫鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>NumLock</source> + <translation>數字鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>ScrollLock</source> + <translation>捲軸鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Menu</source> + <translation>選單</translation> + </message> + <message> + <location line="+1"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="+3"/> + <source>Back</source> + <translation>返回</translation> + </message> + <message> + <location line="+1"/> + <source>Forward</source> + <translation>往前</translation> + </message> + <message> + <location line="+1"/> + <source>Stop</source> + <translation>停止</translation> + </message> + <message> + <location line="+1"/> + <source>Refresh</source> + <translation>刷新</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Down</source> + <translation>音量降低</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Mute</source> + <translation>靜音</translation> + </message> + <message> + <location line="+1"/> + <source>Volume Up</source> + <translation>音量提高</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Boost</source> + <translation>重低音</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Up</source> + <translation>Bass Up</translation> + </message> + <message> + <location line="+1"/> + <source>Bass Down</source> + <translation>Bass Down</translation> + </message> + <message> + <location line="+1"/> + <source>Treble Up</source> + <translation>Treble Up</translation> + </message> + <message> + <location line="+1"/> + <source>Treble Down</source> + <translation>Treble Down</translation> + </message> + <message> + <location line="+1"/> + <source>Media Play</source> + <translation>媒體播放</translation> + </message> + <message> + <location line="+1"/> + <source>Media Stop</source> + <translation>媒體停止</translation> + </message> + <message> + <location line="+1"/> + <source>Media Previous</source> + <translation>媒體前一首</translation> + </message> + <message> + <location line="+1"/> + <source>Media Next</source> + <translation>媒體下一首</translation> + </message> + <message> + <location line="+1"/> + <source>Media Record</source> + <translation>媒體錄音</translation> + </message> + <message> + <location line="+2"/> + <source>Favorites</source> + <translation>我的最愛</translation> + </message> + <message> + <location line="+1"/> + <source>Search</source> + <translation>搜尋</translation> + </message> + <message> + <location line="+1"/> + <source>Standby</source> + <translation>待命</translation> + </message> + <message> + <location line="+1"/> + <source>Open URL</source> + <translation>開啟網址</translation> + </message> + <message> + <location line="+1"/> + <source>Launch Mail</source> + <translation>啟動郵件程式</translation> + </message> + <message> + <location line="+1"/> + <source>Launch Media</source> + <translation>啟動媒體程式</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (0)</source> + <translation>啟動(0)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (1)</source> + <translation>啟動(1)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (2)</source> + <translation>啟動(2)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (3)</source> + <translation>啟動(3)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (4)</source> + <translation>啟動(4)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (5)</source> + <translation>啟動(5)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (6)</source> + <translation>啟動(6)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (7)</source> + <translation>啟動(7)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (8)</source> + <translation>啟動(8)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (9)</source> + <translation>啟動(9)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (A)</source> + <translation>啟動(A)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (B)</source> + <translation>啟動(B)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (C)</source> + <translation>啟動(C)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (D)</source> + <translation>啟動(D)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (E)</source> + <translation>啟動(E)</translation> + </message> + <message> + <location line="+1"/> + <source>Launch (F)</source> + <translation>啟動(F)</translation> + </message> + <message> + <location line="+4"/> + <source>Print Screen</source> + <translation>列印螢幕</translation> + </message> + <message> + <location line="+1"/> + <source>Page Up</source> + <translation>往上一頁</translation> + </message> + <message> + <location line="+1"/> + <source>Page Down</source> + <translation>往下一頁</translation> + </message> + <message> + <location line="+1"/> + <source>Caps Lock</source> + <translation>大寫鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Num Lock</source> + <translation>數字鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Number Lock</source> + <translation>數字鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll Lock</source> + <translation>捲軸鎖定</translation> + </message> + <message> + <location line="+1"/> + <source>Insert</source> + <translation>插入</translation> + </message> + <message> + <location line="+1"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location line="+1"/> + <source>Escape</source> + <translation>Escape</translation> + </message> + <message> + <location line="+1"/> + <source>System Request</source> + <translation>系統要求 SysRq</translation> + </message> + <message> + <location line="+4"/> + <source>Select</source> + <translation>選擇</translation> + </message> + <message> + <location line="+1"/> + <source>Yes</source> + <translation>是</translation> + </message> + <message> + <location line="+1"/> + <source>No</source> + <translation>否</translation> + </message> + <message> + <location line="+4"/> + <source>Context1</source> + <translation>內文1</translation> + </message> + <message> + <location line="+1"/> + <source>Context2</source> + <translation>內文2</translation> + </message> + <message> + <location line="+1"/> + <source>Context3</source> + <translation>內文3</translation> + </message> + <message> + <location line="+1"/> + <source>Context4</source> + <translation>內文4</translation> + </message> + <message> + <location line="+1"/> + <source>Call</source> + <translation>呼叫</translation> + </message> + <message> + <location line="+1"/> + <source>Hangup</source> + <translation>掛斷</translation> + </message> + <message> + <location line="+1"/> + <source>Flip</source> + <translation>反轉</translation> + </message> + <message> + <location line="+527"/> + <location line="+122"/> + <source>Ctrl</source> + <translation>Ctrl</translation> + </message> + <message> + <location line="-121"/> + <location line="+125"/> + <source>Shift</source> + <translation>Shift</translation> + </message> + <message> + <location line="-124"/> + <location line="+122"/> + <source>Alt</source> + <translation>Alt</translation> + </message> + <message> + <location line="-121"/> + <location line="+117"/> + <source>Meta</source> + <translation>Meta</translation> + </message> + <message> + <location line="-25"/> + <source>+</source> + <translation>+</translation> + </message> + <message> + <location line="+46"/> + <source>F%1</source> + <translation>F%1</translation> + </message> + <message> + <location line="-720"/> + <source>Home Page</source> + <translation>首頁</translation> + </message> +</context> +<context> + <name>QSlider</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="+151"/> + <source>Page left</source> + <translation>頁面左方</translation> + </message> + <message> + <location line="+0"/> + <source>Page up</source> + <translation>頁面上方</translation> + </message> + <message> + <location line="+2"/> + <source>Position</source> + <translation>位置</translation> + </message> + <message> + <location line="+3"/> + <source>Page right</source> + <translation>頁面右方</translation> + </message> + <message> + <location line="+0"/> + <source>Page down</source> + <translation>頁面下方</translation> + </message> +</context> +<context> + <name>QSocks5SocketEngine</name> + <message> + <location filename="../src/network/socket/qsocks5socketengine.cpp" line="-67"/> + <source>Connection to proxy refused</source> + <translation>代理伺服器連線被拒</translation> + </message> + <message> + <location line="+4"/> + <source>Connection to proxy closed prematurely</source> + <translation>代理伺服器連線已不正常關閉</translation> + </message> + <message> + <location line="+4"/> + <source>Proxy host not found</source> + <translation>找不到代理伺服器</translation> + </message> + <message> + <location line="+5"/> + <source>Connection to proxy timed out</source> + <translation>代理伺服器連線逾時</translation> + </message> + <message> + <location line="+17"/> + <source>Proxy authentication failed</source> + <translation>代理伺服器認證失敗</translation> + </message> + <message> + <location line="+1"/> + <source>Proxy authentication failed: %1</source> + <translation>代理伺服器認證失敗:%1</translation> + </message> + <message> + <location line="+9"/> + <source>SOCKS version 5 protocol error</source> + <translation>SOCKS 5 的協定錯誤</translation> + </message> + <message> + <location line="+19"/> + <source>General SOCKSv5 server failure</source> + <translation>一般的 SOCKSv5 伺服器錯誤</translation> + </message> + <message> + <location line="+4"/> + <source>Connection not allowed by SOCKSv5 server</source> + <translation>連線未被 SOCKSv5 伺服器允許</translation> + </message> + <message> + <location line="+16"/> + <source>TTL expired</source> + <translation>TTL 逾時</translation> + </message> + <message> + <location line="+4"/> + <source>SOCKSv5 command not supported</source> + <translation>SOCKSv5 指令未被支援</translation> + </message> + <message> + <location line="+4"/> + <source>Address type not supported</source> + <translation>位址型態未被支援</translation> + </message> + <message> + <location line="+5"/> + <source>Unknown SOCKSv5 proxy error code 0x%1</source> + <translation>未知的 SOCKSv5 代理伺服器錯誤代碼 0x%1</translation> + </message> + <message> + <source>Socks5 timeout error connecting to socks server</source> + <translation type="obsolete">連接到 socks 伺服器時發生 socks5 逾時錯誤</translation> + </message> + <message> + <location line="+685"/> + <source>Network operation timed out</source> + <translation>網路操作逾時</translation> + </message> +</context> +<context> + <name>QSpinBox</name> + <message> + <location filename="../src/plugins/accessible/widgets/rangecontrols.cpp" line="-574"/> + <source>More</source> + <translation>更多</translation> + </message> + <message> + <location line="+2"/> + <source>Less</source> + <translation>較少</translation> + </message> +</context> +<context> + <name>QSql</name> + <message> + <location filename="../src/qt3support/sql/q3sqlmanager_p.cpp" line="+890"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location line="+1"/> + <source>Delete this record?</source> + <translation>要刪除這筆紀錄嗎?</translation> + </message> + <message> + <location line="+1"/> + <location line="+16"/> + <location line="+36"/> + <source>Yes</source> + <translation>是</translation> + </message> + <message> + <location line="-51"/> + <location line="+16"/> + <location line="+36"/> + <source>No</source> + <translation>否</translation> + </message> + <message> + <location line="-44"/> + <source>Insert</source> + <translation>插入</translation> + </message> + <message> + <location line="+2"/> + <source>Update</source> + <translation>更新</translation> + </message> + <message> + <location line="+4"/> + <source>Save edits?</source> + <translation>要儲存編輯過的內容嗎?</translation> + </message> + <message> + <location line="+3"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+32"/> + <source>Confirm</source> + <translation>確認</translation> + </message> + <message> + <location line="+1"/> + <source>Cancel your edits?</source> + <translation>要取消編輯嗎?</translation> + </message> +</context> +<context> + <name>QSslSocket</name> + <message> + <location filename="../src/network/ssl/qsslsocket_openssl.cpp" line="+569"/> + <source>Unable to write data: %1</source> + <translation>無法寫入資料:%1</translation> + </message> + <message> + <location line="+119"/> + <source>Error while reading: %1</source> + <translation>讀取時發生錯誤:%1</translation> + </message> + <message> + <location line="+96"/> + <source>Error during SSL handshake: %1</source> + <translation>SSL 同步時發生錯誤:%1</translation> + </message> + <message> + <location line="-524"/> + <source>Error creating SSL context (%1)</source> + <translation>建立 SSL 內文時發生錯誤(%1)</translation> + </message> + <message> + <location line="+25"/> + <source>Invalid or empty cipher list (%1)</source> + <translation>不合法或空白的加密清單(%1)</translation> + </message> + <message> + <location line="+62"/> + <source>Error creating SSL session, %1</source> + <translation>建立 SSL 工作階段時發生錯誤:%1</translation> + </message> + <message> + <location line="+15"/> + <source>Error creating SSL session: %1</source> + <translation>建立 SSL 工作階段時發生錯誤:%1</translation> + </message> + <message> + <location line="-61"/> + <source>Cannot provide a certificate with no key, %1</source> + <translation>沒有金鑰無法提供憑證:%1</translation> + </message> + <message> + <location line="+7"/> + <source>Error loading local certificate, %1</source> + <translation>載入本地憑證時發生錯誤:%1</translation> + </message> + <message> + <location line="+12"/> + <source>Error loading private key, %1</source> + <translation>載入私鑰時發生錯誤:%1</translation> + </message> + <message> + <source>Private key do not certificate public key, %1</source> + <translation type="obsolete">私鑰與公鑰不符:%1</translation> + </message> + <message> + <location line="+7"/> + <source>Private key does not certificate public key, %1</source> + <translation>私密金鑰無法認證公開金鑰,%1</translation> + </message> +</context> +<context> + <name>QSystemSemaphore</name> + <message> + <location filename="../src/corelib/kernel/qsystemsemaphore_unix.cpp" line="-41"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+66"/> + <source>%1: out of resources</source> + <translation>%1:資源不足</translation> + </message> + <message> + <location line="-13"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+4"/> + <source>%1: permission denied</source> + <translation>%1:存取被拒</translation> + </message> + <message> + <location line="+4"/> + <source>%1: already exists</source> + <translation>%1:已存在</translation> + </message> + <message> + <location line="+4"/> + <source>%1: does not exist</source> + <translation>%1:不存在</translation> + </message> + <message> + <location line="+9"/> + <location filename="../src/corelib/kernel/qsystemsemaphore_win.cpp" line="+3"/> + <source>%1: unknown error %2</source> + <translation>%1:未知的錯誤 %2</translation> + </message> +</context> +<context> + <name>QTDSDriver</name> + <message> + <location filename="../src/sql/drivers/tds/qsql_tds.cpp" line="+584"/> + <source>Unable to open connection</source> + <translation>無法開啟連線</translation> + </message> + <message> + <location line="+5"/> + <source>Unable to use database</source> + <translation>無法使用資料庫</translation> + </message> +</context> +<context> + <name>QTabBar</name> + <message> + <location filename="../src/plugins/accessible/widgets/complexwidgets.cpp" line="-326"/> + <source>Scroll Left</source> + <translation>往左捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll Right</source> + <translation>往右捲軸</translation> + </message> +</context> +<context> + <name>QTcpServer</name> + <message> + <source>Socket operation unsupported</source> + <translation type="obsolete">未支援的 socket 操作</translation> + </message> + <message> + <location filename="../src/network/socket/qtcpserver.cpp" line="+282"/> + <source>Operation on socket is not supported</source> + <translation>Socket 的操作未被支援</translation> + </message> +</context> +<context> + <name>QTextControl</name> + <message> + <location filename="../src/gui/text/qtextcontrol.cpp" line="+1973"/> + <source>&Undo</source> + <translation>復原(&U)</translation> + </message> + <message> + <location line="+2"/> + <source>&Redo</source> + <translation>重做(&R)</translation> + </message> + <message> + <location line="+4"/> + <source>Cu&t</source> + <translation>剪下(&T)</translation> + </message> + <message> + <location line="+5"/> + <source>&Copy</source> + <translation>複製(&C)</translation> + </message> + <message> + <location line="+7"/> + <source>Copy &Link Location</source> + <translation>複製連結位址(&L)</translation> + </message> + <message> + <location line="+6"/> + <source>&Paste</source> + <translation>貼上(&P)</translation> + </message> + <message> + <location line="+3"/> + <source>Delete</source> + <translation>刪除</translation> + </message> + <message> + <location line="+7"/> + <source>Select All</source> + <translation>全部選擇</translation> + </message> +</context> +<context> + <name>QToolButton</name> + <message> + <location filename="../src/plugins/accessible/widgets/simplewidgets.cpp" line="+254"/> + <location line="+6"/> + <source>Press</source> + <translation>按下</translation> + </message> + <message> + <location line="-4"/> + <location line="+8"/> + <source>Open</source> + <translation>開啟</translation> + </message> +</context> +<context> + <name>QUdpSocket</name> + <message> + <location filename="../src/network/socket/qudpsocket.cpp" line="+169"/> + <source>This platform does not support IPv6</source> + <translation>此平台不支援 IPv6</translation> + </message> +</context> +<context> + <name>QUndoGroup</name> + <message> + <location filename="../src/gui/util/qundogroup.cpp" line="+386"/> + <source>Undo</source> + <translation>復原</translation> + </message> + <message> + <location line="+28"/> + <source>Redo</source> + <translation>重做</translation> + </message> +</context> +<context> + <name>QUndoModel</name> + <message> + <location filename="../src/gui/util/qundoview.cpp" line="+101"/> + <source><empty></source> + <translation><空白></translation> + </message> +</context> +<context> + <name>QUndoStack</name> + <message> + <location filename="../src/gui/util/qundostack.cpp" line="+834"/> + <source>Undo</source> + <translation>復原</translation> + </message> + <message> + <location line="+27"/> + <source>Redo</source> + <translation>重做</translation> + </message> +</context> +<context> + <name>QUnicodeControlCharacterMenu</name> + <message> + <location filename="../src/gui/text/qtextcontrol.cpp" line="+884"/> + <source>LRM Left-to-right mark</source> + <translation>LRM 左到右標記</translation> + </message> + <message> + <location line="+1"/> + <source>RLM Right-to-left mark</source> + <translation>RLM 右到左標記</translation> + </message> + <message> + <location line="+1"/> + <source>ZWJ Zero width joiner</source> + <translation>ZWJ 零寬度連接器</translation> + </message> + <message> + <location line="+1"/> + <source>ZWNJ Zero width non-joiner</source> + <translation>ZWNJ 零寬度非連接器</translation> + </message> + <message> + <location line="+1"/> + <source>ZWSP Zero width space</source> + <translation>ZWSP 零寬度空白</translation> + </message> + <message> + <location line="+1"/> + <source>LRE Start of left-to-right embedding</source> + <translation>LRE 左到右嵌入起點</translation> + </message> + <message> + <location line="+1"/> + <source>RLE Start of right-to-left embedding</source> + <translation>RLE 右到左嵌入起點</translation> + </message> + <message> + <location line="+1"/> + <source>LRO Start of left-to-right override</source> + <translation>LRO 左到右覆寫起點</translation> + </message> + <message> + <location line="+1"/> + <source>RLO Start of right-to-left override</source> + <translation>RLO 右到左覆寫起點</translation> + </message> + <message> + <location line="+1"/> + <source>PDF Pop directional formatting</source> + <translation>PDF 彈出方向格式</translation> + </message> + <message> + <location line="+6"/> + <source>Insert Unicode control character</source> + <translation>插入萬國碼控制字元</translation> + </message> +</context> +<context> + <name>QWebFrame</name> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp" line="+692"/> + <source>Request cancelled</source> + <translation>請求已取消</translation> + </message> + <message> + <location line="+17"/> + <source>Request blocked</source> + <translation>請求已被阻擋</translation> + </message> + <message> + <location line="+7"/> + <source>Cannot show URL</source> + <translation>無法顯示網址</translation> + </message> + <message> + <location line="+6"/> + <source>Frame load interruped by policy change</source> + <translation>影像載入因政策變更而中斷</translation> + </message> + <message> + <location line="+6"/> + <source>Cannot show mimetype</source> + <translation>無法顯示 MIME 型態</translation> + </message> + <message> + <location line="+6"/> + <source>File does not exist</source> + <translation>檔案不存在</translation> + </message> +</context> +<context> + <name>QWebPage</name> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp" line="+382"/> + <source>Bad HTTP request</source> + <translation>不良的 HTTP 請求</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp" line="+42"/> + <source>Submit</source> + <comment>default label for Submit buttons in forms on web pages</comment> + <translation>提交</translation> + </message> + <message> + <location line="+5"/> + <source>Submit</source> + <comment>Submit (input element) alt text for <input> elements with no alt, title, or value</comment> + <translation>提交</translation> + </message> + <message> + <location line="+5"/> + <source>Reset</source> + <comment>default label for Reset buttons in forms on web pages</comment> + <translation>重置</translation> + </message> + <message> + <location line="+10"/> + <source>This is a searchable index. Enter search keywords: </source> + <comment>text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'</comment> + <translation>這是可搜尋的索引。請輸入關鍵字: </translation> + </message> + <message> + <location line="+5"/> + <source>Choose File</source> + <comment>title for file button used in HTML forms</comment> + <translation>選擇檔案</translation> + </message> + <message> + <location line="+5"/> + <source>No file selected</source> + <comment>text to display in file button used in HTML forms when no file is selected</comment> + <translation>未選取任何檔案</translation> + </message> + <message> + <location line="+5"/> + <source>Open in New Window</source> + <comment>Open in New Window context menu item</comment> + <translation>在新視窗開啟</translation> + </message> + <message> + <location line="+5"/> + <source>Save Link...</source> + <comment>Download Linked File context menu item</comment> + <translation>儲存連結...</translation> + </message> + <message> + <location line="+5"/> + <source>Copy Link</source> + <comment>Copy Link context menu item</comment> + <translation>複製連結</translation> + </message> + <message> + <location line="+5"/> + <source>Open Image</source> + <comment>Open Image in New Window context menu item</comment> + <translation>開啟影像</translation> + </message> + <message> + <location line="+5"/> + <source>Save Image</source> + <comment>Download Image context menu item</comment> + <translation>儲存影像</translation> + </message> + <message> + <location line="+5"/> + <source>Copy Image</source> + <comment>Copy Link context menu item</comment> + <translation>複製影像</translation> + </message> + <message> + <location line="+5"/> + <source>Open Frame</source> + <comment>Open Frame in New Window context menu item</comment> + <translation>開啟框架</translation> + </message> + <message> + <location line="+5"/> + <source>Copy</source> + <comment>Copy context menu item</comment> + <translation>複製</translation> + </message> + <message> + <location line="+5"/> + <source>Go Back</source> + <comment>Back context menu item</comment> + <translation>往回</translation> + </message> + <message> + <location line="+5"/> + <source>Go Forward</source> + <comment>Forward context menu item</comment> + <translation>往前</translation> + </message> + <message> + <location line="+5"/> + <source>Stop</source> + <comment>Stop context menu item</comment> + <translation>停止</translation> + </message> + <message> + <location line="+5"/> + <source>Reload</source> + <comment>Reload context menu item</comment> + <translation>重新載入</translation> + </message> + <message> + <location line="+5"/> + <source>Cut</source> + <comment>Cut context menu item</comment> + <translation>剪下</translation> + </message> + <message> + <location line="+5"/> + <source>Paste</source> + <comment>Paste context menu item</comment> + <translation>貼上</translation> + </message> + <message> + <location line="+5"/> + <source>No Guesses Found</source> + <comment>No Guesses Found context menu item</comment> + <translation>找不到可能的內容</translation> + </message> + <message> + <location line="+5"/> + <source>Ignore</source> + <comment>Ignore Spelling context menu item</comment> + <translation>忽略</translation> + </message> + <message> + <location line="+5"/> + <source>Add To Dictionary</source> + <comment>Learn Spelling context menu item</comment> + <translation>新增到字典</translation> + </message> + <message> + <location line="+5"/> + <source>Search The Web</source> + <comment>Search The Web context menu item</comment> + <translation>搜尋站台</translation> + </message> + <message> + <location line="+5"/> + <source>Look Up In Dictionary</source> + <comment>Look Up in Dictionary context menu item</comment> + <translation>在字典裡搜尋</translation> + </message> + <message> + <location line="+5"/> + <source>Open Link</source> + <comment>Open Link context menu item</comment> + <translation>開啟連結</translation> + </message> + <message> + <location line="+5"/> + <source>Ignore</source> + <comment>Ignore Grammar context menu item</comment> + <translation>忽略</translation> + </message> + <message> + <location line="+5"/> + <source>Spelling</source> + <comment>Spelling and Grammar context sub-menu item</comment> + <translation>拼字</translation> + </message> + <message> + <location line="+5"/> + <source>Show Spelling and Grammar</source> + <comment>menu item title</comment> + <translation>顯示拼字與文法</translation> + </message> + <message> + <location line="+1"/> + <source>Hide Spelling and Grammar</source> + <comment>menu item title</comment> + <translation>隱藏拼字與文法</translation> + </message> + <message> + <location line="+5"/> + <source>Check Spelling</source> + <comment>Check spelling context menu item</comment> + <translation>檢查拼字</translation> + </message> + <message> + <location line="+5"/> + <source>Check Spelling While Typing</source> + <comment>Check spelling while typing context menu item</comment> + <translation>打字時立即檢查拼字</translation> + </message> + <message> + <location line="+5"/> + <source>Check Grammar With Spelling</source> + <comment>Check grammar with spelling context menu item</comment> + <translation>檢查拼字與文法</translation> + </message> + <message> + <location line="+5"/> + <source>Fonts</source> + <comment>Font context sub-menu item</comment> + <translation>字型</translation> + </message> + <message> + <location line="+5"/> + <source>Bold</source> + <comment>Bold context menu item</comment> + <translation>粗體</translation> + </message> + <message> + <location line="+5"/> + <source>Italic</source> + <comment>Italic context menu item</comment> + <translation>斜體</translation> + </message> + <message> + <location line="+5"/> + <source>Underline</source> + <comment>Underline context menu item</comment> + <translation>底線</translation> + </message> + <message> + <location line="+5"/> + <source>Outline</source> + <comment>Outline context menu item</comment> + <translation>外框線</translation> + </message> + <message> + <location line="+5"/> + <source>Direction</source> + <comment>Writing direction context sub-menu item</comment> + <translation>方向</translation> + </message> + <message> + <location line="+5"/> + <source>Text Direction</source> + <comment>Text direction context sub-menu item</comment> + <translation>文字方向</translation> + </message> + <message> + <location line="+5"/> + <source>Default</source> + <comment>Default writing direction context menu item</comment> + <translation>預設</translation> + </message> + <message> + <location line="+5"/> + <source>LTR</source> + <comment>Left to Right context menu item</comment> + <translation>左到右</translation> + </message> + <message> + <location line="+5"/> + <source>RTL</source> + <comment>Right to Left context menu item</comment> + <translation>右到左</translation> + </message> + <message> + <location line="+5"/> + <source>Inspect</source> + <comment>Inspect Element context menu item</comment> + <translation>查驗</translation> + </message> + <message> + <location line="+5"/> + <source>No recent searches</source> + <comment>Label for only item in menu that appears when clicking on the search field image, when no searches have been performed</comment> + <translation>沒有最近的搜尋</translation> + </message> + <message> + <location line="+5"/> + <source>Recent searches</source> + <comment>label for first item in the menu that appears when clicking on the search field image, used as embedded menu title</comment> + <translation>最近的搜尋</translation> + </message> + <message> + <location line="+5"/> + <source>Clear recent searches</source> + <comment>menu item in Recent Searches menu that empties menu's contents</comment> + <translation>清除最近的搜尋</translation> + </message> + <message> + <location line="+75"/> + <source>Unknown</source> + <comment>Unknown filesize FTP directory listing item</comment> + <translation>未知</translation> + </message> + <message> + <location line="+5"/> + <source>%1 (%2x%3 pixels)</source> + <comment>Title string for images</comment> + <translation>%1(%2x%3 像素)</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/WebCoreSupport/InspectorClientQt.cpp" line="+185"/> + <source>Web Inspector - %2</source> + <translation>網站查驗器─%2</translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/ScrollbarQt.cpp" line="+58"/> + <source>Scroll here</source> + <translation>在此捲軸</translation> + </message> + <message> + <location line="+3"/> + <source>Left edge</source> + <translation>左邊緣</translation> + </message> + <message> + <location line="+0"/> + <source>Top</source> + <translation>頂端</translation> + </message> + <message> + <location line="+1"/> + <source>Right edge</source> + <translation>右邊緣</translation> + </message> + <message> + <location line="+0"/> + <source>Bottom</source> + <translation>底端</translation> + </message> + <message> + <location line="+3"/> + <source>Page left</source> + <translation>頁面左方</translation> + </message> + <message> + <location line="+0"/> + <source>Page up</source> + <translation>頁面上方</translation> + </message> + <message> + <location line="+1"/> + <source>Page right</source> + <translation>頁面右方</translation> + </message> + <message> + <location line="+0"/> + <source>Page down</source> + <translation>頁面下方</translation> + </message> + <message> + <location line="+3"/> + <source>Scroll left</source> + <translation>往左捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll up</source> + <translation>往上捲軸</translation> + </message> + <message> + <location line="+1"/> + <source>Scroll right</source> + <translation>往右捲軸</translation> + </message> + <message> + <location line="+0"/> + <source>Scroll down</source> + <translation>往下捲軸</translation> + </message> + <message numerus="yes"> + <location filename="../src/3rdparty/webkit/WebCore/platform/qt/FileChooserQt.cpp" line="+45"/> + <source>%n file(s)</source> + <comment>number of chosen file</comment> + <translation> + <numerusform>%n 個檔案</numerusform> + </translation> + </message> + <message> + <location filename="../src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp" line="+1322"/> + <source>JavaScript Alert - %1</source> + <translation>JavaScript 警告 ─ %1</translation> + </message> + <message> + <location line="+15"/> + <source>JavaScript Confirm - %1</source> + <translation>JavaScript 確認 ─ %1</translation> + </message> + <message> + <location line="+17"/> + <source>JavaScript Prompt - %1</source> + <translation>JavaScript 提示 ─ %1</translation> + </message> + <message> + <location line="+333"/> + <source>Move the cursor to the next character</source> + <translation>移動游標到下一個字元</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous character</source> + <translation>移動游標到前一個字元</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the next word</source> + <translation>移動游標到下一個單字</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous word</source> + <translation>移動游標到前一個單字</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the next line</source> + <translation>移動游標到下一行</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the previous line</source> + <translation>移動游標到前一行</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the line</source> + <translation>移動游標到這一行的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the line</source> + <translation>移動游標到這一行的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the block</source> + <translation>移動游標到這一個區塊的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the block</source> + <translation>移動游標到這一個區塊的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the start of the document</source> + <translation>移動游標到這一個文件的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Move the cursor to the end of the document</source> + <translation>移動游標到這一個文件的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select all</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next character</source> + <translation>選擇到下一個字元</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous character</source> + <translation>選擇到前一個字元</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next word</source> + <translation>選擇到下一個單字</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous word</source> + <translation>選擇到前一個單字</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the next line</source> + <translation>選擇到下一行</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the previous line</source> + <translation>選擇到前一行</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the line</source> + <translation>選擇到這一行的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the line</source> + <translation>選擇到這一行的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the block</source> + <translation>選擇到這一個區塊的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the block</source> + <translation>選擇到這一個區塊的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the start of the document</source> + <translation>選擇到這一個文件的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Select to the end of the document</source> + <translation>選擇到這一個文件的結尾</translation> + </message> + <message> + <location line="+3"/> + <source>Delete to the start of the word</source> + <translation>刪除到此單字的起頭</translation> + </message> + <message> + <location line="+3"/> + <source>Delete to the end of the word</source> + <translation>刪除到此單字的結尾</translation> + </message> + <message> + <location line="+33"/> + <source>Insert a new paragraph</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Insert a new line</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QWhatsThisAction</name> + <message> + <location filename="../src/gui/kernel/qwhatsthis.cpp" line="+522"/> + <source>What's This?</source> + <translation>這是什麼?</translation> + </message> +</context> +<context> + <name>QWidget</name> + <message> + <location filename="../src/gui/kernel/qwidget.cpp" line="+5326"/> + <source>*</source> + <translation>+</translation> + </message> +</context> +<context> + <name>QWizard</name> + <message> + <location filename="../src/gui/dialogs/qwizard.cpp" line="+637"/> + <source>Go Back</source> + <translation>往回</translation> + </message> + <message> + <location line="+3"/> + <source>Continue</source> + <translation>繼續</translation> + </message> + <message> + <location line="+5"/> + <source>Commit</source> + <translation>提交</translation> + </message> + <message> + <location line="+2"/> + <source>Done</source> + <translation>完成</translation> + </message> + <message> + <source>Quit</source> + <translation type="obsolete">離開</translation> + </message> + <message> + <location line="+4"/> + <source>Help</source> + <translation>說明</translation> + </message> + <message> + <location line="-14"/> + <source>< &Back</source> + <translation><返回(&B)</translation> + </message> + <message> + <location line="+10"/> + <source>&Finish</source> + <translation>完成(&F)</translation> + </message> + <message> + <location line="+2"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location line="+2"/> + <source>&Help</source> + <translation>說明(&H)</translation> + </message> + <message> + <location line="-8"/> + <source>&Next</source> + <translation>下一個(&N)</translation> + </message> + <message> + <location line="+0"/> + <source>&Next ></source> + <translation>下一個(&N)></translation> + </message> +</context> +<context> + <name>QWorkspace</name> + <message> + <location filename="../src/gui/widgets/qworkspace.cpp" line="+1094"/> + <source>&Restore</source> + <translation>回復(&R)</translation> + </message> + <message> + <location line="+1"/> + <source>&Move</source> + <translation>移動(&M)</translation> + </message> + <message> + <location line="+1"/> + <source>&Size</source> + <translation>大小(&S)</translation> + </message> + <message> + <location line="+2"/> + <source>Mi&nimize</source> + <translation>最小化(&N)</translation> + </message> + <message> + <location line="+2"/> + <source>Ma&ximize</source> + <translation>最大化(&X)</translation> + </message> + <message> + <location line="+2"/> + <source>&Close</source> + <translation>關閉(&C)</translation> + </message> + <message> + <location line="+6"/> + <source>Stay on &Top</source> + <translation>留在頂端(&T)</translation> + </message> + <message> + <location line="+3"/> + <location line="+1059"/> + <source>Sh&ade</source> + <translation>遮蔽(&A)</translation> + </message> + <message> + <location line="-278"/> + <location line="+60"/> + <source>%1 - [%2]</source> + <translation>%1 - [%2]</translation> + </message> + <message> + <location line="-1837"/> + <source>Minimize</source> + <translation>最小化</translation> + </message> + <message> + <location line="+2"/> + <source>Restore Down</source> + <translation>向下恢復</translation> + </message> + <message> + <location line="-4"/> + <source>Close</source> + <translation>關閉</translation> + </message> + <message> + <location line="+2053"/> + <source>&Unshade</source> + <translation>取消遮蔽(&U)</translation> + </message> +</context> +<context> + <name>QXml</name> + <message> + <location filename="../src/xml/sax/qxml.cpp" line="+58"/> + <source>no error occurred</source> + <translation>沒有發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>error triggered by consumer</source> + <translation>用戶觸發的錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected end of file</source> + <translation>未預期遇到檔案結尾</translation> + </message> + <message> + <location line="+1"/> + <source>more than one document type definition</source> + <translation>定義了一個以上的文件型態</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing element</source> + <translation>剖析元素時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>tag mismatch</source> + <translation>標籤不對稱</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing content</source> + <translation>剖析內容時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>unexpected character</source> + <translation>非預期的字元</translation> + </message> + <message> + <location line="+1"/> + <source>invalid name for processing instruction</source> + <translation>處理指令時的不合法名稱</translation> + </message> + <message> + <location line="+1"/> + <source>version expected while reading the XML declaration</source> + <translation>讀取 XML 宣告時應有版本號</translation> + </message> + <message> + <location line="+1"/> + <source>wrong value for standalone declaration</source> + <translation>獨立宣告時的值錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>encoding declaration or standalone declaration expected while reading the XML declaration</source> + <translation>讀取 XML 宣告時應有編碼宣告或獨立宣告</translation> + </message> + <message> + <location line="+1"/> + <source>standalone declaration expected while reading the XML declaration</source> + <translation>讀取 XML 宣告時應有讀立宣告</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing document type definition</source> + <translation>剖析文件型態定義時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>letter is expected</source> + <translation>預期應為字母</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing comment</source> + <translation>剖析註解時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>error occurred while parsing reference</source> + <translation>剖析參考時發生錯誤</translation> + </message> + <message> + <location line="+1"/> + <source>internal general entity reference not allowed in DTD</source> + <translation>在 DTD 中不允許內部產生的實體參考</translation> + </message> + <message> + <location line="+1"/> + <source>external parsed general entity reference not allowed in attribute value</source> + <translation>在屬性值中不允許使用外部剖析的實體參考</translation> + </message> + <message> + <location line="+1"/> + <source>external parsed general entity reference not allowed in DTD</source> + <translation>在 DTD 中不允許使用外部剖析的實體參考</translation> + </message> + <message> + <location line="+1"/> + <source>unparsed entity reference in wrong context</source> + <translation>在錯誤的內文中有未剖析的實體參考</translation> + </message> + <message> + <location line="+1"/> + <source>recursive entities</source> + <translation>遞迴的實體</translation> + </message> + <message> + <location line="+1"/> + <source>error in the text declaration of an external entity</source> + <translation>在外部實體中的文字宣告有錯誤</translation> + </message> +</context> +<context> + <name>QXmlStream</name> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="+592"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+1769"/> + <source>Extra content at end of document.</source> + <translation>文件尾端有多餘的內容。</translation> + </message> + <message> + <location line="+222"/> + <source>Invalid entity value.</source> + <translation>不合法的實體值</translation> + </message> + <message> + <location line="+107"/> + <source>Invalid XML character.</source> + <translation>不合法的 XML 字元。</translation> + </message> + <message> + <location line="+259"/> + <source>Sequence ']]>' not allowed in content.</source> + <translation>在內文中不允許有序列 "]]>"。</translation> + </message> + <message> + <location line="+309"/> + <source>Namespace prefix '%1' not declared</source> + <translation>命名空間的前置字串 %1 未宣告</translation> + </message> + <message> + <location line="+78"/> + <source>Attribute redefined.</source> + <translation>屬性重定義。</translation> + </message> + <message> + <location line="+115"/> + <source>Unexpected character '%1' in public id literal.</source> + <translation>在公開代碼字元中遇到非預期的字元 %1。</translation> + </message> + <message> + <location line="+28"/> + <source>Invalid XML version string.</source> + <translation>不合法的 XML 版本字串。</translation> + </message> + <message> + <location line="+2"/> + <source>Unsupported XML version.</source> + <translation>未支援的 XML 版本。</translation> + </message> + <message> + <location line="+23"/> + <source>%1 is an invalid encoding name.</source> + <translation>%1 為不合法的編碼名稱。</translation> + </message> + <message> + <location line="+7"/> + <source>Encoding %1 is unsupported</source> + <translation>編碼 %1 不支援。</translation> + </message> + <message> + <source>Invalid XML encoding name.</source> + <translation type="obsolete">不合法的 XML 編碼名稱。</translation> + </message> + <message> + <location line="+16"/> + <source>Standalone accepts only yes or no.</source> + <translation>獨立實體只接受 yes 或 no。</translation> + </message> + <message> + <location line="+2"/> + <source>Invalid attribute in XML declaration.</source> + <translation>XML 宣告中有不合法的屬性。</translation> + </message> + <message> + <location line="+16"/> + <source>Premature end of document.</source> + <translation>文件結尾不正確。</translation> + </message> + <message> + <location line="+2"/> + <source>Invalid document.</source> + <translation>不合法的文件。</translation> + </message> + <message> + <location line="+40"/> + <source>Expected </source> + <translation>預期應為 </translation> + </message> + <message> + <location line="+11"/> + <source>, but got '</source> + <translation>,但是看到的是 </translation> + </message> + <message> + <location line="+4"/> + <source>Unexpected '</source> + <translation>非預期</translation> + </message> + <message> + <location line="+210"/> + <source>Expected character data.</source> + <translation>預期的字元資料。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="-995"/> + <source>Recursive entity detected.</source> + <translation>偵測到遞迴實體。</translation> + </message> + <message> + <location line="+516"/> + <source>Start tag expected.</source> + <translation>預期應有開始標籤。</translation> + </message> + <message> + <location line="+222"/> + <source>XML declaration not at start of document.</source> + <translation>XML 宣告沒有在文件開始處。</translation> + </message> + <message> + <location line="-31"/> + <source>NDATA in parameter entity declaration.</source> + <translation>在參數實體宣告有 NDATA。</translation> + </message> + <message> + <location line="+34"/> + <source>%1 is an invalid processing instruction name.</source> + <translation>%1 是不合法的處理指令名稱。</translation> + </message> + <message> + <location line="+11"/> + <source>Invalid processing instruction name.</source> + <translation>不合法的處理指令名稱。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="-521"/> + <location line="+12"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+164"/> + <location line="+53"/> + <source>Illegal namespace declaration.</source> + <translation>不合法的命名空間宣告。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+15"/> + <source>Invalid XML name.</source> + <translation>不合法的 XML 名稱。</translation> + </message> + <message> + <location line="+23"/> + <source>Opening and ending tag mismatch.</source> + <translation>開啟與結束的標籤不對稱。</translation> + </message> + <message> + <location line="+18"/> + <source>Reference to unparsed entity '%1'.</source> + <translation>參考到未剖析的實體 %1。</translation> + </message> + <message> + <location line="-13"/> + <location line="+61"/> + <location line="+40"/> + <source>Entity '%1' not declared.</source> + <translation>實體 %1 未宣告。</translation> + </message> + <message> + <location line="-26"/> + <source>Reference to external entity '%1' in attribute value.</source> + <translation>在屬性值中參考到外部實體 %1。</translation> + </message> + <message> + <location line="+40"/> + <source>Invalid character reference.</source> + <translation>不合法的字元參考。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream.cpp" line="-75"/> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="-823"/> + <source>Encountered incorrectly encoded content.</source> + <translation>遇到不正確的編碼內容。</translation> + </message> + <message> + <location line="+274"/> + <source>The standalone pseudo attribute must appear after the encoding.</source> + <translation>獨立的虛擬屬性必須在編碼之後出現。</translation> + </message> + <message> + <location filename="../src/corelib/xml/qxmlstream_p.h" line="+562"/> + <source>%1 is an invalid PUBLIC identifier.</source> + <translation>%1 為不合法的 PUBLIC 識別子。</translation> + </message> +</context> +<context> + <name>QtXmlPatterns</name> + <message> + <location filename="../src/xmlpatterns/acceltree/qacceltreebuilder.cpp" line="+205"/> + <source>An %1-attribute with value %2 has already been declared.</source> + <translation>已宣告屬性 %1 的值為 %2。</translation> + </message> + <message> + <location line="+13"/> + <source>An %1-attribute must have a valid %2 as value, which %3 isn't.</source> + <translation>屬性 %1 必須以合法的 %2 為值,而 %3 是不合法的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qiodevicedelegate.cpp" line="+84"/> + <source>Network timeout.</source> + <translation>網路逾時。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+320"/> + <source>Element %1 can't be serialized because it appears outside the document element.</source> + <translation>元素 %1 無法序列化,因為似乎是在文件元素之外。</translation> + </message> + <message> + <source>Attribute element %1 can't be serialized because it appears at the top level.</source> + <translation type="obsolete">屬性元素 %1 無法序列化,因為似乎是在頂層。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractdatetime.cpp" line="+80"/> + <source>Year %1 is invalid because it begins with %2.</source> + <translation>年份 %1 不合法,因為是從 %2 開始的。</translation> + </message> + <message> + <location line="+19"/> + <source>Day %1 is outside the range %2..%3.</source> + <translation>日期 %1 已超出 %2 到 %3 的範圍。</translation> + </message> + <message> + <location line="+7"/> + <source>Month %1 is outside the range %2..%3.</source> + <translation>月份 %1 已超出 %2 到 %3 的範圍。</translation> + </message> + <message> + <location line="+10"/> + <source>Overflow: Can't represent date %1.</source> + <translation>溢位:無法表示日期 %1。</translation> + </message> + <message> + <location line="+9"/> + <source>Day %1 is invalid for month %2.</source> + <translation>月份 %2 中沒有日期 %1。</translation> + </message> + <message> + <location line="+49"/> + <source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source> + <translation>時間 24:%1:%2.%3 不合法。小時為 24 則分、秒與毫秒都必須是 0。 +</translation> + </message> + <message> + <location line="+13"/> + <source>Time %1:%2:%3.%4 is invalid.</source> + <translation>時間 %1:%2:%3.%4 不合法。</translation> + </message> + <message> + <location line="+115"/> + <source>Overflow: Date can't be represented.</source> + <translation>溢位:無法表示日期。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractduration.cpp" line="+99"/> + <location line="+15"/> + <source>At least one component must be present.</source> + <translation>必須表達至少一個組件。</translation> + </message> + <message> + <location line="-7"/> + <source>At least one time component must appear after the %1-delimiter.</source> + <translation>在分隔符 %1 後必須至少有一個時間組件。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qabstractfloatmathematician.cpp" line="+64"/> + <source>No operand in an integer division, %1, can be %2.</source> + <translation>整數除法沒有運作對象,%1,可以是 %2</translation> + </message> + <message> + <location line="+7"/> + <source>The first operand in an integer division, %1, cannot be infinity (%2).</source> + <translation>整數除法的第一個運算對象 %1 不能是無限大(%2)。</translation> + </message> + <message> + <location line="+6"/> + <source>The second operand in a division, %1, cannot be zero (%2).</source> + <translation>整數除法的第二個運算對象 %1 不能是零(%2)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qanyuri_p.h" line="+132"/> + <source>%1 is not a valid value of type %2.</source> + <translation>%1 不是合法的 %2 型態的值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomiccasters_p.h" line="+223"/> + <source>When casting to %1 from %2, the source value cannot be %3.</source> + <translation>從 %2 轉換型態為 %1 的時候,來源數值不能是 %3。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomicmathematicians.cpp" line="+65"/> + <source>Integer division (%1) by zero (%2) is undefined.</source> + <translation>整數除法 %1 除以零(%2)的行為未定義。</translation> + </message> + <message> + <location line="+7"/> + <source>Division (%1) by zero (%2) is undefined.</source> + <translation>除法 %1 除以零(%2)的行為未定義。</translation> + </message> + <message> + <location line="+7"/> + <source>Modulus division (%1) by zero (%2) is undefined.</source> + <translation>餘數除法 %1 除以零(%2)的行為未定義。</translation> + </message> + <message> + <location line="+122"/> + <location line="+32"/> + <source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source> + <translation>將型態 %1 除以 %2(非數值)是不允許的。</translation> + </message> + <message> + <location line="-20"/> + <source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source> + <translation>將型態 %1 除以 %2 或 %3(正或負零)是不允許的。</translation> + </message> + <message> + <location line="+32"/> + <source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source> + <translation>將型態 %1 乘以 %2 或 %3(正或負無限大)是不允許的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qatomicvalue.cpp" line="+79"/> + <source>A value of type %1 cannot have an Effective Boolean Value.</source> + <translation>型態 %1 不能有實際布林值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qboolean.cpp" line="+78"/> + <source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source> + <translation>實際布林值(Effective Boolean)無法用在兩個或兩個以上的原數值(atomic value)的計算。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qderivedinteger_p.h" line="+402"/> + <source>Value %1 of type %2 exceeds maximum (%3).</source> + <translation>型態 %2 的數值 %1 已超過最大值(%3)。</translation> + </message> + <message> + <location line="+9"/> + <source>Value %1 of type %2 is below minimum (%3).</source> + <translation>型態 %2 的數值 %1 已低過最小值(%3)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/data/qhexbinary.cpp" line="+91"/> + <source>A value of type %1 must contain an even number of digits. The value %2 does not.</source> + <translation>型態 %1 的值必須包含偶數個數字。數值 %2 未符合此條件。</translation> + </message> + <message> + <location line="+19"/> + <source>%1 is not valid as a value of type %2.</source> + <translation>%1 不是合法的 %2 型態的值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qarithmeticexpression.cpp" line="+207"/> + <source>Operator %1 cannot be used on type %2.</source> + <translation>操作元 %1 不能用於型態 %2。</translation> + </message> + <message> + <location line="+17"/> + <source>Operator %1 cannot be used on atomic values of type %2 and %3.</source> + <translation>操作元 %1 不能用於型態 %2 與 %3 的原數值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qattributenamevalidator.cpp" line="+66"/> + <source>The namespace URI in the name for a computed attribute cannot be %1.</source> + <translation>在已計算屬性的名稱的命名空間網址不能是 %1。</translation> + </message> + <message> + <location line="+9"/> + <source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source> + <translation>在已計算屬性的名稱不能同時有命名空間網址 %1 與本地端名稱 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcastas.cpp" line="+88"/> + <source>Type error in cast, expected %1, received %2.</source> + <translation>轉換型態錯誤,應為 %1 但接收到 %2。</translation> + </message> + <message> + <location line="+29"/> + <source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source> + <translation>轉換為型態 %1 或其衍生型態時,來源數值必須是相同型態,或者是字串。型態 %2 是不被允許的。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcastingplatform.cpp" line="+134"/> + <source>No casting is possible with %1 as the target type.</source> + <translation>不能轉換到 %1 型態。</translation> + </message> + <message> + <location line="+15"/> + <source>It is not possible to cast from %1 to %2.</source> + <translation>不能從 %1 轉換到 %2。</translation> + </message> + <message> + <location line="+27"/> + <source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source> + <translation>無法轉換到 %1 因為它是一個抽象型態,不能被實體化。</translation> + </message> + <message> + <location line="+23"/> + <source>It's not possible to cast the value %1 of type %2 to %3</source> + <translation>無法轉換型態 %2 的數值 %1 到 %3</translation> + </message> + <message> + <location line="+8"/> + <source>Failure when casting from %1 to %2: %3</source> + <translation>從 %1 轉換到 %2 時失敗:%3</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcommentconstructor.cpp" line="+67"/> + <source>A comment cannot contain %1</source> + <translation>註解不能包含 %1</translation> + </message> + <message> + <location line="+6"/> + <source>A comment cannot end with a %1.</source> + <translation>註解不能以 %1 做結尾</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcomparisonplatform.cpp" line="+167"/> + <source>No comparisons can be done involving the type %1.</source> + <translation>包含型態 %1 時不能做比較。</translation> + </message> + <message> + <location line="+14"/> + <source>Operator %1 is not available between atomic values of type %2 and %3.</source> + <translation>操作元 %1 不能用於型態 %2 與 %3 的原數值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qdocumentcontentvalidator.cpp" line="+86"/> + <source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source> + <translation>屬性點不能做為文件點的子節點。因此,屬性 %1 的位置不合適。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qexpressionfactory.cpp" line="+169"/> + <source>A library module cannot be evaluated directly. It must be imported from a main module.</source> + <translation>不能直接計算函式模組。必須要從主模組匯入。</translation> + </message> + <message> + <location line="+40"/> + <source>No template by name %1 exists.</source> + <translation>沒有名為 %1 的樣本存在。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qgenericpredicate.cpp" line="+106"/> + <source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source> + <translation>型態 %1 的值不能是謂詞(predicate)。謂詞必須是數值型態,或是實際布林值。</translation> + </message> + <message> + <location line="+32"/> + <source>A positional predicate must evaluate to a single numeric value.</source> + <translation>位置謂詞必須能計算出單一的數值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qncnameconstructor_p.h" line="+113"/> + <source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source> + <translation>處理指令的目標名稱不能是任何大小寫組合的 %1。因此,%2 是不合法的值。</translation> + </message> + <message> + <location line="+24"/> + <source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source> + <translation>%1 不是一個合法的處理指令的目標名稱。必須是 %2 的值,例如 %3。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qpath.cpp" line="+109"/> + <source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source> + <translation>路徑的最後一步必須是節點或原值,而不能在兩者之間。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qprocessinginstructionconstructor.cpp" line="+84"/> + <source>The data of a processing instruction cannot contain the string %1</source> + <translation>處理指令的資料不能包含字串 %1</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qqnameconstructor.cpp" line="+82"/> + <source>No namespace binding exists for the prefix %1</source> + <translation>前置字串 %1 沒有結合命名空間</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qqnameconstructor_p.h" line="+156"/> + <source>No namespace binding exists for the prefix %1 in %2</source> + <translation>在 %2 的前置字串 %1 沒有結合命名空間</translation> + </message> + <message> + <location line="+12"/> + <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+69"/> + <source>%1 is an invalid %2</source> + <translation>%1 是不合法的 %2</translation> + </message> + <message numerus="yes"> + <location filename="../src/xmlpatterns/functions/qabstractfunctionfactory.cpp" line="+77"/> + <source>%1 takes at most %n argument(s). %2 is therefore invalid.</source> + <translation> + <numerusform>%1 最多只能有 %n 個參數,因此 %2 是不合法的。</numerusform> + </translation> + </message> + <message numerus="yes"> + <location line="+11"/> + <source>%1 requires at least %n argument(s). %2 is therefore invalid.</source> + <translation> + <numerusform>%1 至少需要 %n 個參數,因此 %2 是不合法的。</numerusform> + </translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qaggregatefns.cpp" line="+120"/> + <source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source> + <translation>呼叫 %1 的第一個參數不能是 %2 型態。必須是數值型態,xs.yearMonthDuration 或 xs.dayTimeDuration。</translation> + </message> + <message> + <location line="+74"/> + <source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> + <translation>呼叫 %1 的第一個參數不能是 %2 型態。必須是 %3、%4 或 %5 型態。</translation> + </message> + <message> + <location line="+91"/> + <source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source> + <translation>呼叫 %1 的第二個參數不能是 %2 型態。必須是 %3、%4 或 %5 型態。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qassemblestringfns.cpp" line="+88"/> + <source>%1 is not a valid XML 1.0 character.</source> + <translation>%1 不是合法的 XML 1.0 字元。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qcomparingaggregator.cpp" line="+197"/> + <source>The first argument to %1 cannot be of type %2.</source> + <translation>呼叫 %1 的第一個參數不能是 %2 型態。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qdatetimefn.cpp" line="+86"/> + <source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source> + <translation>如果兩個值都有區域位移,則必須是相同的區域位移。%1 與 %2 並不相同。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qerrorfn.cpp" line="+61"/> + <source>%1 was called.</source> + <translation>%1 已被呼叫。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qpatternmatchingfns.cpp" line="+94"/> + <source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source> + <translation>%1 後面必須跟著 %2 或 %3,而非取代字串的結尾。</translation> + </message> + <message> + <location line="+39"/> + <source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source> + <translation>在取代字串中,在未脫逸的情形下 %1 必須至少跟著一位數字。</translation> + </message> + <message> + <location line="+26"/> + <source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source> + <translation>在取代字串中,%1 只能用於自身或 %2 的脫逸,而非 %3。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qpatternplatform.cpp" line="+92"/> + <source>%1 matches newline characters</source> + <translation>%1 符合了換行字元</translation> + </message> + <message> + <location line="+4"/> + <source>%1 and %2 match the start and end of a line.</source> + <translation>%1 與 %2 符合了一行的開始與結尾。</translation> + </message> + <message> + <location line="+6"/> + <source>Matches are case insensitive</source> + <translation>比對為區分大小寫</translation> + </message> + <message> + <location line="+4"/> + <source>Whitespace characters are removed, except when they appear in character classes</source> + <translation>空白字元已移除,除非它們出現在字元類別</translation> + </message> + <message> + <location line="+99"/> + <source>%1 is an invalid regular expression pattern: %2</source> + <translation>%1 是不合法的正規表示式樣式:%2</translation> + </message> + <message> + <location line="+30"/> + <source>%1 is an invalid flag for regular expressions. Valid flags are:</source> + <translation>%1 是正規表示式中不合法的旗標。合法的旗標有:</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qqnamefns.cpp" line="+17"/> + <source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source> + <translation>如果第一個參數是空序列,或是長度為 0 的字串(沒有命名空間),則無法指定前置字串。但是您指定了 %1。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qsequencefns.cpp" line="+347"/> + <source>It will not be possible to retrieve %1.</source> + <translation>無法取得 %1。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qcontextnodechecker.cpp" line="+54"/> + <source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source> + <translation>函式 %1 的第二個參數的根節點必須是文件節點。%2 不是文件節點。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qsequencegeneratingfns.cpp" line="+279"/> + <source>The default collection is undefined</source> + <translation>預設的收藏未定義</translation> + </message> + <message> + <location line="+13"/> + <source>%1 cannot be retrieved</source> + <translation>%1 無法取得</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qstringvaluefns.cpp" line="+252"/> + <source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source> + <translation>未支援常態化表單 %1。支援的表單有 %2、%3、%4、%5,以及無(也就是空字串,未常態化)。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qtimezonefns.cpp" line="+87"/> + <source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source> + <translation>區域位移必須是在 %1 到 %2 範圍之內。%3 已超出範圍。</translation> + </message> + <message> + <location line="+12"/> + <source>%1 is not a whole number of minutes.</source> + <translation>%1 不是分鐘的數值。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/janitors/qcardinalityverifier.cpp" line="+58"/> + <source>Required cardinality is %1; got cardinality %2.</source> + <translation>需要的基數為 %1;得到的是 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/janitors/qitemverifier.cpp" line="+67"/> + <source>The item %1 did not match the required type %2.</source> + <translation>項目 %1 未符合需要的型態 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+379"/> + <location line="+7253"/> + <source>%1 is an unknown schema type.</source> + <translation>%1 是未知的機制型態。</translation> + </message> + <message> + <location line="-6971"/> + <source>Only one %1 declaration can occur in the query prolog.</source> + <translation>只有一個 %1 宣告可以在查詢中。</translation> + </message> + <message> + <location line="+188"/> + <source>The initialization of variable %1 depends on itself</source> + <translation>變數 %1 的初始化與自身相依。</translation> + </message> + <message> + <location line="+63"/> + <source>No variable by name %1 exists</source> + <translation>沒有名為 %1 的變數存在</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qparsercontext.cpp" line="+93"/> + <source>The variable %1 is unused</source> + <translation>變數 %1 未使用</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qquerytransformparser.cpp" line="+2841"/> + <source>Version %1 is not supported. The supported XQuery version is 1.0.</source> + <translation>版本 %1 未支援。支援的 XQuery 版本為 1.0。</translation> + </message> + <message> + <location line="+16"/> + <source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source> + <translation>編碼 %1 不合法。必須只能包含拉丁字元,不含空白,並且要符合正規表示式 %2。</translation> + </message> + <message> + <location line="+55"/> + <source>No function with signature %1 is available</source> + <translation>沒有簽章為 %1 的函式可使用</translation> + </message> + <message> + <location line="+72"/> + <location line="+10"/> + <source>A default namespace declaration must occur before function, variable, and option declarations.</source> + <translation>預設的命名空間宣告必須在函式、變數與選項宣告之前。</translation> + </message> + <message> + <location line="+10"/> + <source>Namespace declarations must occur before function, variable, and option declarations.</source> + <translation>命名空間宣告必須在函式、變數與選項宣告之前。</translation> + </message> + <message> + <location line="+11"/> + <source>Module imports must occur before function, variable, and option declarations.</source> + <translation>模組匯入必須在函式、變數與選項宣告之前。</translation> + </message> + <message> + <location line="+200"/> + <source>It is not possible to redeclare prefix %1.</source> + <translation>無法重宣告前置字串 %1。</translation> + </message> + <message> + <source>Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1.</source> + <translation type="obsolete">只有前置字串 %1 可以被宣告與命名空間 %2 結合。它預設已經與前置字串 %1 結合。</translation> + </message> + <message> + <location line="+18"/> + <source>Prefix %1 is already declared in the prolog.</source> + <translation>前置字串 %1 已在 prolog 中宣告。</translation> + </message> + <message> + <location line="+95"/> + <source>The name of an option must have a prefix. There is no default namespace for options.</source> + <translation>選項名稱必須有前置字串。沒有選項的預設命名空間。</translation> + </message> + <message> + <location line="+171"/> + <source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source> + <translation>機制匯入功能未支援,因此有 %1 個宣告無法達成。</translation> + </message> + <message> + <location line="+13"/> + <source>The target namespace of a %1 cannot be empty.</source> + <translation>%1 的目標命名空間不能是空的。</translation> + </message> + <message> + <location line="+8"/> + <source>The module import feature is not supported</source> + <translation>模組匯入功能未支援。</translation> + </message> + <message> + <source>A variable by name %1 has already been declared in the prolog.</source> + <translation type="obsolete">名稱為 %1 的變數已經在 prolog 中宣告。</translation> + </message> + <message> + <location line="+52"/> + <source>No value is available for the external variable by name %1.</source> + <translation>名為 %1 的外部變數沒有可用的值。</translation> + </message> + <message> + <source>The namespace for a user defined function cannot be empty(try the predefined prefix %1 which exists for cases like this)</source> + <translation type="obsolete">使用者定義的函式的命名空間不能是空的(請試試使用預定義前置字串 %1)</translation> + </message> + <message> + <location line="-4154"/> + <source>A construct was encountered which only is allowed in XQuery.</source> + <translation>遇到了建構,實際上只能允許在 XQuery 內。</translation> + </message> + <message> + <location line="+118"/> + <source>A template by name %1 has already been declared.</source> + <translation>名為 %1 的屬性已被宣告。</translation> + </message> + <message> + <location line="+3581"/> + <source>The keyword %1 cannot occur with any other mode name.</source> + <translation>關鍵字 %1 不能與任何其它模式名稱一起存在。</translation> + </message> + <message> + <location line="+29"/> + <source>The value of attribute %1 must of type %2, which %3 isn't.</source> + <translation>屬性 %1 的值必須為型態 %2,但 %3 不是。</translation> + </message> + <message> + <location line="+75"/> + <source>The prefix %1 can not be bound. By default, it is already bound to the namespace %2.</source> + <translation>前置字串 %1 不能被結合。預設它已與命名空間 %2 結合。</translation> + </message> + <message> + <location line="+312"/> + <source>A variable by name %1 has already been declared.</source> + <translation>名為 %1 的變數已被宣告。</translation> + </message> + <message> + <location line="+135"/> + <source>A stylesheet function must have a prefixed name.</source> + <translation>樣式表函式必須有前置名稱。</translation> + </message> + <message> + <location line="+9"/> + <source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source> + <translation>使用者定義函式的命名空間不能為空白(請試著用預先定義的前置字串 %1)</translation> + </message> + <message> + <location line="+9"/> + <source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source> + <translation>命名空間 %1 已被保留,因此使用者定義函式不能使用它。請試試預定義前置字串 %2。</translation> + </message> + <message> + <location line="+12"/> + <source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source> + <translation>在函式模組中的使用者定義函式的命名空間必須與模組的命名空間相同。也就是,應該為 %1 而不是 %2。</translation> + </message> + <message> + <location line="+34"/> + <source>A function already exists with the signature %1.</source> + <translation>已經有簽章為 %1 的函式存在。</translation> + </message> + <message> + <location line="+23"/> + <source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source> + <translation>未支援外部函式。所有支援的含式可以直接使用而不需要先宣告為外部函式。</translation> + </message> + <message> + <location line="+37"/> + <source>An argument by name %1 has already been declared. Every argument name must be unique.</source> + <translation>名稱為 %1 的參數已被宣告。每個參數名稱必須唯一。</translation> + </message> + <message> + <location line="+179"/> + <source>When function %1 is used for matching inside a pattern, the argument must be a variable reference or a string literal.</source> + <translation>當函式 %1 用於樣式比對時,參數必須是變數參考或字串。</translation> + </message> + <message> + <location line="+11"/> + <source>In an XSL-T pattern, the first argument to function %1 must be a string literal, when used for matching.</source> + <translation>在 XSL-T 樣式內,函式 %1 的第一個參數必須是字串,以便用於比對。</translation> + </message> + <message> + <location line="+14"/> + <source>In an XSL-T pattern, the first argument to function %1 must be a literal or a variable reference, when used for matching.</source> + <translation>在 XSL-T 樣式內,函式 %1 的第一個參數必須是文字或變數參考,以便用於比對。</translation> + </message> + <message> + <location line="+9"/> + <source>In an XSL-T pattern, function %1 cannot have a third argument.</source> + <translation>在 XSL-T 樣式內,函式 %1 的不能有第三個參數。</translation> + </message> + <message> + <location line="+10"/> + <source>In an XSL-T pattern, only function %1 and %2, not %3, can be used for matching.</source> + <translation>在 XSL-T 樣式內,只有函式 %1,%2 可以用於比對。%3 不行。</translation> + </message> + <message> + <location line="+63"/> + <source>In an XSL-T pattern, axis %1 cannot be used, only axis %2 or %3 can.</source> + <translation>在 XSL-T 樣式內,不能用 %1 軸,只能用 %2 或 %3。</translation> + </message> + <message> + <location line="+126"/> + <source>%1 is an invalid template mode name.</source> + <translation>%1 不是合法的樣本模式名稱。</translation> + </message> + <message> + <location line="+44"/> + <source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source> + <translation>與 for 敘述結合的變數名稱必須與位置變數不同。因此,有兩個名為 %1 的變數衝突了。</translation> + </message> + <message> + <location line="+758"/> + <source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source> + <translation>未支援機制確認功能。%1 敘述無法使用。</translation> + </message> + <message> + <location line="+39"/> + <source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source> + <translation>未支援 pragma 敘述。因次,必須有預設的敘述。</translation> + </message> + <message> + <location line="+267"/> + <source>Each name of a template parameter must be unique; %1 is duplicated.</source> + <translation>每個樣本參數的名稱必須唯一;%1 已經被使用。</translation> + </message> + <message> + <location line="+129"/> + <source>The %1-axis is unsupported in XQuery</source> + <translation>XQuery 中未支援 %1 軸</translation> + </message> + <message> + <location line="+1150"/> + <source>%1 is not a valid name for a processing-instruction.</source> + <translation>%1 不是處理指令的合法名稱。</translation> + </message> + <message> + <location line="-7029"/> + <source>%1 is not a valid numeric literal.</source> + <translation>%1 不是合法的數值。</translation> + </message> + <message> + <location line="+6165"/> + <source>No function by name %1 is available.</source> + <translation>沒有名為 %1 的函式。</translation> + </message> + <message> + <location line="+102"/> + <source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source> + <translation>要與前置字串 %1 結合的命名空間網址不能是空字串。</translation> + </message> + <message> + <location line="+7"/> + <source>%1 is an invalid namespace URI.</source> + <translation>%1 是不合法的命名空間網址。</translation> + </message> + <message> + <location line="+6"/> + <source>It is not possible to bind to the prefix %1</source> + <translation>無法與前置字串 %1 結合。</translation> + </message> + <message> + <location line="+7"/> + <source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> + <translation>命名空間 %1 只能與 %2 結合(也就是說,要預先定義)。</translation> + </message> + <message> + <location line="+8"/> + <source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source> + <translation>前置字串 %1 只能與 %2 結合(也就是說,要預先定義)。</translation> + </message> + <message> + <location line="+15"/> + <source>Two namespace declaration attributes have the same name: %1.</source> + <translation>有兩個命名空間宣告的屬性有相同的名稱:%1</translation> + </message> + <message> + <location line="+89"/> + <source>The namespace URI must be a constant and cannot use enclosed expressions.</source> + <translation>命名空間網址必須是常數,並且不能使用封閉敘述。</translation> + </message> + <message> + <location line="+16"/> + <source>An attribute by name %1 has already appeared on this element.</source> + <translation>名為 %1 的屬性已出現在此元素。</translation> + </message> + <message> + <location line="+61"/> + <source>A direct element constructor is not well-formed. %1 is ended with %2.</source> + <translation>直接元素建構器沒有完整產生。%1 以 %2 結束。</translation> + </message> + <message> + <location line="+458"/> + <source>The name %1 does not refer to any schema type.</source> + <translation>名稱 %1 未指向任何機制型態。</translation> + </message> + <message> + <location line="+10"/> + <source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source> + <translation>%1 是複數型態,無法轉換成複數型態。然而,轉換為原型態,如 %2 是可行的。</translation> + </message> + <message> + <location line="+9"/> + <source>%1 is not an atomic type. Casting is only possible to atomic types.</source> + <translation>%1 不是一個原型態。只能轉換為原型態。</translation> + </message> + <message> + <source>%1 is not a valid name for a processing-instruction. Therefore this name test will never match.</source> + <translation type="obsolete">%1 不是一個合法的處理指令的名稱。因此名稱測試永遠不會成功。</translation> + </message> + <message> + <location line="+145"/> + <location line="+71"/> + <source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source> + <translation>%1 不是範圍內屬性宣告。注意機制匯入功能未支援。</translation> + </message> + <message> + <location line="+48"/> + <source>The name of an extension expression must be in a namespace.</source> + <translation>延伸敘述的名稱必須在命名空間內。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/type/qcardinality.cpp" line="+55"/> + <source>empty</source> + <translation>空白</translation> + </message> + <message> + <location line="+2"/> + <source>zero or one</source> + <translation>0 或 1 個</translation> + </message> + <message> + <location line="+2"/> + <source>exactly one</source> + <translation>剛好一個</translation> + </message> + <message> + <location line="+2"/> + <source>one or more</source> + <translation>一個以上</translation> + </message> + <message> + <location line="+2"/> + <source>zero or more</source> + <translation>0 個以上</translation> + </message> + <message> + <location filename="../src/xmlpatterns/type/qtypechecker.cpp" line="+63"/> + <source>Required type is %1, but %2 was found.</source> + <translation>需要的型態為 %1,但找到 %2。</translation> + </message> + <message> + <location line="+44"/> + <source>Promoting %1 to %2 may cause loss of precision.</source> + <translation>將 %1 抬升為 %2 可能會失去精確度。</translation> + </message> + <message> + <location line="+49"/> + <source>The focus is undefined.</source> + <translation>焦點未定義。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/utils/qoutputvalidator.cpp" line="+86"/> + <source>It's not possible to add attributes after any other kind of node.</source> + <translation>不能在任何其它種類的節點後面加入屬性。</translation> + </message> + <message> + <location line="+7"/> + <source>An attribute by name %1 has already been created.</source> + <translation>名為 %1 的屬性已被建立。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/utils/qxpathhelper_p.h" line="+120"/> + <source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source> + <translation>只支援 Unicode Codepoint Collation(%1)。%2 未支援。;</translation> + </message> + <message> + <location filename="../src/xmlpatterns/api/qxmlserializer.cpp" line="+60"/> + <source>Attribute %1 can't be serialized because it appears at the top level.</source> + <translation>屬性元素 %1 無法序列化,因為似乎是在頂層。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/acceltree/qacceltreeresourceloader.cpp" line="+314"/> + <source>%1 is an unsupported encoding.</source> + <translation>%1 是個未被支援的編碼。</translation> + </message> + <message> + <location line="+16"/> + <source>%1 contains octets which are disallowed in the requested encoding %2.</source> + <translation>%1 包含了在要求的編碼 %2 內不允許的八進位值。</translation> + </message> + <message> + <location line="+18"/> + <source>The codepoint %1, occurring in %2 using encoding %3, is an invalid XML character.</source> + <translation>在 %2 內的代碼點 %1(編碼 %3)是一個不合法的 XML 字元。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qapplytemplate.cpp" line="+119"/> + <source>Ambiguous rule match.</source> + <translation>不明確的規則符合。</translation> + </message> + <message> + <source>In a namespace constructor, the value for a namespace value cannot be an empty string.</source> + <translation type="obsolete">在命名空間建構子中,命名空間的值不能是空字串。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qcomputednamespaceconstructor.cpp" line="+69"/> + <source>In a namespace constructor, the value for a namespace cannot be an empty string.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+11"/> + <source>The prefix must be a valid %1, which %2 is not.</source> + <translation>前置字串必須是合法的 %1,但 %2 不是。</translation> + </message> + <message> + <location line="+14"/> + <source>The prefix %1 cannot be bound.</source> + <translation>前置字串 %1 不能被結合。</translation> + </message> + <message> + <location line="+10"/> + <source>Only the prefix %1 can be bound to %2 and vice versa.</source> + <translation>只有前置字串 %1 能與 %2 結合。反之亦然。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qevaluationcache.cpp" line="+117"/> + <source>Circularity detected</source> + <translation>偵測到環狀</translation> + </message> + <message> + <location filename="../src/xmlpatterns/expr/qtemplate.cpp" line="+145"/> + <source>The parameter %1 is required, but no corresponding %2 is supplied.</source> + <translation>需要參數 %1,但是沒有提供相關的 %2。</translation> + </message> + <message> + <location line="-71"/> + <source>The parameter %1 is passed, but no corresponding %2 exists.</source> + <translation>參數 %1 已傳送,但找不到相關的 %2。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/functions/qunparsedtextfn.cpp" line="+65"/> + <source>The URI cannot have a fragment</source> + <translation>URI 不能有片段。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+519"/> + <source>Element %1 is not allowed at this location.</source> + <translation>元素 %1 不能在此位置。</translation> + </message> + <message> + <location line="+9"/> + <source>Text nodes are not allowed at this location.</source> + <translation>文字節點不能在此位置。</translation> + </message> + <message> + <location line="+20"/> + <source>Parse error: %1</source> + <translation>剖析錯誤:%1</translation> + </message> + <message> + <location line="+62"/> + <source>The value of the XSL-T version attribute must be a value of type %1, which %2 isn't.</source> + <translation>XLS-T 版本屬性的值必須是型態 %1 的值,而 %2 不是。</translation> + </message> + <message> + <location line="+20"/> + <source>Running an XSL-T 1.0 stylesheet with a 2.0 processor.</source> + <translation>使用 2.0 處理器執行 XSL-T 1.0 樣式表中。</translation> + </message> + <message> + <location line="+108"/> + <source>Unknown XSL-T attribute %1.</source> + <translation>未知的 XSL-T 屬性 %1。</translation> + </message> + <message> + <location line="+23"/> + <source>Attribute %1 and %2 are mutually exclusive.</source> + <translation>屬性 %1 與 %2 彼此互斥。</translation> + </message> + <message> + <location line="+166"/> + <source>In a simplified stylesheet module, attribute %1 must be present.</source> + <translation>在簡化的樣式表模組中,屬性 %1 必須存在。</translation> + </message> + <message> + <location line="+72"/> + <source>If element %1 has no attribute %2, it cannot have attribute %3 or %4.</source> + <translation>若元素 %1 沒有屬性 %2,則也不能有屬性 %3 或 %4。</translation> + </message> + <message> + <location line="+9"/> + <source>Element %1 must have at least one of the attributes %2 or %3.</source> + <translation>元素 %1 必須至少有屬性 %2 或 %3 其中一個。</translation> + </message> + <message> + <location line="+28"/> + <source>At least one mode must be specified in the %1-attribute on element %2.</source> + <translation>在元素 %2 的 %1 屬性中至少要指定一個模式。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qmaintainingreader.cpp" line="+183"/> + <source>Attribute %1 cannot appear on the element %2. Only the standard attributes can appear.</source> + <translation>屬性 %1 不能出現在元素 %2。只能有標準屬性。</translation> + </message> + <message> + <location line="+6"/> + <source>Attribute %1 cannot appear on the element %2. Only %3 is allowed, and the standard attributes.</source> + <translation>屬性 %1 不能出現在元素 %2。只能有 %3 以及標準屬性。</translation> + </message> + <message> + <location line="+8"/> + <source>Attribute %1 cannot appear on the element %2. Allowed is %3, %4, and the standard attributes.</source> + <translation>屬性 %1 不能出現在元素 %2。只能有 %3,%4 以及標準屬性。</translation> + </message> + <message> + <location line="+9"/> + <source>Attribute %1 cannot appear on the element %2. Allowed is %3, and the standard attributes.</source> + <translation>屬性 %1 不能出現在元素 %2。只能有 %3 以及標準屬性。</translation> + </message> + <message> + <location line="+13"/> + <source>XSL-T attributes on XSL-T elements must be in the null namespace, not in the XSL-T namespace which %1 is.</source> + <translation>XSL-T 元素內的 XSL-T 屬性必須放在空(null)的命名空間,而不是像 %1 在 XSL-T 命名空間。</translation> + </message> + <message> + <location line="+12"/> + <source>The attribute %1 must appear on element %2.</source> + <translation>屬性 %1 必須在元素 %2 內出現。</translation> + </message> + <message> + <location line="+8"/> + <source>The element with local name %1 does not exist in XSL-T.</source> + <translation>有本地名稱 %1 的元素在 XSL-T 內不存在。</translation> + </message> + <message> + <location filename="../src/xmlpatterns/parser/qxslttokenizer.cpp" line="+123"/> + <source>Element %1 must come last.</source> + <translation>元素 %1 必須最後出現。</translation> + </message> + <message> + <location line="+24"/> + <source>At least one %1-element must occur before %2.</source> + <translation>至少一個元素 %1 要出現在 %2 之前。</translation> + </message> + <message> + <location line="+7"/> + <source>Only one %1-element can appear.</source> + <translation>只能出現一個元素 %1。</translation> + </message> + <message> + <location line="+31"/> + <source>At least one %1-element must occur inside %2.</source> + <translation>至少一個元素 %1 要出現在 %2 之內。</translation> + </message> + <message> + <location line="+58"/> + <source>When attribute %1 is present on %2, a sequence constructor cannot be used.</source> + <translation>當屬性 %1 出現在 %2 內時,不能使用序列建構子。</translation> + </message> + <message> + <location line="+13"/> + <source>Element %1 must have either a %2-attribute or a sequence constructor.</source> + <translation>元素 %1 必須至少有一個屬性 %2 或一個序列建構子。</translation> + </message> + <message> + <location line="+125"/> + <source>When a parameter is required, a default value cannot be supplied through a %1-attribute or a sequence constructor.</source> + <translation>當需要參數時,不能透過屬性 %1 或序列建構子提供預設值。</translation> + </message> + <message> + <location line="+270"/> + <source>Element %1 cannot have children.</source> + <translation>元素 %1 不能有子元素。</translation> + </message> + <message> + <location line="+434"/> + <source>Element %1 cannot have a sequence constructor.</source> + <translation>元素 %1不能有序列建構子。</translation> + </message> + <message> + <location line="+86"/> + <location line="+9"/> + <source>The attribute %1 cannot appear on %2, when it is a child of %3.</source> + <translation>屬性 %1 不能出現在 %2,因為它是 %3 的子元素。</translation> + </message> + <message> + <location line="+15"/> + <source>A parameter in a function cannot be declared to be a tunnel.</source> + <translation>函式內的參數不能被宣告為通道(tunnel)。</translation> + </message> + <message> + <location line="+149"/> + <source>This processor is not Schema-aware and therefore %1 cannot be used.</source> + <translation>此處理器不是 Schema-aware,因此不能使用 %1。</translation> + </message> + <message> + <location line="+57"/> + <source>Top level stylesheet elements must be in a non-null namespace, which %1 isn't.</source> + <translation>頂層樣式表元素必須是非空白的命名空間,而 %1 不是。</translation> + </message> + <message> + <location line="+48"/> + <source>The value for attribute %1 on element %2 must either be %3 or %4, not %5.</source> + <translation>元素 %2 內屬性 %1 的值必須是 %3 或 %4,而不是 %5。</translation> + </message> + <message> + <location line="+20"/> + <source>Attribute %1 cannot have the value %2.</source> + <translation>屬性 %1 的值不能為 %2。</translation> + </message> + <message> + <location line="+58"/> + <source>The attribute %1 can only appear on the first %2 element.</source> + <translation>屬性 %1 只能出現在前 %2 個元素內。</translation> + </message> + <message> + <location line="+99"/> + <source>At least one %1 element must appear as child of %2.</source> + <translation>%2 必須至少有一個子元素 %1。</translation> + </message> +</context> +<context> + <name>VolumeSlider</name> + <message> + <location filename="../src/3rdparty/phonon/phonon/volumeslider.cpp" line="+67"/> + <source>Muted</source> + <translation>靜音</translation> + </message> + <message> + <location line="+5"/> + <location line="+15"/> + <source>Volume: %1%</source> + <translation>音量:%1%</translation> + </message> +</context> +<context> + <name>WebCore::PlatformScrollbar</name> + <message> + <source>Scroll here</source> + <translation type="obsolete">在此捲軸</translation> + </message> + <message> + <source>Left edge</source> + <translation type="obsolete">左邊緣</translation> + </message> + <message> + <source>Top</source> + <translation type="obsolete">頂端</translation> + </message> + <message> + <source>Right edge</source> + <translation type="obsolete">右邊緣</translation> + </message> + <message> + <source>Bottom</source> + <translation type="obsolete">底端</translation> + </message> + <message> + <source>Page left</source> + <translation type="obsolete">頁面左方</translation> + </message> + <message> + <source>Page up</source> + <translation type="obsolete">頁面上方</translation> + </message> + <message> + <source>Page right</source> + <translation type="obsolete">頁面右方</translation> + </message> + <message> + <source>Page down</source> + <translation type="obsolete">頁面下方</translation> + </message> + <message> + <source>Scroll left</source> + <translation type="obsolete">往左捲軸</translation> + </message> + <message> + <source>Scroll up</source> + <translation type="obsolete">往上捲軸</translation> + </message> + <message> + <source>Scroll right</source> + <translation type="obsolete">往右捲軸</translation> + </message> + <message> + <source>Scroll down</source> + <translation type="obsolete">往下捲軸</translation> + </message> +</context> +</TS> diff --git a/verifydetailsdialog.cpp b/verifydetailsdialog.cpp index 55fb567..102dec2 100644 --- a/verifydetailsdialog.cpp +++ b/verifydetailsdialog.cpp @@ -59,9 +59,11 @@ void VerifyDetailsDialog::refresh() //mCtx->preventNoDataErr(&text); gpgme_signature_t sign; if(mInputSignature != 0) { - sign = mCtx->verify(mInputData, mInputSignature); + // TODO: kgpg + //sign = mCtx->verify(mInputData, mInputSignature); } else { - sign = mCtx->verify(mInputData); + //TODO kgpg + //sign = mCtx->verify(mInputData); } if(sign==0) { diff --git a/verifynotification.cpp b/verifynotification.cpp index 1230534..9aa061f 100644 --- a/verifynotification.cpp +++ b/verifynotification.cpp @@ -100,8 +100,14 @@ bool VerifyNotification::refresh() mCtx->preventNoDataErr(&text); int textIsSigned = mCtx->textIsSigned(text); - gpgme_signature_t sign = mCtx->verify(&text); + //gpgme_signature_t sign = mCtx->verify(text); + //KGpgVerify *verify = new KGpgVerify(this, message.mid(posstart, posend - posstart)); + KGpgVerify *verify = new KGpgVerify(this, text); + connect(verify, SIGNAL(done(int)), SLOT(slotVerifyDone(int))); + verify->start(); + + /* if (sign == NULL) { return false; } @@ -180,6 +186,156 @@ bool VerifyNotification::refresh() verifyLabelText.remove(verifyLabelText.length()-1,1); this->setVerifyLabel(verifyLabelText,verifyStatus); - + */ return true; } + +void VerifyNotification::slotVerifyDone(int result) +{ + const KGpgVerify * const verify = qobject_cast<KGpgVerify *>(sender()); + sender()->deleteLater(); + Q_ASSERT(verify != NULL); + + if (result == KGpgVerify::TS_MISSING_KEY) { + qDebug() << "missing keys" << verify->missingId(); + this->keysNotInList->append(verify->missingId()); + this->showImportAction(true); + } + + const QStringList messages = verify->getMessages(); + foreach(QString mess, messages) { + qDebug() << "vm: " << mess; + } + + getReport(messages); + /*emit verifyFinished(); + + if (result == KGpgVerify::TS_MISSING_KEY) { + verifyKeyNeeded(verify->missingId()); + return; + } + + const QStringList messages = verify->getMessages(); + + if (messages.isEmpty()) + return; + + QStringList msglist; + foreach (QString rawmsg, messages) + msglist << rawmsg.replace(QLatin1Char('<'), QLatin1String("<")); + + (void) new KgpgDetailedInfo(this, KGpgVerify::getReport(messages, m_model), + msglist.join(QLatin1String("<br/>")), + QStringList(), i18nc("Caption of message box", "Verification Finished")); + */ +} + +QString VerifyNotification::getReport(const QStringList &log) +{ + QString verifyLabelText; + verify_label_status verifyStatus=VERIFY_ERROR_OK; + + QString result; + // newer versions of GnuPG emit both VALIDSIG and GOODSIG + // for a good signature. Since VALIDSIG has more information + // we use that. + const QRegExp validsig(QLatin1String("^\\[GNUPG:\\] VALIDSIG([ ]+[^ ]+){10,}.*$")); + + +// const bool useGoodSig = (model != NULL) && (log.indexOf(validsig) == -1); + const bool useGoodSig = false; + + QString sigtime; // timestamp of signature creation + + foreach (const QString &line, log) { + if (!line.startsWith(QLatin1String("[GNUPG:] "))) + continue; + + const QString msg = line.mid(9); + + if (msg.startsWith(QLatin1String("VALIDSIG ")) && !useGoodSig) { + // from GnuPG source, doc/DETAILS: + // VALIDSIG <fingerprint in hex> <sig_creation_date> <sig-timestamp> + // <expire-timestamp> <sig-version> <reserved> <pubkey-algo> + // <hash-algo> <sig-class> <primary-key-fpr> + const QStringList vsig = msg.mid(9).split(QLatin1Char(' '), QString::SkipEmptyParts); + Q_ASSERT(vsig.count() >= 10); + + qDebug() << "sig: " << vsig[9]; + + verifyStatus=VERIFY_ERROR_WARN; + verifyLabelText.append(tr("Error for key with fingerprint ")+mCtx->beautifyFingerprint(QString(vsig[9]))); + + + } + } + + this->setVerifyLabel(verifyLabelText,verifyStatus); + /*const KGpgKeyNode *node = model->findKeyNode(vsig[9]); + + if (node != NULL) { + // ignore for now if this is signed with the primary id (vsig[0] == vsig[9]) or not + if (node->getEmail().isEmpty()) + result += tr("<qt>Good signature from:<br /><b>%1</b><br />Key ID: %2<br /></qt>") + .arg(node->getName()).arg(vsig[9]); + else + result += tr("Good signature from: NAME <EMAIL>, Key ID: HEXID", + "<qt>Good signature from:<br /><b>%1 <%2></b><br />Key ID: %3<br /></qt>") + .arg(node->getName()).arg(node->getEmail()).arg(vsig[9]); + + result += sigTimeMessage(vsig[2]); + } else { + // this should normally never happen, but one could delete + // the key just after the verification. Brute force solution: + // do the whole report generation again, but this time make + // sure GOODSIG is used. + return getReport(log, NULL); + } + } else if (msg.startsWith(QLatin1String("UNEXPECTED")) || + msg.startsWith(QLatin1String("NODATA"))) { + result += tr("No signature found.") + QLatin1Char('\n'); + } else if (useGoodSig && msg.startsWith(QLatin1String("GOODSIG "))) { + int sigpos = msg.indexOf( ' ' , 8); + const QString keyid = msg.mid(8, sigpos - 8); + + // split the name/email pair to give translators more power to handle this + QString email; + QString name = msg.mid(sigpos + 1); + + int oPos = name.indexOf(QLatin1Char('<')); + int cPos = name.indexOf(QLatin1Char('>')); + if ((oPos >= 0) && (cPos >= 0)) { + email = name.mid(oPos + 1, cPos - oPos - 1); + name = name.left(oPos).simplified(); + } + + if (email.isEmpty()) + result += tr("<qt>Good signature from:<br /><b>%1</b><br />Key ID: %2<br /></qt>") + .arg(name).arg(keyid); + else + result += tr("Good signature from: NAME <EMAIL>, Key ID: HEXID", + "<qt>Good signature from:<br /><b>%1 <%2></b><br />Key ID: %3<br /></qt>") + .arg(name).arg(email).arg(keyid); + if (!sigtime.isEmpty()) { + result += sigTimeMessage(sigtime); + sigtime.clear(); + } + } else if (msg.startsWith(QLatin1String("SIG_ID "))) { + const QStringList parts = msg.simplified().split(QLatin1Char(' ')); + if (parts.count() > 2) + sigtime = parts[2]; + } else if (msg.startsWith(QLatin1String("BADSIG"))) { + int sigpos = msg.indexOf( ' ', 7); + result += tr("<qt><b>BAD signature</b> from:<br /> %1<br />Key id: %2<br /><br /><b>The file is corrupted</b><br /></qt>") + .arg(msg.mid(sigpos + 1).replace(QLatin1Char('<'), QLatin1String("<"))) + .arg(msg.mid(7, sigpos - 7)); + } else if (msg.startsWith(QLatin1String("TRUST_UNDEFINED"))) { + result += tr("<qt>The signature is valid, but the key is untrusted<br /></qt>"); + } else if (msg.startsWith(QLatin1String("TRUST_ULTIMATE"))) { + result += tr("<qt>The signature is valid, and the key is ultimately trusted<br /></qt>"); + } + } + */ + return result; +} + diff --git a/verifynotification.h b/verifynotification.h index e1b4f1b..6f34f47 100644 --- a/verifynotification.h +++ b/verifynotification.h @@ -24,6 +24,7 @@ #include "editorpage.h" #include "verifydetailsdialog.h" +#include "kgpg/transactions/kgpgverify.h" #include <gpgme.h> #include <QWidget> @@ -75,6 +76,8 @@ public: QStringList *keysNotInList; /** List with keys, which are in signature but not in keylist */ + QString getReport(const QStringList &log); + public slots: /** @@ -93,6 +96,8 @@ public slots: */ bool refresh(); + void slotVerifyDone(int result); + private: QMenu *detailMenu; /** Menu for te Button in verfiyNotification */ QAction *importFromKeyserverAct; /** Action for importing keys from keyserver which are notin keylist */ |