std::string lggHunSpell_Wrapper::dictName2FullName(std::string dictName)
{
	if (dictName.empty())
	{
		return dictName;
	}

	std::string countryCode("");
	std::string languageCode("");

	//remove extension
	dictName = dictName.substr(0,dictName.find("."));

	//break it up by - or _
	S32 breakPoint = dictName.find("-");
	if (breakPoint == std::string::npos)
	{
		breakPoint = dictName.find("_");
	}
	if (breakPoint == std::string::npos)
	{
		//no country code given
		languageCode = dictName;
	}
	else
	{
		languageCode = dictName.substr(0,breakPoint);
		countryCode = dictName.substr(breakPoint+1);
	}

	//get long language code
	for (int i = 0; i<LANGUAGE_CODES_RAW_SIZE; i++)
	{		
		if (0 == LLStringUtil::compareInsensitive(languageCode, std::string(languageCodesraw[i])))
		{
			languageCode = languageCodesraw[i+1];
			break;
		}
	}

	//get long country code
	if (!countryCode.empty())
	{
		for (int i =0; i<COUNTRY_CODES_RAW_SIZE; i++)
		{		
			//llinfos << i << llendl;
			if (0 == LLStringUtil::compareInsensitive(countryCode, std::string(countryCodesraw[i])))
			{
				countryCode = countryCodesraw[i+1];
				break;
			}
		}
		countryCode = " (" + countryCode + ")";
	}
	
	return std::string(languageCode+countryCode);
}
std::string lggHunSpell_Wrapper::fullName2DictName(std::string fullName)
{
	std::string countryCode("");
	std::string languageCode("");
	S32 breakPoint = fullName.find(" (");
	if (breakPoint == std::string::npos)
	{
		languageCode = fullName;
	}
	else
	{
		languageCode = fullName.substr(0, breakPoint);
		countryCode = fullName.substr(breakPoint+2, fullName.length()-3-breakPoint);
	}
	//get long language code
	for (int i = 1; i<LANGUAGE_CODES_RAW_SIZE; i+=2)
	{
		//llinfos << i << llendl;
		if (0 == LLStringUtil::compareInsensitive(languageCode, std::string(languageCodesraw[i])))
		{
			languageCode = std::string(languageCodesraw[i-1]);
			break;
		}
	}
	//get long country code
	std::string toReturn = languageCode;
	if (!countryCode.empty())
	{
		for (int i = 1; i<COUNTRY_CODES_RAW_SIZE; i+=2)
		{
			//llinfos << i << " comparing " <<countryCode<<" and "<<std::string(countryCodesraw[i]).c_str()<< llendl;
			if (0 == LLStringUtil::compareInsensitive(countryCode, std::string(countryCodesraw[i])))
			{
				countryCode = std::string(countryCodesraw[i-1]);
				break;
			}
		}
		toReturn += "_" + countryCode;
	}

	LLStringUtil::toLower(toReturn);
	return toReturn;
}
Example #3
0
bool MetaTranslator::save( const QString& filename ) const
{
    QFile f( filename );
    if ( !f.open(QIODevice::WriteOnly) )
        return false;

    QTextStream t( &f );
    t.setCodec( QTextCodec::codecForName("ISO-8859-1") );

    //### The xml prolog allows processors to easily detect the correct encoding
    t << "<?xml version=\"1.0\"";
    t << " encoding=\"utf-8\"";
    t << "?>\n<!DOCTYPE TS><TS version=\"1.1\"";
    if (!languageCode().isEmpty() && languageCode() != QLatin1String("C"))
        t << " language=\"" << languageCode() << "\"";
    t << ">\n";
    if ( codecName != "ISO-8859-1" )
        t << "<defaultcodec>" << codecName << "</defaultcodec>\n";
    TMM::ConstIterator m = mm.begin();
    while ( m != mm.end() ) {
        TMMInv inv;
        TMMInv::Iterator i;
        bool contextIsUtf8 = m.key().utf8();
        QByteArray context = m.key().context();
        QByteArray comment = "";

        do {
            if (QByteArray(m.key().sourceText()) == ContextComment) {
                if ( m.key().type() != MetaTranslatorMessage::Obsolete ) {
                    contextIsUtf8 = m.key().utf8();
                    comment = QByteArray(m.key().comment());
                }
            } else {
                inv.insert( *m, m.key() );
            }
        } while ( ++m != mm.end() && QByteArray(m.key().context()) == context );

        if ( inv.isEmpty() )
            continue;

        t << "<context";
        if ( contextIsUtf8 )
            t << " encoding=\"UTF-8\"";
        t << ">\n";
        t << "    <name>" << evilBytes( context, contextIsUtf8 )
          << "</name>\n";
        if ( !comment.isEmpty() )
            t << "    <comment>" << evilBytes( comment, contextIsUtf8 )
              << "</comment>\n";

        for ( i = inv.begin(); i != inv.end(); ++i ) {
            MetaTranslatorMessage msg = *i;
            // no need for such noise
            if ( msg.type() == MetaTranslatorMessage::Obsolete &&
                 msg.translation().isEmpty() )
                continue;

            t << "    <message";
            if ( msg.utf8() )
                t << " encoding=\"UTF-8\"";
            if ( msg.isPlural() )
                t << " numerus=\"yes\"";
            t << ">\n";
            if (!msg.fileName().isEmpty() && msg.lineNumber() >= 0) {
                QDir tsPath = QFileInfo(filename).absoluteDir();
                QString fn = tsPath.relativeFilePath(msg.fileName()).replace('\\','/');
                t << "        <location filename=\"" << fn << "\" line=\"" << msg.lineNumber() << "\"/>\n";
            }
            t  << "        <source>" << evilBytes( msg.sourceText(),
                                                  msg.utf8() )
              << "</source>\n";
            if ( !QByteArray(msg.comment()).isEmpty() )
                t << "        <comment>" << evilBytes( msg.comment(),
                                                       msg.utf8() )
                  << "</comment>\n";
            if ( !QByteArray(msg.translatorComment()).isEmpty() )
                t << "        <translatorcomment>"
                  << evilBytes( msg.translatorComment(), msg.utf8() )
                  << "</translatorcomment>\n";
            t << "        <translation";
            if ( msg.type() == MetaTranslatorMessage::Unfinished )
                t << " type=\"unfinished\"";
            else if ( msg.type() == MetaTranslatorMessage::Obsolete )
                t << " type=\"obsolete\"";
            if (msg.isPlural()) {
                t << ">\n";
                QLocale::Language l;
                QLocale::Country c;
                languageAndCountry(m_language, &l, &c);
                QStringList translns = normalizedTranslations(msg, l, c);
                for (int j = 0; j < qMax(1, translns.count()); ++j) {
                    const QString &transln = translns.value(j);
                    t << "            <numerusform";
                    if ( transln.contains( VARIANT_DELIMITER ) )
                        saveLengthVariants( t, "            ", transln );
                    else
                        t << ">"
                          << protect( transln.toUtf8() ) << "</numerusform>\n";
                }
                t << "        ";
            } else {
                if ( msg.translation().contains( VARIANT_DELIMITER ) )
                    saveLengthVariants( t, "        ", msg.translation() );
                else
                    t << ">"
                      << protect( msg.translation().toUtf8() );
            }
            t << "</translation>\n";
            t << "    </message>\n";
        }
        t << "</context>\n";
    }
    t << "</TS>\n";
    f.close();
    return true;
}
Example #4
0
bool MetaTranslator::saveXLIFF( const QString& filename) const
{
    QFile f( filename );
    if ( !f.open(QIODevice::WriteOnly | QIODevice::Text) )
        return false;

    int indent = 2;
    int currentindent = 0;

    QTextStream t( &f );
    t.setCodec( QTextCodec::codecForName("ISO-8859-1") );

    QMap<QString, TranslatorMessage> mtSortByFileName;
    TMM::ConstIterator m = mm.begin();
    while ( m != mm.end() ) {
        TranslatorMessage msg = m.key();
        QString location = msg.fileName() + QLatin1String(msg.context()) + QString::number(msg.lineNumber());
        mtSortByFileName.insertMulti(location, msg);
        ++m;
    }

    t.setFieldAlignment(QTextStream::AlignRight);
    t << "<?xml version=\"1.0\"";
    t << " encoding=\"utf-8\"?>\n";
    t << "<xliff version=\"1.1\" xmlns=\"" << XLIFF11namespaceURI << "\">\n";
    currentindent += indent;
    QMap<QString, TranslatorMessage>::iterator mi = mtSortByFileName.begin();
    TranslatorMessage msg;
    QByteArray ctx;
    QString fn;
    bool ctxdiffer = false;
    bool filediffer = false;
    while (mi != mtSortByFileName.end()) {
        msg = mi.value();
        ctxdiffer = msg.context() != ctx;
        filediffer = msg.fileName() != fn;

        if (ctxdiffer || filediffer) {
            if (!ctx.isEmpty()) {
            writeIndent(&t, currentindent);
                t << "</group>\n";
                currentindent -= indent;
            }
        }

        if (filediffer) {
            if (!fn.isEmpty()) {
                writeIndent(&t, currentindent);
                t << "</body></file>\n";
                currentindent -= indent;
            }
            fn = msg.fileName();

            writeIndent(&t, currentindent);
            t << "<file original=\"" << fn << "\""
                << " datatype=\"" << dataType(msg) << "\""
                << " source-language=\"" << "en" << "\"" //###
                << " target-language=\"" << languageCode() << "\""
                << "><body>\n";
            currentindent += indent;

        }

        if (ctxdiffer || filediffer) {
            ctx = msg.context();
            writeIndent(&t, currentindent);
            t << "<group restype=\"" << restypeContext << "\""
                << " resname=\"" << evilBytes(ctx, msg.utf8()) << "\""
                << ">\n";
            currentindent += indent;
        }

        writeMessage(&t, msg, currentindent, m_language);
        ++mi;
    }
    currentindent-=indent;
    writeIndent(&t, currentindent);
    t << "</group>\n";
    currentindent-=indent;
    writeIndent(&t, currentindent);
    t << "</body></file>\n";
    t << "</xliff>\n";

    f.close();
    return true;
}