Skip to content

Commit b122666

Browse files
committed
Merge pull request nemomobile#19 from mikkoharju/translators
[mlite] Do not install translators from desktop files
2 parents 8fe2a7e + e9707d7 commit b122666

5 files changed

+60
-42
lines changed

src/mdesktopentry.cpp

+27-30
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ const QString URLKey("Desktop Entry/URL");
4848
const QString LogicalIdKey("Desktop Entry/X-MeeGo-Logical-Id");
4949
const QString TranslationCatalogKey("Desktop Entry/X-MeeGo-Translation-Catalog");
5050
const QString XMaemoServiceKey("Desktop Entry/X-Maemo-Service");
51-
QMap<QString, QSharedPointer<QTranslator> > MDesktopEntryPrivate::translators;
5251

5352
// The syntax of the locale string in the POSIX environment variables
5453
// related to locale is:
@@ -94,34 +93,7 @@ MDesktopEntryPrivate::MDesktopEntryPrivate(const QString &fileName) :
9493

9594
//Checks if the file exists and opens it in readonly mode
9695
if (file.exists() && file.open(QIODevice::ReadOnly)) {
97-
if (readDesktopFile(file, desktopEntriesMap)) {
98-
// Load the translation catalog if it has been defined for the entry.
99-
if (desktopEntriesMap.contains(TranslationCatalogKey)) {
100-
// Load the catalog from disk if it's not yet loaded
101-
QString catalog = desktopEntriesMap.value(TranslationCatalogKey);
102-
QString engineeringEnglishCatalog = catalog + "_eng_en";
103-
if (!translators.contains(engineeringEnglishCatalog)) {
104-
QTranslator *translator = new QTranslator;
105-
if (translator->load(engineeringEnglishCatalog, "/usr/share/translations")) {
106-
translators[engineeringEnglishCatalog] = QSharedPointer<QTranslator>(translator);
107-
qApp->installTranslator(translator);
108-
} else {
109-
delete translator;
110-
}
111-
}
112-
113-
if (!translators.contains(catalog)) {
114-
QTranslator *translator = new QTranslator;
115-
if (translator->load(QLocale(), catalog, "-", "/usr/share/translations")) {
116-
translators[catalog] = QSharedPointer<QTranslator>(translator);
117-
qApp->installTranslator(translator);
118-
} else {
119-
qDebug() << "Unable to load catalog" << catalog;
120-
delete translator;
121-
}
122-
}
123-
}
124-
}
96+
readDesktopFile(file, desktopEntriesMap);
12597
} else {
12698
qDebug() << "Specified Desktop file does not exist" << fileName;
12799
}
@@ -137,6 +109,18 @@ bool MDesktopEntryPrivate::readDesktopFile(QIODevice &device, QMap<QString, QStr
137109
return valid;
138110
}
139111

112+
QTranslator *MDesktopEntryPrivate::loadTranslator() const
113+
{
114+
QTranslator *translator = new QTranslator;
115+
QString catalog = desktopEntriesMap.value(TranslationCatalogKey);
116+
if (catalog.isNull() || !translator->load(QLocale(), catalog, "-", "/usr/share/translations")) {
117+
qDebug() << "Unable to load catalog" << catalog;
118+
delete translator;
119+
translator = 0;
120+
}
121+
return translator;
122+
}
123+
140124
bool MDesktopEntry::readDesktopFile(QIODevice &device, QMap<QString, QString> &desktopEntriesMap)
141125
{
142126
bool valid = true;
@@ -335,11 +319,23 @@ QString MDesktopEntry::version() const
335319

336320
QString MDesktopEntry::name() const
337321
{
322+
Q_D(const MDesktopEntry);
323+
324+
if (!d->translatedName.isNull())
325+
return d->translatedName;
326+
338327
QString name = value(NameKey);
339328

340329
if (contains(LogicalIdKey)) {
341330
QString key = value(LogicalIdKey);
342-
QString translation = qtTrId(key.toLatin1().data());
331+
QString translation;
332+
QScopedPointer<QTranslator> translator(d->loadTranslator());
333+
if (translator) {
334+
translation = translator->translate(0, key.toLatin1().data(), 0, -1);
335+
} else {
336+
translation = qtTrId(key.toLatin1().data());
337+
}
338+
343339
if (!translation.isEmpty() && translation != key) {
344340
name = translation;
345341
}
@@ -360,6 +356,7 @@ QString MDesktopEntry::name() const
360356
}
361357
}
362358

359+
d->translatedName = name;
363360
return name;
364361
}
365362

src/mdesktopentry_p.h

+9-3
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ class MDesktopEntryPrivate
5757
//! A map for storing the desktop entries keys and their corresponding values
5858
QMap<QString, QString> desktopEntriesMap;
5959

60-
//! A map for storing translators for translation catalogs
61-
static QMap<QString, QSharedPointer<QTranslator> > translators;
62-
6360
/*!
6461
* Returns the boolean value of a key.
6562
*
@@ -80,6 +77,15 @@ class MDesktopEntryPrivate
8077
//! Flag to indicate whether the desktop entry is valid during parsing
8178
bool valid;
8279

80+
//! Cached translated name
81+
mutable QString translatedName;
82+
83+
/*!
84+
* Loads a QTranslator from X-MeeGo-Translation-Catalog
85+
* \return A translator for specified catalog, or null
86+
*/
87+
QTranslator *loadTranslator() const;
88+
8389
protected:
8490
/*
8591
* \brief this q_ptr starts the inheritance hierarchy

tests/ut_mdesktopentry.cpp

+15-8
Original file line numberDiff line numberDiff line change
@@ -371,22 +371,28 @@ void UtMDesktopEntry::localization_data()
371371
"Name[sr@Latn]=l_vFoo\n",
372372
"sr_YU@Latn", "l_vFoo");
373373

374-
Helper::add("logical", "X-MeeGo-Logical-Id=LogicalFoo", QString(), "LogicalFooTranslated");
375-
Helper::add("logical_noTranslation", "X-MeeGo-Logical-Id=LogicalFooNoTr", QString(), "Foo");
376-
}
374+
QString entry = QString("X-MeeGo-Logical-Id=LogicalBar\n"
375+
"X-MeeGo-Translation-Catalog=%1/ut_mdesktopentry2.qm")
376+
.arg(QCoreApplication::applicationDirPath());
377377

378-
void UtMDesktopEntry::localization()
379-
{
380-
QFETCH(Values, values);
381-
QFETCH(QString, lang);
382-
QFETCH(QString, expected);
378+
Helper::add("logical_fromCatalog", entry, QString(), "LogicalBarTranslated");
379+
Helper::add("logical_global", "X-MeeGo-Logical-Id=LogicalFoo", QString(), "LogicalFooTranslated");
380+
Helper::add("logical_noTranslation", "X-MeeGo-Logical-Id=LogicalFooNoTr", QString(), "Foo");
381+
Helper::add("logical_other", "X-MeeGo-Logical-Id=LogicalBar", QString(), "Foo");
383382

384383
QTranslator *const translator = new QTranslator;
385384
const bool loadOk = translator->load("ut_mdesktopentry",
386385
QCoreApplication::instance()->applicationDirPath());
387386
Q_ASSERT(loadOk);
388387
qApp->installTranslator(translator);
389388
Q_ASSERT(qtTrId("LogicalFoo") == "LogicalFooTranslated");
389+
}
390+
391+
void UtMDesktopEntry::localization()
392+
{
393+
QFETCH(Values, values);
394+
QFETCH(QString, lang);
395+
QFETCH(QString, expected);
390396

391397
if (!lang.isEmpty()) {
392398
qputenv("LANG", lang.toLocal8Bit());
@@ -395,6 +401,7 @@ void UtMDesktopEntry::localization()
395401
MDesktopEntry entry(createDesktopEntry(values));
396402
QCOMPARE(entry.nameUnlocalized(), QString("Foo"));
397403
QCOMPARE(entry.name(), expected);
404+
QVERIFY2(qtTrId("LogicalBar") != "LogicalBarTranslated", "MDesktopEntry: A translator was installed globally");
398405
}
399406

400407
QString UtMDesktopEntry::createDesktopEntry(const Values &values)

tests/ut_mdesktopentry.pro

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
include(testapplication.pri)
22

3-
TRANSLATIONS = ut_mdesktopentry.ts
3+
TRANSLATIONS = ut_mdesktopentry.ts ut_mdesktopentry2.ts
44

55
lrelease.input = TRANSLATIONS
66
lrelease.output = ${QMAKE_FILE_BASE}.qm

tests/ut_mdesktopentry2.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!DOCTYPE TS>
2+
<TS>
3+
<context>
4+
<message id="LogicalBar">
5+
<translation>LogicalBarTranslated</translation>
6+
</message>
7+
</context>
8+
</TS>

0 commit comments

Comments
 (0)