atcprintf() is now fully re-entrant, meaning translations can be used from inside translations
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401626
This commit is contained in:
parent
c3149f22cf
commit
744dbdc4c7
@ -87,23 +87,43 @@ inline bool TryTranslation(CPlugin *pl, const char *key, unsigned int langid, un
|
||||
return (err == Trans_Okay) ? true : false;
|
||||
}
|
||||
|
||||
size_t Translate(char *buffer, size_t maxlen, IPluginContext *pCtx, const char *key, cell_t target, const cell_t *params, int *arg, bool *error)
|
||||
inline void ReorderTranslationParams(const Translation *pTrans, cell_t *params)
|
||||
{
|
||||
cell_t new_params[MAX_TRANSLATE_PARAMS];
|
||||
for (unsigned int i = 0; i < pTrans->fmt_count; i++)
|
||||
{
|
||||
new_params[i] = params[pTrans->fmt_order[i]];
|
||||
}
|
||||
memcpy(params, new_params, pTrans->fmt_count * sizeof(cell_t));
|
||||
}
|
||||
|
||||
size_t Translate(char *buffer,
|
||||
size_t maxlen,
|
||||
IPluginContext *pCtx,
|
||||
const char *key,
|
||||
cell_t target,
|
||||
const cell_t *params,
|
||||
int *arg,
|
||||
bool *error)
|
||||
{
|
||||
unsigned int langid;
|
||||
*error = false;
|
||||
Translation pTrans;
|
||||
CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext());
|
||||
size_t langcount = pl->GetLangFileCount();
|
||||
void *new_params[MAX_TRANSLATE_PARAMS];
|
||||
unsigned int max_params = 0;
|
||||
|
||||
try_serverlang:
|
||||
if (target == LANG_SERVER)
|
||||
{
|
||||
langid = g_Translator.GetServerLanguage();
|
||||
} else if ((target >= 1) && (target <= g_Players.GetMaxClients())) {
|
||||
}
|
||||
else if ((target >= 1) && (target <= g_Players.GetMaxClients()))
|
||||
{
|
||||
langid = g_Translator.GetClientLanguage(target);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
pCtx->ThrowNativeErrorEx(SP_ERROR_PARAM, "Translation failed: invalid client index %d", target);
|
||||
goto error_out;
|
||||
}
|
||||
@ -114,13 +134,17 @@ try_serverlang:
|
||||
{
|
||||
target = LANG_SERVER;
|
||||
goto try_serverlang;
|
||||
} else if (langid != LANGUAGE_ENGLISH) {
|
||||
}
|
||||
else if (langid != LANGUAGE_ENGLISH)
|
||||
{
|
||||
if (!TryTranslation(pl, key, LANGUAGE_ENGLISH, langcount, &pTrans))
|
||||
{
|
||||
pCtx->ThrowNativeErrorEx(SP_ERROR_PARAM, "Language phrase \"%s\" not found", key);
|
||||
goto error_out;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
pCtx->ThrowNativeErrorEx(SP_ERROR_PARAM, "Language phrase \"%s\" not found", key);
|
||||
goto error_out;
|
||||
}
|
||||
@ -140,22 +164,18 @@ try_serverlang:
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
/* Translate the parameters to raw pointers */
|
||||
for (size_t i=0; i<max_params; i++)
|
||||
{
|
||||
pCtx->LocalToPhysAddr(params[*arg], reinterpret_cast<cell_t **>(&new_params[i]));
|
||||
(*arg)++;
|
||||
}
|
||||
/* Re-order the parameters that this translation requires */
|
||||
ReorderTranslationParams(&pTrans, const_cast<cell_t *>(¶ms[*arg]));
|
||||
}
|
||||
|
||||
return g_Translator.Translate(buffer, maxlen, new_params, &pTrans);
|
||||
/* Now, call back into atcprintf() which is re-entrant */
|
||||
return atcprintf(buffer, maxlen, pTrans.szPhrase, pCtx, params, arg);
|
||||
|
||||
error_out:
|
||||
*error = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//:TODO: review this code before we choose a license
|
||||
|
||||
void AddString(char **buf_p, size_t &maxlen, const char *string, int width, int prec)
|
||||
{
|
||||
int size = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user