Add another layer of indirection for translation

To make supporting old modules easier

Ref #1354
This commit is contained in:
Alexey Sokolov
2016-12-25 20:29:09 +00:00
parent ef6fb13ed2
commit a1e1591ba5
5 changed files with 38 additions and 69 deletions
+6 -12
View File
@@ -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<void(const CString& sLine)> 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<void(const CString& sLine)> func);
/// @return True if the command was successfully removed.
bool RemCommand(const CString& sCmd);
+19 -1
View File
@@ -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<CString, CDelayedTranslation> after C++17
CString m_sText;
CDelayedTranslation m_dTranslation;
};
// Used by everything except modules.
// CModule defines its own version of these functions.
class CCoreTranslationMixin {
+7 -22
View File
@@ -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;
};
+6 -30
View File
@@ -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<void(const CString& sLine)> 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<void(const CString& sLine)> 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);
-4
View File
@@ -1019,7 +1019,3 @@ CString CWebSock::GetSkinName() {
return CZNC::Get().GetSkinName();
}
CString CWebSubPage::GetTitle() const {
return m_bTranslating ? m_dTitle.Resolve() : m_sTitle;
}