String BrazilianStemmer::stem(const String& term)
    {
        // creates CT
        createCT(term);

        if (!isIndexable(CT))
            return L"";
        if (!isStemmable(CT))
            return CT;

        R1 = getR1(CT);
        R2 = getR1(R1);
        RV = getRV(CT);
        TERM = term + L";" + CT;

        bool altered = step1();
        if (!altered)
            altered = step2();

        if (altered)
            step3();
        else
            step4();

        step5();

        return CT;
    }
TCHAR* GermanStemmer::stem(const TCHAR* term, size_t length) {
    if (length < 0) {
        length = _tcslen(term);
    }

    // Reset the StringBuffer.
    sb.clear();
    sb.append(term, length);

    if (!isStemmable(sb.getBuffer(), sb.length()))
        return sb.giveBuffer();

    // Stemming starts here...
    substitute(sb);
    strip(sb);
    optimize(sb);
    resubstitute(sb);
    removeParticleDenotion(sb);

    return sb.giveBuffer();
}
    String FrenchStemmer::stem(const String& term)
    {
        if (!isStemmable(term))
            return term;
        
        // Use lowercase for medium stemming.
        stringBuffer = StringUtils::toLower(term);

        // reset the booleans
        modified = false;
        suite = false;

        treatVowels(stringBuffer);

        setStrings();

        step1();

        if (!modified || suite)
        {
            if (!RV.empty())
            {
                suite = step2a();
                if (!suite)
                    step2b();
            }
        }

        if (modified || suite)
            step3();
        else
            step4();

        step5();

        step6();

        return stringBuffer;
    }
    String DutchStemmer::stem(const String& term)
    {
        // Use lowercase for medium stemming.
        buffer = StringUtils::toLower(term);
        if (!isStemmable())
            return buffer;
        
        if (stemDict && stemDict.contains(term))
            return stemDict.get(term);

        // Stemming starts here...
        substitute();
        storeYandI();
        R1 = getRIndex(0);
        R1 = std::max((int32_t)3, R1);
        step1();
        step2();
        R2 = getRIndex(R1);
        step3a();
        step3b();
        step4();
        reStoreYandI();
        return buffer;
    }