kdecore: use the Katie translations format

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-11-02 05:42:59 +02:00
parent a7fc6cd735
commit 881b47b8ea
9 changed files with 128 additions and 278 deletions

View file

@ -107,14 +107,6 @@ if(X11_FOUND)
endif(NOT HAVE_XSYNC AND NOT HAVE_XSCREENSAVER) endif(NOT HAVE_XSYNC AND NOT HAVE_XSCREENSAVER)
endif(X11_FOUND) endif(X11_FOUND)
kde4_optional_find_package(Libintl)
set_package_properties(Libintl PROPERTIES
DESCRIPTION "Support for multiple languages"
URL "http://www.gnu.org/software/gettext"
TYPE RECOMMENDED
PURPOSE "Enables KDE to be available in many different languages"
)
kde4_optional_find_package(DBusMenuQt) kde4_optional_find_package(DBusMenuQt)
set_package_properties(DBusMenuQt PROPERTIES set_package_properties(DBusMenuQt PROPERTIES
DESCRIPTION "Support for notification area menus via the DBusMenu protocol" DESCRIPTION "Support for notification area menus via the DBusMenu protocol"

View file

@ -15,7 +15,6 @@ include(CMakePushCheckState)
# definitions like _GNU_SOURCE that are needed on each platform. # definitions like _GNU_SOURCE that are needed on each platform.
set(CMAKE_REQUIRED_DEFINITIONS ${_KDE4_PLATFORM_DEFINITIONS}) set(CMAKE_REQUIRED_DEFINITIONS ${_KDE4_PLATFORM_DEFINITIONS})
kde4_bool_to_01(Libintl_FOUND HAVE_LIBINTL) # kdecore
kde4_bool_to_01(DBUSMENUQT_FOUND HAVE_DBUSMENUQT) # kdeui kde4_bool_to_01(DBUSMENUQT_FOUND HAVE_DBUSMENUQT) # kdeui
kde4_bool_to_01(LibArchive_FOUND HAVE_LIBARCHIVE) # karchive kde4_bool_to_01(LibArchive_FOUND HAVE_LIBARCHIVE) # karchive
kde4_bool_to_01(BZIP2_FOUND HAVE_BZIP2) # karchive kde4_bool_to_01(BZIP2_FOUND HAVE_BZIP2) # karchive

View file

@ -43,7 +43,6 @@ set(cmakeFiles
FindLibATASmart.cmake FindLibATASmart.cmake
FindLibDeflate.cmake FindLibDeflate.cmake
FindLibDRM.cmake FindLibDRM.cmake
FindLibintl.cmake
FindLibKonq.cmake FindLibKonq.cmake
FindLibLZMA.cmake FindLibLZMA.cmake
FindLibMms.cmake FindLibMms.cmake

View file

@ -302,7 +302,7 @@ if(_kdeBootStrapping)
set(KDE4_DATA_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/apps" CACHE PATH "KDE data installation directory") set(KDE4_DATA_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/apps" CACHE PATH "KDE data installation directory")
set(KDE4_ICON_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/icons" CACHE PATH "KDE icon installation directory") set(KDE4_ICON_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/icons" CACHE PATH "KDE icon installation directory")
set(KDE4_KCFG_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/config.kcfg" CACHE PATH "KDE kcfg installation directory") set(KDE4_KCFG_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/config.kcfg" CACHE PATH "KDE kcfg installation directory")
set(KDE4_LOCALE_INSTALL_DIR "${CMAKE_INSTALL_FULL_LOCALEDIR}" CACHE PATH "KDE locale installation directory") set(KDE4_LOCALE_INSTALL_DIR "${KATIE_TRANSLATIONS_PATH}/kde4" CACHE PATH "KDE locale installation directory")
set(KDE4_SERVICES_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/kde4/services" CACHE PATH "KDE services installation directory") set(KDE4_SERVICES_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/kde4/services" CACHE PATH "KDE services installation directory")
set(KDE4_SERVICETYPES_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/kde4/servicetypes" CACHE PATH "KDE service types installation directory") set(KDE4_SERVICETYPES_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/kde4/servicetypes" CACHE PATH "KDE service types installation directory")
set(KDE4_SOUND_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/sounds" CACHE PATH "KDE sounds installation directory") set(KDE4_SOUND_INSTALL_DIR "${KDE4_SHARE_INSTALL_PREFIX}/sounds" CACHE PATH "KDE sounds installation directory")

View file

@ -1,45 +0,0 @@
# Try to find Libintl functionality, once done this will define:
#
# LIBINTL_FOUND - system has Libintl
# LIBINTL_INCLUDE_DIR - Libintl include directory
# LIBINTL_LIBRARIES - Libraries needed to use Libintl
#
# TODO: This will enable translations only if Gettext functionality is
# present in libc. Must have more robust system for release, where Gettext
# functionality can also reside in standalone Gettext library, or the one
# embedded within kdelibs (cf. gettext.m4 from Gettext source).
# Copyright (c) 2006, Chusslove Illich, <caslav.ilic@gmx.net>
# Copyright (c) 2007, Alexander Neundorf, <neundorf@kde.org>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
if(LIBINTL_INCLUDE_DIR AND LIBINTL_LIB_FOUND)
set(Libintl_FIND_QUIETLY TRUE)
endif(LIBINTL_INCLUDE_DIR AND LIBINTL_LIB_FOUND)
find_path(LIBINTL_INCLUDE_DIR libintl.h)
set(LIBINTL_LIB_FOUND FALSE)
if(LIBINTL_INCLUDE_DIR)
include(CheckFunctionExists)
check_function_exists(dgettext LIBINTL_LIBC_HAS_DGETTEXT)
if (LIBINTL_LIBC_HAS_DGETTEXT)
set(LIBINTL_LIBRARIES)
set(LIBINTL_LIB_FOUND TRUE)
else (LIBINTL_LIBC_HAS_DGETTEXT)
find_library(LIBINTL_LIBRARIES NAMES intl libintl )
if(LIBINTL_LIBRARIES)
set(LIBINTL_LIB_FOUND TRUE)
endif(LIBINTL_LIBRARIES)
endif (LIBINTL_LIBC_HAS_DGETTEXT)
endif(LIBINTL_INCLUDE_DIR)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Libintl DEFAULT_MSG LIBINTL_INCLUDE_DIR LIBINTL_LIB_FOUND)
mark_as_advanced(LIBINTL_INCLUDE_DIR LIBINTL_LIBRARIES LIBINTL_LIBC_HAS_DGETTEXT LIBINTL_LIB_FOUND)

View file

@ -296,14 +296,37 @@ macro(KDE4_OPTIONAL_ADD_SUBDIRECTORY _dir)
endif() endif()
endmacro(KDE4_OPTIONAL_ADD_SUBDIRECTORY) endmacro(KDE4_OPTIONAL_ADD_SUBDIRECTORY)
# KDE4_OPTIONAL_FIND_PACKAGE(<name> ... ) # KDE4_OPTIONAL_FIND_PACKAGE(<PACKAGE> ...)
# This macro is a combination of OPTION() and FIND_PACKAGE(), it works like # This macro is a combination of OPTION() and FIND_PACKAGE(), it works like
# FIND_PACKAGE(), but additionally it automatically creates an option # FIND_PACKAGE(), but additionally it automatically creates an option
# WITH_<name>, which can be disabled via the cmake GUI or via # WITH_<name>, which can be disabled via the cmake GUI or via
# -DWITH_<name>=OFF # -DWITH_<name>=OFF
macro(KDE4_OPTIONAL_FIND_PACKAGE _name) macro(KDE4_OPTIONAL_FIND_PACKAGE _PACKAGE)
option(WITH_${_name} "Search for ${_name} package" ON) option(WITH_${_PACKAGE} "Search for ${_PACKAGE} package" ON)
if (WITH_${_name}) if (WITH_${_PACKAGE})
find_package(${_name} ${ARGN}) find_package(${_PACKAGE} ${ARGN})
endif () endif ()
endmacro(KDE4_OPTIONAL_FIND_PACKAGE) endmacro(KDE4_OPTIONAL_FIND_PACKAGE)
# KDE4_OPTIONAL_FIND_PACKAGE(<LANGUAGE> FILE1.po ... FILEN.po)
# This macro is will create and install translation files
macro(KDE4_TRANSLATE _LANGUAGE)
foreach(_pofile ${ARGN})
get_filename_component(_abspofile "${_pofile}" ABSOLUTE)
get_filename_component(_poname "${_abspofile}" NAME_WE)
make_directory("${CMAKE_CURRENT_BINARY_DIR}")
set(trout "${CMAKE_CURRENT_BINARY_DIR}/${_poname}.tr")
string(REPLACE "@" "_" _language ${_LANGUAGE})
add_custom_target(
translations_${_language}_${_poname} ALL
COMMAND ${KATIE_TRC} "${_abspofile}" -o "${trout}"
COMMENT "Generating ${_poname}.tr"
)
set_source_files_properties("${trout}" PROPERTIES GENERATED TRUE)
install(
FILES "${trout}"
DESTINATION "${KDE4_LOCALE_INSTALL_DIR}/${_LANGUAGE}"
RENAME "${_poname}.tr"
)
endforeach()
endmacro(KDE4_TRANSLATE)

View file

@ -38,9 +38,6 @@
/* Define to 1 if you have the XSync extension */ /* Define to 1 if you have the XSync extension */
#cmakedefine HAVE_XSYNC 1 #cmakedefine HAVE_XSYNC 1
/* Define to 1 if you have libintl */
#cmakedefine HAVE_LIBINTL 1
/* Define to 1 if you have DBusMenuQt */ /* Define to 1 if you have DBusMenuQt */
#cmakedefine HAVE_DBUSMENUQT 1 #cmakedefine HAVE_DBUSMENUQT 1

View file

@ -35,12 +35,6 @@ set(kdecore_OPTIONAL_LIBS)
add_definitions(-DQT_NO_CAST_FROM_ASCII) add_definitions(-DQT_NO_CAST_FROM_ASCII)
# compile Gettext support if available
if(LIBINTL_FOUND)
include_directories(${LIBINTL_INCLUDE_DIR})
set(kdecore_OPTIONAL_LIBS ${kdecore_OPTIONAL_LIBS} ${LIBINTL_LIBRARIES})
endif()
# compile Enchant if available # compile Enchant if available
if(ENCHANT_FOUND) if(ENCHANT_FOUND)
include_directories( include_directories(

View file

@ -19,159 +19,115 @@
#include "kcatalog_p.h" #include "kcatalog_p.h"
#include "kstandarddirs.h" #include "kstandarddirs.h"
#include <config.h>
#include <QtCore/QFile>
#include <QtCore/qmutex.h>
#include <kdebug.h> #include <kdebug.h>
#include <stdlib.h> #include <QFile>
#include <locale.h> #include <QTranslator>
#ifdef HAVE_LIBINTL static QByteArray translationData(const QByteArray &localeDir, const QByteArray &language, const QByteArray &name)
# include <libintl.h>
#endif
// = "LANGUAGE=" + 32 chars for language code + terminating zero
static const int langenvMaxlen = 42;
Q_GLOBAL_STATIC(QMutex, catalogLock)
class KMsgCtx
{ {
public: QByteArray translationpath = localeDir;
KMsgCtx(const char* const msgctxt, const char* const msgid); translationpath.append('/');
~KMsgCtx(); translationpath.append(language);
translationpath.append('/');
const char* const constData() const; translationpath.append(name);
translationpath.append(".tr");
private: QFile translationfile(QFile::decodeName(translationpath));
Q_DISABLE_COPY(KMsgCtx); if (!translationfile.open(QFile::ReadOnly)) {
return QByteArray();
bool m_freedata;
char* m_data;
};
KMsgCtx::KMsgCtx(const char* const msgctxt, const char* const msgid)
: m_freedata(false),
m_data(nullptr)
{
const int msgidlen = qstrlen(msgid);
if (Q_UNLIKELY(msgidlen <= 0)) {
m_data = nullptr;
return;
} }
return translationfile.readAll();
const int msgctxtlen = qstrlen(msgctxt);
if (msgctxtlen <= 0) {
m_data = (char*)msgid;
return;
}
// for reference:
// https://github.com/autotools-mirror/gettext/blob/master/gnulib-local/lib/gettext.h
const int totallen = (msgctxtlen + 1 + msgidlen + 1);
m_data = static_cast<char*>(::malloc(totallen * sizeof(char)));
::memcpy(m_data, msgctxt, msgctxtlen * sizeof(char));
m_data[msgctxtlen] = '\004';
::memcpy(m_data + msgctxtlen + 1, msgid, msgidlen * sizeof(char));
m_data[totallen - 1] = '\0';
m_freedata = true;
// qDebug() << Q_FUNC_INFO << m_data;
}
KMsgCtx::~KMsgCtx()
{
if (m_freedata) {
::free(m_data);
}
}
const char* const KMsgCtx::constData() const
{
return m_data;
} }
class KCatalogPrivate class KCatalogPrivate
{ {
public: public:
QByteArray language; KCatalogPrivate();
QByteArray name; ~KCatalogPrivate();
QByteArray localeDir;
#ifdef HAVE_LIBINTL QByteArray language;
QByteArray systemLanguage; QByteArray name;
QByteArray localeDir;
void setupGettextEnv(); #ifndef QT_NO_TRANSLATION
void resetSystemLanguage(); QTranslator* translator;
#endif #endif
}; };
KCatalogPrivate::KCatalogPrivate()
: translator(nullptr)
{
}
KCatalogPrivate::~KCatalogPrivate()
{
delete translator;
}
QDebug operator<<(QDebug debug, const KCatalog &c) 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 << " " << c.d->localeDir;
} }
KCatalog::KCatalog(const QString &name, const QString &language) KCatalog::KCatalog(const QString &name, const QString &language)
: d( new KCatalogPrivate() ) : d(new KCatalogPrivate())
{ {
setlocale(LC_ALL, ""); d->language = QFile::encodeName(language);
d->name = QFile::encodeName(name);
d->localeDir = QFile::encodeName(catalogLocaleDir(name, language));
// Find locale directory for this catalog. #ifndef QT_NO_TRANSLATION
QString localeDir = catalogLocaleDir(name, language); d->translator = new QTranslator();
d->translator->loadFromData(translationData(d->localeDir, d->language, d->name));
d->language = QFile::encodeName(language); // kDebug() << << name << language << localeDir;
d->name = QFile::encodeName(name);
d->localeDir = QFile::encodeName(localeDir);
#ifdef HAVE_LIBINTL
// Point Gettext to current language, recording system value for recovery.
d->systemLanguage = qgetenv("LANGUAGE");
// Always get translations in UTF-8, regardless of user's environment.
bind_textdomain_codeset(d->name.constData(), "UTF-8");
//kDebug() << << name << language << localeDir;
bindtextdomain(d->name.constData(), d->localeDir.constData());
#endif #endif
} }
KCatalog::KCatalog(const KCatalog & rhs) KCatalog::KCatalog(const KCatalog &rhs)
: d( new KCatalogPrivate(*rhs.d) ) : d(new KCatalogPrivate())
{ {
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));
#endif
} }
KCatalog & KCatalog::operator=(const KCatalog & rhs) KCatalog & KCatalog::operator=(const KCatalog & rhs)
{ {
*d = *rhs.d; d->language = rhs.d->language;
d->name = rhs.d->name;
d->localeDir = rhs.d->localeDir;
return *this; #ifndef QT_NO_TRANSLATION
d->translator->loadFromData(translationData(d->localeDir, d->language, d->name));
#endif
return *this;
} }
KCatalog::~KCatalog() KCatalog::~KCatalog()
{ {
delete d; delete d;
} }
QString KCatalog::catalogLocaleDir( const QString &name, QString KCatalog::catalogLocaleDir(const QString &name,
const QString &language ) const QString &language)
{ {
QString relpath = QString::fromLatin1( "%1/LC_MESSAGES/%2.mo" ) QString relpath = QString::fromLatin1("%1/%2.tr").arg(language).arg(name);
.arg( language ).arg( name ); return KGlobal::dirs()->findResourceDir("locale", relpath);
return KGlobal::dirs()->findResourceDir( "locale", relpath );
} }
QString KCatalog::name() const QString KCatalog::name() const
{ {
return QFile::decodeName(d->name); return QFile::decodeName(d->name);
} }
QString KCatalog::language() const QString KCatalog::language() const
{ {
return QFile::decodeName(d->language); return QFile::decodeName(d->language);
} }
QString KCatalog::localeDir() const QString KCatalog::localeDir() const
@ -179,156 +135,91 @@ QString KCatalog::localeDir() const
return QFile::decodeName(d->localeDir); return QFile::decodeName(d->localeDir);
} }
#ifdef HAVE_LIBINTL
void KCatalogPrivate::setupGettextEnv()
{
if (language != systemLanguage) {
// it is enough to change the string set there.
char langenv[langenvMaxlen];
::memset(langenv, 0, langenvMaxlen * sizeof(char));
snprintf(langenv, langenvMaxlen, "LANGUAGE=%s", language.constData());
putenv(strdup(langenv));
}
}
void KCatalogPrivate::resetSystemLanguage ()
{
if (language != systemLanguage) {
char langenv[langenvMaxlen];
::memset(langenv, 0, langenvMaxlen * sizeof(char));
snprintf(langenv, langenvMaxlen, "LANGUAGE=%s", systemLanguage.constData());
putenv(strdup(langenv));
}
}
#endif
QString KCatalog::translate(const char * msgid) const QString KCatalog::translate(const char * msgid) const
{ {
#ifdef HAVE_LIBINTL #ifndef QT_NO_TRANSLATION
QMutexLocker locker(catalogLock()); return d->translator->translate(nullptr, msgid);
d->setupGettextEnv();
const char *msgstr = dgettext(d->name, msgid);
d->resetSystemLanguage();
return QString::fromUtf8(msgstr);
#else #else
return QString::fromUtf8(msgid); return QString::fromUtf8(msgid);
#endif #endif
} }
QString KCatalog::translate(const char * msgctxt, const char * msgid) const QString KCatalog::translate(const char * msgctxt, const char * msgid) const
{ {
#ifdef HAVE_LIBINTL #ifndef QT_NO_TRANSLATION
QMutexLocker locker(catalogLock()); return d->translator->translate(msgctxt, msgid);
d->setupGettextEnv();
const KMsgCtx msgwithctx(msgctxt, msgid);
const char *msgstr = dgettext(d->name, msgwithctx.constData());
const bool msgstrict = (msgstr != msgwithctx.constData());
d->resetSystemLanguage();
return msgstrict ? QString::fromUtf8(msgstr) : QString::fromUtf8(msgid);
#else #else
Q_UNUSED(msgctxt); Q_UNUSED(msgctxt);
return QString::fromUtf8(msgid); return QString::fromUtf8(msgid);
#endif #endif
} }
QString KCatalog::translate(const char * msgid, const char * msgid_plural, QString KCatalog::translate(const char * msgid, const char * msgid_plural,
unsigned long n) const unsigned long n) const
{ {
#ifdef HAVE_LIBINTL #ifndef QT_NO_TRANSLATION
QMutexLocker locker(catalogLock()); return (n == 1 ? d->translator->translate(nullptr, msgid) : d->translator->translate(nullptr, msgid_plural));
d->setupGettextEnv();
const char *msgstr = dngettext(d->name, msgid, msgid_plural, n);
d->resetSystemLanguage();
return QString::fromUtf8(msgstr);
#else #else
return (n == 1 ? QString::fromUtf8(msgid) : QString::fromUtf8(msgid_plural)); return (n == 1 ? QString::fromUtf8(msgid) : QString::fromUtf8(msgid_plural));
#endif #endif
} }
QString KCatalog::translate(const char * msgctxt, const char * msgid, QString KCatalog::translate(const char * msgctxt, const char * msgid,
const char * msgid_plural, unsigned long n) const const char * msgid_plural, unsigned long n) const
{ {
#ifdef HAVE_LIBINTL #ifndef QT_NO_TRANSLATION
QMutexLocker locker(catalogLock()); return (n == 1 ? d->translator->translate(msgctxt, msgid) : d->translator->translate(msgctxt, msgid_plural));
d->setupGettextEnv();
const KMsgCtx msgwithctx(msgctxt, msgid);
const char *msgstr = dngettext(d->name, msgwithctx.constData(), msgid_plural, n);
const bool msgstrict = (msgstr != msgwithctx.constData());
const bool msgstrict2 = (msgstr != msgid_plural);
d->resetSystemLanguage();
return msgstrict && msgstrict2 ? QString::fromUtf8(msgstr) : (n == 1 ? QString::fromUtf8(msgid) : QString::fromUtf8(msgid_plural));
#else #else
Q_UNUSED(msgctxt); Q_UNUSED(msgctxt);
return (n == 1 ? QString::fromUtf8(msgid) : QString::fromUtf8(msgid_plural)); return (n == 1 ? QString::fromUtf8(msgid) : QString::fromUtf8(msgid_plural));
#endif #endif
} }
QString KCatalog::translateStrict(const char * msgid) const QString KCatalog::translateStrict(const char * msgid) const
{ {
#ifdef HAVE_LIBINTL #ifndef QT_NO_TRANSLATION
QMutexLocker locker(catalogLock()); return d->translator->translateStrict(nullptr, msgid);
d->setupGettextEnv();
const char *msgstr = dgettext(d->name, msgid);
d->resetSystemLanguage();
return msgstr != msgid ? QString::fromUtf8(msgstr) : QString();
#else #else
Q_UNUSED(msgid); Q_UNUSED(msgid);
return QString(); return QString();
#endif #endif
} }
QString KCatalog::translateStrict(const char * msgctxt, const char * msgid) const QString KCatalog::translateStrict(const char * msgctxt, const char * msgid) const
{ {
#ifdef HAVE_LIBINTL #ifndef QT_NO_TRANSLATION
QMutexLocker locker(catalogLock()); return d->translator->translateStrict(msgctxt, msgid);
d->setupGettextEnv();
const KMsgCtx msgwithctx(msgctxt, msgid);
const char *msgstr = dgettext(d->name, msgwithctx.constData());
const bool msgstrict = (msgstr != msgwithctx.constData());
d->resetSystemLanguage();
return msgstrict ? QString::fromUtf8(msgstr) : QString();
#else #else
Q_UNUSED(msgctxt); Q_UNUSED(msgctxt);
Q_UNUSED(msgid); Q_UNUSED(msgid);
return QString(); return QString();
#endif #endif
} }
QString KCatalog::translateStrict(const char * msgid, const char * msgid_plural, QString KCatalog::translateStrict(const char * msgid, const char * msgid_plural,
unsigned long n) const unsigned long n) const
{ {
#ifdef HAVE_LIBINTL #ifndef QT_NO_TRANSLATION
QMutexLocker locker(catalogLock()); return (n == 1 ? d->translator->translateStrict(nullptr, msgid) : d->translator->translateStrict(nullptr, msgid_plural));
d->setupGettextEnv();
const char *msgstr = dngettext(d->name, msgid, msgid_plural, n);
d->resetSystemLanguage();
return msgstr != msgid && msgstr != msgid_plural ? QString::fromUtf8(msgstr) : QString();
#else #else
Q_UNUSED(msgid); Q_UNUSED(msgid);
Q_UNUSED(msgid_plural); Q_UNUSED(msgid_plural);
Q_UNUSED(n); Q_UNUSED(n);
return QString(); return QString();
#endif #endif
} }
QString KCatalog::translateStrict(const char * msgctxt, const char * msgid, QString KCatalog::translateStrict(const char * msgctxt, const char * msgid,
const char * msgid_plural, unsigned long n) const const char * msgid_plural, unsigned long n) const
{ {
#ifdef HAVE_LIBINTL #ifndef QT_NO_TRANSLATION
QMutexLocker locker(catalogLock()); return (n == 1 ? d->translator->translateStrict(msgctxt, msgid) : d->translator->translateStrict(msgctxt, msgid_plural));
d->setupGettextEnv();
const KMsgCtx msgwithctx(msgctxt, msgid);
const char *msgstr = dngettext(d->name, msgwithctx.constData(), msgid_plural, n);
const bool msgstrict = (msgstr != msgwithctx.constData());
const bool msgstrict2 = (msgstr != msgid_plural);
d->resetSystemLanguage();
return msgstrict && msgstrict2 ? QString::fromUtf8(msgstr) : QString();
#else #else
Q_UNUSED(msgctxt); Q_UNUSED(msgctxt);
Q_UNUSED(msgid); Q_UNUSED(msgid);
Q_UNUSED(msgid_plural); Q_UNUSED(msgid_plural);
Q_UNUSED(n); Q_UNUSED(n);
return QString(); return QString();
#endif #endif
} }