From 689704119a3a12110bf8842c76c6298c5e4d9d1d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 11 Jan 2018 00:27:08 +0100 Subject: [PATCH] Fix handling of underscores in tags in "wxrc -g" output Unlike all the other nodes containing translatable text, the contents of the tags, used for wxChoice, wxListBox etc items, is not escaped (because it can't contain mnemonics), so don't unescape it when outputting it from "wxrc --gettext" neither. See #18033. --- utils/wxrc/wxrc.cpp | 89 +++++++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 32 deletions(-) diff --git a/utils/wxrc/wxrc.cpp b/utils/wxrc/wxrc.cpp index 56f4c9799f..fb06278d07 100644 --- a/utils/wxrc/wxrc.cpp +++ b/utils/wxrc/wxrc.cpp @@ -949,6 +949,46 @@ static wxString ConvertText(const wxString& str) } +enum ContentsKind +{ + Contents_NotTrans, // Not a translatable text at all. + Contents_TransOnly, // Translatable but not escaped text. + Contents_Text // Text, i.e. both translatable and escaped. +}; + +// Check if the given node contains translatable text and, if it does, whether +// it's escaped (i.e. parsed using GetText()) or not. +ContentsKind +GetNodeContentsKind(wxXmlNode& node, const wxString& contents) +{ + if ( node.GetName() == wxT("label") || + (node.GetName() == wxT("value") && !contents.IsNumber()) || + node.GetName() == wxT("help") || + node.GetName() == wxT("hint") || + node.GetName() == wxT("longhelp") || + node.GetName() == wxT("tooltip") || + node.GetName() == wxT("htmlcode") || + node.GetName() == wxT("title") || + node.GetName() == wxT("message") || + node.GetName() == wxT("note") || + node.GetName() == wxT("defaultdirectory") || + node.GetName() == wxT("defaultfilename") || + node.GetName() == wxT("defaultfolder") || + node.GetName() == wxT("filter") || + node.GetName() == wxT("caption") ) + { + return Contents_Text; + } + + // This one is special: it is translated in XRC, but its contents is not + // escaped. + if ( node.GetName() == wxT("item") ) + return Contents_TransOnly; + + return Contents_NotTrans; +} + + ExtractedStrings XmlResApp::FindStrings(const wxString& filename, wxXmlNode *node) { @@ -963,41 +1003,26 @@ XmlResApp::FindStrings(const wxString& filename, wxXmlNode *node) if ((node->GetType() == wxXML_ELEMENT_NODE) && // parent is an element, i.e. has subnodes... (n->GetType() == wxXML_TEXT_NODE || - n->GetType() == wxXML_CDATA_SECTION_NODE) && + n->GetType() == wxXML_CDATA_SECTION_NODE)) // ...it is textnode... - ( - node/*not n!*/->GetName() == wxT("label") || - (node/*not n!*/->GetName() == wxT("value") && - !n->GetContent().IsNumber()) || - node/*not n!*/->GetName() == wxT("help") || - node/*not n!*/->GetName() == wxT("hint") || - node/*not n!*/->GetName() == wxT("longhelp") || - node/*not n!*/->GetName() == wxT("tooltip") || - node/*not n!*/->GetName() == wxT("htmlcode") || - node/*not n!*/->GetName() == wxT("title") || - node/*not n!*/->GetName() == wxT("item") || - node/*not n!*/->GetName() == wxT("message") || - node/*not n!*/->GetName() == wxT("note") || - node/*not n!*/->GetName() == wxT("defaultdirectory") || - node/*not n!*/->GetName() == wxT("defaultfilename") || - node/*not n!*/->GetName() == wxT("defaultfolder") || - node/*not n!*/->GetName() == wxT("filter") || - node/*not n!*/->GetName() == wxT("caption") - )) - // ...and known to contain translatable string { - if (!flagGettext || - node->GetAttribute(wxT("translate"), wxT("1")) != wxT("0")) + wxString s = n->GetContent(); + switch ( GetNodeContentsKind(*node, s) ) { - arr.push_back - ( - ExtractedString - ( - ConvertText(n->GetContent()), - filename, - n->GetLineNumber() - ) - ); + case Contents_NotTrans: + break; + + case Contents_Text: + s = ConvertText(s); + wxFALLTHROUGH; + + case Contents_TransOnly: + if (!flagGettext || + node->GetAttribute(wxT("translate"), wxT("1")) != wxT("0")) + { + arr.push_back(ExtractedString(s, filename, n->GetLineNumber())); + } + break; } }