message: Use --files-from for msgcat too
  Prevent "filename too long" errors when concatenating a huge number of
  files (typically when legacy extractors were involved) by passing the
  arguments through a file instead of cmdline.
  This was already being done for xgettext, extent the same protection to
  Extractor.ConcatCatalogs()'s use of msgcat.
diff: #include <wx/dir.h>
  #include <wx/filename.h>
  +#include <wx/textfile.h>
  #include <algorithm>
  @@ -324,11 +325,29 @@ wxString Extractor::ConcatCatalogs(TempDirectory& tmpdir, const std::vector<wxSt
  auto outfile = tmpdir.CreateFileName("concatenated.pot");
  - wxString list;
  - for (auto& f: files)
  - list += wxString::Format(" %s", QuoteCmdlineArg(f));
  + 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 cmd = wxString::Format("msgcat --force-po -o %s %s", QuoteCmdlineArg(outfile), list);
  + auto cmd = wxString::Format
  + (
  + "msgcat --force-po -o %s --files-from=%s",
  + QuoteCmdlineArg(outfile),
  + QuoteCmdlineArg(filelist.GetName())
  + );
  bool succ = ExecuteGettext(cmd);
  if (!succ)
  