PDA

Просмотр полной версии : [Include] zlang - языковая система для каждого игрока на основе GVar



ziggi
04.09.2016, 18:37
zlang
GitHub (https://github.com/Open-GTO/zlang)

Описание
Языковая система для каждого игрока на основе GVar.

Требования
- Плагин GVar (https://github.com/samp-incognito/samp-gvar-plugin)
- foreach (https://github.com/Open-GTO/foreach) - не обязательно, но желательно

Библиотеки, совместимые с zlang
- mdialog (http://pro-pawn.ru/showthread.php?14311) - новый вид для функций Dialog_Open, Dialog_Message и Dialog_MessageEx.

Константы


Константа
Значение по умолчанию
Можно переназначить?


MAX_LANGS
2
Да


LANG_VAR_OFFSET
1000
Да


LANG_IGNORED_FIRST_SYMBOL
'\0', '#', ';'
Да


MAX_LANG_VAR_STRING
64
Да


MAX_LANG_VALUE_STRING
144
Да


MAX_LANG_SEPARATOR_STRING
64
Да


MAX_LANG_MVALUE_STRING
MAX_LANG_VALUE_STRING * 25
Да


MAX_LANG_CODE
2
Да


MAX_LANG_NAME
16
Да


MAX_LANG_FILES
5
Да


MAX_LANG_FILENAME
256
Да


INVALID_LANG_ID
Lang:-1
Нет


INVALID_LANG_FILE_ID
-1
Нет



Функции

Добавить язык
Lang:Lang_Add(code[], name[])

Удалить язык
Lang_Remove(Lang:lang)

Загрузить языковой файл
Lang_LoadFile(Lang:lang, filename[])

Выгрузить языковой файл
Lang_UnloadFile(Lang:lang, filename[] = "", fid = INVALID_LANG_FILE_ID)

Перезагрузить все языковые файлы для языка
Lang_Reload(Lang:lang)

Получить язык по его коду или имени
Lang:Lang_Get(code[] = "", name[] = "")

Установить название языка
Lang_SetName(Lang:lang, name[])

Получить название языка
Lang_GetName(Lang:lang, name[], const size = sizeof(name))

Получить название языка и возвратить его
Lang_ReturnName(Lang:lang)

Установить код языка
Lang_SetCode(Lang:lang, code[])

Получить код языка
Lang_GetCode(Lang:lang, code[], const size = sizeof(code))

Получить код языка и возвратить его
Lang_ReturnCode(Lang:lang)

Получить строку языковых кодов, разделённых символов separator
Lang_GetCodes(result[], const size = sizeof(result), const separator = '/', const bool:isuppercase = false)

Получить строку языковых кодов и вернуть её
Lang_ReturnCodes(const separator = '/', const bool:isuppercase = false)

Проверить язык на валидность
Lang_IsValid(Lang:lang)

Получить количество языков
Lang_GetCount()

Установить язык игроку
Lang_SetPlayerLang(playerid, Lang:lang)

Получить язык игрока
Lang:Lang_GetPlayerLang(playerid)

Установить язык игроку по коду
Lang:Lang_SetPlayerLangByCode(playerid, code[])

Установить язык игроку по названию
Lang:Lang_SetPlayerLangByName(playerid, name[])

Установить язык по умолчанию
Lang_SetDefaultLang(Lang:lang)

Получить язык по умолчанию
Lang_GetDefaultLang()

Получить языковой текст
Lang_GetText(Lang:lang, var[], text[], const size = sizeof(text), {Float, _}:...)

Получить языковой текст для игрока
Lang_GetPlayerText(playerid, var[], text[], const size = sizeof(text), {Float, _}:...)

Получить языковой текст для языка по умлочанию
Lang_GetDefaultText(var[], text[], const size = sizeof(text), {Float, _}:...)

Удалить языковой текст
Lang_RemoveText(Lang:lang, var[])

Проверить существование языкового текста
Lang_IsTextExists(Lang:lang, var[])

Языковая функция printf с языком по умолчанию
Lang_printf(var[], {Float, _}:...)

Языковая функция printf с определённым языком
Lang_printfex(Lang:lang, var[], {Float, _}:...)

Языковая функция print с языком по умолчанию
Lang_print(var[])

Языковая функция print с определённым языком
Lang_printex(Lang:lang, var[])

Отправить языковой текст игроку
Lang_SendText(playerid, var[], {Float, _}:...)

Отправить языковой текст всем игрокам
Lang_SendTextToAll(var[], {Float, _}:...)

Отправить языковой текст всем игрокам в массиве
Lang_SendTextToPlayers(players[], var[], {Float, _}:...)

Показать языковой диалог для игрока
Lang_ShowDialog(playerid, dialogid, style, var_caption[], var_info[], var_button1[], var_button2[], {Float, _}:...)

Показать языковой GameText для игрока
Lang_GameText(playerid, time, style, var[], {Float, _}:...)

Показать языковой GameText для всех игроков
Lang_GameTextForAll(time, style, var[], {Float, _}:...)

Создаёт TextDraw игрока с языковой переменной
Lang_CreatePlayerTextDraw(playerid, Float:x, Float:y, var[], {Float, _}:...)

Устанавливает языковой текст для TextDraw игрока
Lang_PlayerTextDrawSetString(playerid, PlayerText:text, var[], {Float, _}:...)

Формат языкового файла
Формат языкового файла представляет из себя обычный INI файл (без секций). Поддерживаются различные спецсимволы, такие как: \n, \t, \%, \s, \\, \<число>, \x<hex>.

Переменные
Вы можете использовать переменные в ваших текстовых файлах. Это поддерживает любой уровень вложенности.

HELLO_MSG = Hello
COLOR_RED = {FF0000}
COLOR_GREEN = {00FF00}
COLOR_WHITE = {FFFFFF}
NAME_ONE = \v(COLOR_RED)Alex\v(COLOR_WHITE)
NAME_TWO = \v(COLOR_GREEN)Peter\v(COLOR_WHITE)
MESSAGE_HELLO = \v(COLOR_WHITE)\v(HELLO_MSG) \v(NAME_ONE) and \v(NAME_TWO)


Пример использования
#include <a_samp>
#include <gvar>
#include <zlang>

enum e_LANG_INFO {
Lang:e_LANG_EN,
Lang:e_LANG_RU,
}

static
gLang[e_LANG_INFO];

main() {}

public OnGameModeInit()
{
// загрузить языки
gLang[e_LANG_RU] = Lang_Add("ru", "Russian");
gLang[e_LANG_EN] = Lang_Add("en", "English");

Lang_LoadFile(gLang[e_LANG_RU], "ru.ini");
Lang_LoadFile(gLang[e_LANG_EN], "en.ini");

// установить английский как язык по умлочанию
Lang_SetDefaultLang(gLang[e_LANG_EN]);
return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp(cmdtext, "/ru", true, 3) == 0) {
Lang_SetPlayerLang(playerid, gLang[e_LANG_RU]);
Lang_SendText(playerid, "LANGUAGE_CHANGED");
return 1;
}

if (strcmp(cmdtext, "/en", true, 3) == 0) {
Lang_SetPlayerLang(playerid, gLang[e_LANG_EN]);
Lang_SendText(playerid, "LANGUAGE_CHANGED");
return 1;
}

if (strcmp(cmdtext, "/help", true, 5) == 0) {
Lang_SendText(playerid, "HELLO_MSG");
Lang_SendText(playerid, "COMMANDS_LIST");
return 1;
}

if (strcmp(cmdtext, "/help330", true, 5) == 0) {
Lang_SendText(playerid, "Hello, World!");
Lang_SendText(playerid, "Commands: /help, /en, /ru");
return 1;
}

return 0;
}


scriptfiles/en.ini:

COLOR_GRAY = {CCCCCC}
LANGUAGE_CHANGED = \v(COLOR_GRAY)Now you are using english language.
HELLO_MSG = Hello, {00FF00}World!
COMMANDS_LIST = Commands: /help, /en, /ru


scriptfiles/ru.ini:

COLOR_GRAY = {CCCCCC}
LANGUAGE_CHANGED = \v(COLOR_GRAY)Теперь вы используете русский язык.
HELLO_MSG = Привет, {00FF00}Мир!
COMMANDS_LIST = Команды: /help, /en, /ru
# in zlang 3.3.0
Hello, World! = \v(HELLO_MSG)
Commands: /help, /en, /ru = \v(COMMANDS_LIST)


Скачать

Последнюю версию вы всегда можете найти на странице релизов GitHub (https://github.com/Open-GTO/zlang/releases).

vasyok28
04.09.2016, 23:09
Годно! Возьму себе
upd время компиляции не увеличит сильно?

ziggi
05.09.2016, 03:08
Годно! Возьму себе
upd время компиляции не увеличит сильно?

Сильно не увеличит.

vovandolg
06.09.2016, 22:57
Не по теме, но..

- mdialog - новый вид для функций Dialog_Open, Dialog_Message и Dialog_MessageEx.
Я так понял эти манёвры в коде для удобного чтения/редактирования были сделаны?
Или в этом всё таки есть + к быстродействию?

ziggi
07.09.2016, 02:42
Я так понял эти манёвры в коде для удобного чтения/редактирования были сделаны?
Или в этом всё таки есть + к быстродействию?

Цель была одна - упростить написание диалогов и расположение их по разным файлам, в стиле zcmd. Плюс к быстродействию возможен при большом количестве диалогов, но я это не тестировал и не собираюсь.

P.S. Скоро создам отдельную тему для этой библиотеки.

DeimoS
15.12.2016, 08:23
Может стоит на sVar перевести?

ziggi
15.12.2016, 08:56
Может стоит на sVar перевести?

Версия 1.0 - на SVar, можно использовать её (правда язык глобальный, не по игрокам). Но:
- SVar значительно медленнее GVar
- SVar имеет ограничение в 2000 штук (в GVar ограничения нет)
- В SVar нельзя добавить дополнительный ключ для переменной как в GVar, что при создании языковой системы по игрокам, значительно просадит производительность

Раньше ещё была версия на property - тот же SVar, только медленнее. Ускорить систему можно разве что изменением строковых ключей на целочисленные, но тогда будет сильная потеря в удобстве. Но, в любом случае, это значительно быстрее y_languages и других подобных библиотек.

Витёк
04.01.2017, 03:27
у меня почему-то при подключение выдаёт ошибку

zlang.inc(917) : error 017: undefined symbol "SERVER_VARTYPE_NONE"
(я так понял что ты какой-то параметр забыл дописать или что)

ziggi
04.01.2017, 07:33
у меня почему-то при подключение выдаёт ошибку

zlang.inc(917) : error 017: undefined symbol "SERVER_VARTYPE_NONE"
(я так понял что ты какой-то параметр забыл дописать или что)

Я забыл поменять константу от SVar. Поправил.

Витёк
04.01.2017, 11:39
вопрос а как можно 2 кнопку не действовать?
делал "" она поевляется (и там как я понял еррор) потом добавил в файл

CNOPCA = Ок
CNOPCA2 =
в итоге
https://pp.vk.me/c837127/v837127605/219d0/nHQyJizfzLs.jpg

ziggi
04.01.2017, 13:53
вопрос а как можно 2 кнопку не действовать?
делал "" она поевляется (и там как я понял еррор) потом добавил в файл

CNOPCA = Ок
CNOPCA2 =
в итоге
https://pp.vk.me/c837127/v837127605/219d0/nHQyJizfzLs.jpg

Оставить пустым поле с переменной.


Lang_ShowDialog(playerid, dialogid, style, "CAPTION", "INFO", "CNOPCA", "");

Витёк
04.01.2017, 14:15
Оставить пустым поле с переменной.


Lang_ShowDialog(playerid, dialogid, style, "CAPTION", "INFO", "CNOPCA", "");

я ж говорил тоже самое
https://pp.vk.me/c604817/v604817605/23547/0xUvqEvnL3M.jpg

Lang_ShowDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "DIALOG_NAME", "COMMANDS_LIST", "CNOPCA","");

ziggi
04.01.2017, 19:14
я ж говорил тоже самое
https://pp.vk.me/c604817/v604817605/23547/0xUvqEvnL3M.jpg

Lang_ShowDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "DIALOG_NAME", "COMMANDS_LIST", "CNOPCA","");

Поправил.

Витёк
05.01.2017, 05:38
Поправил.

найду ещё баги отпишусь
очень нужный include твой для сервера :good:

ziggi
25.11.2017, 19:03
zlang v3.3.0

- Поддержка переменных
- Исправлено определение разделителя с ключами, содержащими пробел
- Добавлены функции для TextDraw игрока

Переменные
Вы можете использовать переменные в ваших текстовых файлах. Это поддерживает любой уровень вложенности.


HELLO_MSG = Hello
COLOR_RED = {FF0000}
COLOR_GREEN = {00FF00}
COLOR_WHITE = {FFFFFF}
NAME_ONE = \v(COLOR_RED)Alex\v(COLOR_WHITE)
NAME_TWO = \v(COLOR_GREEN)Peter\v(COLOR_WHITE)
MESSAGE_HELLO = \v(COLOR_WHITE)\v(HELLO_MSG) \v(NAME_ONE) and \v(NAME_TWO)


Ключи

Теперь строки можно использовать как ключи:


if (strcmp(cmdtext, "/help330", true, 5) == 0) {
Lang_SendText(playerid, "Hello, World!");
Lang_SendText(playerid, "Commands: /help, /en, /ru");
return 1;
}




COLOR_GRAY = {CCCCCC}
LANGUAGE_CHANGED = \v(COLOR_GRAY)Теперь вы используете русский язык.
HELLO_MSG = Привет, {00FF00}Мир!
COMMANDS_LIST = Команды: /help, /en, /ru
# in zlang 3.3.0
Hello, World! = \v(HELLO_MSG)
Commands: /help, /en, /ru = \v(COMMANDS_LIST)

Batya_Montes
02.01.2018, 11:47
почему-то не хочет отображаться длинный текст:

DIALOG_REGISTER_PASSWORD_INFO = \v(COLOR_WHITE)\v(FIRST_WELCOME_MESSAGE)\n\v(COLOR_WHITE)Для начала игры на сервере необходимо зарегистрироваться\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз, когда вы заходите на сервер\n\n

SERVER_GLOBAL_COLOR = {9ACD32}
SERVER_NAME = \v(SERVER_GLOBAL_COLOR)SERVER_NAME
FIRST_WELCOME_MESSAGE = Добро пожаловать на сервер \v(SERVER_NAME)
COLOR_WHITE = {FFFFFF}

отображается только все что до этой части: Введите пароль д (включая), а дальше уже нет

используется в связке с mdialog

ziggi
02.01.2018, 12:05
почему-то не хочет отображаться длинный текст:

DIALOG_REGISTER_PASSWORD_INFO = \v(COLOR_WHITE)\v(FIRST_WELCOME_MESSAGE)\n\v(COLOR_WHITE)Для начала игры на сервере необходимо зарегистрироваться\n\nВведите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз, когда вы заходите на сервер\n\n

SERVER_GLOBAL_COLOR = {9ACD32}
SERVER_NAME = \v(SERVER_GLOBAL_COLOR)SERVER_NAME
FIRST_WELCOME_MESSAGE = Добро пожаловать на сервер \v(SERVER_NAME)
COLOR_WHITE = {FFFFFF}

отображается только все что до этой части: Введите пароль д (включая), а дальше уже нет

используется в связке с mdialog

Потому что размер MAX_LANG_VALUE_STRING по умолчанию равен 144, можешь увеличить его так:


#define MAX_LANG_VALUE_STRING 512
#include <zlang>

или можешь разбить строку так:

DIALOG_REGISTER_PASSWORD_INFO_0 = \v(COLOR_WHITE)\v(FIRST_WELCOME_MESSAGE)\n\v(COLOR_WHITE)Для начала игры на сервере необходимо зарегистрироваться\n\n
DIALOG_REGISTER_PASSWORD_INFO_1 = Введите пароль для вашего аккаунта\nОн будет запрашиваться каждый раз, когда вы заходите на сервер\n\n
использовать также, как и использовал, строка автоматически склеится.

DeimoS
21.03.2018, 12:29
Языковая функция print с языком по умолчанию
Lang_print(var[], {Float, _}:...)

{Float, _}:... тут лишним будет

Daniel_Cortez
21.03.2018, 20:18
Ещё один ляп, связанный с автозаменой:
http://ihost.pro-pawn.ru/image.php?di=G7R1

Впрочем, здорово видеть, что люди здесь не безразличны к оформлению тем.

ziggi
21.03.2018, 22:42
Ещё один ляп, связанный с автозаменой:
http://ihost.pro-pawn.ru/image.php?di=G7R1

Впрочем, здорово видеть, что люди здесь не безразличны к оформлению тем.


{Float, _}:... тут лишним будет

Всё поправил, спасибо.

Mopok
13.01.2019, 12:12
Реально ли использовать данную вещь с плагином YSF и дополнением fixes.inc?

Nexius_Tailer
13.01.2019, 20:30
А почему нет?

Mopok
14.01.2019, 11:45
Да, протестил еще раз, данная приблуда не работает с плагином jit. Если не прав, поправьте будьте добры. С остальными плагинами у меня работает. Покамест отдаю предпочтение оставить плагин jit, ибо скорость в приоритете )

Daniel_Cortez
14.01.2019, 16:44
Покамест отдаю предпочтение оставить плагин jit, ибо скорость в приоритете )
Едва ли вы сами заметите прирост производительности от JIT, больше времени потеряете на разработку своей системы (или просто кучки костылей) для мультиязычности. Вообще JIT много с чем несовместим - к примеру раньше многие зарубежные скриптеры обходили этот плагин стороной, потому что он был несовместим с хаками из YSI (кто бы мог подумать, что хаки, оказывается, ненадёжны и их придётся переделывать под новую ВМ?)

Mopok
14.01.2019, 21:33
Время на разработку и так уходит много, главное же результат) Пока вот не встречал активного популярного интернационального мультиязычного проекта (как много прилагательных), даже неизвестно нужно ли такое, и могу ли я выступить в роли создателя такого мода тоже еще сомнительно, конечно, хоть и были мысли как-то...)