/*! \file pitranslator.h * \ingroup Application * \~\brief * \~english Translation support * \~russian Поддержка перевода */ /* PIP - Platform Independent Primitives Translation support Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef pitranslator_H #define pitranslator_H #include "pistring.h" #define piTr PITranslator::tr #define piTrNoOp PITranslator::trNoOp //! \ingroup Application //! \~\brief //! \~english Translation support //! \~russian Поддержка перевода class PIP_EXPORT PITranslator { public: //! \~english Translates string "in" with optional context. //! \~russian Переводит строку "in" с опциональным контекстом. static PIString tr(const PIString & in, const PIString & context = {}); //! \~english Translates string "in" with optional context. //! \~russian Переводит строку "in" с опциональным контекстом. static PIString tr(const char * in, const PIString & context = {}) { return tr(PIString::fromUTF8(in), context); } //! \~english Returns original string without translation. //! \~russian Возвращает оригинальную строку без перевода. static PIString trNoOp(const PIString & in, const PIString & context = {}) { return in; } //! \~english Returns original string without translation. //! \~russian Возвращает оригинальную строку без перевода. static PIString trNoOp(const char * in, const PIString & context = {}) { return trNoOp(PIString::fromUTF8(in), context); } //! \~english Clears all loaded translations. //! \~russian Очищает все загруженные переводы. static void clear(); //! \~english Loads translation for language "short_lang" from directory "dir". //! \~russian Загружает перевод для языка "short_lang" из директории "dir". static void loadLang(const PIString & short_lang, PIString dir = {}); //! \~english Loads translation from config "content". //! \~russian Загружает перевод из конфигурации "content". static void loadConfig(const PIString & content); //! \~english Loads translation from binary content. //! \~russian Загружает перевод из бинарного содержимого. static bool load(const PIByteArray & content); //! \~english Loads translation from file. //! \~russian Загружает перевод из файла. static bool loadFile(const PIString & path); private: PITranslator(); ~PITranslator(); NO_COPY_CLASS(PITranslator) PRIVATE_DECLARATION(PIP_EXPORT) static PITranslator * instance(); }; //! \~english Context-aware string wrapper for translation. //! \~russian Контекстно-зависимая обертка строки для перевода. class PIStringContextTr { public: //! \~english Constructs wrapper from string. //! \~russian Создает обертку из строки. PIStringContextTr(PIString && s): _s(s) {} //! \~english Returns translated string. //! \~russian Возвращает переведенную строку. operator PIString() const { return PITranslator::tr(_s); } //! \~english Returns translated string with context. //! \~russian Возвращает переведенную строку с контекстом. PIString operator()(const PIString & ctx = {}) const { return PITranslator::tr(_s, ctx); } private: PIString _s; }; //! \~english Context-aware string wrapper without translation (no-op). //! \~russian Контекстно-зависимая обертка строки без перевода (заглушка). class PIStringContextTrNoOp { public: //! \~english Constructs wrapper from string. //! \~russian Создает обертку из строки. PIStringContextTrNoOp(PIString && s): _s(s) {} //! \~english Returns original string. //! \~russian Возвращает оригинальную строку. operator PIString() const { return _s; } //! \~english Returns original string with context. //! \~russian Возвращает оригинальную строку с контекстом. PIString operator()(const PIString & ctx = {}) const { return _s; } private: PIString _s; }; //! \~\brief //! \~english Translate string with \a PITranslator::tr() //! \~russian Перевести строку с помощью \a PITranslator::tr() inline PIStringContextTr operator""_tr(const char * v, size_t sz) { return PIStringContextTr(PIString::fromUTF8(v, sz)); } //! \~\brief //! \~english Translate string with \a PITranslator::tr() //! \~russian Перевести строку с помощью \a PITranslator::tr() inline PIStringContextTrNoOp operator""_trNoOp(const char * v, size_t sz) { return PIStringContextTrNoOp(PIString::fromUTF8(v, sz)); } #endif