diff options
Diffstat (limited to 'l10ntools/source/renewpo.cxx')
-rw-r--r-- | l10ntools/source/renewpo.cxx | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/l10ntools/source/renewpo.cxx b/l10ntools/source/renewpo.cxx new file mode 100644 index 000000000000..c9fad34a99f3 --- /dev/null +++ b/l10ntools/source/renewpo.cxx @@ -0,0 +1,168 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <iostream> +#include <fstream> +#include <dirent.h> +#include <string> +#include <rtl/string.hxx> +#include "po.hxx" + +using namespace std; + +//Check wheather the two entry are the same but in different languages +bool IsSameEntry(const OString& rFirstEntry,const OString& rSecEntry) +{ + for(int i = PoEntry::PROJECT; i<=PoEntry::LOCALID;++i) + { + if ( rFirstEntry.getToken(i,'\t') != rSecEntry.getToken(i,'\t')) + return false; + } + return true; +} + +//Get path of po file +OString GetPath(const OString& rPath, const OString& rLine) +{ + OString sSourceFile = rLine.getToken(PoEntry::SOURCEFILE,'\t'); + OString sSourcePath = rPath + "/" + + rLine.getToken(PoEntry::PROJECT,'\t') + "/" + + sSourceFile.copy(0,sSourceFile.lastIndexOf("\\")). + replaceAll("\\","/"); + return sSourcePath; +} + +//Renew po files of the actual language +void HandleLanguage(struct dirent* pLangEntry, const OString& rPath, + const OString& rpo2ooPath, const OString& rSDFPath) +{ + const OString LangEntryName = pLangEntry->d_name; + const OString SDFFileName = LangEntryName + ".sdf"; + + //Generate and open sdf + cout << "Start process with language: " << LangEntryName.getStr() << endl; + system( (rpo2ooPath + " -t " + rSDFPath + + " -l " + LangEntryName + " " + + rPath.getStr() + LangEntryName + " " + + SDFFileName).getStr()); + + ofstream aOutPut; + ifstream aSDFInput(SDFFileName.getStr()); + string s; + getline(aSDFInput,s); + OString sLine = OString(s.data(),s.length()); + while(!aSDFInput.eof()) + { + OString sActUnTrans = sLine; + OString sPath = rPath + LangEntryName; + OString sActSourcePath = GetPath(sPath,sActUnTrans); + //Make new po file, copy header with some changes + if (!aOutPut.is_open()) + { + aOutPut.open((sActSourcePath + ".po_tmp").getStr(), + std::ios_base::out | std::ios_base::trunc); + ifstream aPOInput((sActSourcePath + ".po").getStr()); + getline(aPOInput,s); + while(s!="") + { + if (s.find("#. extracted from")!=string::npos) + s = string(s,0,s.length()-3); + if (s.find("Report-Msgid-Bugs-To")!=string::npos) + s = string("\"Report-Msgid-Bugs-To: ") + + "https://bugs.freedesktop.org/enter_bug.cgi?product=" + + "LibreOffice&bug_status=UNCONFIRMED&component=UI\\n\""; + if (s.find("X-Generator")!=string::npos) + s = "\"X-Generator: LibreOffice\\n\""; + aOutPut << s << endl; + getline(aPOInput,s); + }; + aPOInput.close(); + } + + //Set PoEntry and write out + getline(aSDFInput,s); + sLine = OString(s.data(),s.length()); + OString sActTrans; + if (IsSameEntry(sActUnTrans,sLine)) + { + sActTrans = sLine; + getline(aSDFInput,s); + sLine = OString(s.data(),s.length()); + } + else + { + sActTrans =""; + } + PoEntry aPE(sActUnTrans); + aPE.setTransStr(sActTrans.getToken(PoEntry::TEXT,'\t')); + aPE.writeToFile(aOutPut); + + //Check wheather next entry is in the same po file + OString sNextSourcePath = GetPath(sPath,sLine); + if (sNextSourcePath!=sActSourcePath) + { + aOutPut.close(); + system(("rm " + sActSourcePath +".po").getStr()); + system(("mv "+ sActSourcePath +".po_tmp " + + sActSourcePath +".po").getStr()); + } + } + + //Close and remove sdf file + aSDFInput.close(); + system(("rm " + SDFFileName).getStr()); + aOutPut.close(); +} + + +int main(int argc, char* argv[]) +{ + //Usage + if (argc < 4) + { + cout << "Use: renewpot translationsdir po2oo en-us.sdf" << endl; + cout << "translationsdir: in this dir there are language" << endl; + cout << "directories which contain the po files. These" << endl; + cout << "directories have named by the languageid" << endl; + cout << "po2oo: the path withwhich po2oo can be call" << endl; + cout << "en-us.sdf: the path to call po2oo with this sdf" << endl; + return 1; + } + + //Call processing function with all language directories + DIR* pTranslations = opendir(argv[1]); + while ( struct dirent* pActEntry = readdir(pTranslations) ) + { + if ( OString(pActEntry->d_name).indexOf('.')==-1 ) + HandleLanguage(pActEntry,OString(argv[1]), + OString(argv[2]),OString(argv[3])); + } + closedir(pTranslations); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |