Index: src/libictranslate/ResourceManager.cpp =================================================================== diff -u -N -rc72f797f7e7795e3ff15dc2ed832032ee6bafd0a -rf6fe924675e9de6120b6c1eac2430fa5b2946251 --- src/libictranslate/ResourceManager.cpp (.../ResourceManager.cpp) (revision c72f797f7e7795e3ff15dc2ed832032ee6bafd0a) +++ src/libictranslate/ResourceManager.cpp (.../ResourceManager.cpp) (revision f6fe924675e9de6120b6c1eac2430fa5b2946251) @@ -150,6 +150,62 @@ *pszOut = _T('\0'); } +CTranslationItem::ECompareResult CTranslationItem::Compare(const CTranslationItem& rReferenceItem) +{ + if(!m_pszText || !rReferenceItem.m_pszText) + return eResult_Invalid; + + if(rReferenceItem.m_uiChecksum != rReferenceItem.m_uiChecksum) + return eResult_Invalid; + + // space check + if(rReferenceItem.m_pszText[0] == _t(' ') && m_pszText[0] != _t(' ')) + return eResult_ContentWarning; + + size_t stReferenceLen = _tcslen(rReferenceItem.m_pszText); + size_t stOwnLen = _tcslen(m_pszText); + if(stReferenceLen > 0 && stOwnLen > 0 && rReferenceItem.m_pszText[stReferenceLen - 1] == _t(' ') && m_pszText[stOwnLen - 1] != _t(' ')) + return eResult_ContentWarning; + + // formatting strings check + tstring_t strRefFmt; + const tchar_t* pszData = rReferenceItem.m_pszText; + while((pszData = _tcschr(pszData, _t('%'))) != NULL) + { + pszData++; // it works assuming the string is null-terminated + switch(*pszData) + { + case _t('%'): + pszData++; + break; // it's a %% - skip it + default: + strRefFmt += *pszData; + } + } + + tstring_t strOwnFmt; + pszData = m_pszText; + while((pszData = _tcschr(pszData, _t('%'))) != NULL) + { + pszData++; // it works assuming the string is null-terminated + if(*pszData) + { + switch(*pszData) + { + case _t('%'): + pszData++; + break; // it's a %% - skip it + default: + strOwnFmt += *pszData; + } + } + } + if(strRefFmt != strOwnFmt) + return eResult_ContentWarning; + + return eResult_Valid; +} + CLangData::CLangData() : m_pszFilename(NULL), m_pszLngName(NULL),