Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Мультиязычность в плагине. Перевод (.phrases.txt).
_wS_ Дата: Среда, 29.02.2012, 12:18:53 | Сообщение # 1
Использовать мультиязычность разумно, так как на сервере могут играть люди из самых разных стран. Такие файлы расположены в addons/sourcemod/translations/ и имеют расширение .phrases.txt. Само имя файла (перед расширением) вы придумываете любое, но удобнее, чтобы оно соответствовало названию вашего скрипта.

Файл имеет такую структуру и кодировку UTF-8 без BOM:

Код
"Phrases"
{
     "ваша_фраза"
     {
         "ru" "Привет"
         "en" "Hello"
     }
     "welcome"
     {
         "#format" "{1:s}"
         "ru" "Добро пожаловать, {1}"
         "en" "Welcome, {1}"
     }
}


Если имя файла xz.phrases.txt, то пробуем скрипт:

Код
#include <sourcemod>

public OnPluginStart()
{
     LoadTranslations("xz.phrases");
}

public OnClientPutInServer(i)
{
     decl String:Name[MAX_NAME_LENGTH];
     GetClientName(i, Name, MAX_NAME_LENGTH);
     PrintToChat(i, "%t", "welcome", Name);
}


Чтобы проверить работает ли мультиязычность, меняйте cl_language в консоле игры на нужный вам язык, например russian, english, и перезаходите на сервер. Если в вашем файле нет языка игрока, то он будет видеть тот язык, который используется сервером по умолчанию, а это вы можете настроить в addons/sourcemod/configs/core.cfg ("ServerLang" "en" - стоит английский).

Все языки прописаны в addons/sourcemod/configs/languages.cfg. Если какого-то языка нет в списке, то вы не сможете его использовать для перевода. Если вы изменили файл перевода (Phrases), то нужно сменить карту чтобы изменения вступили в силу, вроде даже перезапуск скрипта не поможет, а только смена карты.

#format - это значит, что в строке будут использованы переменные. s - стока, d/i - целое число, f - число с точкой и тд. Если их несколько, то перечисляйте через запятую.

Код
"#format" "{1:s},{2:d},{3:f}"
"ru" "А тут пишете в нужных местах {1} {2} и {3}"


В скрипте вы должны передавать переменные в соответствующем порядке:

Цитата
PrintToChatAll("%t", "fraza", "stroka", 5, 2.0);

stroka = {1:s}
5 = {2:d}
2.0 = {3:f}


%t - используйте лишь тогда, когда сообщение отправляется для игрока, такое как PrintToChat, PrintHintText и т.д. Но если, например, вы добавляете строку в меню, то там уже надо использовать символ %T и после фразы указать индекс игрока, для определения языка. Если использовать пример выше и у нас есть индекс клиента i, то это будет выглядеть так:

Код
decl String:StR[100];
Format(StR, sizeof(StR), "%T", "fraza", i, "stroka", 5, 2.0);
AddMenuItem(Handle:menu, StR);


Т.е. все то же самое, только символ %T и индекс игрока после фразы.
 
Geny Дата: Понедельник, 27.01.2014, 20:35:28 | Сообщение # 2
Сообщений: 110
Репутация: 0 [ +/- ]
Дайте более наглядный пример для меню... Прмер в коде и пример в Переводе.

+ SetMenuTitle(menu, "ялялялл:\n \n"); - как тут быть?
 
TEIN Дата: Вторник, 28.01.2014, 11:10:34 | Сообщение # 3
Сообщений: 563
Репутация: 78 [ +/- ]
Цитата _wS_ ()
decl String:StR[100];
Format(StR, sizeof(StR), "%T", "fraza", i, "stroka", 5, 2.0);
AddMenuItem(Handle:menu, StR);

Т.е. все то же самое, только символ %T и индекс игрока после фразы.

Аналогично с SetMenuTitle
 
Geny Дата: Вторник, 28.01.2014, 14:12:00 | Сообщение # 4
Сообщений: 110
Репутация: 0 [ +/- ]
ты себя нормально чувствуешь? Перечитай что я просил и что ты написал..

Прмер в коде и пример в Переводе.


Сообщение отредактировал Geny - Вторник, 28.01.2014, 14:12:37
 
TEIN Дата: Вторник, 28.01.2014, 14:39:22 | Сообщение # 5
Сообщений: 563
Репутация: 78 [ +/- ]
маразм, ну жди, жди
 
Geny Дата: Четверг, 30.01.2014, 15:16:19 | Сообщение # 6
Сообщений: 110
Репутация: 0 [ +/- ]
Код
   decl String:StR[100];  
   Format(StR, sizeof(StR), "%T", "stroka", client);   
       AddMenuItem(menu, "1" StR);


Не пашит! Напишите по человечески код который подойдет под вот такой перевод

Код
    "stroka"
  {
   "ru"   "ЛЯЛЯЛЛЯ"
  }
 
Darkeneez Дата: Пятница, 31.01.2014, 14:58:34 | Сообщение # 7
Сообщений: 221
Репутация: 18 [ +/- ]
запятую не поставил
 
«SeReGa»☆ Дата: Пятница, 12.06.2015, 07:12:09 | Сообщение # 8
Сообщений: 395
Репутация: 37 [ +/- ]
а какая разница между %t и %T


Сообщение отредактировал «SeReGa»☆ - Пятница, 12.06.2015, 07:13:14
 
TheReal Дата: Пятница, 12.06.2015, 16:15:05 | Сообщение # 9
Сообщений: 72
Репутация: 4 [ +/- ]
Цитата «SeReGa»☆ ()
а какая разница между %t и %T

%t для чата
%T для меню
 
«SeReGa»☆ Дата: Пятница, 12.06.2015, 19:37:24 | Сообщение # 10
Сообщений: 395
Репутация: 37 [ +/- ]
Цитата TheReal ()
%t для чата
%T для меню

лигично, думаю легче было ответить ответом <ПОТОМУ ЧТО....>



Сообщение отредактировал «SeReGa»☆ - Пятница, 12.06.2015, 19:40:26
 
Sallcom Дата: Пятница, 12.06.2015, 21:01:36 | Сообщение # 11
Сообщений: 205
Репутация: 31 [ +/- ]
Цитата TheReal ()
%t для чата
%T для меню

%T - язык игрока
%t - язык сервера
 
_R1KO_ Дата: Пятница, 12.06.2015, 21:35:16 | Сообщение # 12
Сообщений: 200
Репутация: 30 [ +/- ]
Цитата Sallcom ()
%T - язык игрока %t - язык сервера

вообще не то))

Ладно, так и быть. Поясню.

%t Мы используем только когда отправляем сообщение функцией, которая имеет индекс игрока.
Например PrintToChat, hint и т.д. Но это относиться и к PrintToChatAll, т.к. это тот же PrintToChat но в цикле.
Почему так?
Есть ф-я https://sm.alliedmods.net/api/index.php?fastload=show&id=151&
Она устаналивает для какого игрока сейчас будет идти форматирование.
В PrintToChat сделано так:
Код
SetGlobalTransTarget(i);
VFormat(buffer, sizeof(buffer), format, 2);
PrintToChat(i, buffer);

(Конечно же это написано на c++ но дабы было понятней пишу на павне)
В PrintToChatAll так же но в цикле.
Синтаксис: PrintToChat(client, const String:format[], any:...);
Тоесть он понимает что текст выводится игроку client и форматировать текст нужно под него.

%T Используется когда нужно форматировать текст для ф-и нет имеющей доступа к индексу игрока.
Например в меню
Поэтому при использовании %T необходимо 2-м аргументом передавать индекс игрока (1-й нас фраза в переводе)
Например
Код
Format(text, 64, "%T", "фраза_в_переводе", client);


Но можно сделать и так:

Код
SetGlobalTransTarget(client);
Format(text, 64, "%t", "фраза_в_переводе")
 
Vitaminoz Дата: Понедельник, 23.11.2015, 17:38:40 | Сообщение # 13
Сообщений: 141
Репутация: 1 [ +/- ]
Есть код:
Код
char panel_items[64];
     Panel c_panel = new Panel();
     FormatEx(panel_items, sizeof(panel_items), "%T", "Control Title", client, "%T", bot_name, client);
     c_panel.SetTitle(panel_items);
     FormatEx(panel_items, sizeof(panel_items), "%T", "Yes", client);
     c_panel.DrawItem(panel_items);
     FormatEx(panel_items, sizeof(panel_items), "%T", "No", client);
     c_panel.DrawItem(panel_items);
     c_panel.Send(client, Conrol_Option, MENU_TIME_FOREVER);
     delete c_panel;

Никак не могу в панели перевести и фразу и имена ботов (bot_name). По отдельности всё нормально, а так выдаёт %T.
Часть файла перевода:
Код
    "Control Title"
    {
  #format "{1:s}"
  ru "Взять под контроль AI игрока {1}?"
  en "Take control of AI players {1}?"
    }


Сообщение отредактировал Vitaminoz - Понедельник, 23.11.2015, 17:40:08
 
_R1KO_ Дата: Понедельник, 23.11.2015, 18:35:15 | Сообщение # 14
Сообщений: 200
Репутация: 30 [ +/- ]
Vitaminoz, уже ответил, но еще тут отвечу:
Код

"Control Title"
    {
        "#format" "{1:t}" // тут обрати внимание
        "ru" "Взять под контроль AI игрока {1}?"
        "en" "Take control of AI players {1}?"
    }

//  и на все кавычки обрати

FormatEx(panel_items, sizeof(panel_items), "%T", "Control Title", client, bot_name);
 
Vitaminoz Дата: Пятница, 05.08.2016, 01:17:50 | Сообщение # 15
Сообщений: 141
Репутация: 1 [ +/- ]
Всё понял, спасибо! Моя невнимательность

Добавлено (05.08.2016, 01:17:50)
---------------------------------------------
Как в файле перевода правильно поставить знак процента ? Поставил 1-2 знака они не отображаются.

 
  • Страница 1 из 1
  • 1
Поиск: