changed around translation API a bit
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40388
This commit is contained in:
parent
b489378b9c
commit
326ac67c68
@ -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;
|
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<int>(object));
|
phrase_t *pPhrase = (phrase_t *)m_pMemory->GetAddress(reinterpret_cast<int>(object));
|
||||||
trans_t *trans = (trans_t *)m_pMemory->GetAddress(pPhrase->trans_tbl);
|
trans_t *trans = (trans_t *)m_pMemory->GetAddress(pPhrase->trans_tbl);
|
||||||
|
|
||||||
trans = &trans[pTrans->lang_id];
|
trans = &trans[lang_id];
|
||||||
|
|
||||||
if (trans->stridx == -1)
|
if (trans->stridx == -1)
|
||||||
{
|
{
|
||||||
return NULL;
|
return Trans_BadPhraseLanguage;
|
||||||
}
|
}
|
||||||
|
|
||||||
*fmt_order = (int *)m_pMemory->GetAddress(trans->fmt_order);
|
pTrans->fmt_order = (int *)m_pMemory->GetAddress(trans->fmt_order);
|
||||||
*fmt_count = pPhrase->fmt_count;
|
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()
|
const char *CPhraseFile::GetFilename()
|
||||||
@ -735,30 +737,15 @@ SMCParseResult CTranslator::ReadSMC_KeyValue(const char *key, const char *value,
|
|||||||
return SMCParse_Continue;
|
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())
|
void *new_params[MAX_TRANSLATE_PARAMS];
|
||||||
{
|
|
||||||
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];
|
|
||||||
|
|
||||||
/* Rewrite the parameter order */
|
/* Rewrite the parameter order */
|
||||||
for (unsigned int i=0; i<count; i++)
|
for (unsigned int i=0; i<pTrans->fmt_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);
|
||||||
}
|
}
|
||||||
|
@ -43,10 +43,17 @@ struct Language
|
|||||||
|
|
||||||
struct Translation
|
struct Translation
|
||||||
{
|
{
|
||||||
const char *szPhrase;
|
const char *szPhrase; /**< Translated phrase. */
|
||||||
unsigned int lang_id;
|
unsigned int fmt_count; /**< Number of format parameters. */
|
||||||
unsigned int file_id;
|
int *fmt_order; /**< Format phrase order. */
|
||||||
void **params;
|
};
|
||||||
|
|
||||||
|
enum TransError
|
||||||
|
{
|
||||||
|
Trans_Okay = 0,
|
||||||
|
Trans_BadLanguage = 1,
|
||||||
|
Trans_BadPhrase = 2,
|
||||||
|
Trans_BadPhraseLanguage = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
class CPhraseFile : public ITextListener_SMC
|
class CPhraseFile : public ITextListener_SMC
|
||||||
@ -57,7 +64,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
void ReparseFile();
|
void ReparseFile();
|
||||||
const char *GetFilename();
|
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
|
public: //ITextListener_SMC
|
||||||
void ReadSMC_ParseStart();
|
void ReadSMC_ParseStart();
|
||||||
void ReadSMC_ParseEnd(bool halted, bool failed);
|
void ReadSMC_ParseEnd(bool halted, bool failed);
|
||||||
@ -99,7 +106,8 @@ public:
|
|||||||
BaseStringTable *GetStringTable();
|
BaseStringTable *GetStringTable();
|
||||||
unsigned int GetLanguageCount();
|
unsigned int GetLanguageCount();
|
||||||
bool GetLanguageByCode(const char *code, unsigned int *index);
|
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:
|
private:
|
||||||
CVector<Language *> m_Languages;
|
CVector<Language *> m_Languages;
|
||||||
CVector<CPhraseFile *> m_Files;
|
CVector<CPhraseFile *> m_Files;
|
||||||
|
Loading…
Reference in New Issue
Block a user