📄 messagemodel.cpp
字号:
if ((sortOrder == Qt::AscendingOrder) ? (nleft < nright) : (nleft > nright)) return true; break; } case 2: nleft = left->finishedCount(); nright = right->finishedCount(); if ((sortOrder == Qt::AscendingOrder) ? (nleft < nright) : (nleft > nright)) return true; break; default: nleft = nright = 0; break; } if (sSortColumn != 1 && nleft == nright) { sortOrder = Qt::AscendingOrder; } if (sSortColumn == 1 || nleft == nright) { res = QString::localeAwareCompare(left->context(), right->context()); if ((sortOrder == Qt::AscendingOrder) ? (res < 0) : !(res < 0)) return true; } return false;}ContextItem *MessageModel::contextItem(int context) const{ if (context >= 0 && context < cntxtList.count()) return cntxtList[context]; return 0;}/** * class MessageModelTranslator * * */class MessageModelTranslator : public QTranslator{public: MessageModelTranslator(MessageModel *msgmodel): QTranslator(msgmodel) { //m_msgModel = msgmodel; } virtual ~MessageModelTranslator() {} virtual bool isEmpty() const; virtual QString translate(const char *context, const char *sourcetext, const char *comment = 0) const;private: MessageModel *messageModel() const { return static_cast<MessageModel*>(parent()); }};bool MessageModelTranslator::isEmpty() const{ return messageModel()->isEmpty();}QString MessageModelTranslator::translate(const char *context, const char *sourcetext, const char *comment /*= 0*/) const{ MessageItem *m = messageModel()->findMessage(context, sourcetext, comment); return m ? m->translation() : QString();}MessageItem *MessageModel::messageItem(int context, int message) const{ ContextItem *c = contextItem(context); if (c && message >= 0 && message < c->messageItemsInList()) return c->messageItem(message); return 0;}bool MessageModel::findMessage(int *contextNo, int *itemNo, const QString &findText, int findWhere, bool matchSubstring, Qt::CaseSensitivity cs){ bool found = false; if (contextsInList() <= 0) return false; int pass = 0; int scopeNum = *contextNo; int itemNum = *itemNo; MessageItem *m = 0; // We want to search the scope we started from *again*, since we did not necessarily search that *completely* when we started. // (Problaby we started somewhere in the middle of it.) // Therefore, "pass <=" and not "pass < " while (!found && pass <= contextsInList()) { ContextItem *c = contextList().at(scopeNum); for (int mit = itemNum; mit < c->messageItemsInList() ; ++mit) { m = c->messageItem(mit); QString searchText; switch (findWhere) { case SourceText: searchText = m->sourceText(); break; case Translations: searchText = m->translation(); break; case Comments: searchText = c->fullContext(); break; } if (matchSubstring) { if (searchText.indexOf(findText,0, cs) >= 0) { found = true; break; } } else { if (cs == Qt::CaseInsensitive) { if (findText.toLower() == searchText.toLower()) { found = true; break; } } else { if ( findText == searchText ) { found = true; break; } } } } itemNum = 0; ++pass; ++scopeNum; if (scopeNum >= contextsInList()) { scopeNum = 0; //delayedMsg = tr("Search wrapped."); } } if (found) { *itemNo = itemNum; *contextNo = scopeNum; } return found;}bool MessageModel::load(const QString &fileName){ MetaTranslator tor; bool ok = tor.load(fileName); if (ok) { int messageCount = 0; clearContextList(); m_numFinished = 0; m_numNonobsolete = 0; TML all = tor.messages(); QHash<QString, ContextItem*> contexts; m_srcWords = 0; m_srcChars = 0; m_srcCharsSpc = 0; foreach(MetaTranslatorMessage mtm, all) { QCoreApplication::processEvents(); ContextItem *c; if (contexts.contains(QString(mtm.context()))) { c = contexts.value( QString(mtm.context())); } else { c = createContextItem(tor.toUnicode(mtm.context(), mtm.utf8()));; appendContextItem(c); contexts.insert(QString(mtm.context()), c); } if (QByteArray(mtm.sourceText()) == ContextComment) { c->appendToComment(tor.toUnicode(mtm.comment(), mtm.utf8())); } else { MessageItem *tmp = new MessageItem(mtm, tor.toUnicode(mtm.sourceText(), mtm.utf8()), tor.toUnicode(mtm.comment(), mtm.utf8()), c); if (mtm.type() != MetaTranslatorMessage::Obsolete) { m_numNonobsolete++; //if (mtm.type() == MetaTranslatorMessage::Finished) //tmp->setFinished(true); //++m_numFinished; doCharCounting(tmp->sourceText(), m_srcWords, m_srcChars, m_srcCharsSpc); } else { c->incrementObsoleteCount(); } c->appendMessageItem(tmp); ++messageCount; } } QString lang = tor.languageCode(); if (lang.isEmpty()) { int pos_sep = fileName.indexOf(QChar('_')); if (pos_sep + 3 <= fileName.length()) { lang = fileName.mid(pos_sep + 1, 2); } } QLocale::Language l; QLocale::Country c; MetaTranslator::languageAndCountry(lang, &l, &c); if (l == QLocale::C) { QLocale sys = QLocale::system(); l = sys.language(); c = sys.country(); } setLanguage(l); setCountry(c); // locale will be 'C' if we could not find the language in the ts file nor // guestimate the language from the filename m_numMessages = messageCount; updateAll(); setModified(false); } return ok;}bool MessageModel::save(const QString &fileName){ MetaTranslator tor; MessageItem *m; for (iterator it = begin(); (m = it.current()); ++it) { tor.insert(m->message()); } QLocale locale(m_language, m_country); if (m_country == QLocale::AnyCountry) { QString languageCode = locale.name().section(QLatin1Char('_'), 0, 0); if (languageCode.length() <= 3) { tor.setLanguageCode(languageCode); } }else { QString languageCode = locale.name(); tor.setLanguageCode(languageCode); } bool ok = tor.save(fileName); if (ok) setModified(false); return ok;}bool MessageModel::release(const QString& fileName, bool verbose /*= false*/, bool ignoreUnfinished /*= false*/, Translator::SaveMode mode /*= Translator::Stripped */){ QFile file(fileName); if (file.open(QIODevice::WriteOnly)) { bool ok = release(&file, verbose, ignoreUnfinished, mode); file.close(); return ok; } return false;}bool MessageModel::release(QIODevice *iod, bool verbose /*= false*/, bool ignoreUnfinished /*= false*/, Translator::SaveMode mode /*= Translator::Stripped */){ MetaTranslator tor; MessageItem *m; QLocale locale(m_language, m_country); tor.setLanguageCode(locale.name()); for (MessageModel::iterator it = begin() ; (m = it.current()) ; ++it) { tor.insert(m->message()); } return tor.release(iod, verbose, ignoreUnfinished, mode);}void MessageModel::doCharCounting(const QString& text, int& trW, int& trC, int& trCS){ trCS += text.length(); bool inWord = false; for (int i=0; i<(int)text.length(); ++i) { if (text[i].isLetterOrNumber() || text[i] == QChar('_')) { if (!inWord) { ++trW; inWord = true; } } else { inWord = false; } if (!text[i].isSpace()) trC++; }}QLocale::Language MessageModel::language() const{ return m_language;}void MessageModel::setLanguage(QLocale::Language lang){ if (m_language != lang) { m_language = lang; emit languageChanged(m_language); }}QLocale::Country MessageModel::country() const{ return m_country;}void MessageModel::setCountry(QLocale::Country country){ m_country = country;}void MessageModel::updateStatistics(){ QList<ContextItem *> ctxtList; QList<MessageItem *> msgList; const MessageItem *mi; int trW = 0; int trC = 0; int trCS = 0; for (MessageModel::iterator it = begin(); (mi = it.current()); ++it) { if (mi->finished() && !(mi->message().type() == MetaTranslatorMessage::Obsolete)) doCharCounting(mi->translation(), trW, trC, trCS); } emit statsChanged(m_srcWords, m_srcChars, m_srcCharsSpc, trW, trC, trCS);}MessageItem *MessageModel::findMessage(const char *context, const char *sourcetext, const char *comment /*= 0*/) const{ for (int c = 0; c < cntxtList.count(); ++c) { ContextItem *ctx = cntxtList.at(c); if (ctx->context() == QLatin1String(context)) { QList<MessageItem*> items = ctx->messageItemList(); for (int i = 0; i < items.count(); ++i) { MessageItem *mi = items.at(i); if (mi->sourceText() == QLatin1String(sourcetext)) { if (comment) { if (mi->comment() != QLatin1String(comment)) continue; } return mi; } } break; } } return 0;}QTranslator *MessageModel::translator(){ if (!m_translator) m_translator = static_cast<QTranslator*>(new MessageModelTranslator(this)); return m_translator;}/****************************************************************************** * * MessageModel::iterator IMPLEMENTATION * **************************************************************************** */MessageModel::iterator::iterator(ContextList *contextList, int contextNo /*= 0*/, int itemNo /*=0*/) : m_contextList(contextList), m_contextNo(contextNo), m_itemNo(itemNo){}MessageModel::iterator::iterator(MessageModel *model, int contextNo /*= 0*/, int itemNo /*=0*/) : m_contextList(&model->cntxtList), m_contextNo(contextNo), m_itemNo(itemNo){}MessageModel::iterator::iterator(const MessageModel::iterator& other){ *this = other;}MessageModel::iterator &MessageModel::iterator::operator=(const MessageModel::iterator& other){ m_contextList = other.m_contextList; m_contextNo = other.m_contextNo; m_itemNo = other.m_itemNo; return *this;}MessageModel::iterator &MessageModel::iterator::operator++(){ ++m_itemNo; if (m_itemNo >= m_contextList->at(m_contextNo)->messageItemsInList()) { ++m_contextNo; if (m_contextNo != m_contextList->count()) m_itemNo = 0; } return *this;}MessageItem *MessageModel::iterator::current() const{ if (m_contextNo >= 0 && m_contextNo < m_contextList->count()) { if (m_itemNo >= 0 && m_itemNo < m_contextList->at(m_contextNo)->messageItemsInList()) { return m_contextList->at(m_contextNo)->messageItem(m_itemNo); } } return 0;}MessageItem *MessageModel::iterator::operator*() const{ return current();}void MessageModel::iterator::reset(){ m_contextNo = 0; m_itemNo = 0;}/****************************************************************************** * * ContextList IMPLEMENTATION * **************************************************************************** */ContextList::ContextList(){ m_modified = false;}bool ContextList::isModified(){ return m_modified;}ContextItem *ContextList::contextItem(int context) const{ if (context >= 0 && context < count()) return at(context); return 0;}MessageItem *ContextList::messageItem(int context, int message) const{ ContextItem *c = contextItem(context); if (c && message >= 0 && message < c->messageItemsInList()) return c->messageItem(message); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -