From ff6f41503500c5569fe38c8d31ca06d92d07a4e4 Mon Sep 17 00:00:00 2001 From: Rustam Ismailov <46057609+rismailov@users.noreply.github.com> Date: Fri, 10 Jul 2026 05:32:04 +0300 Subject: [PATCH 1/7] Lang_GetCodes, Lang_printex and variable name --- zlang.inc | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/zlang.inc b/zlang.inc index 6e4e4df..6a62557 100644 --- a/zlang.inc +++ b/zlang.inc @@ -50,7 +50,7 @@ */ #if !defined MAX_LANGS - #define MAX_LANGS (2) + #define MAX_LANGS (5) #endif #if !defined LANG_VAR_OFFSET @@ -698,29 +698,30 @@ stock Lang_ReturnCode(Lang:lang) stock Lang_GetCodes(result[], const size = sizeof(result), const separator = '/', const bool:isuppercase = false) { - new - lang, - i, - length, + static + code[MAX_LANG_CODE + 1], + Lang:lang, sep[2]; result[0] = '\0'; sep[0] = separator; - for (lang = 0; lang < MAX_LANGS; lang += 1) { - strcat(result, gLangInfo[lang][e_zlCode], size); - strcat(result, sep, size); + for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) { + if (!Lang_IsValid(Lang:lang)) { + continue; + } - for (i = (MAX_LANG_CODE + 1) * lang; i < (MAX_LANG_CODE + 1) * (lang + 1) - 1; i += 1) { - if (isuppercase) { - result[i] = toupper(result[i]); - } else { - result[i] = tolower(result[i]); - } + _Lang_strcpy(code, gLangInfo[lang][e_zlCode], MAX_LANG_CODE + 1); + + for (new i = 0; code[i] != '\0'; i += 1) { + code[i] = isuppercase ? toupper(code[i]) : tolower(code[i]); } + + strcat(result, code, size); + strcat(result, sep, size); } - length = strlen(result); + new length = strlen(result); if (length != 0) { result[length - 1] = '\0'; } @@ -980,12 +981,9 @@ stock Lang_printf(const var[], lang_args<>) stock Lang_printfex(Lang:lang, const var[], lang_args<>) { static - Lang:lang, text[MAX_LANG_MFORMAT_STRING], success; - lang = Lang_GetDefaultLang(); - success = Lang_GetText(lang, var, text); if (numargs() > 2) { @@ -1646,7 +1644,7 @@ static stock _Lang_ProcessVars(Lang:lang, strings_with_vars) epos = strfind(varvalue, ")", true, spos); if (epos == -1) { next_iteration = false; - printf("Error: error with using language variables, example of usage: \\v(VARIABLE)"); + printf("Error: language variable (%s) is undefined\n", varname); break; } From e9dab727a8fb8733e7eda0ecff481d38177388d6 Mon Sep 17 00:00:00 2001 From: Rustam Ismailov <46057609+rismailov@users.noreply.github.com> Date: Fri, 10 Jul 2026 05:37:00 +0300 Subject: [PATCH 2/7] Update zlang.inc --- zlang.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zlang.inc b/zlang.inc index 6a62557..7ec36cc 100644 --- a/zlang.inc +++ b/zlang.inc @@ -50,7 +50,7 @@ */ #if !defined MAX_LANGS - #define MAX_LANGS (5) + #define MAX_LANGS (2) #endif #if !defined LANG_VAR_OFFSET From 207889655c15f937695efba1ba6a460c30308bfc Mon Sep 17 00:00:00 2001 From: Rustam Ismailov <46057609+rismailov@users.noreply.github.com> Date: Fri, 10 Jul 2026 12:40:15 +0300 Subject: [PATCH 3/7] simplify and optimize --- zlang.inc | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/zlang.inc b/zlang.inc index 7ec36cc..629d0ad 100644 --- a/zlang.inc +++ b/zlang.inc @@ -698,33 +698,33 @@ stock Lang_ReturnCode(Lang:lang) stock Lang_GetCodes(result[], const size = sizeof(result), const separator = '/', const bool:isuppercase = false) { - static - code[MAX_LANG_CODE + 1], - Lang:lang, - sep[2]; - - result[0] = '\0'; - sep[0] = separator; - - for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) { - if (!Lang_IsValid(Lang:lang)) { - continue; - } - - _Lang_strcpy(code, gLangInfo[lang][e_zlCode], MAX_LANG_CODE + 1); - - for (new i = 0; code[i] != '\0'; i += 1) { - code[i] = isuppercase ? toupper(code[i]) : tolower(code[i]); - } - - strcat(result, code, size); - strcat(result, sep, size); - } - - new length = strlen(result); - if (length != 0) { - result[length - 1] = '\0'; - } + static + Lang:lang, + pos; + + pos = 0; + + for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) + { + if (!Lang_IsValid(Lang:lang)) { + continue; + } + + for (new i = 0; gLangInfo[lang][e_zlCode][i] != '\0' && pos < size - 1; i += 1) { + result[pos++] = isuppercase + ? toupper(gLangInfo[lang][e_zlCode][i]) + : tolower(gLangInfo[lang][e_zlCode][i]); + } + + if (pos < size - 1) { + result[pos++] = separator; + } + } + + if (pos != 0) { + pos--; + } + result[pos] = '\0'; } stock Lang_ReturnCodes(const separator = '/', const bool:isuppercase = false) From 57642d1dfd1ffdbfbc46a307ae714e0cb812b14b Mon Sep 17 00:00:00 2001 From: Rustam Ismailov <46057609+rismailov@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:25:06 +0300 Subject: [PATCH 4/7] Lang_GetCount --- zlang.inc | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/zlang.inc b/zlang.inc index 629d0ad..3ad7d68 100644 --- a/zlang.inc +++ b/zlang.inc @@ -167,7 +167,6 @@ static gLangInfo[MAX_LANGS][e_ZLANG_INFO], gLangFiles[MAX_LANGS][MAX_LANG_FILES][MAX_LANG_FILENAME], gLangSlots[MAX_LANGS char], - gLangCount, Lang:gDefaultLang, Lang:gPlayerLang[MAX_PLAYERS]; @@ -278,8 +277,6 @@ static stock Lang_Load() if (_Lang_IsVarExists(LANG_SYSVAR_SLOT_STATUS, _:lang)) { status = _Lang_GetVarInt(LANG_SYSVAR_SLOT_STATUS, _:lang); _Lang_SetSlotStatus(lang, status); - - gLangCount += 1; } else { _Lang_SetSlotStatus(lang, LANG_SLOT_FREE); } @@ -324,7 +321,6 @@ stock Lang:Lang_Add(const code[], const name[]) Lang_SetName(lang, name); Lang_SetSlotStatus(lang, LANG_SLOT_BUSY); - gLangCount += 1; return lang; } @@ -342,7 +338,6 @@ stock Lang_Remove(Lang:lang) } Lang_SetSlotStatus(lang, LANG_SLOT_FREE); - gLangCount -= 1; return 1; } @@ -744,6 +739,14 @@ stock Lang_IsValid(Lang:lang) stock Lang_GetCount() { + new gLangCount; + + for (new Lang:lang; lang < Lang:MAX_LANGS; _:lang += 1) { + if (Lang_IsValid(lang)) { + gLangCount ++; + } + } + return gLangCount; } @@ -1415,12 +1418,6 @@ public zlang_SetCode(Lang:lang, const name[]) forward zlang_SetSlotStatus(Lang:lang, status); public zlang_SetSlotStatus(Lang:lang, status) { - if (_Lang_IsSlotHaveStatus(lang, LANG_SLOT_FREE) && (status & LANG_SLOT_BUSY)) { - gLangCount += 1; - } else if (_Lang_IsSlotHaveStatus(lang, LANG_SLOT_BUSY) && (status & LANG_SLOT_FREE)) { - gLangCount -= 1; - } - _Lang_SetSlotStatus(lang, status); } From 8182f87a5c4bc1d54fb3d8931ff108e8dbee6da6 Mon Sep 17 00:00:00 2001 From: Rustam Ismailov <46057609+rismailov@users.noreply.github.com> Date: Fri, 10 Jul 2026 15:13:40 +0300 Subject: [PATCH 5/7] Update zlang.inc --- zlang.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zlang.inc b/zlang.inc index 3ad7d68..d961364 100644 --- a/zlang.inc +++ b/zlang.inc @@ -1641,7 +1641,7 @@ static stock _Lang_ProcessVars(Lang:lang, strings_with_vars) epos = strfind(varvalue, ")", true, spos); if (epos == -1) { next_iteration = false; - printf("Error: language variable (%s) is undefined\n", varname); + printf("Error: language variable (%s) is undefined", varname); break; } From b932036f11cd01eb93ca790f09b121c5fc11bf2a Mon Sep 17 00:00:00 2001 From: Rustam Ismailov <46057609+rismailov@users.noreply.github.com> Date: Fri, 10 Jul 2026 15:34:03 +0300 Subject: [PATCH 6/7] dynamic variable name --- zlang.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zlang.inc b/zlang.inc index d961364..c14d259 100644 --- a/zlang.inc +++ b/zlang.inc @@ -1678,7 +1678,8 @@ stock Lang_ProcessDynamicVars(Lang:lang, text[], const size = sizeof(text)) while ((spos = strfind(text, "\\v(", true)) != -1) { epos = strfind(text, ")", true, spos); if (epos == -1) { - printf("Error: error with using language variables, example of usage: \\v(VARIABLE)"); + strmid(vartmp, text, spos + 3, strlen(text)); + printf("Error: dynamic variable (%s) is undefined", vartmp); break; } From 9f45728036a5c6e4cce2adf83a6699d4505fb342 Mon Sep 17 00:00:00 2001 From: Rustam Ismailov <46057609+rismailov@users.noreply.github.com> Date: Tue, 6 Oct 2026 16:16:48 +0300 Subject: [PATCH 7/7] fix --- zlang.inc | 110 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/zlang.inc b/zlang.inc index c14d259..6d4363f 100644 --- a/zlang.inc +++ b/zlang.inc @@ -167,6 +167,7 @@ static gLangInfo[MAX_LANGS][e_ZLANG_INFO], gLangFiles[MAX_LANGS][MAX_LANG_FILES][MAX_LANG_FILENAME], gLangSlots[MAX_LANGS char], + gLangCount, Lang:gDefaultLang, Lang:gPlayerLang[MAX_PLAYERS]; @@ -277,6 +278,8 @@ static stock Lang_Load() if (_Lang_IsVarExists(LANG_SYSVAR_SLOT_STATUS, _:lang)) { status = _Lang_GetVarInt(LANG_SYSVAR_SLOT_STATUS, _:lang); _Lang_SetSlotStatus(lang, status); + + gLangCount += 1; } else { _Lang_SetSlotStatus(lang, LANG_SLOT_FREE); } @@ -321,6 +324,7 @@ stock Lang:Lang_Add(const code[], const name[]) Lang_SetName(lang, name); Lang_SetSlotStatus(lang, LANG_SLOT_BUSY); + gLangCount += 1; return lang; } @@ -338,6 +342,7 @@ stock Lang_Remove(Lang:lang) } Lang_SetSlotStatus(lang, LANG_SLOT_FREE); + gLangCount -= 1; return 1; } @@ -693,33 +698,35 @@ stock Lang_ReturnCode(Lang:lang) stock Lang_GetCodes(result[], const size = sizeof(result), const separator = '/', const bool:isuppercase = false) { - static - Lang:lang, - pos; + static + Lang:lang, + pos, + i; - pos = 0; + pos = 0; - for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) - { - if (!Lang_IsValid(Lang:lang)) { - continue; - } + for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) { + if (!Lang_IsValid(lang)) { + continue; + } - for (new i = 0; gLangInfo[lang][e_zlCode][i] != '\0' && pos < size - 1; i += 1) { - result[pos++] = isuppercase - ? toupper(gLangInfo[lang][e_zlCode][i]) - : tolower(gLangInfo[lang][e_zlCode][i]); - } + for (i = 0; i < MAX_LANG_CODE && pos < size - 1; i += 1) { + result[pos] = isuppercase + ? toupper(gLangInfo[_:lang][e_zlCode][i]) + : tolower(gLangInfo[_:lang][e_zlCode][i]); + pos += 1; + } - if (pos < size - 1) { - result[pos++] = separator; - } - } + if (pos < size - 1) { + result[pos] = separator; + pos += 1; + } + } - if (pos != 0) { - pos--; - } - result[pos] = '\0'; + if (pos != 0) { + pos -= 1; + } + result[pos] = '\0'; } stock Lang_ReturnCodes(const separator = '/', const bool:isuppercase = false) @@ -739,14 +746,6 @@ stock Lang_IsValid(Lang:lang) stock Lang_GetCount() { - new gLangCount; - - for (new Lang:lang; lang < Lang:MAX_LANGS; _:lang += 1) { - if (Lang_IsValid(lang)) { - gLangCount ++; - } - } - return gLangCount; } @@ -1064,21 +1063,21 @@ stock Lang_SendTextToAll(const var[], lang_args<>) static playerid, Lang:lang, - text[Lang:MAX_LANGS][MAX_LANG_FORMAT_STRING + 1]; + text[MAX_LANGS][MAX_LANG_FORMAT_STRING + 1]; for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) { if (!Lang_IsValid(lang)) { continue; } - Lang_GetText(lang, var, text[lang]); + Lang_GetText(lang, var, text[_:lang]); if (numargs() > 1) { - Lang_format(text[lang], sizeof(text[]), text[lang], lang_start<1>); + Lang_format(text[_:lang], sizeof(text[]), text[_:lang], lang_start<1>); } #if defined ENABLE_LANG_DYNAMIC_VARS - Lang_ProcessDynamicVars(lang, text[lang]); + Lang_ProcessDynamicVars(lang, text[_:lang]); #endif } @@ -1094,7 +1093,7 @@ stock Lang_SendTextToAll(const var[], lang_args<>) continue; } #endif - SendClientMessage(playerid, -1, text[Lang_GetPlayerLang(playerid)]); + SendClientMessage(playerid, -1, text[_:Lang_GetPlayerLang(playerid)]); } } @@ -1103,26 +1102,26 @@ stock Lang_SendTextToPlayers(const players[], const var[], lang_args<>) static idx, Lang:lang, - text[Lang:MAX_LANGS][MAX_LANG_FORMAT_STRING + 1]; + text[MAX_LANGS][MAX_LANG_FORMAT_STRING + 1]; for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) { if (!Lang_IsValid(lang)) { continue; } - Lang_GetText(lang, var, text[lang]); + Lang_GetText(lang, var, text[_:lang]); if (numargs() > 2) { - Lang_format(text[lang], sizeof(text[]), text[lang], lang_start<2>); + Lang_format(text[_:lang], sizeof(text[]), text[_:lang], lang_start<2>); } #if defined ENABLE_LANG_DYNAMIC_VARS - Lang_ProcessDynamicVars(lang, text[lang]); + Lang_ProcessDynamicVars(lang, text[_:lang]); #endif } for (idx = 0; players[idx] != INVALID_PLAYER_ID; idx += 1) { - SendClientMessage(players[idx], -1, text[Lang_GetPlayerLang(players[idx])]); + SendClientMessage(players[idx], -1, text[_:Lang_GetPlayerLang(players[idx])]); } } @@ -1131,26 +1130,26 @@ stock Lang_SendTextToPlayersEx(const players[], const size = sizeof(players), co static idx, Lang:lang, - text[Lang:MAX_LANGS][MAX_LANG_FORMAT_STRING + 1]; + text[MAX_LANGS][MAX_LANG_FORMAT_STRING + 1]; for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) { if (!Lang_IsValid(lang)) { continue; } - Lang_GetText(lang, var, text[lang]); + Lang_GetText(lang, var, text[_:lang]); if (numargs() > 3) { - Lang_format(text[lang], sizeof(text[]), text[lang], lang_start<3>); + Lang_format(text[_:lang], sizeof(text[]), text[_:lang], lang_start<3>); } #if defined ENABLE_LANG_DYNAMIC_VARS - Lang_ProcessDynamicVars(lang, text[lang]); + Lang_ProcessDynamicVars(lang, text[_:lang]); #endif } for (idx = 0; idx < size && players[idx] != INVALID_PLAYER_ID; idx += 1) { - SendClientMessage(players[idx], -1, text[Lang_GetPlayerLang(players[idx])]); + SendClientMessage(players[idx], -1, text[_:Lang_GetPlayerLang(players[idx])]); } } @@ -1212,21 +1211,21 @@ stock Lang_GameTextForAll(time, style, const var[], lang_args<>) static playerid, Lang:lang, - text[Lang:MAX_LANGS][MAX_LANG_FORMAT_STRING + 1]; + text[MAX_LANGS][MAX_LANG_FORMAT_STRING + 1]; for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) { if (!Lang_IsValid(lang)) { continue; } - Lang_GetText(lang, var, text[lang]); + Lang_GetText(lang, var, text[_:lang]); if (numargs() > 3) { - Lang_format(text[lang], sizeof(text[]), text[lang], lang_start<3>); + Lang_format(text[_:lang], sizeof(text[]), text[_:lang], lang_start<3>); } #if defined ENABLE_LANG_DYNAMIC_VARS - Lang_ProcessDynamicVars(lang, text[lang]); + Lang_ProcessDynamicVars(lang, text[_:lang]); #endif } @@ -1242,7 +1241,7 @@ stock Lang_GameTextForAll(time, style, const var[], lang_args<>) continue; } #endif - GameTextForPlayer(playerid, text[Lang_GetPlayerLang(playerid)], time, style); + GameTextForPlayer(playerid, text[_:Lang_GetPlayerLang(playerid)], time, style); } } @@ -1418,6 +1417,12 @@ public zlang_SetCode(Lang:lang, const name[]) forward zlang_SetSlotStatus(Lang:lang, status); public zlang_SetSlotStatus(Lang:lang, status) { + if (_Lang_IsSlotHaveStatus(lang, LANG_SLOT_FREE) && (status & LANG_SLOT_BUSY)) { + gLangCount += 1; + } else if (_Lang_IsSlotHaveStatus(lang, LANG_SLOT_BUSY) && (status & LANG_SLOT_FREE)) { + gLangCount -= 1; + } + _Lang_SetSlotStatus(lang, status); } @@ -1641,7 +1646,7 @@ static stock _Lang_ProcessVars(Lang:lang, strings_with_vars) epos = strfind(varvalue, ")", true, spos); if (epos == -1) { next_iteration = false; - printf("Error: language variable (%s) is undefined", varname); + printf("Error: invalid language variable found \"%s\" in \"%s\". Please use the following format: \\v(VARIABLE).", varvalue[spos + 3], varname); break; } @@ -1678,8 +1683,7 @@ stock Lang_ProcessDynamicVars(Lang:lang, text[], const size = sizeof(text)) while ((spos = strfind(text, "\\v(", true)) != -1) { epos = strfind(text, ")", true, spos); if (epos == -1) { - strmid(vartmp, text, spos + 3, strlen(text)); - printf("Error: dynamic variable (%s) is undefined", vartmp); + printf("Error: invalid language variable found \"%s\". Please use the following format: \\v(VARIABLE).", text[spos + 3]); break; }