diff --git a/kdecore/kernel/kglobal.cpp b/kdecore/kernel/kglobal.cpp index 6acbf8fb..88c93639 100644 --- a/kdecore/kernel/kglobal.cpp +++ b/kdecore/kernel/kglobal.cpp @@ -33,9 +33,10 @@ #include // umask #include -#include -#include -#include +#include +#include +#include +#include #include #include @@ -43,12 +44,8 @@ #include #include #include -#undef QT_NO_TRANSLATION -#include -#define QT_NO_TRANSLATION -#include -#include #include "kcmdlineargs.h" +#include "kcatalog_p.h" mode_t s_umsk; @@ -58,6 +55,9 @@ class KGlobalPrivate inline KGlobalPrivate() : locale(0), charsets(0), +#ifndef QT_NO_TRANSLATION + translator(0), +#endif localeIsFromFakeComponent(false) { // the umask is read here before any threads are created to avoid race conditions @@ -68,6 +68,10 @@ class KGlobalPrivate inline ~KGlobalPrivate() { +#ifndef QT_NO_TRANSLATION + delete translator; + translator = 0; +#endif delete locale; locale = 0; delete charsets; @@ -78,6 +82,9 @@ class KGlobalPrivate KComponentData mainComponent; // holds a refcount KLocale *locale; KCharsets *charsets; +#ifndef QT_NO_TRANSLATION + KDETranslator* translator; +#endif bool localeIsFromFakeComponent; QStringList catalogsToInsert; @@ -173,7 +180,10 @@ KLocale *KGlobal::locale() " takes care of this. If not using KApplication, call KGlobal::locale() during initialization."); #ifndef QT_NO_TRANSLATION } else { - QCoreApplication::installTranslator(new KDETranslator(coreApp)); + delete d->translator; + d->translator = 0; + d->translator = new KDETranslator(); + QCoreApplication::installTranslator(d->translator); #endif } } diff --git a/kdecore/kernel/kglobal_p.h b/kdecore/kernel/kglobal_p.h index c50778e4..2d9b4d7f 100644 --- a/kdecore/kernel/kglobal_p.h +++ b/kdecore/kernel/kglobal_p.h @@ -32,7 +32,8 @@ namespace KGlobal #include "kglobal.h" #include "klocale.h" -#include + +#include #ifndef QT_NO_TRANSLATION class KDETranslator : public QTranslator diff --git a/kdecore/localization/kcatalog.cpp b/kdecore/localization/kcatalog.cpp index 68899d14..4e6a183d 100644 --- a/kdecore/localization/kcatalog.cpp +++ b/kdecore/localization/kcatalog.cpp @@ -24,30 +24,14 @@ #include #include -static QByteArray translationData(const QByteArray &localeDir, const QByteArray &language, const QByteArray &name) -{ - QByteArray translationpath = localeDir; - translationpath.append('/'); - translationpath.append(language); - translationpath.append('/'); - translationpath.append(name); - translationpath.append(".tr"); - QFile translationfile(QFile::decodeName(translationpath)); - if (!translationfile.open(QFile::ReadOnly)) { - return QByteArray(); - } - return translationfile.readAll(); -} - class KCatalogPrivate { public: KCatalogPrivate(); ~KCatalogPrivate(); - QByteArray language; - QByteArray name; - QByteArray localeDir; + QString language; + QString name; #ifndef QT_NO_TRANSLATION QTranslator* translator; @@ -66,20 +50,19 @@ KCatalogPrivate::~KCatalogPrivate() QDebug operator<<(QDebug debug, const KCatalog &c) { - return debug << c.d->language << " " << c.d->name << " " << c.d->localeDir; + return debug << c.d->language << " " << c.d->name; } KCatalog::KCatalog(const QString &name, const QString &language) : d(new KCatalogPrivate()) { - d->language = QFile::encodeName(language); - d->name = QFile::encodeName(name); - d->localeDir = QFile::encodeName(catalogLocaleDir(name, language)); + d->language = language; + d->name = name; #ifndef QT_NO_TRANSLATION d->translator = new QTranslator(); - d->translator->loadFromData(translationData(d->localeDir, d->language, d->name)); - // kDebug() << << name << language << localeDir; + d->translator->loadFromData(catalogData(d->name, d->language)); + // kDebug() << << name << language; #endif } @@ -88,11 +71,10 @@ KCatalog::KCatalog(const KCatalog &rhs) { d->language = rhs.d->language; d->name = rhs.d->name; - d->localeDir = rhs.d->localeDir; #ifndef QT_NO_TRANSLATION d->translator = new QTranslator(); - d->translator->loadFromData(translationData(d->localeDir, d->language, d->name)); + d->translator->loadFromData(catalogData(d->name, d->language)); #endif } @@ -100,10 +82,9 @@ KCatalog & KCatalog::operator=(const KCatalog & rhs) { d->language = rhs.d->language; d->name = rhs.d->name; - d->localeDir = rhs.d->localeDir; #ifndef QT_NO_TRANSLATION - d->translator->loadFromData(translationData(d->localeDir, d->language, d->name)); + d->translator->loadFromData(catalogData(d->name, d->language)); #endif return *this; } @@ -116,23 +97,33 @@ KCatalog::~KCatalog() QString KCatalog::catalogLocaleDir(const QString &name, const QString &language) { - QString relpath = QString::fromLatin1("%1/%2.tr").arg(language).arg(name); + const QString relpath = QString::fromLatin1("%1/%2.tr").arg(language).arg(name); return KGlobal::dirs()->findResourceDir("locale", relpath); } +QByteArray KCatalog::catalogData(const QString &name, const QString &language) +{ + const QString relpath = QString::fromLatin1("%1/%2.tr").arg(language).arg(name); + const QString translationpath = KGlobal::dirs()->locate("locale", relpath); + if (translationpath.isEmpty()) { + return QByteArray(); + } + QFile translationfile(translationpath); + if (!translationfile.open(QFile::ReadOnly)) { + return QByteArray(); + } + return translationfile.readAll(); +} + + QString KCatalog::name() const { - return QFile::decodeName(d->name); + return d->name; } QString KCatalog::language() const { - return QFile::decodeName(d->language); -} - -QString KCatalog::localeDir() const -{ - return QFile::decodeName(d->localeDir); + return d->language; } QString KCatalog::translate(const char * msgid) const diff --git a/kdecore/localization/kcatalog_p.h b/kdecore/localization/kcatalog_p.h index 17287186..bfbea7d8 100644 --- a/kdecore/localization/kcatalog_p.h +++ b/kdecore/localization/kcatalog_p.h @@ -42,17 +42,17 @@ public: * @param name The name of the catalog * @param language The language of this catalog */ - KCatalog( const QString &name, const QString &language ); + KCatalog(const QString &name, const QString &language); /** * Copy constructor. */ - KCatalog(const KCatalog & rhs); + KCatalog(const KCatalog &rhs); /** * Assignment operator. */ - KCatalog & operator = ( const KCatalog & rhs); + KCatalog& operator=(const KCatalog &rhs); /** * Destructor. @@ -67,8 +67,18 @@ public: * * @return The locale directory if found, QString() otherwise. */ - static QString catalogLocaleDir( const QString &name, - const QString &language ); + static QString catalogLocaleDir(const QString &name, const QString &language); + + /** + * Finds the catalog file for the given catalog in given language, reads it + * and returns its data. + * + * @param name The name of the catalog + * @param language The language of this catalog + * + * @return The catalog data if found, QByteArray() otherwise. + */ + static QByteArray catalogData(const QString &name, const QString &language); /** * Returns the name of the catalog. @@ -84,13 +94,6 @@ public: */ QString language() const; - /** - * Returns locale directory of the catalog. - * - * @return The locale directory of the catalog. - */ - QString localeDir() const; - /** * Retrieves a translation of the specified message id. *