#include "precompiled.h" #include "CLocale.h" #include "TSComponent.h" #include "StringBuffer.h" // Vaguely useful utility function for deleting stuff template void delete_fn(T* v) { delete v; } #include #include #include "ps/CLogger.h" #define LOG_CATEGORY "i18n" using namespace I18n; #ifdef I18NDEBUG namespace I18n { bool g_UsedCache; } #endif I18n::StringBuffer::operator Str() { #ifdef I18NDEBUG g_UsedCache = false; #endif if (Variables.size() != String.VarCount) { LOG(ERROR, LOG_CATEGORY, "I18n: Incorrect number of parameters passed to Translate"); // Tidy up std::for_each(Variables.begin(), Variables.end(), delete_fn); return L"(translation error)"; } if (String.VarCount == 0) if (String.Parts.size()) return String.Parts[0]->ToString(Locale, Variables).str(); else return Str(); Str ret; if (Locale->ReadCached(this, ret)) { // Found in cache #ifdef I18NDEBUG g_UsedCache = true; #endif // Clean up the current allocated data std::for_each(Variables.begin(), Variables.end(), delete_fn); // Return the cached string return ret; } // Not in cache - construct the string for (std::vector::iterator it = String.Parts.begin(), end = String.Parts.end(); it != end; ++it) { ret += (*it)->ToString(Locale, Variables).str(); } Locale->AddToCache(this, ret); return ret; } I18n::StringBuffer::StringBuffer(TranslatedString& str, CLocale* loc) : String(str), Locale(loc) { } u32 I18n::StringBuffer::Hash() { u32 hash = 0; size_t max = Variables.size(); for (size_t i = 0; i < max; ++i) hash += Variables[i]->Hash(); return hash; }