Catalog *SourceDigger::Dig(const wxArrayString& paths, const wxArrayString& keywords, const wxString& charset) { ParsersDB pdb; pdb.Read(wxConfig::Get()); m_progressInfo->UpdateMessage(_("Scanning files...")); wxArrayString *all_files = FindFiles(paths, pdb); if (all_files == NULL) return NULL; TempDirectory tmpdir; wxArrayString partials; for (size_t i = 0; i < pdb.GetCount(); i++) { if ( all_files[i].empty() ) continue; // no files of this kind m_progressInfo->UpdateMessage( wxString::Format(_("Parsing %s files..."), pdb[i].Name.c_str())); if (!DigFiles(tmpdir, partials, all_files[i], pdb[i], keywords, charset)) { delete[] all_files; return NULL; } } delete[] all_files; if ( partials.empty() ) return NULL; // couldn't parse any source files wxString mergedFile = tmpdir.CreateFileName(_T("merged.pot")); if ( !ConcatCatalogs(partials, mergedFile) ) return NULL; Catalog *c = new Catalog(mergedFile, Catalog::CreationFlag_IgnoreHeader); if ( !c->IsOk() ) { wxLogError(_("Failed to load extracted catalog.")); delete c; return NULL; } return c; }
void PoeditApp::SetDefaultParsers(wxConfigBase *cfg) { ParsersDB pdb; bool changed = false; wxString defaultsVersion = cfg->Read("Parsers/DefaultsVersion", "1.2.x"); pdb.Read(cfg); // Add parsers for languages supported by gettext itself (but only if the // user didn't already add language with this name himself): static struct { const char *name; const char *exts; } s_gettextLangs[] = { { "C/C++", "*.c;*.cpp;*.h;*.hpp;*.cc;*.C;*.cxx;*.hxx" }, { "C#", "*.cs" }, { "Java", "*.java" }, { "Perl", "*.pl" }, { "PHP", "*.php" }, { "Python", "*.py" }, { "TCL", "*.tcl" }, { NULL, NULL } }; for (size_t i = 0; s_gettextLangs[i].name != NULL; i++) { // if this lang is already registered, don't overwrite it: if (pdb.FindParser(s_gettextLangs[i].name) != -1) continue; wxString langflag; if ( wxStrcmp(s_gettextLangs[i].name, "C/C++") == 0 ) langflag = " --language=C++"; else langflag = wxString(" --language=") + s_gettextLangs[i].name; // otherwise add new parser: Parser p; p.Name = s_gettextLangs[i].name; p.Extensions = s_gettextLangs[i].exts; p.Command = wxString("xgettext") + langflag + " --add-comments=TRANSLATORS --force-po -o %o %C %K %F"; p.KeywordItem = "-k%k"; p.FileItem = "%f"; p.CharsetItem = "--from-code=%c"; pdb.Add(p); changed = true; } // If upgrading Poedit to 1.2.4, add dxgettext parser for Delphi: #ifdef __WINDOWS__ if (defaultsVersion == "1.2.x") { Parser p; p.Name = "Delphi (dxgettext)"; p.Extensions = "*.pas;*.dpr;*.xfm;*.dfm"; p.Command = "dxgettext --so %o %F"; p.KeywordItem = wxEmptyString; p.FileItem = "%f"; pdb.Add(p); changed = true; } #endif // If upgrading Poedit to 1.2.5, update C++ parser to handle --from-code: if (defaultsVersion == "1.2.x" || defaultsVersion == "1.2.4") { int cpp = pdb.FindParser("C/C++"); if (cpp != -1) { if (pdb[cpp].Command == "xgettext --force-po -o %o %K %F") { pdb[cpp].Command = "xgettext --force-po -o %o %C %K %F"; pdb[cpp].CharsetItem = "--from-code=%c"; changed = true; } } } // Poedit 1.5.6 had a breakage, it add --add-comments without space in front of it. // Repair this automatically: for (size_t i = 0; i < pdb.GetCount(); i++) { wxString& cmd = pdb[i].Command; if (cmd.Contains("--add-comments=") && !cmd.Contains(" --add-comments=")) { cmd.Replace("--add-comments=", " --add-comments="); changed = true; } } if (changed) { pdb.Write(cfg); cfg->Write("Parsers/DefaultsVersion", GetAppVersion()); } }