Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Мультиязычность [ALL]

Статус
В этой теме нельзя размещать новые ответы.

Thule

Умник
Мультиязычность для сервера​
​

Уровень сложности: средний​

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

Выход есть - мультиязычность! С помощью неё можно реализовать на сервер одновременный перевод на два языка (можно больше).

Делать это по принципу:
PHP:
if(PlayerLang[playerid] == 0) SendClientMessage(playerid,-1,"Русский");
else SendClientMessage(playerid,-1,"English");
как минимум глупо. Это очень трудоемкий процесс, да и редактирование такого кода осложняется.
Вопросом двойного языка я занялся пару месяцев назад. Тогда я вступил в проект по созданию зомби-сервера. Как сделать удобную систему перевода, в плане кода, я придумал быстро, но тем не менее, это оставался долгий процесс. Проект распался. А вот пару дней назад мне вспомнились попытки подружиться с западом, поэтому я вернулся к старой затее. Проекта у меня нет, поэтому поделиться полученным опытом я решил с широкой публикой.

Теория:
Проще всего помещать текст в глобальные массивы:
PHP:
new text[2][] = {
{"Привет, мир!"},
{"Hello world!"}
};
после чего выводить их содержимое где-то:
PHP:
SendClientMessage(playerid,-1,text[PlayerLang[playerid]]
Я думаю вы поняли, что в переменной PlayerLang[playerid] храниться выбранный язык какого-то игрока. Допустим если там был 0, то будет показан текст "Привет, мир!".

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

Решение (отсюда начинается урок):
Для облегчения работы с проектом перевода я создал программу. Она позволяет автоматизировать многие действия и что самое важное: вы можете предоставить заняться переводом на другой язык совершенно непонимающего в павн человека.

1 - поле для текста под ID 0.
2 - поле для текста под ID 1.
3 - список текущих массивов-перевода.
4 - название массива (не вводите туда русские или спец. символы!)

Первым делом, создайте необходимые "переводы". Сделать это просто: жмите кнопку "Добавить" (над списком), введите имя массива, добавьте русский и английский текст. Не забудьте сохранить созданный проект с помощью "Файл -> Сохранить как...".
Выберите папку include вашего сервера, для сохранения проекта.

Второй пункт: заходим в pwn файл вашего сервера и добавляем инклуд:
PHP:
#include "../include/название.inc"
Третий пункт:: создаем глобальный массив PlayerLang[MAX_PLAYERS];
Или можно включить переменную в enum pInfo, например, но не забудьте подкорректировать 4й пункт.

Четвертый пункт: создадим макрос, для упрощения себе жизни:
PHP:
#define L(%0,%1) %1[PlayerLang[%0]]
Или, если вы всегда при работе с ID игроков используете переменную playerid, то можно упростить:
PHP:
#define L(%0) %0[PlayerLang[playerid]]
Как использовать:
PHP:
SendClientMessage(playerid,-1,L(playerid,HelloWorld));
Где HelloWorld название массива.
Готово! Все для двойного перевода сервера есть. Вам осталось только изучить английский :bs: или найти знающего человека.





PHP:
#include <a_samp>
#include "../include/lang.inc"

new PlayerLang[MAX_PLAYERS];

#define L(%0,%1) %1[PlayerLang[%0]]

main()
{
	print("hh");
}

public OnGameModeInit()
{
	SetGameModeText("LANG!");
	AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
	return 1;
}

public OnPlayerConnect(playerid)
{
	ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Select language:","{FFFFFF}","Русский","Английский");
	return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == 1)
	{
	    PlayerLang[playerid] = !response;
		ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,L(playerid,EnterTitle),L(playerid,EnterMsg),"X","");
	}
	return 1;
}

Скачать программу:
Вирус тотал:
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу