summaryrefslogtreecommitdiff
path: root/src/utils/translation/poparser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/translation/poparser.cpp')
-rw-r--r--src/utils/translation/poparser.cpp286
1 files changed, 0 insertions, 286 deletions
diff --git a/src/utils/translation/poparser.cpp b/src/utils/translation/poparser.cpp
deleted file mode 100644
index 399980a21..000000000
--- a/src/utils/translation/poparser.cpp
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * The ManaPlus Client
- * Copyright (C) 2012-2017 The ManaPlus Developers
- *
- * This file is part of The ManaPlus Client.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "utils/translation/poparser.h"
-
-#include "fs/virtfs/fs.h"
-
-#include "utils/stringutils.h"
-
-#include "utils/translation/podict.h"
-
-#include "logger.h"
-
-#include "debug.h"
-
-PoParser::PoParser() :
- mLang(),
- mFile(),
- mLine(),
- mMsgId(),
- mMsgStr(),
- mDict(nullptr),
- mReadingId(false),
- mReadingStr(false),
- mSkipId(false)
-{
-}
-
-void PoParser::openFile(const std::string &name)
-{
- int size;
- const char *buf = VirtFs::loadFile(getFileName(name), size);
-
- if (buf != nullptr)
- {
- mFile.str(std::string(buf, size));
- delete [] buf;
- }
- else
- {
- mFile.clear();
- }
-}
-
-PoDict *PoParser::load(const std::string &restrict lang,
- const std::string &restrict fileName,
- PoDict *restrict const dict)
-{
- logger->log("loading lang: %s, file: %s", lang.c_str(), fileName.c_str());
-
- setLang(lang);
- if (dict == nullptr)
- mDict = getDict();
- else
- mDict = dict;
-
- if (fileName.empty())
- openFile(mLang);
- else
- openFile(fileName);
-
- mMsgId.clear();
- mMsgStr.clear();
-
- // cycle by msgid+msgstr
- while (readLine())
- {
- // reading msgid
- while (readMsgId())
- {
- if (!readLine())
- break;
- }
-
- if (!mMsgId.empty())
- {
- // if we got msgid then reading msgstr
- while (readMsgStr())
- {
- if (!readLine())
- break;
- }
- }
-
- if (!mMsgId.empty() && !mMsgStr.empty())
- {
-// logger->log("add key: " + mMsgId);
-// logger->log("add value: " + mMsgStr);
-
- convertStr(mMsgId);
- convertStr(mMsgStr);
- // store key and value
- mDict->set(mMsgId, mMsgStr);
- }
-
- mMsgId.clear();
- mMsgStr.clear();
- }
-
- return mDict;
-}
-
-bool PoParser::readLine()
-{
- char line[1001];
- if (!mFile.getline(line, 1000))
- return false;
- // skip plurals msgid if present
- if (strStartWith(line, "msgid_plural \""))
- {
- if (!mFile.getline(line, 1000))
- return false;
- }
- mLine = line;
- return true;
-}
-
-bool PoParser::readMsgId()
-{
- // if we reading msgstr then stop here
- if (mReadingStr)
- return false;
-
- const std::string msgId1("msgid \"");
-
- // check if in reading process
- if (mReadingId)
- {
- // if we get empty line in file then stop reading
- if (mLine.empty())
- {
- mReadingId = false;
- return false;
- }
- else if (checkLine())
- {
- // reading text from: "text"
- mMsgId.append(mLine.substr(1, mLine.size() - 2));
- mLine.clear();
- return true;
- }
- // stop reading in other case
- mReadingId = false;
- return false;
- }
-
- // check line start from msgid "
- if (strStartWith(mLine, msgId1))
- {
- if (!mSkipId)
- { // translation not fuzzed and can be processed
- mReadingId = true;
- const size_t msgId1Size = msgId1.size();
- // reading text from: msgid "text"
- mMsgId.append(mLine.substr(msgId1Size,
- mLine.size() - 1 - msgId1Size));
- }
- else
- { // skipped fuzzed translation. reset skip flag
- mSkipId = false;
- }
- mLine.clear();
- return true;
- }
- else if (mLine == "#, fuzzy")
- { // check for fuzzy translation
- mSkipId = true;
- mLine.clear();
- return true;
- }
- // stop reading if we don't read msgid before
- return mMsgId.empty();
-}
-
-bool PoParser::readMsgStr()
-{
- // normal msgstr
- const std::string msgStr1("msgstr \"");
- // plurals first msgstr
- const std::string msgStr2("msgstr[0] \"");
-
- // check if in reading process
- if (mReadingStr)
- {
- // if we get empty line in file then stop reading
- if (mLine.empty())
- {
- mReadingStr = false;
- return false;
- }
- if (checkLine())
- {
- // reading text from: "text"
- mMsgStr.append(mLine.substr(1, mLine.size() - 2));
- mLine.clear();
- return true;
- }
- // stop reading in other case
- mReadingStr = false;
- }
- else
- {
- // check line start from msgstr "
- if (strStartWith(mLine, msgStr1))
- {
- mReadingStr = true;
- const size_t msgStr1Size = msgStr1.size();
- // reading text from: msgstr "text"
- mMsgStr.append(mLine.substr(msgStr1Size,
- mLine.size() - 1 - msgStr1Size));
- mLine.clear();
- return true;
- }
- // checl list start from msgstr[0] "
- else if (strStartWith(mLine, msgStr2))
- {
- mReadingStr = true;
- const size_t msgStr2Size = msgStr2.size();
- // reading text from: msgstr[0] "text"
- mMsgStr.append(mLine.substr(msgStr2Size,
- mLine.size() - 1 - msgStr2Size));
- mLine.clear();
- return true;
- }
- }
-
- // stop reading in other case
- return false;
-}
-
-bool PoParser::checkLine() const
-{
- const size_t sz = mLine.size();
- // check is line in format: "text"
- return sz > 2 && mLine[0] == '\"' && mLine[sz - 1] == '\"';
-}
-
-PoDict *PoParser::getEmptyDict()
-{
- return new PoDict("");
-}
-
-bool PoParser::checkLang(const std::string &lang)
-{
- // check is po file exists
- return VirtFs::exists(getFileName(lang));
-}
-
-std::string PoParser::getFileName(const std::string &lang)
-{
- // get po file name from lang name
-// logger->log("getFileName: translations/%s.po", lang.c_str());
- return strprintf("translations/%s.po", lang.c_str());
-}
-
-PoDict *PoParser::getDict() const
-{
- return new PoDict(mLang);
-}
-
-void PoParser::convertStr(std::string &str)
-{
- if (str.empty())
- return;
-
- replaceAll(str, "\\n", "\n");
- replaceAll(str, "\\\"", "\"");
- replaceAll(str, "\\\\", "\\");
-}