genLang update
removed source/gHandler.cxx is now part of gLang.cxx (and defined as a local class) Change-Id: I6fccfb9d9cebe964ba4458cdea5121a44186c1ab
This commit is contained in:
@@ -1,531 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* This file incorporates work covered by the following license notice:
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed
|
||||
* with this work for additional information regarding copyright
|
||||
* ownership. The ASF licenses this file to you under the Apache
|
||||
* License, Version 2.0 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
#include "gLang.hxx"
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
************************ G H A N D L E R . C X X ************************
|
||||
*****************************************************************************
|
||||
* This is the control module, that interpret the command line and implement
|
||||
* the different work types
|
||||
* extract / merge / generate / convert
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
|
||||
/********************** I M P L E M E N T A T I O N **********************/
|
||||
handler::handler()
|
||||
:
|
||||
mbForceSave(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, sLangText;
|
||||
int argNow, nLen;
|
||||
|
||||
|
||||
// make internal throw test (to avoid if cascades
|
||||
try
|
||||
{
|
||||
// check for fixed parameter: genLang <cmd> <module> <po dir> <languages>
|
||||
if (argc <= 5)
|
||||
throw "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 == "merge") meWorkMode = DO_MERGE;
|
||||
else if (sWorkText == "help") showManual();
|
||||
else throw "<command> is mandatory";
|
||||
|
||||
// and set fixed parameters
|
||||
msModuleName = argv[2];
|
||||
msPoOutDir = msPoDir = argv[3];
|
||||
sLangText = argv[4];
|
||||
if (sLangText[0] == '\"')
|
||||
sLangText.erase(0,1);
|
||||
nLen = sLangText.size() -1;
|
||||
if (nLen > 0 && sLangText[nLen] == '\"')
|
||||
sLangText.erase(nLen);
|
||||
|
||||
// decode parameters and translate to variables
|
||||
for (argNow = 5; argNow < argc;)
|
||||
{
|
||||
std::string sArg(argv[argNow++]);
|
||||
|
||||
// all -x is followed by a directory/file name
|
||||
if (sArg[0] == '-')
|
||||
{
|
||||
// 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 == "-d") {l10nMem::setShowDebug(); }
|
||||
else if (sArg == "-f") {eGotArg = ARG_F; }
|
||||
else if (sArg == "-k") {if (meWorkMode == DO_EXTRACT)
|
||||
meWorkMode = DO_EXTRACT_KID;
|
||||
else
|
||||
throw "-k is not valid"; }
|
||||
else if (sArg == "-o") {eGotArg = ARG_O; mbForceSave = true; }
|
||||
else if (sArg == "-p") {if (meWorkMode == DO_CONVERT)
|
||||
meWorkMode = DO_CONVERT_POT;
|
||||
else
|
||||
throw "-p is not valid"; }
|
||||
else if (sArg == "-s") {eGotArg = ARG_S; }
|
||||
else if (sArg == "-t") {eGotArg = ARG_T; }
|
||||
else if (sArg == "-v") {l10nMem::setShowVerbose(); }
|
||||
else throw std::string("unknown parameter: ") + sArg;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (eGotArg)
|
||||
{
|
||||
case ARG_NONE: break;
|
||||
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 mandatory for all commands
|
||||
if (!msModuleName.size())
|
||||
throw "<module name> is mandatory";
|
||||
if (!msPoDir.size())
|
||||
throw "<po dir> is mandatory";
|
||||
|
||||
// control parameter usage according to selected action;
|
||||
{
|
||||
int useLangText, useSoption, useToption;
|
||||
useLangText = useSoption = useToption = -1;
|
||||
|
||||
if (!mvSourceFiles.size())
|
||||
throw "-f <files> is missing or empty";
|
||||
|
||||
switch (meWorkMode)
|
||||
{
|
||||
case DO_EXTRACT:
|
||||
case DO_EXTRACT_KID:
|
||||
break;
|
||||
|
||||
case DO_MERGE:
|
||||
useSoption = 0;
|
||||
useLangText = 1;
|
||||
useToption = 1;
|
||||
break;
|
||||
|
||||
case DO_CONVERT:
|
||||
useLangText = 1;
|
||||
case DO_CONVERT_POT:
|
||||
useToption = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (sLangText.size() && useLangText == -1)
|
||||
throw "<languages> must be empty";
|
||||
if (!sLangText.size() && useLangText == 1)
|
||||
throw "<languages> is mandatory";
|
||||
if (msSourceDir.size() && useSoption == -1)
|
||||
throw "-s <source dir> is not valid";
|
||||
if (msSourceDir.size() && useSoption == 1)
|
||||
throw "-s <source dir> is mandatory";
|
||||
if (msTargetDir.size() && useToption == -1)
|
||||
throw "-t <target dir> is not valid";
|
||||
if (!msTargetDir.size() && useToption == 1)
|
||||
throw "-t <target dir> is mandatory";
|
||||
}
|
||||
|
||||
if (msTargetDir.size() && !convert_gen::checkAccess(msTargetDir))
|
||||
throw "<target dir> does not exist";
|
||||
if (msSourceDir.size() && !convert_gen::checkAccess(msSourceDir))
|
||||
throw "<source dir> does not exist";
|
||||
}
|
||||
catch(const char *sErr)
|
||||
{
|
||||
std::string myErr(sErr);
|
||||
showUsage(myErr);
|
||||
exit(-1);
|
||||
}
|
||||
catch(std::string sErr)
|
||||
{
|
||||
showUsage(sErr);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
// update directories to include final /
|
||||
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("/");
|
||||
|
||||
// and convert language to a vector
|
||||
if (sLangText.size())
|
||||
{
|
||||
int current;
|
||||
int next = -1;
|
||||
do
|
||||
{
|
||||
current = next + 1;
|
||||
next = sLangText.find_first_of( " ", current );
|
||||
std::string sNewLang = sLangText.substr(current,next-current);
|
||||
if (sNewLang != "en-US")
|
||||
mvLanguages.push_back(sLangText.substr(current,next-current));
|
||||
}
|
||||
while (next != (int)std::string::npos);
|
||||
}
|
||||
|
||||
// check if source files list needs to be coverted
|
||||
if (mvSourceFiles[0] == "USEFILE:")
|
||||
readFileWithSources();
|
||||
|
||||
// tell system
|
||||
l10nMem::showVerbose("genLang starting to " + sWorkText + " from module " + msModuleName);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************** I M P L E M E N T A T I O N **********************/
|
||||
void handler::run()
|
||||
{
|
||||
try
|
||||
{
|
||||
// prepare translation memory to module type
|
||||
mcMemory.setModuleName(msModuleName);
|
||||
|
||||
// build list of languages (to be loaded and later written
|
||||
if (msPoDir.size())
|
||||
loadL10MEM( (meWorkMode == DO_EXTRACT) );
|
||||
|
||||
// use workMode to start correct control part
|
||||
switch (meWorkMode)
|
||||
{
|
||||
case DO_EXTRACT: runExtract(false); break;
|
||||
case DO_EXTRACT_KID: runExtract(true); break;
|
||||
case DO_MERGE: runMerge(); break;
|
||||
case DO_CONVERT: runConvert(false); break;
|
||||
case DO_CONVERT_POT: runConvert(true); break;
|
||||
}
|
||||
}
|
||||
catch(int)
|
||||
{
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************** I M P L E M E N T A T I O N **********************/
|
||||
void handler::runExtract(bool bKid)
|
||||
{
|
||||
// just to satisfy compiler
|
||||
if (bKid)
|
||||
return;
|
||||
|
||||
// no convert
|
||||
mcMemory.setConvert(false, false);
|
||||
|
||||
// loop through all source files, and extract messages from each file
|
||||
for (std::vector<std::string>::iterator siSource = mvSourceFiles.begin(); siSource != mvSourceFiles.end(); ++siSource)
|
||||
{
|
||||
// tell system
|
||||
l10nMem::showDebug("genLang extracting text from file " + msSourceDir + *siSource);
|
||||
|
||||
// get converter and extract file
|
||||
convert_gen convertObj(mcMemory, msSourceDir, msTargetDir, *siSource);
|
||||
convertObj.execute(false);
|
||||
}
|
||||
|
||||
// and generate language file
|
||||
mcMemory.saveTemplates(msPoOutDir, false, mbForceSave);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************** I M P L E M E N T A T I O N **********************/
|
||||
void handler::runMerge()
|
||||
{
|
||||
// no convert
|
||||
mcMemory.setConvert(false, false);
|
||||
|
||||
// loop through all source files, and extract messages from each file
|
||||
for (std::vector<std::string>::iterator siSource = mvSourceFiles.begin(); siSource != mvSourceFiles.end(); ++siSource)
|
||||
{
|
||||
// tell system
|
||||
l10nMem::showDebug("genLang merging translated text to file " + msSourceDir + *siSource);
|
||||
|
||||
// get converter and extract file
|
||||
convert_gen convertObj(mcMemory, msSourceDir, msTargetDir, *siSource);
|
||||
convertObj.execute(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************** I M P L E M E N T A T I O N **********************/
|
||||
void handler::runConvert(bool bPot)
|
||||
{
|
||||
// convert
|
||||
mcMemory.setConvert(true, bPot);
|
||||
|
||||
// loop through all source files, and extract messages from each file
|
||||
for (std::vector<std::string>::iterator siSource = mvSourceFiles.begin(); siSource != mvSourceFiles.end(); ++siSource)
|
||||
{
|
||||
// handle .pot (templates)
|
||||
if (bPot)
|
||||
{
|
||||
// tell system
|
||||
l10nMem::showDebug("genLang compare template " + msSourceDir + *siSource);
|
||||
|
||||
// get converter and extract files
|
||||
convert_gen convertObj(mcMemory, "./", msTargetDir, *siSource);
|
||||
convertObj.execute(false);
|
||||
|
||||
if (bPot)
|
||||
mcMemory.showNOconvert();
|
||||
}
|
||||
else
|
||||
for (std::vector<std::string>::iterator siLang = mvLanguages.begin(); siLang != mvLanguages.end(); ++siLang)
|
||||
{
|
||||
std::string sFilePath = msSourceDir + *siLang + "/";
|
||||
|
||||
// get converter and extract files
|
||||
mcMemory.setLanguage(*siLang, false);
|
||||
|
||||
// tell system
|
||||
l10nMem::showDebug("genLang convert text from file " + sFilePath + *siSource + " language " + *siLang);
|
||||
|
||||
// get converter and extract files
|
||||
convert_gen convertObj(mcMemory, sFilePath, msTargetDir, *siSource);
|
||||
convertObj.execute(true);
|
||||
}
|
||||
}
|
||||
|
||||
// and generate language file
|
||||
if (!bPot)
|
||||
mcMemory.saveLanguages(msPoOutDir, mbForceSave);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************** 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> [-d] [-f <files>] [-k] [-o <dir>] [-p] [-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::showManual()
|
||||
{
|
||||
// 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 (.pot)\n"
|
||||
"and merges with .po files in different languages.\n"
|
||||
"genLang uses .po files and AOO sources to generate language sources.\n"
|
||||
"\n"
|
||||
"genLang can also convert old .po files (generated from .sdf)\n"
|
||||
"\n";
|
||||
|
||||
std::cout <<
|
||||
"Syntax:\n"
|
||||
" genLang extract <module> <po dir> \"\" [-v] [-d] \\\n"
|
||||
" -f <files> [-s <source dir>]\n"
|
||||
" if -s is omitted . is used\n"
|
||||
" extract text from <source dir>/<files>, result is merged and\n"
|
||||
" written to <po dir>/<module>.pot\n"
|
||||
"\n";
|
||||
std::cout <<
|
||||
" genLang merge <module> <po dir> <languages> [-v] [-d] [-k]\\\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";
|
||||
std::cout <<
|
||||
" genLang convert <module> <po dir> <languages> [-v] [-d]\\\n"
|
||||
" [-p] [-o <po outdir>] -s <source dir> -f <files>\n"
|
||||
" reads sdf generated .po <files> from\n"
|
||||
" <source dir>/*lang/<module>.po\n"
|
||||
" 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"
|
||||
" - Keys in <source dir>, not in <module>.po\n"
|
||||
" are shown as warnings\n"
|
||||
" - Keys in <source dir>, with changed translation\n"
|
||||
" are marked \"fuzzy\"\n"
|
||||
" - Keys in source files not in .po files (new keys)\n"
|
||||
" are added and marked \"fuzzy\"\n"
|
||||
" if -p is used, .pot files is assumed, and a compare is made\n"
|
||||
"\n";
|
||||
std::cout <<
|
||||
" genLang help\n"
|
||||
" this text\n"
|
||||
"\n";
|
||||
std::cout <<
|
||||
"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 or a module.dbpo file for fast loading\n"
|
||||
" <languages>\n"
|
||||
" comma separated string with langauge id to be used\n"
|
||||
"\n"
|
||||
" -d\n"
|
||||
" extensive verbose mode, tells what genLang is doing in detail\n"
|
||||
" -f <files>\n"
|
||||
" list of files containing messages to be extracted\n"
|
||||
" \"convert\" expect sdf generated po files, to be converted\n"
|
||||
" instead of passing a list of files, it is possible to pass\n"
|
||||
" a file contains the list, by using:\n"
|
||||
" -f USEFILE: <filename>\n"
|
||||
" -k\n"
|
||||
" generate kid id (hex) for all messages in the source code,\n"
|
||||
" solely for QA\n"
|
||||
" -o <po outdir>\n"
|
||||
" directory to write .po files, same structure as -p\n"
|
||||
" -p\n"
|
||||
" used with convert, when comparing .pot files (old system == new system)\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 genLang is doing\n";
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************** I M P L E M E N T A T I O N **********************/
|
||||
void handler::loadL10MEM(bool onlyTemplates)
|
||||
{
|
||||
std::string sMod = msModuleName + ".pot";
|
||||
std::string sLoad = msPoDir + "templates/";
|
||||
|
||||
// no convert
|
||||
mcMemory.setConvert(false, false);
|
||||
|
||||
// load texts from en-US po file (master)
|
||||
// tell system
|
||||
l10nMem::showDebug("genLang loading master text from file " + sLoad + sMod);
|
||||
|
||||
// and load file
|
||||
mcMemory.setLanguage("", true);
|
||||
convert_gen (mcMemory, sLoad, msTargetDir, sMod).execute(false);
|
||||
|
||||
if (onlyTemplates)
|
||||
return;
|
||||
|
||||
// loop through all languages and load text
|
||||
sMod = msModuleName + ".po";
|
||||
for (std::vector<std::string>::iterator siLang = mvLanguages.begin(); siLang != mvLanguages.end(); ++siLang)
|
||||
{
|
||||
sLoad = msPoDir + *siLang + "/";
|
||||
|
||||
// get converter and extract files
|
||||
mcMemory.setLanguage(*siLang, true);
|
||||
|
||||
// tell system
|
||||
l10nMem::showDebug("genLang loading text from language file " + sLoad + sMod);
|
||||
|
||||
convert_gen(mcMemory, sLoad, msTargetDir, sMod).execute(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/********************** I M P L E M E N T A T I O N **********************/
|
||||
void handler::readFileWithSources()
|
||||
{
|
||||
std::ifstream fInput;
|
||||
char buf[256];
|
||||
|
||||
|
||||
if (mvSourceFiles.size() < 2)
|
||||
throw l10nMem::showError("missing file with sources (-f USEFILE: <filename>)");
|
||||
|
||||
fInput.open (mvSourceFiles[1].c_str(), std::ifstream::in);
|
||||
if (!fInput.is_open())
|
||||
throw l10nMem::showError("Cannot open file with sources (-f), trying to open" + mvSourceFiles[1]);
|
||||
|
||||
mvSourceFiles.clear();
|
||||
|
||||
while (fInput.good())
|
||||
{
|
||||
fInput.getline(buf, sizeof(buf));
|
||||
if (!buf[0])
|
||||
continue;
|
||||
mvSourceFiles.push_back(buf);
|
||||
}
|
||||
|
||||
fInput.close();
|
||||
}
|
Reference in New Issue
Block a user