diff options
Diffstat (limited to 'src/corelib/kernel/qtranslator.cpp')
-rw-r--r-- | src/corelib/kernel/qtranslator.cpp | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index 794a4aaa0c..dad471c1b0 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -613,6 +613,13 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo return false; } +Q_NEVER_INLINE +static bool is_readable_file(const QString &name) +{ + const QFileInfo fi(name); + return fi.isReadable() && fi.isFile(); +} + static QString find_translation(const QLocale & locale, const QString & filename, const QString & prefix, @@ -625,9 +632,11 @@ static QString find_translation(const QLocale & locale, if (!path.isEmpty() && !path.endsWith(QLatin1Char('/'))) path += QLatin1Char('/'); } + const QString suffixOrDotQM = suffix.isNull() ? QStringLiteral(".qm") : suffix; - QFileInfo fi; QString realname; + realname += path + filename + prefix; // using += in the hope for some reserve capacity + const int realNameBaseSize = realname.size(); QStringList fuzzyLocales; // see http://www.unicode.org/reports/tr35/#LanguageMatching for inspiration @@ -646,16 +655,15 @@ static QString find_translation(const QLocale & locale, foreach (QString localeName, languages) { localeName.replace(QLatin1Char('-'), QLatin1Char('_')); - realname = path + filename + prefix + localeName + (suffix.isNull() ? QLatin1String(".qm") : suffix); - fi.setFile(realname); - if (fi.isReadable() && fi.isFile()) + realname += localeName + suffixOrDotQM; + if (is_readable_file(realname)) return realname; - realname = path + filename + prefix + localeName; - fi.setFile(realname); - if (fi.isReadable() && fi.isFile()) + realname.truncate(realNameBaseSize + localeName.size()); + if (is_readable_file(realname)) return realname; + realname.truncate(realNameBaseSize); fuzzyLocales.append(localeName); } @@ -668,33 +676,36 @@ static QString find_translation(const QLocale & locale, break; localeName.truncate(rightmost); - realname = path + filename + prefix + localeName + (suffix.isNull() ? QLatin1String(".qm") : suffix); - fi.setFile(realname); - if (fi.isReadable() && fi.isFile()) + realname += localeName + suffixOrDotQM; + if (is_readable_file(realname)) return realname; - realname = path + filename + prefix + localeName; - fi.setFile(realname); - if (fi.isReadable() && fi.isFile()) + realname.truncate(realNameBaseSize + localeName.size()); + if (is_readable_file(realname)) return realname; + + realname.truncate(realNameBaseSize); } } + const int realNameBaseSizeFallbacks = path.size() + filename.size(); + + // realname == path + filename + prefix; if (!suffix.isNull()) { - realname = path + filename + suffix; - fi.setFile(realname); - if (fi.isReadable() && fi.isFile()) + realname.replace(realNameBaseSizeFallbacks, prefix.size(), suffix); + // realname == path + filename; + if (is_readable_file(realname)) return realname; + realname.replace(realNameBaseSizeFallbacks, suffix.size(), prefix); } - realname = path + filename + prefix; - fi.setFile(realname); - if (fi.isReadable() && fi.isFile()) + // realname == path + filename + prefix; + if (is_readable_file(realname)) return realname; - realname = path + filename; - fi.setFile(realname); - if (fi.isReadable() && fi.isFile()) + realname.truncate(realNameBaseSizeFallbacks); + // realname == path + filename; + if (is_readable_file(realname)) return realname; return QString(); |