wxString Extractor::GetCommand(const wxArrayString& files, const wxArrayString& keywords, const wxString& output, const wxString& charset) { wxString cmdline, kline, fline; cmdline = Command; cmdline.Replace("%o", QuoteCmdlineArg(output)); wxString dummy; size_t i; for (i = 0; i < keywords.GetCount(); i++) { dummy = KeywordItem; dummy.Replace("%k", keywords[i]); kline << " " << dummy; } for (i = 0; i < files.GetCount(); i++) { wxString fn = files[i]; #ifdef __WXMSW__ // Gettext tools can't handle Unicode filenames well (due to using // char* arguments), so work around this by using the short names. if (!fn.IsAscii()) { fn = wxFileName(fn).GetShortPath(); fn.Replace("\\", "/"); } #endif dummy = FileItem; dummy.Replace("%f", QuoteCmdlineArg(fn)); fline << " " << dummy; } wxString charsetline; if (!charset.empty()) { charsetline = CharsetItem; charsetline.Replace("%c", charset); } cmdline.Replace("%C", charsetline); cmdline.Replace("%K", kline); cmdline.Replace("%F", fline); return cmdline; }
wxString Extract(TempDirectory& tmpdir, const SourceCodeSpec& sourceSpec, const std::vector<wxString>& files) const override { auto basepath = sourceSpec.BasePath; #ifdef __WXMSW__ basepath = CliSafeFileName(basepath); basepath.Replace("\\", "/"); #endif wxTextFile filelist; filelist.Create(tmpdir.CreateFileName("gettext_filelist.txt")); for (auto fn: files) { #ifdef __WXMSW__ // Gettext tools can't handle Unicode filenames well (due to using // char* arguments), so work around this by using the short names. if (!fn.IsAscii()) { fn = CliSafeFileName(fn); fn.Replace("\\", "/"); } #endif filelist.AddLine(fn); } filelist.Write(wxTextFileType_Unix, wxConvFile); auto outfile = tmpdir.CreateFileName("gettext.pot"); wxString cmdline; cmdline.Printf ( "xgettext --force-po -o %s --directory=%s --files-from=%s --from-code=%s", QuoteCmdlineArg(outfile), QuoteCmdlineArg(basepath), QuoteCmdlineArg(filelist.GetName()), QuoteCmdlineArg(!sourceSpec.Charset.empty() ? sourceSpec.Charset : "UTF-8") ); auto additional = GetAdditionalFlags(); if (!additional.empty()) cmdline += " " + additional; for (auto& kw: sourceSpec.Keywords) { cmdline += wxString::Format(" -k%s", QuoteCmdlineArg(kw)); } wxString extraFlags; try { extraFlags = sourceSpec.XHeaders.at("X-Poedit-Flags-xgettext"); } catch (std::out_of_range) {} if (!extraFlags.Contains("--add-comments")) cmdline += " --add-comments=TRANSLATORS:"; if (!extraFlags.empty()) cmdline += " " + extraFlags; if (!ExecuteGettext(cmdline)) return ""; return outfile; }