Fix handling of underscores in <item> tags in "wxrc -g" output

Unlike all the other nodes containing translatable text, the contents of
the <item> 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.
This commit is contained in:
Vadim Zeitlin 2018-01-11 00:27:08 +01:00
parent 6bd8cb964b
commit 689704119a

View File

@ -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
{
wxString s = n->GetContent();
switch ( GetNodeContentsKind(*node, s) )
{
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
(
ConvertText(n->GetContent()),
filename,
n->GetLineNumber()
)
);
arr.push_back(ExtractedString(s, filename, n->GetLineNumber()));
}
break;
}
}