summaryrefslogblamecommitdiff
path: root/src/rules/po.cpp
blob: fadc650208f1c94a8e7ebcf916ac4ad863f97e79 (plain) (tree)




























































                                                                         



                                                                           


                                                                              



                                                                           



















                                                               





































































                                                             
/*
 *  The ManaPlus Client
 *  Copyright (C) 2014  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 3 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 "template.hpp"

registerRuleExt(po, "010", "(.+)[.](po)")

bool readId(false);
bool readStr(false);
std::string msgId;
std::string msgStr;

static void processMessage(RuleBase *const rule)
{
//    rule->print(std::string("pair: ").append(msgId).append(
//        "=").append(msgStr));
    readId = false;
    readStr = false;

    // skip not translated lines
    if (msgStr.empty())
        return;

    const size_t szId = msgId.size();
    const size_t szStr = msgStr.size();
    for (size_t f = 0; f < szId && f < szStr; f ++)
    {
        if (msgId[f] == ' ')
        {
            if (msgStr[f] != ' ')
            {
                rule->print("Wrong number of spaces at translation "
                    "line start.");
                break;
            }
        }
        break;
    }
    if (szId > 1 && szStr > 1)
    {
        const char cStr = msgStr[szStr - 1];
        const char cId = msgId[szId - 1];
        if (cStr == ' ' && cId != ' ')
            rule->print("Useless space at end of translation line.");
        std::string name = rule->getFile();
        if (findCutLast(name, "po/ar.po") || findCutLast(name, "po/fa.po"))
            return;

        if (cId == '.' || cId == ',' || cId == '!' || cId == '?' || cId == '-'
            || cId == ':' || cId == ';' || cId == '+' || cId == '|'
            || cId == ' ')
        {
            if (cId != cStr)
                rule->print("Wrong character at end of translation line.");
        }
        if (msgId.find("###") != std::string::npos
            && msgStr.find("###") == std::string::npos)
        {
            rule->print("Missing ### in translation.");
        }
/*
        if (msgId.find("\\n") != std::string::npos)
        {
            if (!findCutLast(name, "help/zh_CN.po"))
            {
                if (msgStr.find("\\n") == std::string::npos)
                    rule->print("Missing \\n in translation.");
            }
        }
        else
        {
            if (msgStr.find("\\n") != std::string::npos)
                rule->print("Useless \\n in translation.");
        }
*/
    }
}

startRule(po)
{
    readId = false;
    readStr = false;
    msgId = std::string();
    msgStr = std::string();
}

endRule(po)
{
    if (readStr)
        processMessage(this);
}

parseLineRule(po)
{
    if (findCutFirst(data, "msgid \""))
    {   // msgId start
        if (readStr)
        {
            processMessage(this);
            readStr = false;
        }
        readId = true;
        if (findCutLast(data, "\""))
            msgId = data;
        else
            print("Wrong msgId line. Missing last \".");
    }
    else if (findCutFirst(data, "msgstr \""))
    {   // msgStr start
        if (readId)
            readId = false;
        readStr = true;
        if (findCutLast(data, "\""))
            msgStr = data;
        else
            print("Wrong msgStr line. Missing last \".");
    }
    else if (findCutFirst(data, "\""))
    {   // line start with "
        if (readId)
        {
            if (findCutLast(data, "\""))
                msgId += data;
            else
                print("Wrong msgId line. Missing last \".");
        }
        if (readStr)
        {
            if (findCutLast(data, "\""))
                msgStr += data;
            else
                print("Wrong msgStr line. Missing last \".");
        }
    }
    else
    {   // other lines
        if (readStr)
            processMessage(this);
        readId = false;
        readStr = false;
        msgId = std::string();
        msgStr = std::string();
    }
}