#ifndef _KVI_LOCALE_H_
#define _KVI_LOCALE_H_
//=============================================================================
//
// File : KviLocale.h
// Creation date : Sat Jan 16 1999 18:15:01 by Szymon Stefanek
//
// This file is part of the KVIrc IRC client distribution
// Copyright (C) 1999-2010 Szymon Stefanek (pragma at kvirc dot net)
// Copyright (C) 2011 Elvio Basello (hellvis69 at gmail dot com)
//
// This program is FREE software. You can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the HOPE that it will be USEFUL,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
/**
* \file KviLocale.h
* \author Szymon Stefanek
* \brief KVIrc localization stuff
*/
#include "kvi_settings.h"
#include "KviHeapObject.h"
#include "KviMessageCatalogue.h"
class KviCString;
class QApplication;
class QString;
class QTextCodec;
/**
* \def KVI_NUM_ENCODINGS The number of charset encodings
* \def KVI_NUM_ENCODING_GROUPS The number of charset groups
*/
#ifndef QT_NO_BIG_CODECS
#define KVI_NUM_ENCODINGS 112
#define KVI_NUM_ENCODING_GROUPS 8
#else
#define KVI_NUM_ENCODINGS 85
#define KVI_NUM_ENCODING_GROUPS 5
#endif
/**
* \class KviLocale
* \brief Holds the localization functions
*/
class KVILIB_API KviLocale : public KviHeapObject
{
public:
/**
* \typedef EncodingDescription
* \struct _EncodingDescription
* \brief Holds the encoding data
*/
struct EncodingDescription
{
const char * pcName; /**< name of the encoding */
char bSmart; /**< is it a smart codec? */
char bSendUtf8; /**< does it send utf8 or the local charset? */
uint uGroup; /**< group */
const char * pcDescription; /**< description of the encoding */
};
protected:
/**
* \brief Constructs the KviLocale object
* \param pApp The main application
* \param szLocaleDir The directory containing the localizations
* \param szForceLocaleDir The directory forced by the user
* \return KviLocale
*/
KviLocale(QApplication * pApp, const QString & szLocaleDir, const QString & szForceLocaleDir);
/**
* \brief Destroys the object
* \return KviLocale
*/
~KviLocale();
public:
static QString g_szLang;
protected:
QApplication * m_pApp;
private:
static KviLocale * m_pSelf;
public:
/**
* \brief Initializes the class instance
* \param pApp The main application
* \param szLocaleDir The directory containing the localizations
* \param szForceLocaleDir The directory forced by the user
* \return void
*/
static void init(QApplication * pApp, const QString & szLocaleDir, const QString & szForceLocaleDir);
/**
* \brief Destroys the class instance
* \param pApp The main application
* \return void
*/
static void done();
/**
* \brief Returns the instance of the class
* \return KviLocale *
*/
static inline KviLocale * instance() { return m_pSelf; }
/**
* \brief Returns the description of the encoding used
* \param iIdx The index of the description
* \warning You MUST start iterating from 0 and terminate when you get an entry with
* a NULL pcName
* \return EncodingDescription *
*/
EncodingDescription * encodingDescription(int iIdx);
/**
* \brief Returns the description of the encoding used
* \param iIdx The index of the group
* \warning You MUST start iterating from 0 and terminate when you get an entry with
* a NULL value
* \return const char *
*/
const char * encodingGroup(int iIdx);
/**
* \brief Returns the language code of the localization
* \return const QString &
*/
const QString & localeName() const { return g_szLang; }
/**
* \brief Returns the codec associated to the given translation
* \param pcName The name of the translation
* \return QTextCodec *
*/
QTextCodec * codecForName(const char * pcName);
/**
* \brief Finds the catalogue
*
* This function attempts to determine the current locale and then load the
* corresponding translation file from the KVIrc locale directory.
* Returns true if the locale was correctly set; i.e. the locale is C or POSIX
* (no translation needed) or the locale is correctly defined and the translation
* map was successfully loaded
* \param szBuffer The buffer where to store the translation full path
* \param szName The name of the translation file
* \param szLocaleDir The directory where the localizations are stored
* \return bool
*/
bool findCatalogue(QString & szBuffer, const QString & szName, const QString & szLocaleDir);
/**
* \brief Loads the catalogue
* \param szName The name of the catalogue
* \param szLocaleDir The directory where to look for the catalogue
* \return KviMessageCatalogue *
*/
KviMessageCatalogue * loadCatalogue(const QString & szName, const QString & szLocaleDir);
/**
* \brief Unloads a catalogue
* \param szName The catalogue to unload
* \return bool
*/
bool unloadCatalogue(const QString & szName);
/**
* \brief Returns the loaded catalogue
* \param szName The name of the catalogue to get
* \return KviMessageCatalogue *
*/
KviMessageCatalogue * getLoadedCatalogue(const QString & szName);
/**
* \brief Translates the given text from the given context
* \param pcText The text to translate
* \param pcContext The context where to look for the text
* \return const char *
*/
const char * translate(const char * pcText, const char * pcContext);
/**
* \brief Translates the given text from the given context
* \param pcText The text to translate
* \param pcContext The context where to look for the text
* \return const QString &
*/
const QString & translateToQString(const char * pcText, const char * pcContext);
};
#ifndef _KVI_LOCALE_CPP_
extern KVILIB_API KviMessageCatalogue * g_pMainCatalogue;
#endif // !_KVI_LOCALE_CPP_
#define __tr(text) g_pMainCatalogue->translate(text)
#define __tr_no_lookup(text) text
#define __tr_no_xgettext(text) g_pMainCatalogue->translate(text)
#define __tr2qs(text) g_pMainCatalogue->translateToQString(text)
#define __tr2qs_no_lookup(text) text
#define __tr2qs_no_xgettext(text) g_pMainCatalogue->translateToQString(text)
#define __tr_ctx(text, context) KviLocale::instance()->translate(text, context)
#define __tr_no_lookup_ctx(text, context) text
#define __tr_no_xgettext_ctx(text, context) KviLocale::instance()->translate(text, context)
#define __tr2qs_ctx(text, context) KviLocale::instance()->translateToQString(text, context)
#define __tr2qs_ctx_no_xgettext(text, context) KviLocale::instance()->translateToQString(text, context)
#endif //_KVI_LOCALE_H_