diff --git a/core/CTranslator.cpp b/core/CTranslator.cpp index 515227ad..bf4369df 100644 --- a/core/CTranslator.cpp +++ b/core/CTranslator.cpp @@ -538,33 +538,35 @@ void CPhraseFile::ReadSMC_ParseEnd(bool halted, bool failed) } } -const char *CPhraseFile::GetTranslation(const Translation *pTrans, int **fmt_order, unsigned int *fmt_count) +TransError CPhraseFile::GetTranslation(const char *szPhrase, unsigned int lang_id, Translation *pTrans) { - if (pTrans->lang_id >= m_LangCount) + if (lang_id >= m_LangCount) { - return NULL; + return Trans_BadLanguage; } void *object; - if (!sm_trie_retrieve(m_pPhraseLookup, pTrans->szPhrase, &object)) + if (!sm_trie_retrieve(m_pPhraseLookup, szPhrase, &object)) { - return NULL; + return Trans_BadPhrase; } phrase_t *pPhrase = (phrase_t *)m_pMemory->GetAddress(reinterpret_cast(object)); trans_t *trans = (trans_t *)m_pMemory->GetAddress(pPhrase->trans_tbl); - trans = &trans[pTrans->lang_id]; + trans = &trans[lang_id]; if (trans->stridx == -1) { - return NULL; + return Trans_BadPhraseLanguage; } - *fmt_order = (int *)m_pMemory->GetAddress(trans->fmt_order); - *fmt_count = pPhrase->fmt_count; + pTrans->fmt_order = (int *)m_pMemory->GetAddress(trans->fmt_order); + pTrans->fmt_count = pPhrase->fmt_count; - return m_pStringTab->GetString(trans->stridx); + pTrans->szPhrase = m_pStringTab->GetString(trans->stridx); + + return Trans_Okay; } const char *CPhraseFile::GetFilename() @@ -735,30 +737,15 @@ SMCParseResult CTranslator::ReadSMC_KeyValue(const char *key, const char *value, return SMCParse_Continue; } -size_t CTranslator::Translate(char *buffer, size_t maxlength, const Translation *pTrans) +size_t CTranslator::Translate(char *buffer, size_t maxlength, void **params, const Translation *pTrans) { - if (pTrans->file_id >= m_Files.size()) - { - return 0; - } - - CPhraseFile *pFile = m_Files[pTrans->file_id]; - unsigned int count; - int *order_table; - const char *str; - - if ((str=pFile->GetTranslation(pTrans, &order_table, &count)) == NULL) - { - return 0; - } - - void *params[MAX_TRANSLATE_PARAMS]; + void *new_params[MAX_TRANSLATE_PARAMS]; /* Rewrite the parameter order */ - for (unsigned int i=0; ifmt_count; i++) { - params[i] = pTrans->params[order_table[i]]; + new_params[i] = params[pTrans->fmt_order[i]]; } - return gnprintf(buffer, maxlength, str, params); + return gnprintf(buffer, maxlength, pTrans->szPhrase, new_params); } diff --git a/core/CTranslator.h b/core/CTranslator.h index 6899626e..a77e7405 100644 --- a/core/CTranslator.h +++ b/core/CTranslator.h @@ -43,10 +43,17 @@ struct Language struct Translation { - const char *szPhrase; - unsigned int lang_id; - unsigned int file_id; - void **params; + const char *szPhrase; /**< Translated phrase. */ + unsigned int fmt_count; /**< Number of format parameters. */ + int *fmt_order; /**< Format phrase order. */ +}; + +enum TransError +{ + Trans_Okay = 0, + Trans_BadLanguage = 1, + Trans_BadPhrase = 2, + Trans_BadPhraseLanguage = 3 }; class CPhraseFile : public ITextListener_SMC @@ -57,7 +64,7 @@ public: public: void ReparseFile(); const char *GetFilename(); - const char *GetTranslation(const Translation *pTrans, int **fmt_order, unsigned int *fmt_count); + TransError GetTranslation(const char *szPhrase, unsigned int lang_id, Translation *pTrans); public: //ITextListener_SMC void ReadSMC_ParseStart(); void ReadSMC_ParseEnd(bool halted, bool failed); @@ -99,7 +106,8 @@ public: BaseStringTable *GetStringTable(); unsigned int GetLanguageCount(); bool GetLanguageByCode(const char *code, unsigned int *index); - size_t Translate(char *buffer, size_t maxlength, const Translation *pTrans); + size_t Translate(char *buffer, size_t maxlength, void **params, const Translation *pTrans); + CPhraseFile *GetFileByIndex(unsigned int index); private: CVector m_Languages; CVector m_Files;