Author: jani Date: Sun Mar 3 21:53:34 2013 New Revision: 1452135 URL: http://svn.apache.org/r1452135 Log: Load of modified sdf works for languages (de,da,fr)
Modified: openoffice/branches/l10n/main/l10ntools/source/gCon.cxx openoffice/branches/l10n/main/l10ntools/source/gCon.hxx openoffice/branches/l10n/main/l10ntools/source/gConDB.cxx openoffice/branches/l10n/main/l10ntools/source/gConDB.hxx openoffice/branches/l10n/main/l10ntools/source/gConPoWrap.cxx openoffice/branches/l10n/main/l10ntools/source/gConXcsWrap.cxx openoffice/branches/l10n/main/l10ntools/source/gConXcuWrap.cxx openoffice/branches/l10n/main/l10ntools/source/gConXhpWrap.cxx openoffice/branches/l10n/main/l10ntools/source/gHandler.cxx openoffice/branches/l10n/main/l10ntools/source/gL10nMem.cxx openoffice/branches/l10n/main/l10ntools/source/gL10nMem.hxx openoffice/branches/l10n/main/l10ntools/source/gLang.hxx Modified: openoffice/branches/l10n/main/l10ntools/source/gCon.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gCon.cxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gCon.cxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gCon.cxx Sun Mar 3 21:53:34 2013 @@ -19,6 +19,7 @@ * *************************************************************/ #include "gCon.hxx" +#include "gConDB.hxx" #include "gConPo.hxx" #include "gConProp.hxx" #include "gConSrc.hxx" @@ -49,7 +50,7 @@ convert_gen_impl * convert_gen_impl::mcI /********************** I M P L E M E N T A T I O N **********************/ -convert_gen::convert_gen(const std::string& srSourceFile, l10nMem& crMemory, const bool bMerge) +convert_gen::convert_gen(l10nMem& crMemory, const std::string& srSourceFile) { // did the user give a .xxx with the source file ? int nInx = srSourceFile.rfind("."); @@ -65,6 +66,7 @@ convert_gen::convert_gen(const std::stri if (sExtension == "hrc") convert_gen_impl::mcImpl = new convert_src(crMemory); else if (sExtension == "src") convert_gen_impl::mcImpl = new convert_src(crMemory); else if (sExtension == "po") convert_gen_impl::mcImpl = new convert_po(crMemory); + else if (sExtension == "pot") convert_gen_impl::mcImpl = new convert_db(crMemory); else if (sExtension == "tree") convert_gen_impl::mcImpl = new convert_tree(crMemory); else if (sExtension == "ulf") convert_gen_impl::mcImpl = new convert_ulf(crMemory); else if (sExtension == "xcu") convert_gen_impl::mcImpl = new convert_xcu(crMemory); @@ -75,7 +77,6 @@ convert_gen::convert_gen(const std::stri // and set environment convert_gen_impl::mcImpl->msSourceFile = srSourceFile; - convert_gen_impl::mcImpl->mbMergeMode = bMerge; } @@ -89,8 +90,10 @@ convert_gen::~convert_gen() /********************** I M P L E M E N T A T I O N **********************/ -void convert_gen::execute() +void convert_gen::execute(const bool bMerge) { + convert_gen_impl::mcImpl->mbMergeMode = bMerge; + // and load file convert_gen_impl::mcImpl->prepareFile(); @@ -102,8 +105,8 @@ void convert_gen::execute() /********************** I M P L E M E N T A T I O N **********************/ convert_gen_impl::convert_gen_impl(l10nMem& crMemory) - : mcMemory(crMemory), - miLineNo(1) + : mcMemory(crMemory), + miLineNo(1) { } @@ -127,7 +130,7 @@ void convert_gen_impl::prepareFile() throw showError((char *)"Cannot open file"); // get length of file: - mnSourceReadIndex = 0; + miSourceReadIndex = 0; inputFile.seekg (0, std::ios::end); msSourceBuffer.resize((unsigned int)inputFile.tellg()); inputFile.seekg (0, std::ios::beg); @@ -146,26 +149,26 @@ void convert_gen_impl::prepareFile() void convert_gen_impl::lexRead(char *sBuf, int *nResult, int nMax_size) { // did we hit eof - if (mnSourceReadIndex == -1) + if (miSourceReadIndex == -1) { *nResult = 0; return; } // assume we can copy all that are left. - *nResult = msSourceBuffer.size() - mnSourceReadIndex; + *nResult = msSourceBuffer.size() - miSourceReadIndex; // space enough for the whole line ? if (*nResult <= nMax_size) { - msSourceBuffer.copy(sBuf, *nResult, mnSourceReadIndex); - mnSourceReadIndex = -1; + msSourceBuffer.copy(sBuf, *nResult, miSourceReadIndex); + miSourceReadIndex = -1; } else { - msSourceBuffer.copy(sBuf, nMax_size, mnSourceReadIndex); + msSourceBuffer.copy(sBuf, nMax_size, miSourceReadIndex); *nResult = nMax_size; - mnSourceReadIndex += nMax_size; + miSourceReadIndex += nMax_size; } } @@ -193,7 +196,7 @@ std::string& convert_gen_impl::copySourc // write text for merge if (mbMergeMode) - writeSourceFile(msCollector + msCopyText); + writeSourceFile(msCopyText); if (bDoClear) msCollector.clear(); @@ -203,13 +206,13 @@ std::string& convert_gen_impl::copySourc // remove any CR for (nL = 0; nL < (int)msCopyText.size(); ++nL) { - if (msCopyText[nL] == '\r') - { - msCopyText.erase(nL, 1); - --nL; - continue; - } - if (msCopyText[nL] == '\n') + if (msCopyText[nL] == '\r') + { + msCopyText.erase(nL, 1); + --nL; + continue; + } + if (msCopyText[nL] == '\n') ++miLineNo; } Modified: openoffice/branches/l10n/main/l10ntools/source/gCon.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gCon.hxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gCon.hxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gCon.hxx Sun Mar 3 21:53:34 2013 @@ -59,14 +59,14 @@ class convert_gen_impl // utility functions for converters - void lexRead (char *sBuf, int *nResult, int nMax_size); - void writeSourceFile(const std::string& line); - std::string showError(char *sText); + void lexRead (char *sBuf, int *nResult, int nMax_size); + void writeSourceFile(const std::string& line); + std::string showError(char *sText); std::string& copySource(char *yyText, bool bDoClear = true); - private: + protected: std::string msSourceBuffer, msCopyText; - int mnSourceReadIndex; + int miSourceReadIndex; void prepareFile(); Modified: openoffice/branches/l10n/main/l10ntools/source/gConDB.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gConDB.cxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gConDB.cxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gConDB.cxx Sun Mar 3 21:53:34 2013 @@ -39,4 +39,70 @@ convert_db::~convert_db() /********************** I M P L E M E N T A T I O N **********************/ void convert_db::execute() { -} \ No newline at end of file + std::string oldKey; + int iB, iE; + + + msSourceBuffer += '\n'; + miSize = msSourceBuffer.size() -1; + + while (collectLine()) + { + mcMemory.setFileName(msFields[0]); + if (mbMergeMode) + { + iB = msFields[15].find("/"); + if (iB == (int)std::string::npos) + showError("missing / in en_US"); + iE = msFields[15].find("/", iB+1); + if (iE == (int)std::string::npos) + showError("missing / in en_US"); + oldKey = msFields[15].substr(iB+1, iE - iB -1); + iB = msFields[15].find("/",iE+1); + if (iB == (int)std::string::npos) + showError("missing / in en_US"); + if (iB != iE+1) + oldKey += "." + msFields[15].substr(iE+1, iB - iE -1); + + // handle en-US (master) + mcMemory.loadEnUsKey(msFields[4], msFields[3], msFields[10], oldKey); + } + else + { + std::string newKey = msFields[4]; + if (msFields[5].size()) + newKey += "." + msFields[5]; + mcMemory.loadLangKey(msFields[9], newKey, msFields[3], msFields[10]); + } + } +} + + +/********************** I M P L E M E N T A T I O N **********************/ +bool convert_db::collectLine() +{ + int i, iStart; + bool bLineEnd; + + for (i = 0; i < NUMFIELD; ++i) + msFields[i].clear(); + + for (i = 0, bLineEnd = false, iStart = miSourceReadIndex; !bLineEnd; ++miSourceReadIndex) + { + if (msSourceBuffer[miSourceReadIndex] == '\r' || + msSourceBuffer[miSourceReadIndex] == '\n' || + miSourceReadIndex == miSize) + bLineEnd = true; + if (msSourceBuffer[miSourceReadIndex] == '\t' || bLineEnd) + { + if (i >= NUMFIELD) + { + showError("TOO many fields"); + exit(-1); + } + msFields[i++] = msSourceBuffer.substr(iStart, miSourceReadIndex - iStart); + iStart = miSourceReadIndex +1; + } + } + return (miSourceReadIndex < miSize); +} Modified: openoffice/branches/l10n/main/l10ntools/source/gConDB.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gConDB.hxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gConDB.hxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gConDB.hxx Sun Mar 3 21:53:34 2013 @@ -40,6 +40,11 @@ class convert_db : public convert_gen_im ~convert_db(); private: + static const int NUMFIELD = 16; + std::string msFields[NUMFIELD]; + int miSize; + void execute(); + bool collectLine(); }; #endif \ No newline at end of file Modified: openoffice/branches/l10n/main/l10ntools/source/gConPoWrap.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gConPoWrap.cxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gConPoWrap.cxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gConPoWrap.cxx Sun Mar 3 21:53:34 2013 @@ -77,6 +77,7 @@ void convert_po::stopCollectData(char *s if (mbMergeMode) { +#if 0 // get all languages (includes en-US) std::vector<l10nMem_entry *>& cExtraLangauges = mcMemory.getLanguagesForKey(useKey); std::string sNewLine; @@ -89,6 +90,7 @@ void convert_po::stopCollectData(char *s cExtraLangauges[i]->msText + "</value>"; writeSourceFile(sNewLine); } +#endif } else mcMemory.setEnUsKey(miLineNo, useKey, std::string("dummy"), sCollectedText); Modified: openoffice/branches/l10n/main/l10ntools/source/gConXcsWrap.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gConXcsWrap.cxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gConXcsWrap.cxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gConXcsWrap.cxx Sun Mar 3 21:53:34 2013 @@ -136,6 +136,7 @@ void convert_xcs::stopCollectData(char * if (mbMergeMode) { +#if 0 // get all languages (includes en-US) std::vector<l10nMem_entry *>& cExtraLangauges = mcMemory.getLanguagesForKey(sKey); std::string sNewLine; @@ -150,6 +151,7 @@ void convert_xcs::stopCollectData(char * writeSourceFile(sNewLine); } +#endif } else mcMemory.setEnUsKey(miLineNo, sKey, std::string("dummy"), sText); Modified: openoffice/branches/l10n/main/l10ntools/source/gConXcuWrap.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gConXcuWrap.cxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gConXcuWrap.cxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gConXcuWrap.cxx Sun Mar 3 21:53:34 2013 @@ -155,6 +155,7 @@ void convert_xcu::stopCollectData(char * if (mbMergeMode) { // get all languages (includes en-US) +#if 0 std::vector<l10nMem_entry *>& cExtraLangauges = mcMemory.getLanguagesForKey(useKey); std::string sNewLine; nL = cExtraLangauges.size(); @@ -165,6 +166,7 @@ void convert_xcu::stopCollectData(char * cExtraLangauges[i]->msText + "</value>"; writeSourceFile(sNewLine); } +#endif } else if (useText.size()) Modified: openoffice/branches/l10n/main/l10ntools/source/gConXhpWrap.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gConXhpWrap.cxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gConXhpWrap.cxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gConXhpWrap.cxx Sun Mar 3 21:53:34 2013 @@ -215,7 +215,7 @@ void convert_xhp::setRef(char *yytext) break; case VALUE_NOT_USED: - VALUE_IS_VALUE: + case VALUE_IS_VALUE: break; } } Modified: openoffice/branches/l10n/main/l10ntools/source/gHandler.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gHandler.cxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gHandler.cxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gHandler.cxx Sun Mar 3 21:53:34 2013 @@ -35,148 +35,133 @@ /********************** I M P L E M E N T A T I O N **********************/ -handler::handler() {} -handler::~handler() {} +handler::handler() + : mbVerbose(false) +{ +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +handler::~handler() +{ +} /********************** I M P L E M E N T A T I O N **********************/ void handler::checkCommandLine(int argc, char *argv[]) { + enum {ARG_NONE, ARG_F, ARG_O, ARG_S, ARG_T} eGotArg = ARG_NONE; std::string sWorkText; + int argNow, nLen; // make internal throw test (to avoid if cascades try { - // check for parameter count - if (argc <= 1) - throw std::string(""); + // check for fixed parameter: genLang <cmd> <module> <po dir> <languages> + if (argc <= 5) + throw std::string("Not enough parameters"); // check for working mode sWorkText = argv[1]; + if (sWorkText == "convert") meWorkMode = DO_CONVERT; + else if (sWorkText == "extract") meWorkMode = DO_EXTRACT; + else if (sWorkText == "help") showManual(); + else if (sWorkText == "merge") meWorkMode = DO_EXTRACT; + else throw std::string("<command> is mandatory"); + + // and set fixed parameters + msModuleName = argv[2]; + msPoOutDir = msPoDir = argv[3]; + sWorkText = argv[4]; + if (sWorkText[0] == '\"') + sWorkText.erase(0,1); + nLen = sWorkText.size() -1; + if (sWorkText[nLen] == '\"') + sWorkText.erase(nLen); + if (!sWorkText.size()) + throw std::string("<languages> is mandatory"); - if (sWorkText == "extract") meWorkMode = DO_EXTRACT; - else if (sWorkText == "merge") meWorkMode = DO_EXTRACTMERGE; - else if (sWorkText == "generate") meWorkMode = DO_GENERATE; - else if (sWorkText == "insert") meWorkMode = DO_INSERT; - else if (sWorkText == "--help") throw std::string(""); - else throw std::string("unknown mode (1 argument)"); - + // and convert language to a vector + { + int current; + int next = -1; + do + { + current = next + 1; + next = sWorkText.find_first_of( ",", current ); + mvLanguages.push_back(sWorkText.substr(current,next-current)); + } + while (next != (int)std::string::npos); + } + // decode parameters and translate to variables - for (int n = 2; n < argc; ++n) + for (argNow = 5; argNow < argc;) { - std::string sArg(argv[n]); + std::string sArg(argv[argNow++]); - // all -x is followed by a directory - if (sArg.at(0) == '-') + // all -x is followed by a directory/file name + if (sArg[0] == '-') { - if (n == argc) - throw std::string("missing directory after ")+sArg; - - // find directory type, and set it - if (sArg == "-m") msModuleName = argv[++n]; - else if (sArg == "-t") msTargetDir = argv[++n]; - else if (sArg == "-s") msSourceDir = argv[++n]; - else if (sArg == "-v") mbVerbose = true; - else throw std::string("unknown parameter: ")+sArg; + // Terminate collection ? + if (eGotArg == ARG_F) + eGotArg = ARG_NONE; + + // Are we waiting for a directory + if (eGotArg != ARG_NONE) + throw (std::string("missing argument to ") + argv[argNow-1]); + + // is it a known parameter + if (sArg == "-f") eGotArg = ARG_F; + else if (sArg == "-o") eGotArg = ARG_O; + else if (sArg == "-s") eGotArg = ARG_S; + else if (sArg == "-t") eGotArg = ARG_T; + else if (sArg == "-v") mbVerbose = true; + else throw std::string("unknown parameter: ")+sArg; } else - msSourceFiles.push_back(sArg); + { + switch (eGotArg) + { + case ARG_F: mvSourceFiles.push_back(sArg); break; + case ARG_O: msPoOutDir = sArg; eGotArg = ARG_NONE; break; + case ARG_S: msSourceDir = sArg; eGotArg = ARG_NONE; break; + case ARG_T: msTargetDir = sArg; eGotArg = ARG_NONE; break; + } + } } // check parameters according to function - switch (meWorkMode) - { - case DO_EXTRACT: - // required parameters - if (!msModuleName.size()) throw std::string("missing -m <module name>"); - if (!msTargetDir.size()) throw std::string("missing -t <target dir>"); - if (!msSourceFiles.size()) throw std::string("missing source files"); - break; - - case DO_EXTRACTMERGE: - // required parameters - if (!msSourceDir.size()) throw std::string("missing -s <source dir>"); - if (!msTargetDir.size()) throw std::string("missing -t <target dir>"); - - // not allowed parameters - if (msModuleName.size()) throw std::string("-m is invalid with merge"); - if (msSourceFiles.size()) throw std::string("<source> is invalid with merge"); - break; - - case DO_GENERATE: - // required parameters - if (!msSourceDir.size()) throw std::string("missing -s <source dir>"); - if (!msTargetDir.size()) throw std::string("missing -t <target dir>"); - - // not allowed parameters - if (msModuleName.size()) throw std::string("-m is invalid with generate"); - if (!msSourceFiles.size()) throw std::string("<source> is invalid with generate"); - break; - - case DO_INSERT: - // required parameters - if (!msModuleName.size()) throw std::string("missing -m <module name>"); - if (!msSourceDir.size()) throw std::string("missing -s <source dir>"); - - // not allowed parameters - if (!msSourceFiles.size()) throw std::string("<source> is invalid with generate"); - break; - } + if (!mvSourceFiles.size()) + throw std::string("-f <files> is mandatory"); + + // partly valid + if (meWorkMode != DO_MERGE && msTargetDir.size()) + throw std::string("-t is mandatory using \"extract\""); + if (meWorkMode == DO_MERGE && !msTargetDir.size()) + throw std::string("-t is only valid using \"extract\""); } catch(std::string sErr) { - // do we have an error text ? - if (sErr.size()) - std::cerr << "commandline error:" << sErr << std::endl; - - // give the correct usage - std::cout << "genLang (c)2013 by Apache Software Foundation\n" - "====================================\n" - "As part of the L10N framework, genLang extracts and merges translations\n" - "out of and into the whole source tree.\n\n" - "Syntax:\n" - " genLang extract -m <name> [-s <source dir>] -t <target dir> <sources>\n" - " genLang merge -s <source dir> -t <target dir>\n" - " genLang generate -s <source dir> -t <target dir>\n" - " genLang insert -s <source dir> -m <name> [-t <target dir>]\n" - " genLang --help\n" - "Parameters:\n" - " extract, causes a scan of the <sources> for en-US text, and creates\n" - " a module file: <target dir>/<module name>\n" - " -s can optionally be used to specify the root of <source>\n" - " merge, causes a merge of the en-US files in <source dir> with the\n" - " native language files in <target dir>/*\n" - " generate, uses the native language files in <source dir> to build\n" - " module files in <target dir> with all language\n" - " insert, uses the module file <source dir>/<module name> to\n" - " update the source files in the module" - "\n" - " -v verbose mode, tells what gLang is doing\n" - " -m <modulename> name of the module, used in file naming\n" - " -s <source dir> extract: source file directory\n" - " merge: language staging input directory\n" - " generate: native language directory\n" - " insert: language staging output directory\n" - " -t <target dir> extract: language staging input directory\n" - " merge: native language directory\n" - " generate: language output staging directory\n" - " <sources> list of files containing messages to be extracted\n"; + showUsage(sErr); exit(-1); } // update directories to include final / - { - int nLen; - - nLen = msSourceDir.size(); - if (nLen && msSourceDir.at(nLen-1) != '/') - msSourceDir.append("/"); - nLen = msTargetDir.size(); - if (msTargetDir.at(nLen-1) != '/') - msTargetDir.append("/"); - } + nLen = msSourceDir.size(); + if (nLen && msSourceDir.at(nLen-1) != '/') + msSourceDir.append("/"); + nLen = msTargetDir.size(); + if (nLen && msTargetDir.at(nLen-1) != '/') + msTargetDir.append("/"); + nLen = msPoDir.size(); + if (nLen && msPoDir.at(nLen-1) != '/') + msPoDir.append("/"); + nLen = msPoOutDir.size(); + if (nLen && msPoOutDir.at(nLen-1) != '/') + msPoOutDir.append("/"); // tell system if (mbVerbose) @@ -190,13 +175,18 @@ void handler::run() { try { + // prepare translation memory to module type + mcMemory.setModuleName(msModuleName); + + // build list of languages (to be loaded and later written + loadL10MEM(); + // use workMode to start correct control part switch (meWorkMode) { - case DO_EXTRACT: runExtractMerge(false); break; - case DO_EXTRACTMERGE: runExtractMerge(true); break; - case DO_GENERATE: runGenerate(); break; - case DO_INSERT: runInsert(); break; + case DO_EXTRACT: runExtractMerge(false); break; + case DO_MERGE: runExtractMerge(true); break; + case DO_CONVERT: runConvert(); break; } } catch(std::string sErr) @@ -211,11 +201,9 @@ void handler::run() /********************** I M P L E M E N T A T I O N **********************/ void handler::runExtractMerge(bool bMerge) { - // prepare translation memory to module type - mcMemory.setModuleName(msModuleName); // loop through all source files, and extract messages from each file - for (std::vector<std::string>::iterator siSource = msSourceFiles.begin(); siSource != msSourceFiles.end(); ++siSource) + for (std::vector<std::string>::iterator siSource = mvSourceFiles.begin(); siSource != mvSourceFiles.end(); ++siSource) { // tell system if (mbVerbose) @@ -225,26 +213,155 @@ void handler::runExtractMerge(bool bMerg mcMemory.setFileName(*siSource); // get converter and extract files - convert_gen convertObj(msSourceDir + *siSource, mcMemory, bMerge); - convertObj.execute(); + convert_gen convertObj(mcMemory, msSourceDir + *siSource); + convertObj.execute(bMerge); } // and generate language file - mcMemory.save(msTargetDir + msModuleName); +// mcMemory.save(msTargetDir + msModuleName); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +void handler::runConvert() +{ + throw std::string("handler::runConvert not implemented"); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +void handler::showUsage(std::string& sErr) +{ + // do we have an error text ? + if (sErr.size()) + std::cerr << "commandline error:" << sErr << std::endl; + + std::cout << + "syntax oveview, use \"genLang help\" for full description\n" + "genLang <cmd> <module> <po dir> <languages> [-f <files>] [-o <dir>] [-s <dir>] [-t <dir>] [-v]\n" + "<cmd> is one of \"convert\", \"extract\", \"help\", \"merge\"\n"; + + exit(-1); } /********************** I M P L E M E N T A T I O N **********************/ -void handler::runGenerate() +void handler::showManual() { - throw std::string("handler::runGenerate not implemented"); + // give the correct usage + std::cout << + "genLang (c)2013 by Apache Software Foundation\n" + "=============================================\n" + "As part of the L10N framework for Apache Open Office (AOO),\n" + "genLang extracts en-US texts sources of the following types:\n" + " .xrm, .xhp, .xcu, .xcs, .ulf, .tree, .src, .prop and .po\n" + "and merges with .po files in different languages.\n" + "genLang merges .po files with AOO sources to add languages.\n" + "\n" + "genLang can also convert old .po files (generated from .sdf)\n" + "\n" + "Syntax:\n" + " genLang extract <module> <po dir> <languages> [-v] \\\n" + " [-o <po outdir>] -f <files> -s <source dir>\n" + " reads <po dir>/*lang/<module>.po files and extract text\n" + " from <source dir>/<files>, result is merged and\n" + " written to <po outdir>/*lang/<module>.po if -o present\n" + " or <po dir>/*lang/<module>.po is overwritten\n" + " - File will only be written if they are changes\n" + " - Keys in .po files, not in sources files (deleted keys)\n" + " are moved to '-p <dir>'/<module>.deleted.po\n" + " - Keys in .po files, with changed text in the source\n" + " are marked \"fuzzy\"\n" + " - Keys in source files not in .po files (new keys)\n" + " are added and marked \"fuzzy\"\n" + "\n" + " genLang merge <module> <po dir> <languages> [-v]\\\n" + " [-o <po outdir>] -f <files> -s <source dir> \\\n" + " -t <target dir>\n" + " works as \"extract\" and additionally merges\n" + " <source dir>/<files> with all native language text\n" + " from <po dir>/*lang/<module>.po\n" + " The result is stored in <target dir>/<files>\n" + "\n" + " genLang convert <module> <po dir> <languages> [-v] \\\n" + " [-o <po outdir>] -f <files>\n" + " reads sdf generated .po <files> and merges with\n" + " <po dir>/*lang/<module>.po\n" + " Result is written to <po outdir>/*lang/<module>.po if\n" + " - present or <po dir>/*lang/<module>.po is overwritten\n" + " - File will only be written if they are changes\n" + " - Keys in <files>, not in <module>.po\n" + " are moved to <po dir>/<module>.deleted.po\n" + " - Keys in <files>, with changed translation\n" + " are marked \"fuzzy\"\n" + " Result is written to <po outdir>/*lang/<module>.po if\n" + " -o present or <po dir>/*lang/<module>.po is overwritten\n" + "\n" + " genLang help\n" + " this text\n" + "\n" + "Parameters:\n" + " <module>\n" + " name of module (directory in main)\n" + " <po dir>\n" + " directory containing a directory for each language which contains\n" + " a .po file for each module\n" + " <languages>\n" + " comma separated string with langauge id to be used\n" + "\n" + " -f <files>\n" + " list of files containing messages to be extracted\n" + " \"convert\" expect sdf generated po files, to be converted\n" + " -o <po outdir>\n" + " directory to write .po files, same structure as -p\n" + " -s <source dir>\n" + " directory containing all source files (root path for <files>\n" + " -t <target dir>\n" + " <directory> used to write merged source files (root path for <files>\n" + " -v\n" + " verbose mode, tells what gLang is doing\n"; + + exit(0); } /********************** I M P L E M E N T A T I O N **********************/ -void handler::runInsert() +void handler::loadL10MEM() { - throw std::string("handler::runInsert not implemented"); + std::string sMod = "/" + msModuleName + ".pot"; + std::string sLoad = msPoDir + "en-US" + sMod; + + + // load texts from en-US po file (master) + { + // prepare translation memory + mcMemory.setFileName(sLoad); + + // tell system + if (mbVerbose) + std::cout << "gLang loading master text from file " << sLoad << std::endl; + + // and load file + convert_gen(mcMemory, sLoad).execute(true); + } + + // loop through all languages and load text + for (std::vector<std::string>::iterator siLang = mvLanguages.begin(); siLang != mvLanguages.end(); ++siLang) + { + sLoad = msPoDir + *siLang + sMod; + + // prepare translation memory + mcMemory.setFileName(sLoad); + + // tell system + if (mbVerbose) + std::cout << "gLang loading text from language file " << sLoad << std::endl; + + // get converter and extract files + convert_gen(mcMemory, sLoad).execute(false); + } } Modified: openoffice/branches/l10n/main/l10ntools/source/gL10nMem.cxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gL10nMem.cxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gL10nMem.cxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gL10nMem.cxx Sun Mar 3 21:53:34 2013 @@ -18,7 +18,7 @@ * under the License. * *************************************************************/ -#include "gLang.hxx" +#include "gL10nMem.hxx" #include <algorithm> #include <iostream> #include <fstream> @@ -35,18 +35,109 @@ +/******************* G L O B A L D E F I N I T I O N *******************/ +l10nMem_impl * l10nMem_impl::mcImpl = NULL; + + + +/********************** I M P L E M E N T A T I O N **********************/ +l10nMem::l10nMem() +{ + l10nMem_impl::mcImpl = new l10nMem_impl(); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +l10nMem::~l10nMem() +{ + delete l10nMem_impl::mcImpl; +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +std::string l10nMem::showError(int iLineNo, char *sText, bool bWarning) +{ + return l10nMem_impl::mcImpl->showError(iLineNo, sText, bWarning); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +bool l10nMem::isError() +{ + return l10nMem_impl::mcImpl->isError(); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +bool l10nMem::checkKey(const std::string& sKey, const std::string& sObjectType) +{ + return l10nMem_impl::mcImpl->checkKey(sKey, sObjectType); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +void l10nMem::setFileName(const std::string& srSourceFile) +{ + return l10nMem_impl::mcImpl->setFileName(srSourceFile); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +void l10nMem::setModuleName(const std::string& srModuleName) +{ + return l10nMem_impl::mcImpl->setModuleName(srModuleName); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +void l10nMem::setEnUsKey(int iLineNo, const std::string& srKey, const std::string& srObjectType, + const std::string& srText, int iIndex) +{ + return l10nMem_impl::mcImpl->setEnUsKey(iLineNo, srKey, srObjectType, srText, iIndex); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +void l10nMem::loadEnUsKey(const std::string& srKey, const std::string& srObjectType, + const std::string& srText, const std::string& oldKey) +{ + l10nMem_impl::mcImpl->loadEnUsKey(srKey, srObjectType, srText, oldKey); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +void l10nMem::loadLangKey(const std::string& srLang, const std::string& srKey, const std::string& srObjectType, + const std::string& srText) +{ + l10nMem_impl::mcImpl->loadLangKey(srLang, srKey, srObjectType, srText); +} + + + /********************** I M P L E M E N T A T I O N **********************/ l10nMem_entry::l10nMem_entry(const std::string& srSourceFile, const std::string& srModuleName, const std::string& srKey, const std::string& srObjectType, - const std::string& srLanguage, const std::string& srText, - const int iIndex) + const std::string& srLanguage, const std::string& srText, + const int iIndex, + const std::string srOldKey) : msSourceFile(srSourceFile), msModuleName(srModuleName), msKey(srKey), - msObjectType(srObjectType), + msObjectType(srObjectType), msLanguage(srLanguage), msText(srText), - miIndex(iIndex) + miIndex(iIndex), + msOLDKEY(srOldKey), + mbDeleted(true) { } @@ -59,9 +150,8 @@ l10nMem_entry::~l10nMem_entry() /********************** I M P L E M E N T A T I O N **********************/ -l10nMem::l10nMem() +l10nMem_impl::l10nMem_impl() : mbInError(false), - miStartInx(0), miLastUniqResort(0) { } @@ -69,14 +159,14 @@ l10nMem::l10nMem() /********************** I M P L E M E N T A T I O N **********************/ -l10nMem::~l10nMem() +l10nMem_impl::~l10nMem_impl() { } /********************** I M P L E M E N T A T I O N **********************/ -std::string l10nMem::showError(int iLineNo, char *sText, bool bWarning) +std::string l10nMem_impl::showError(int iLineNo, char *sText, bool bWarning) { if (!bWarning) mbInError = true; @@ -88,7 +178,7 @@ std::string l10nMem::showError(int iLine /********************** I M P L E M E N T A T I O N **********************/ -bool l10nMem::isError() +bool l10nMem_impl::isError() { return mbInError; } @@ -96,11 +186,11 @@ bool l10nMem::isError() /********************** I M P L E M E N T A T I O N **********************/ -bool l10nMem::checkKey(const std::string& sKey, const std::string& sObjectType) +bool l10nMem_impl::checkKey(const std::string& sKey, const std::string& sObjectType) { int i; - for (i = miStartInx; i < (int)mcMemory.size(); ++i) + for (i = 0; i < (int)mcMemory.size(); ++i) if (mcMemory[i].msModuleName == msCurrentModuleName && mcMemory[i].msSourceFile == msCurrentSourceFileName && mcMemory[i].msObjectType == sObjectType && @@ -112,7 +202,7 @@ bool l10nMem::checkKey(const std::string /********************** I M P L E M E N T A T I O N **********************/ -void l10nMem::save(const std::string& srTargetFile) +void l10nMem_impl::save(const std::string& srTargetFile) { int i; std::string sFile = srTargetFile + ".cnv"; @@ -143,7 +233,7 @@ void l10nMem::save(const std::string& sr /********************** I M P L E M E N T A T I O N **********************/ -void l10nMem::clear() +void l10nMem_impl::clear() { mcMemory.clear(); // JIX @@ -152,10 +242,9 @@ void l10nMem::clear() /********************** I M P L E M E N T A T I O N **********************/ -void l10nMem::setFileName(const std::string& srSourceFile) +void l10nMem_impl::setFileName(const std::string& srSourceFile) { msCurrentSourceFileName = srSourceFile; - miStartInx = mcMemory.size(); // modify to please current sdf format std::replace(msCurrentSourceFileName.begin(), msCurrentSourceFileName.end(), '/', '\\' ); @@ -164,7 +253,7 @@ void l10nMem::setFileName(const std::str /********************** I M P L E M E N T A T I O N **********************/ -void l10nMem::setModuleName(const std::string& srModuleName) +void l10nMem_impl::setModuleName(const std::string& srModuleName) { msCurrentModuleName = srModuleName; } @@ -172,7 +261,7 @@ void l10nMem::setModuleName(const std::s /********************** I M P L E M E N T A T I O N **********************/ -void l10nMem::setEnUsKey(int iLineNo, const std::string& srKey, const std::string& srObjectType, const std::string& srText, int iIndex) +void l10nMem_impl::setEnUsKey(int iLineNo, const std::string& srKey, const std::string& srObjectType, const std::string& srText, int iIndex) { std::string baseLanguage = "en-US"; std::string myKey = srKey; @@ -193,8 +282,52 @@ void l10nMem::setEnUsKey(int iLineNo, co + +/********************** I M P L E M E N T A T I O N **********************/ +void l10nMem_impl::loadEnUsKey(const std::string& srKey, const std::string& srObjectType, + const std::string& srText, const std::string& oldKey) +{ + std::string baseLanguage = "en-US"; + + + if (!checkKey(srKey, srObjectType)) + { + showError(0, "en-US key is not uniq"); + } + mcMemory.push_back(l10nMem_entry(msCurrentSourceFileName, msCurrentModuleName, + srKey, srObjectType, baseLanguage, srText, 0, oldKey)); +} + + + +/********************** I M P L E M E N T A T I O N **********************/ +void l10nMem_impl::loadLangKey(const std::string& srLang, const std::string& srKey, const std::string& srObjectType, + const std::string& srText) +{ + int i; + + + for (i = 0; i < (int)mcMemory.size(); ++i) + { + if (mcMemory[i].msSourceFile != msCurrentSourceFileName) + continue; + if (mcMemory[i].msKey == srKey || mcMemory[i].msOLDKEY == srKey) + break; + } + if (i < (int)mcMemory.size()) + { + mcMemory[i].mcLang.push_back(l10nMem_entry(msCurrentSourceFileName, msCurrentModuleName, + srKey, srObjectType, srLang, srText, 0, std::string(""))); + return; + } + + showError(0, (char *)(("cannot find key: " + srKey + " for lang " + srLang).c_str())); +} + + + /********************** I M P L E M E N T A T I O N **********************/ -std::vector<l10nMem_entry *>& l10nMem::getLanguagesForKey(const std::string& srKey) +std::vector<l10nMem_entry *>& l10nMem_impl::getLanguagesForKey(const std::string& srKey) { int nL = mcMemory.size(); Modified: openoffice/branches/l10n/main/l10ntools/source/gL10nMem.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gL10nMem.hxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gL10nMem.hxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gL10nMem.hxx Sun Mar 3 21:53:34 2013 @@ -20,6 +20,7 @@ *************************************************************/ #ifndef GL10NMEM_HXX #define GL10NMEM_HXX +#include "gLang.hxx" @@ -38,7 +39,8 @@ class l10nMem_entry public: l10nMem_entry(const std::string& srSourceFile, const std::string& srModuleName, const std::string& srKey, const std::string& srObjectType, const std::string& srLanguage, const std::string& srText, - const int iIndex); + const int iIndex, + const std::string srOldKey = ""); ~l10nMem_entry(); std::string msSourceFile; @@ -47,7 +49,10 @@ class l10nMem_entry std::string msObjectType; std::string msLanguage; std::string msText; + std::string msOLDKEY; int miIndex; + bool mbDeleted; + std::vector<l10nMem_entry> mcLang; private: }; @@ -55,11 +60,11 @@ class l10nMem_entry /******************** C L A S S D E F I N I T I O N ********************/ -class l10nMem +class l10nMem_impl { public: - l10nMem(); - ~l10nMem(); + l10nMem_impl(); + ~l10nMem_impl(); std::string showError (int iLineNo, char *sText, bool bWarning = false); bool isError (); @@ -72,6 +77,14 @@ class l10nMem void setEnUsKey (int iLineNo,const std::string& srKey, const std::string& srObjectType, const std::string& srText, int iIndex = 0); + void loadEnUsKey (const std::string& srKey, + const std::string& srObjectType, + const std::string& srText, + const std::string& oldKey); + void loadLangKey (const std::string& srLang, + const std::string& srKey, + const std::string& srObjectType, + const std::string& srText); std::vector<l10nMem_entry *>& getLanguagesForKey(const std::string& srKey); private: @@ -80,7 +93,9 @@ class l10nMem std::vector<l10nMem_entry *> mcCurrentSelection; std::vector<l10nMem_entry> mcMemory; bool mbInError; - int miStartInx; int miLastUniqResort; + static l10nMem_impl *mcImpl; + + friend class l10nMem; }; #endif Modified: openoffice/branches/l10n/main/l10ntools/source/gLang.hxx URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/gLang.hxx?rev=1452135&r1=1452134&r2=1452135&view=diff ============================================================================== --- openoffice/branches/l10n/main/l10ntools/source/gLang.hxx (original) +++ openoffice/branches/l10n/main/l10ntools/source/gLang.hxx Sun Mar 3 21:53:34 2013 @@ -40,55 +40,32 @@ extern bool gbVerbose; /******************** C L A S S D E F I N I T I O N ********************/ -class l10nMem_entry -{ - public: - l10nMem_entry(const std::string& srSourceFile, const std::string& srModuleName, const std::string& srKey, - const std::string& srObjectType, const std::string& srLanguage, const std::string& srText, - const int iIndex); - ~l10nMem_entry(); - - std::string msSourceFile; - std::string msModuleName; - std::string msKey; - std::string msObjectType; - std::string msLanguage; - std::string msText; - int miIndex; - - private: -}; - - - -/******************** C L A S S D E F I N I T I O N ********************/ +class l10nMem_impl; class l10nMem { public: l10nMem(); ~l10nMem(); - std::string showError (int iLineNo, char *sText, bool bWarning = false); - bool isError (); - bool checkKey (const std::string& sKey, - const std::string& sObjectType); - void save (const std::string& srTargetFile); - void clear(); - void setFileName (const std::string& srSourceFile); - void setModuleName (const std::string& srModuleName); - void setEnUsKey (int iLineNo,const std::string& srKey, - const std::string& srObjectType, - const std::string& srText, int iIndex = 0); - std::vector<l10nMem_entry *>& getLanguagesForKey(const std::string& srKey); - - private: - std::string msCurrentModuleName; - std::string msCurrentSourceFileName; - std::vector<l10nMem_entry *> mcCurrentSelection; - std::vector<l10nMem_entry> mcMemory; - bool mbInError; - int miStartInx; - int miLastUniqResort; + std::string showError (int iLineNo, char *sText, bool bWarning = false); + bool isError (); + bool checkKey (const std::string& sKey, + const std::string& sObjectType); + void setFileName (const std::string& srSourceFile); + void setModuleName(const std::string& srModuleName); + void setEnUsKey (int iLineNo, + const std::string& srKey, + const std::string& srObjectType, + const std::string& srText, + int iIndex = 0); + void loadEnUsKey (const std::string& srKey, + const std::string& srObjectType, + const std::string& srText, + const std::string& oldKey); + void loadLangKey (const std::string& srLang, + const std::string& srKey, + const std::string& srObjectType, + const std::string& srText); }; @@ -97,11 +74,11 @@ class l10nMem class convert_gen { public: - convert_gen(const std::string& srSourceFile, l10nMem& crMemory, const bool bMerge); + convert_gen(l10nMem& crMemory, const std::string& srSourceFile); ~convert_gen(); // do extract/merge - void execute(); + void execute(const bool bMerge); }; @@ -117,16 +94,22 @@ class handler void run(); private: - enum {DO_EXTRACT, DO_EXTRACTMERGE, DO_GENERATE, DO_INSERT} meWorkMode; + enum {DO_CONVERT, DO_EXTRACT, DO_MERGE} meWorkMode; l10nMem mcMemory; std::string msModuleName; + std::string msPoOutDir; + std::string msPoDir; std::string msSourceDir; std::string msTargetDir; - std::vector<std::string> msSourceFiles; - bool mbVerbose; + std::vector<std::string> mvSourceFiles; + std::vector<std::string> mvLanguages; + bool mbVerbose; + void runConvert(); void runExtractMerge(bool bMerge); - void runGenerate(); - void runInsert(); + + void showUsage(std::string& sErr); + void showManual(); + void loadL10MEM(); }; #endif