diff --git a/include/znc/Modules.h b/include/znc/Modules.h index 1613ea82..36638d57 100644 --- a/include/znc/Modules.h +++ b/include/znc/Modules.h @@ -353,9 +353,7 @@ class CModCommand { CModCommand(const CString& sCmd, CModule* pMod, ModCmdFunc func, const CString& sArgs, const CString& sDesc); CModCommand(const CString& sCmd, CmdFunc func, const CString& sArgs, - const CString& sDesc); - CModCommand(const CString& sCmd, CmdFunc func, const CString& sArgs, - const CDelayedTranslation& dDesc); + const COptionalTranslation& Desc); /** Copy constructor, needed so that this can be saved in a std::map. * @param other Object to copy from. @@ -381,7 +379,7 @@ class CModCommand { const CString& GetCommand() const { return m_sCmd; } CmdFunc GetFunction() const { return m_pFunc; } const CString& GetArgs() const { return m_sArgs; } - CString GetDescription() const; + CString GetDescription() const { return m_Desc.Resolve(); } void Call(const CString& sLine) const { m_pFunc(sLine); } @@ -389,9 +387,7 @@ class CModCommand { CString m_sCmd; CmdFunc m_pFunc; CString m_sArgs; - CString m_sDesc; - CDelayedTranslation m_dDesc; - bool m_bTranslating; + COptionalTranslation m_Desc; }; /** The base class for your own ZNC modules. @@ -1149,15 +1145,13 @@ class CModule { /// @return True if the command was successfully added. bool AddCommand(const CModCommand& Command); /// @return True if the command was successfully added. + /// @deprecated Use the variant with COptionalTranslation. bool AddCommand(const CString& sCmd, CModCommand::ModCmdFunc func, const CString& sArgs = "", const CString& sDesc = ""); + /// @param dDesc Either a string "", or the result of t_d() /// @return True if the command was successfully added. bool AddCommand(const CString& sCmd, const CString& sArgs, - const CString& sDesc, - std::function func); - /// @return True if the command was successfully added. - bool AddCommand(const CString& sCmd, const CString& sArgs, - const CDelayedTranslation& dDesc, + const COptionalTranslation& dDesc, std::function func); /// @return True if the command was successfully removed. bool RemCommand(const CString& sCmd); diff --git a/include/znc/Translation.h b/include/znc/Translation.h index 28df1da1..03cda252 100644 --- a/include/znc/Translation.h +++ b/include/znc/Translation.h @@ -56,7 +56,7 @@ struct CTranslationDomainRefHolder { ~CTranslationDomainRefHolder(); private: - CString m_sDomain; + const CString m_sDomain; }; // This is inspired by boost::locale::message, but without boost @@ -74,6 +74,24 @@ class CDelayedTranslation { CString m_sEnglish; }; +class COptionalTranslation { + public: + COptionalTranslation(const CString& sText) + : m_bTranslating(false), m_sText(sText) {} + COptionalTranslation(const char* s) : COptionalTranslation(CString(s)) {} + COptionalTranslation(const CDelayedTranslation& dTranslation) + : m_bTranslating(true), m_dTranslation(dTranslation) {} + CString Resolve() const { + return m_bTranslating ? m_dTranslation.Resolve() : m_sText; + } + + private: + bool m_bTranslating; + // TODO switch to std::variant after C++17 + CString m_sText; + CDelayedTranslation m_dTranslation; +}; + // Used by everything except modules. // CModule defines its own version of these functions. class CCoreTranslationMixin { diff --git a/include/znc/WebModules.h b/include/znc/WebModules.h index f2b36b41..0fe96752 100644 --- a/include/znc/WebModules.h +++ b/include/znc/WebModules.h @@ -83,21 +83,13 @@ class CWebSubPage { public: CWebSubPage(const CString& sName, const CString& sTitle = "", unsigned int uFlags = 0) - : m_uFlags(uFlags), m_sName(sName), m_sTitle(sTitle), m_vParams() {} + : m_uFlags(uFlags), m_sName(sName), m_Title(sTitle), m_vParams() {} - CWebSubPage(const CString& sName, const CString& sTitle, + CWebSubPage(const CString& sName, const COptionalTranslation& Title, const VPair& vParams, unsigned int uFlags = 0) : m_uFlags(uFlags), m_sName(sName), - m_sTitle(sTitle), - m_vParams(vParams) {} - - CWebSubPage(const CString& sName, const CDelayedTranslation& dTitle, - const VPair& vParams, unsigned int uFlags = 0) - : m_uFlags(uFlags), - m_sName(sName), - m_dTitle(dTitle), - m_bTranslating(true), + m_Title(Title), m_vParams(vParams) {} virtual ~CWebSubPage() {} @@ -105,13 +97,8 @@ class CWebSubPage { enum { F_ADMIN = 1 }; void SetName(const CString& s) { m_sName = s; } - void SetTitle(const CString& s) { - m_sTitle = s; - m_bTranslating = false; - } - void SetTitle(const CDelayedTranslation& d) { - m_dTitle = d; - m_bTranslating = true; + void SetTitle(const COptionalTranslation& s) { + m_Title = s; } void AddParam(const CString& sName, const CString& sValue) { m_vParams.push_back(make_pair(sName, sValue)); @@ -120,15 +107,13 @@ class CWebSubPage { bool RequiresAdmin() const { return m_uFlags & F_ADMIN; } const CString& GetName() const { return m_sName; } - CString GetTitle() const; + CString GetTitle() const { return m_Title.Resolve(); } const VPair& GetParams() const { return m_vParams; } private: unsigned int m_uFlags; CString m_sName; - CString m_sTitle; - CDelayedTranslation m_dTitle; - bool m_bTranslating = false; + COptionalTranslation m_Title; VPair m_vParams; }; diff --git a/src/Modules.cpp b/src/Modules.cpp index 753d5dfb..588a7178 100644 --- a/src/Modules.cpp +++ b/src/Modules.cpp @@ -518,16 +518,9 @@ bool CModule::AddCommand(const CString& sCmd, CModCommand::ModCmdFunc func, } bool CModule::AddCommand(const CString& sCmd, const CString& sArgs, - const CString& sDesc, + const COptionalTranslation& Desc, std::function func) { - CModCommand cmd(sCmd, std::move(func), sArgs, sDesc); - return AddCommand(std::move(cmd)); -} - -bool CModule::AddCommand(const CString& sCmd, const CString& sArgs, - const CDelayedTranslation& dDesc, - std::function func) { - CModCommand cmd(sCmd, std::move(func), sArgs, dDesc); + CModCommand cmd(sCmd, std::move(func), sArgs, Desc); return AddCommand(std::move(cmd)); } @@ -1965,31 +1958,18 @@ ModHandle CModules::OpenModule(const CString& sModule, const CString& sModPath, } CModCommand::CModCommand() - : m_sCmd(), m_pFunc(nullptr), m_sArgs(), m_sDesc(), m_bTranslating(false) {} + : m_sCmd(), m_pFunc(nullptr), m_sArgs(), m_Desc("") {} CModCommand::CModCommand(const CString& sCmd, CModule* pMod, ModCmdFunc func, const CString& sArgs, const CString& sDesc) : m_sCmd(sCmd), m_pFunc([pMod, func](const CString& sLine) { (pMod->*func)(sLine); }), m_sArgs(sArgs), - m_sDesc(sDesc), - m_bTranslating(false) {} + m_Desc(sDesc) {} CModCommand::CModCommand(const CString& sCmd, CmdFunc func, - const CString& sArgs, const CString& sDesc) - : m_sCmd(sCmd), - m_pFunc(std::move(func)), - m_sArgs(sArgs), - m_sDesc(sDesc), - m_bTranslating(false) {} - -CModCommand::CModCommand(const CString& sCmd, CmdFunc func, - const CString& sArgs, const CDelayedTranslation& dDesc) - : m_sCmd(sCmd), - m_pFunc(std::move(func)), - m_sArgs(sArgs), - m_dDesc(dDesc), - m_bTranslating(true) {} + const CString& sArgs, const COptionalTranslation& Desc) + : m_sCmd(sCmd), m_pFunc(std::move(func)), m_sArgs(sArgs), m_Desc(Desc) {} void CModCommand::InitHelp(CTable& Table) { Table.AddColumn("Command"); @@ -2002,10 +1982,6 @@ void CModCommand::AddHelp(CTable& Table) const { Table.SetCell("Description", GetDescription()); } -CString CModCommand::GetDescription() const { - return m_bTranslating ? m_dDesc.Resolve() : m_sDesc; -} - CString CModule::t_s(const CString& sEnglish, const CString& sContext) const { return CTranslation::Get().Singular("znc-" + GetModName(), sContext, sEnglish); diff --git a/src/WebModules.cpp b/src/WebModules.cpp index b7065886..b7b8d9a9 100644 --- a/src/WebModules.cpp +++ b/src/WebModules.cpp @@ -1019,7 +1019,3 @@ CString CWebSock::GetSkinName() { return CZNC::Get().GetSkinName(); } - -CString CWebSubPage::GetTitle() const { - return m_bTranslating ? m_dTitle.Resolve() : m_sTitle; -}