1 #include "localization.h" 3 #include <QApplication> 7 #include <QLibraryInfo> 11 #include <QStringList> 12 #include "plugins/engineplugin.h" 13 #include "plugins/pluginloader.h" 14 #include "datapaths.h" 17 const QString DEFINITION_FILE_PATTERN =
"*.def";
18 const QString TRANSLATIONS_LOCATION_SUBDIR =
"translations";
19 const int NUM_VALID_VERSION_TOKENS = 2;
20 const int NUM_VALID_TOKENS = 3;
22 QList<QTranslator*> Localization::currentlyLoadedTranslations;
24 class Localization::LocalizationLoader
27 LocalizationLoader() {};
29 QList<LocalizationInfo> loadLocalizationsList(
const QStringList& definitionsFileSearchDirs);
32 QList<LocalizationInfo> localizations;
34 void loadLocalizationsListFile(
const QString& definitionsFilePath);
35 void loadLocalizationsListFile(QIODevice& io);
43 int obtainVersion(QIODevice& io);
53 QList<LocalizationInfo> Localization::loadLocalizationsList(
const QStringList& definitionsFileSearchDirs)
56 return l.loadLocalizationsList(definitionsFileSearchDirs);
59 bool Localization::loadTranslation(
const QString& localeName)
62 qDeleteAll(currentlyLoadedTranslations);
63 currentlyLoadedTranslations.clear();
64 if (localeName ==
"en_EN")
68 TRANSLATIONS_LOCATION_SUBDIR);
70 installQtTranslations(localeName, searchPaths);
73 bool installed = installTranslation(localeName, searchPaths);
79 QTranslator *pluginTranslator = loadTranslationFile(
80 QString(
"%1_%2").arg(name, localeName),
84 gLog << QString(
"Loaded translation for plugin %1").arg(name);
85 QCoreApplication::installTranslator(pluginTranslator);
86 currentlyLoadedTranslations.append(pluginTranslator);
92 void Localization::installQtTranslations(
const QString &localeName, QStringList searchPaths)
99 searchPaths << QLibraryInfo::location(QLibraryInfo::TranslationsPath);
101 #if (QT_VERSION < QT_VERSION_CHECK(5, 3, 0)) 103 installTranslation(
"qt_" + localeName, searchPaths);
105 installTranslation(
"qtbase_" + localeName, searchPaths);
106 installTranslation(
"qtmultimedia_" + localeName, searchPaths);
110 bool Localization::installTranslation(
const QString &translationName,
const QStringList &searchPaths)
112 QTranslator* translator = loadTranslationFile(translationName, searchPaths);
113 if (translator != NULL)
115 QCoreApplication::installTranslator(translator);
116 currentlyLoadedTranslations.append(translator);
121 gLog << QString(
"Translation '%1' not found.").arg(translationName);
126 QTranslator* Localization::loadTranslationFile(
const QString& translationName,
const QStringList& searchPaths)
128 QTranslator* pTranslator =
new QTranslator();
129 bool bLoaded =
false;
130 foreach (
const QString& dir, searchPaths)
132 if (pTranslator->load(translationName, dir))
134 gLog << QString(
"Found translation '%1' in dir '%2'.").arg(translationName, dir);
147 QList<LocalizationInfo> Localization::LocalizationLoader::loadLocalizationsList(
const QStringList& definitionsFileSearchDirs)
149 foreach (
const QString& dirPath, definitionsFileSearchDirs)
151 loadLocalizationsListFile(dirPath);
154 return localizations;
157 void Localization::LocalizationLoader::loadLocalizationsListFile(
const QString& definitionsFilePath)
159 QDir dir(definitionsFilePath);
160 QStringList defFiles = dir.entryList(QStringList(DEFINITION_FILE_PATTERN), QDir::Files);
161 foreach (
const QString& defFileName, defFiles)
165 gLog << QString(
"Reading localizations definitions file: %1").arg(defFileName);
166 QString filePath = dir.absoluteFilePath(defFileName);
167 QFile file(filePath);
168 if (file.open(QIODevice::ReadOnly))
170 loadLocalizationsListFile(file);
175 gLog << QString(
"Failed to open localizations definitions file: %1").arg(definitionsFilePath);
180 void Localization::LocalizationLoader::loadLocalizationsListFile(QIODevice& io)
182 int version = obtainVersion(io);
185 gLog << QString(
"Translation definition file doesn't contain valid protocol version information.");
189 QString line = io.readLine();
190 while (!line.isEmpty())
192 line = line.trimmed();
194 if (!line.isEmpty() && !line.startsWith(
"#"))
196 QStringList tokens = line.split(
";");
197 if (tokens.size() == NUM_VALID_TOKENS)
202 info.
niceName = tokens[2].trimmed();
203 if (!localizations.contains(info))
205 localizations.append(info);
210 gLog << QString(
"Invalid localization definition: %1").arg(line);
213 line = io.readLine();
217 int Localization::LocalizationLoader::obtainVersion(QIODevice& io)
219 QString line = io.readLine();
224 QStringList tokens = line.split(
"=");
225 if (tokens.size() == NUM_VALID_VERSION_TOKENS)
227 QString versionToken = tokens[1];
229 version = versionToken.toInt(&bOk);
239 void Localization::LocalizationLoader::sort()
241 qSort(localizations.begin(), localizations.end(), localizationInfoLessThan);
QString localeName
Compliant with language_country standard. See QLocale::name()
QString niceName
Name that will be displayed to user.
EnginePlugin * info() const
Main plugin interface.
QString countryCodeName
The same as code used for country flags in IP2C.
QString nameCanonical() const
Derived from actual plugin name.
static QStringList staticDataSearchDirs(const QString &subdir=QString())
Paths to directories where program should search for its static data.