📄 translator.cpp
字号:
quint16 *hTable = new quint16[hTableSize]; memset(hTable, 0, hTableSize * sizeof(quint16)); t << hTableSize; t.device()->seek(2 + (hTableSize << 1)); t << (quint16)0; // the entry at offset 0 cannot be used uint upto = 2; QMap<int, const char *>::const_iterator entry = hashMap.constBegin(); while (entry != hashMap.constEnd()) { int i = entry.key(); hTable[i] = (quint16)(upto >> 1); do { const char *con = entry.value(); uint len = (uint)qstrlen(con); len = qMin(len, 255u); t << (quint8)len; t.writeRawData(con, len); upto += 1 + len; ++entry; } while (entry != hashMap.constEnd() && entry.key() == i); do { t << (quint8) 0; // empty string ++upto; } while ((upto & 0x1) != 0); // offsets have to be even } t.device()->seek(2); for (int j = 0; j < hTableSize; j++) t << hTable[j]; delete [] hTable; if (upto > 131072) { qWarning("Translator::squeeze: Too many contexts"); d->contextArray.clear(); } }}void Translator::unsqueeze(){ if (!d->messages.isEmpty() || d->messageArray.isEmpty()) return; qFatal("Cannot unsqueeze (bug in Linguist?)");}bool Translator::contains(const char* context, const char* sourceText, const char* comment) const{ return !findMessage(context, sourceText, comment).translation().isNull();}bool Translator::contains(const char *context, const char *comment, const QString &fileName, int lineNumber) const{ return !findMessage(context, 0, comment, fileName, lineNumber).isNull();}void Translator::insert(const TranslatorMessage& message){ unsqueeze(); d->messages.remove(message); // safer d->messages.insert(message, (void *) 0);}void Translator::remove(const TranslatorMessage& message){ unsqueeze(); d->messages.remove(message);}TranslatorMessage Translator::findMessage(const char *context, const char *sourceText, const char *comment, const QString &fileName, int lineNumber) const{ if (context == 0) context = ""; if (sourceText == 0) sourceText = ""; if (comment == 0) comment = ""; QString myFilename = fileName; int myLineNumber = lineNumber; if (!d->messages.isEmpty()) { QMap<TranslatorMessage, void *>::const_iterator it; // Either we want to find an item that matches context, sourcetext (and optionally comment) // Or we want to find an item that matches context, filename, linenumber (and optionally comment) it = d->messages.constFind(TranslatorMessage(context, sourceText, comment, myFilename, myLineNumber)); if (it != d->messages.constEnd()) return it.key(); if (comment[0]) { it = d->messages.constFind(TranslatorMessage(context, sourceText, "", myFilename, myLineNumber)); if (it != d->messages.constEnd()) return it.key(); } it = d->messages.constFind(TranslatorMessage(context, "", comment, myFilename, myLineNumber)); if (it != d->messages.constEnd()) return it.key(); if (comment[0]) { it = d->messages.constFind(TranslatorMessage(context, "", "", myFilename, myLineNumber)); if (it != d->messages.constEnd()) return it.key(); } return TranslatorMessage(); } return TranslatorMessage();}bool Translator::isEmpty() const{ return !d->unmapPointer && !d->unmapLength && d->messageArray.isEmpty() && d->offsetArray.isEmpty() && d->contextArray.isEmpty() && d->messages.isEmpty();}void Translator::setNumerusRules(const QByteArray &rules){ d->numerusRules = rules;}QList<TranslatorMessage> Translator::messages() const{ ((Translator *) this)->unsqueeze(); return d->messages.keys();}TranslatorMessage::TranslatorMessage() : m_hash(0), m_fileName(), m_lineNumber(-1){}TranslatorMessage::TranslatorMessage(const char * context, const char * sourceText, const char * comment, const QString &fileName, int lineNumber, const QStringList& translations) : m_context(context), m_sourcetext(sourceText), m_comment(comment), m_translations(translations), m_fileName(fileName), m_lineNumber(lineNumber){ // 0 means we don't know, "" means empty if (m_context == (const char*)0) m_context = ""; if (m_sourcetext == (const char*)0) m_sourcetext = ""; if (m_comment == (const char*)0) m_comment = ""; m_hash = elfHash(m_sourcetext + m_comment);}TranslatorMessage::TranslatorMessage(const TranslatorMessage & m) : m_context(m.m_context), m_sourcetext(m.m_sourcetext), m_comment(m.m_comment), m_translations(m.m_translations), m_fileName(m.m_fileName), m_lineNumber(m.m_lineNumber){ m_hash = m.m_hash;}TranslatorMessage & TranslatorMessage::operator=( const TranslatorMessage & m){ m_hash = m.m_hash; m_context = m.m_context; m_sourcetext = m.m_sourcetext; m_comment = m.m_comment; m_translations = m.m_translations; m_fileName = m.m_fileName; m_lineNumber = m.m_lineNumber; return *this;}void TranslatorMessage::write(QDataStream & stream, bool strip, Prefix prefix) const{ for (int i = 0; i < m_translations.count(); ++i) stream << quint8(Tag_Translation) << m_translations.at(i); if (!strip) prefix = HashContextSourceTextComment; switch (prefix) { case HashContextSourceTextComment: stream << quint8(Tag_Comment) << m_comment; // fall through case HashContextSourceText: stream << quint8(Tag_SourceText) << m_sourcetext; // fall through case HashContext: stream << quint8(Tag_Context) << m_context; default: ; } stream << quint8(Tag_End);}TranslatorMessage::Prefix TranslatorMessage::commonPrefix(const TranslatorMessage& m) const{ if (m_hash != m.m_hash) return NoPrefix; if (m_context != m.m_context) return Hash; if (m_sourcetext != m.m_sourcetext) return HashContext; if (m_comment != m.m_comment) return HashContextSourceText; return HashContextSourceTextComment;}bool TranslatorMessage::operator==(const TranslatorMessage& m) const{ bool isHashEq = (m_hash == m.m_hash ? true : false); bool isContextEq = (m_context == m.m_context ? true : false); bool isSourceEq = (m_sourcetext == m.m_sourcetext ? true : false); bool isCommentEq = (m_comment == m.m_comment ? true : false); bool isLocationEq = m_lineNumber == m.m_lineNumber && m_fileName == m.m_fileName; return (isHashEq && isContextEq && isSourceEq && isCommentEq) || // translation can be different, but treat the equal (m_sourcetext.isEmpty() && isContextEq && isCommentEq && isLocationEq);}bool TranslatorMessage::operator<(const TranslatorMessage& m) const{ return m_hash != m.m_hash ? m_hash < m.m_hash : (m_context != m.m_context ? m_context < m.m_context : (m_sourcetext != m.m_sourcetext ? m_sourcetext < m.m_sourcetext : m_comment < m.m_comment));}bool getNumerusInfo(QLocale::Language language, QLocale::Country country, QByteArray *rules, QStringList *forms){ forever { for (int i = 0; i < NumerusTableSize; ++i) { const NumerusTableEntry &entry = numerusTable[i]; for (int j = 0; entry.languages[j] != EOL; ++j) { if (entry.languages[j] == language && ((!entry.countries && country == QLocale::AnyCountry) || (entry.countries && entry.countries[j] == country))) { if (rules) { *rules = QByteArray::fromRawData(reinterpret_cast<const char *>(entry.rules), entry.rulesSize); } if (forms) { forms->clear(); for (int k = 0; entry.forms[k]; ++k) forms->append(QLatin1String(entry.forms[k])); } return true; } } } if (country == QLocale::AnyCountry) break; country = QLocale::AnyCountry; } return false;}#endif // QT_NO_TRANSLATION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -