Fix incorrect translation language for %l format identifier
This commit is contained in:
parent
4cea082303
commit
6a18f8007d
|
@ -4456,7 +4456,7 @@ static cell AMX_NATIVE_CALL LookupLangKey(AMX *amx, cell *params)
|
|||
{
|
||||
int len;
|
||||
char *key=get_amxstring(amx,params[3],0,len);
|
||||
const char *def=translate(amx,params[4],key);
|
||||
const char *def=translate(amx, playerlang(params[4]),key);
|
||||
|
||||
if (def==NULL)
|
||||
{
|
||||
|
|
|
@ -44,60 +44,78 @@ template size_t atcprintf<char, char>(char *, size_t, const char *, AMX *, cell
|
|||
|
||||
THash<ke::AString, lang_err> BadLang_Table;
|
||||
|
||||
static cvar_t *amx_mldebug = NULL;
|
||||
static cvar_t *amx_cl_langs = NULL;
|
||||
static cvar_t *amx_mldebug = nullptr;
|
||||
static cvar_t *amx_cl_langs = nullptr;
|
||||
|
||||
const char *translate(AMX *amx, cell amxaddr, const char *key)
|
||||
const char *playerlang(const cell index)
|
||||
{
|
||||
const char *pLangName = NULL;
|
||||
const char *def = NULL;
|
||||
int status;
|
||||
cell *addr = get_amxaddr(amx, amxaddr);
|
||||
char name[4];
|
||||
if (addr[0] == LANG_PLAYER)
|
||||
const char *pLangName = nullptr;
|
||||
|
||||
if (index == LANG_PLAYER)
|
||||
{
|
||||
if (!amx_cl_langs)
|
||||
{
|
||||
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
|
||||
if ( (int)amx_cl_langs->value == 0 )
|
||||
}
|
||||
|
||||
if (static_cast<int>(amx_cl_langs->value) == 0)
|
||||
{
|
||||
pLangName = amxmodx_language->string;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
pLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(g_langMngr.GetDefLang())->pEdict, "lang");
|
||||
}
|
||||
} else if (addr[0] == LANG_SERVER) {
|
||||
pLangName = amxmodx_language->string;
|
||||
} else if (addr[0] >= 1 && addr[0] <= gpGlobals->maxClients) {
|
||||
if (!amx_cl_langs)
|
||||
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
|
||||
if ( (int)amx_cl_langs->value == 0 )
|
||||
}
|
||||
else if (index == LANG_SERVER)
|
||||
{
|
||||
pLangName = amxmodx_language->string;
|
||||
} else {
|
||||
pLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(addr[0])->pEdict, "lang");
|
||||
}
|
||||
} else {
|
||||
get_amxstring_r(amx, amxaddr, name, 3);
|
||||
pLangName = name;
|
||||
else if (index >= 1 && index <= gpGlobals->maxClients)
|
||||
{
|
||||
if (!amx_cl_langs)
|
||||
{
|
||||
amx_cl_langs = CVAR_GET_POINTER("amx_client_languages");
|
||||
}
|
||||
|
||||
if (static_cast<int>(amx_cl_langs->value) == 0)
|
||||
{
|
||||
pLangName = amxmodx_language->string;
|
||||
}
|
||||
else
|
||||
{
|
||||
pLangName = ENTITY_KEYVALUE(GET_PLAYER_POINTER_I(index)->pEdict, "lang");
|
||||
}
|
||||
}
|
||||
|
||||
return pLangName;
|
||||
}
|
||||
|
||||
const char *translate(AMX *amx, const char *lang, const char *key)
|
||||
{
|
||||
auto pLangName = lang;
|
||||
int status;
|
||||
|
||||
if (!pLangName || !isalpha(pLangName[0]))
|
||||
{
|
||||
pLangName = amxmodx_language->string;
|
||||
}
|
||||
|
||||
//next parameter!
|
||||
def = g_langMngr.GetDef(pLangName, key, status);
|
||||
auto def = g_langMngr.GetDef(pLangName, key, status);
|
||||
|
||||
if (!amx_mldebug)
|
||||
{
|
||||
amx_mldebug = CVAR_GET_POINTER("amx_mldebug");
|
||||
}
|
||||
|
||||
bool debug = (amx_mldebug && amx_mldebug->string && (amx_mldebug->string[0] != '\0'));
|
||||
auto debug = (amx_mldebug && amx_mldebug->string && (amx_mldebug->string[0] != '\0'));
|
||||
|
||||
if (debug)
|
||||
{
|
||||
int debug_status;
|
||||
bool validlang = true;
|
||||
const char *testlang = amx_mldebug->string;
|
||||
auto validlang = true;
|
||||
auto testlang = amx_mldebug->string;
|
||||
|
||||
if (!g_langMngr.LangExists(testlang))
|
||||
{
|
||||
AMXXLOG_Error("[AMXX] \"%s\" is an invalid debug language", testlang);
|
||||
|
@ -107,16 +125,18 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
|
|||
g_langMngr.GetDef(testlang, key, debug_status);
|
||||
|
||||
if (validlang && debug_status == ERR_BADKEY)
|
||||
{
|
||||
AMXXLOG_Error("[AMXX] Language key \"%s\" not found for language \"%s\", check \"%s\"", key, testlang, GetFileName(amx));
|
||||
}
|
||||
}
|
||||
|
||||
if (def == NULL)
|
||||
if (!def)
|
||||
{
|
||||
if (debug && status == ERR_BADLANG)
|
||||
{
|
||||
ke::AString lang(pLangName);
|
||||
ke::AString langName(pLangName);
|
||||
|
||||
lang_err &err = BadLang_Table.AltFindOrInsert(ke::Move(lang));
|
||||
auto &err = BadLang_Table.AltFindOrInsert(ke::Move(langName));
|
||||
|
||||
if (err.last + 120.0f < gpGlobals->time)
|
||||
{
|
||||
|
@ -125,12 +145,16 @@ const char *translate(AMX *amx, cell amxaddr, const char *key)
|
|||
}
|
||||
}
|
||||
|
||||
if (addr[0] != LANG_SERVER)
|
||||
if (strcmp(pLangName, amxmodx_language->string) != 0)
|
||||
{
|
||||
def = g_langMngr.GetDef(amxmodx_language->string, key, status);
|
||||
}
|
||||
|
||||
if (!def && (strcmp(pLangName, "en") != 0 && strcmp(amxmodx_language->string, "en") != 0))
|
||||
{
|
||||
def = g_langMngr.GetDef("en", key, status);
|
||||
}
|
||||
}
|
||||
|
||||
return def;
|
||||
}
|
||||
|
@ -656,20 +680,23 @@ reswitch:
|
|||
case 'L':
|
||||
case 'l':
|
||||
{
|
||||
cell target;
|
||||
const char *lang;
|
||||
int len;
|
||||
if (ch == 'L')
|
||||
{
|
||||
CHECK_ARGS(1);
|
||||
target = params[arg++];
|
||||
auto currParam = params[arg++];
|
||||
lang = playerlang(*get_amxaddr(amx, currParam));
|
||||
if (!lang)
|
||||
lang = get_amxstring(amx, currParam, 4, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECK_ARGS(0);
|
||||
target = g_langMngr.GetDefLang();
|
||||
lang = playerlang(g_langMngr.GetDefLang());
|
||||
}
|
||||
int len;
|
||||
const char *key = get_amxstring(amx, params[arg++], 3, len);
|
||||
const char *def = translate(amx, target, key);
|
||||
const char *def = translate(amx, lang, key);
|
||||
if (!def)
|
||||
{
|
||||
static char buf[255];
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
template <typename D, typename S>
|
||||
size_t atcprintf(D *buffer, size_t maxlen, const S *format, AMX *amx, cell *params, int *param);
|
||||
|
||||
const char *translate(AMX *amx, cell amxaddr, const char *key);
|
||||
const char *playerlang(const cell index);
|
||||
const char *translate(AMX *amx, const char *lang, const char *key);
|
||||
|
||||
#endif //_INCLUDE_FORMATTING_H
|
||||
|
|
Loading…
Reference in New Issue
Block a user