Skip to content

Commit 046ee37

Browse files
committed
Account for partial localizations in gettext output parsing
When parsing GNU gettext tools' output and looking for "error: " and "warning: " prefixes, check their untranslated version too. This fixes parsing in case gettext-tools is partially translated into a language and while these prefixes are translated as individual strings, some messages that embed the prefix aren't.
1 parent f261986 commit 046ee37

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

src/gexecute.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,29 +166,34 @@ ParsedGettextErrors parse_gettext_stderr(const subprocess::Output& output, const
166166

167167
struct StdPrefixEater
168168
{
169-
StdPrefixEater()
170-
: m_prefixWarning(str::to_wstring(wxGetTranslation("warning: ", "gettext-tools"))),
171-
m_prefixError(str::to_wstring(wxGetTranslation("error: ", "gettext-tools")))
169+
StdPrefixEater(const std::wstring& warning, const std::wstring& error)
170+
: m_prefixWarning(warning), m_prefixError(error)
172171
{}
173172

174-
inline void eat_std_prefixes(std::wstring& err, ParsedGettextErrors::Item& rec)
173+
inline bool eat_std_prefixes(std::wstring& err, ParsedGettextErrors::Item& rec)
175174
{
176175
if (boost::starts_with(err, m_prefixError))
177176
{
178177
err = err.substr(m_prefixError.length());
179178
// this is the default already, but let's be explicit:
180179
rec.level = ParsedGettextErrors::Error;
180+
return true;
181181
}
182182
else if (boost::starts_with(err, m_prefixWarning))
183183
{
184184
err = err.substr(m_prefixWarning.length());
185185
rec.level = ParsedGettextErrors::Warning;
186+
return true;
186187
}
188+
return false;
187189
}
188190

189191
std::wstring m_prefixWarning, m_prefixError;
190192
};
191-
StdPrefixEater eater;
193+
194+
StdPrefixEater eaterEnglish(L"warning: ", L"error: ");
195+
StdPrefixEater eaterLocalized(str::to_wstring(wxGetTranslation("warning: ", "gettext-tools")),
196+
str::to_wstring(wxGetTranslation("error: ", "gettext-tools")));
192197

193198
process_error_output
194199
(
@@ -201,7 +206,8 @@ ParsedGettextErrors parse_gettext_stderr(const subprocess::Output& output, const
201206
ParsedGettextErrors::Item rec;
202207

203208
// recognizing standard prefixes first simplifies differentiating between then and file:line locations:
204-
eater.eat_std_prefixes(err, rec);
209+
if (!eaterLocalized.eat_std_prefixes(err, rec))
210+
eaterEnglish.eat_std_prefixes(err, rec);
205211

206212
static const std::wregex RE_LOCATION(L"^([^\r\n]+):([0-9]+): ", std::regex_constants::ECMAScript | std::regex_constants::optimize);
207213
std::wsmatch match;
@@ -213,7 +219,8 @@ ParsedGettextErrors parse_gettext_stderr(const subprocess::Output& output, const
213219
}
214220

215221
// have to do again, as the standard format is e.g. "test.c:7: warning: text..."
216-
eater.eat_std_prefixes(err, rec);
222+
if (!eaterLocalized.eat_std_prefixes(err, rec))
223+
eaterEnglish.eat_std_prefixes(err, rec);
217224

218225
rec.text = err;
219226

0 commit comments

Comments
 (0)