📄 trwindow.cpp
字号:
QMessageBox::warning(this, tr("Qt Linguist"), tr("Cannot read from phrase book '%1'.").arg(name)); return false; } QAction *a = m_ui.menuClosePhraseBook->addAction(pb.friendlyPhraseBookName()); phraseBooks[PhraseCloseMenu].insert(a, pb); a->setWhatsThis(tr("Close this phrase book.")); a = m_ui.menuEditPhraseBook->addAction(pb.friendlyPhraseBookName()); phraseBooks[PhraseEditMenu].insert(a, pb); a->setWhatsThis(tr("Allow you to add, modify, or delete" " phrases of this phrase book.")); a = m_ui.menuPrintPhraseBook->addAction(pb.friendlyPhraseBookName()); phraseBooks[PhrasePrintMenu].insert(a, pb); a->setWhatsThis(tr("Print the entries of the phrase" " book.")); updatePhraseDict(); m_ui.actionBatchTranslation->setEnabled(phraseBooks[PhraseCloseMenu].count() > 0); return true;}bool TrWindow::savePhraseBook(QString &name, const PhraseBook &pb){ if (!name.contains(".qph") && !name.contains(".")) name += ".qph"; if (!pb.save(name)) { QMessageBox::warning(this, tr("Qt Linguist"), tr("Cannot create phrase book '%1'.").arg(name)); return false; } return true;}void TrWindow::updateProgress(){ int numNonobsolete = cmdl->getNumNonobsolete(); int numFinished = cmdl->getNumFinished(); if (numNonobsolete == 0) progress->setText(QString(" " " ")); else progress->setText(QString(" %1/%2 ").arg(numFinished) .arg(numNonobsolete)); m_ui.actionPrevUnfinished->setEnabled(numFinished != numNonobsolete); m_ui.actionNextUnfinished->setEnabled(numFinished != numNonobsolete); m_ui.actionPrev->setEnabled(cmdl->contextsInList() > 0); m_ui.actionNext->setEnabled(cmdl->contextsInList() > 0);}void TrWindow::updatePhraseDict(){ phraseDict.clear(); foreach (PhraseBook pb, phraseBooks[PhraseCloseMenu]) { foreach (Phrase p, pb) { QString f = friendlyString(p.source()); if ( f.length() > 0 ) { f = f.split(QChar(' ')).first(); if (!phraseDict.contains(f)) { PhraseBook pbe; phraseDict.insert(f, pbe); } phraseDict[f].append(p); } } } revalidate();}PhraseBook TrWindow::getPhrases(const QString &source){ PhraseBook phrases; QString f = friendlyString(source); QStringList lookupWords = f.split(QChar(' ')); foreach (QString s, lookupWords) { if (phraseDict.contains(s)) { PhraseBook ent = phraseDict.value(s); foreach (Phrase p, ent) { if (f.indexOf(friendlyString((p).source())) >= 0) phrases.append(p); } } } return phrases;}void TrWindow::printDanger(MessageItem *m){ danger(m, true);}bool TrWindow::updateDanger(MessageItem *m, bool verbose){ bool dngr = danger(m, verbose); if (dngr != m->danger()) m->setDanger(dngr); return dngr;}bool TrWindow::danger( const MessageItem *m, bool verbose ){ QString source = m->sourceText(); QStringList translations = m->translations(); if (m_ui.actionAccelerators->isChecked()) { bool sk = source.contains(Qt::Key_Ampersand); bool tk = true; for (int i = 0; i < translations.count() && tk; ++i) { tk &= bool(translations[i].contains(Qt::Key_Ampersand)); } if (!sk && tk) { if (verbose) statusBar()->showMessage(tr("Accelerator possibly superfluous in" " translation."), ErrorMS); return true; } else if (sk && !tk) { if (verbose) statusBar()->showMessage(tr("Accelerator possibly missing in" " translation."), ErrorMS); return true; } } if (m_ui.actionEndingPunctuation->isChecked()) { bool endingok = true; for (int i = 0; i < translations.count() && endingok; ++i) { endingok &= (ending( source, cmdl->language()) == ending(translations[i], cmdl->language() )); } if (!endingok) { if (verbose) statusBar()->showMessage(tr("Translation does not end with the" " same punctuation as the source text."), ErrorMS); return true; } } if (m_ui.actionPhraseMatches->isChecked()) { QString fsource = friendlyString(source); QString ftranslation = friendlyString(translations.first()); QStringList lookupWords = fsource.split(QChar(' ')); bool phraseFound; foreach (QString s, lookupWords) { if (phraseDict.contains(s)) { PhraseBook ent = phraseDict.value(s); phraseFound = false; foreach (Phrase p, ent) { if (fsource.indexOf(friendlyString(p.source())) < 0 || ftranslation.indexOf(friendlyString(p.target())) >= 0) { phraseFound = true; break; } } if (!phraseFound) { if (verbose) statusBar()->showMessage(tr("A phrase book suggestion for" " '%1' was ignored.").arg(s), ErrorMS ); return true; } } } } if (m_ui.actionPlaceMarkerMatches->isChecked()) { // Stores the occurence count of the place markers in the vector placeMarkerIndexes. // i.e. the occurence count of %1 is stored at placeMarkerIndexes[1], // count of %2 is stored at placeMarkerIndexes[2] etc. // In the first pass, it counts all place markers in the sourcetext. // In the second pass it (de)counts all place markers in the translation. // When finished, all elements should have returned to a count of 0, if not there is a mismatch // between place markers in the source text and the translation text. QVector<int> placeMarkerIndexes; QString translation; int numTranslations = translations.count(); for (int pass = 0; pass < numTranslations + 1; ++pass) { const QChar *uc_begin = source.unicode(); const QChar *uc_end = uc_begin + source.length(); if (pass >= 1) { translation = translations[pass - 1]; uc_begin = translation.unicode(); uc_end = uc_begin + translation.length(); } const QChar *c = uc_begin; while (c < uc_end) { if (c->unicode() == '%') { const QChar *escape_start = ++c; while (c->isDigit()) ++c; const QChar *escape_end = c; bool ok = true; int markerIndex = QString::fromRawData(escape_start, escape_end - escape_start).toInt(&ok); if (ok) { if (markerIndex >= placeMarkerIndexes.size()) { placeMarkerIndexes.resize(markerIndex + 1); } placeMarkerIndexes[markerIndex]+= (pass == 0 ? numTranslations : -1); } } ++c; } } for (int i = 0; i < placeMarkerIndexes.size(); ++i) { if (placeMarkerIndexes.at(i) != 0) { if (verbose) statusBar()->showMessage(tr("Translation does not refer" " to the same place markers as in the source text."), ErrorMS); return true; } } } if (verbose) statusBar()->clearMessage(); return false;}void TrWindow::readConfig(){ QString keybase(QString::number((QT_VERSION >> 16) & 0xff) + "." + QString::number((QT_VERSION >> 8) & 0xff) + "/"); QSettings config; QRect r( pos(), size() ); recentFiles = config.value(keybase + "RecentlyOpenedFiles").toStringList(); restoreGeometry(config.value(keybase + "Geometry/WindowGeometry").toByteArray()); restoreState(config.value(keybase + "MainWindowState").toByteArray()); m_ui.actionAccelerators->setChecked(config.value(keybase+ "Validators/Accelerator", true).toBool()); m_ui.actionEndingPunctuation->setChecked(config.value(keybase+ "Validators/EndingPunctuation", true).toBool()); m_ui.actionPhraseMatches->setChecked(config.value(keybase+ "Validators/PhraseMatch", true).toBool()); m_ui.actionPlaceMarkerMatches->setChecked(config.value(keybase+ "Validators/PlaceMarkers", true).toBool());}void TrWindow::writeConfig(){ QString keybase(QString::number( (QT_VERSION >> 16) & 0xff ) + "." + QString::number( (QT_VERSION >> 8) & 0xff ) + "/" ); QSettings config; config.setValue(keybase + "RecentlyOpenedFiles", recentFiles); config.setValue(keybase + "Geometry/WindowGeometry", saveGeometry()); config.setValue(keybase+ "Validators/Accelerator", m_ui.actionAccelerators->isChecked()); config.setValue(keybase+ "Validators/EndingPunctuation", m_ui.actionEndingPunctuation->isChecked()); config.setValue(keybase+ "Validators/PhraseMatch", m_ui.actionPhraseMatches->isChecked()); config.setValue(keybase+ "Validators/PlaceMarkers", m_ui.actionPlaceMarkerMatches->isChecked()); config.setValue(keybase + "MainWindowState", saveState());}void TrWindow::setupRecentFilesMenu(){ m_ui.menuRecentlyOpenedFiles->clear(); if (recentFiles.count() > 0) { m_ui.menuRecentlyOpenedFiles->setEnabled(true); QStringList::Iterator it = recentFiles.begin(); for (; it != recentFiles.end(); ++it) { m_ui.menuRecentlyOpenedFiles->addAction(*it); } } else { m_ui.menuRecentlyOpenedFiles->setEnabled(false); }}void TrWindow::recentFileActivated(QAction *action){ if (!action->text().isEmpty()) { if (maybeSave()) openFile(action->text()); }}void TrWindow::addRecentlyOpenedFile(const QString &fn, QStringList &lst){ QFileInfo fi(fn); if (lst.contains(fi.absoluteFilePath())) return; if ( lst.count() >= 10 ) lst.removeLast(); lst.prepend(fi.absoluteFilePath());}void TrWindow::toggleGuessing(){ me->toggleGuessing();}void TrWindow::focusSourceList(){ stv->setFocus();}void TrWindow::focusPhraseList(){ ptv->setFocus();}void TrWindow::toggleStatistics(){ if (m_ui.actionStatistics->isChecked()) { if (!stats) { stats = new Statistics(this); connect(cmdl, SIGNAL(statsChanged(int,int,int,int,int,int)), stats, SLOT(updateStats(int,int,int,int,int,int))); } stats->show(); updateStatistics(); } else if (stats) { stats->close(); }}void TrWindow::updateStatistics(){ // don't call this if stats dialog is not open // because this can be slow... if (!stats || !stats->isVisible()) return; cmdl->updateStatistics();}void TrWindow::finishedBatchTranslation(){ updateStatistics(); updateProgress(); updateCaption();}QStringList TrWindow::findFormFilesInCurrentTranslationFile(){ QStringList ret; for (MessageModel::iterator it = cmdl->begin(); it != cmdl->end(); ++it) { QString fileName = (*it)->message().fileName(); if (fileName.endsWith(QLatin1String(".ui"))) { if (!ret.contains(fileName)) { ret+=fileName; } } } return ret;}void TrWindow::previewForm(){ if (m_previewTool.isNull()) { m_previewTool = new TrPreviewTool(); QStringList fileNames = findFormFilesInCurrentTranslationFile(); bool ok = true; for (QStringList::iterator it = fileNames.begin(); it != fileNames.end(); ++it) { QString fileName = *it; if (!fileName.isEmpty() && QFileInfo(fileName).exists()) { if (!m_previewTool->addFormFile(fileName)) { ok = false; break; } } } if (ok) { ok = m_previewTool->addTranslator(cmdl->translator(), QFileInfo(filename).fileName()); if (ok) { m_previewTool->cascade(); } else { QMessageBox::warning(this, tr("Qt Linguist"), tr("There was a problem in the preparation of form preview.")); } } } else { // Only do a refresh if it is already open m_previewTool->reloadTranslations(); } m_previewTool->show();}void TrWindow::showTranslationSettings(){ if (!m_translationSettingsDialog) { m_translationSettingsDialog = new TranslationSettingsDialog(this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -