Как делать мультиязычные переводы для плагинов.
Fasendas :: ИГРОСТРОЙ :: Сервера Left 4 Dead 1/2 :: Особенности программирования скриптов (краткий справочник)
Страница 1 из 1
Как делать мультиязычные переводы для плагинов.
КАК СДЕЛАТЬ ПЛАГИН НА 2 И БОЛЬШЕ МОВЫ? (от Den Marko)
И так приступим к изучению.
создаем файл содержавший перевод, назовем например "hello.phrases.txt"
и так формат файла:
"Phrases"
{
"hello"
{
"en" "Hello"
"ru" "Привет"
}
}
использование в плагине:
public OnPluginStart()
{
LoadTranslations("название файла который содержит перевод"); //подзагружаем перевод
}
используем перевод в коде
decl String:buffer[128];
PrintToChat(client, "[SourceMod] %t", "hello");
Format(buffer, sizeof(buffer), "[SourceMod] %T", "hello", LANG_SERVER /*или*/ client/*но я передпочитаю client так как перевод будет точнее*/);
PrintToChat(client, buffer);
И так приступим к изучению.
создаем файл содержавший перевод, назовем например "hello.phrases.txt"
и так формат файла:
"Phrases"
{
"hello"
{
"en" "Hello"
"ru" "Привет"
}
}
использование в плагине:
public OnPluginStart()
{
LoadTranslations("название файла который содержит перевод"); //подзагружаем перевод
}
используем перевод в коде
decl String:buffer[128];
PrintToChat(client, "[SourceMod] %t", "hello");
Format(buffer, sizeof(buffer), "[SourceMod] %T", "hello", LANG_SERVER /*или*/ client/*но я передпочитаю client так как перевод будет точнее*/);
PrintToChat(client, buffer);
Re: Как делать мультиязычные переводы для плагинов.
Даю более точные пояснения.
В папке транслитов "translations", для вашего плагина должен быть файл с переводами с нужным расширением (пример: "(Название вашего файла переводов).phrases.txt" ). У каждого варианта перевода, должен быть предваряющий языковой тег, как в данном примере:
"Phrases" // Необходимое оглавление определения языкового файла
{
"hello" // Это пример оригинального слова / фразы
{
"en" "Hello" // Это на английском (тег "en")
"ru" "Привет" // Это на русском (тег "ru")
}
}
В самом плагине, там где должен выводится текст, в данном случае вариант перевода, стоит спец.символ вывода транслита "%T" или "%t".
Сам спец.символ имеет для такого случая специфическую букву "t", что косвенно указывает на его происхождение от слова "translation" (то бишь, "перевод").
PrintToChat(client, "%t", "hello");
// Здесь клиенту выводиться инфа из файла транслита, по примеру оригинального слова "hello".
Т.е. в файле транслита ищется соответствие с этим словом (см. пример файла транслита выше), и согласно региональной принадлежности клиента выводится перевод на его языке.
Если региональная принадлежность клиента не выявлена, то инфа будет выводится в оригинальном варианте, т.е., в данном случае, по английски.
Этот спец символ так же подразумевает использование текстовой информации, как и спец символ "%s" (от англ. "simbol") но по умолчанию берет данные из файла транслита, который подключается следующим образом (как и указано в примере Den Marko):
public OnPluginStart()
{
LoadTranslations("название файла который содержит перевод"); //подзагружаем перевод
}
Далее идет более сложный вариант представления вывода инфы в переводе:
Format(buffer, sizeof(buffer), "%T", "hello", LANG_SERVER /*или*/ client/*но я передпочитаю client так как перевод будет точнее*/);
// С помощью команды "Format" , мы можем внести строковые данные в переменную "bufer", которая должна быть заранее объявлена методом декларирования:
decl String:buffer[128];
далее идет цепь синтактических вложений:
(buffer, sizeof(buffer), "%T", "hello", LANG_SERVER);
// В переменную "bufer" , с вычислением ее размера "sizeof(buffer)", вносится перевод с помощью спец.символа "%T" , примером перевода служит слово в оригинальном написании "hello". Далее мы даем команду вывода движку "LANG_SERVER", точнее это скорее некая коррекция, своеобразная подсказка, каким образом вывод нужно ориентировать. В данном случае, как можно видеть - LANG, это означает принадлежность к транслиту (от англ. Language), и SERVER - принадлежность к серверной части исполнения.
или
(buffer, sizeof(buffer), "%T", "hello", client);
Что собственно все то же самое, но вместо "LANG_SERVER", используются данные конкретного клиента "client". Как и подсказал Den Marko, в данном случает, перевод находится более точнее, на самом деле используется региональная принадлежность клиента напрямую, и по ней сразу выбирается языковой вариант перевода, в ином случае используется оригинал представления, в данном случае, англоязычный вариант.
Надеюсь я достаточно ясно и подробно описал все особенности использования транслита в работе с плагином на примере приведенном Den Marko
В папке транслитов "translations", для вашего плагина должен быть файл с переводами с нужным расширением (пример: "(Название вашего файла переводов).phrases.txt" ). У каждого варианта перевода, должен быть предваряющий языковой тег, как в данном примере:
"Phrases" // Необходимое оглавление определения языкового файла
{
"hello" // Это пример оригинального слова / фразы
{
"en" "Hello" // Это на английском (тег "en")
"ru" "Привет" // Это на русском (тег "ru")
}
}
В самом плагине, там где должен выводится текст, в данном случае вариант перевода, стоит спец.символ вывода транслита "%T" или "%t".
Сам спец.символ имеет для такого случая специфическую букву "t", что косвенно указывает на его происхождение от слова "translation" (то бишь, "перевод").
PrintToChat(client, "%t", "hello");
// Здесь клиенту выводиться инфа из файла транслита, по примеру оригинального слова "hello".
Т.е. в файле транслита ищется соответствие с этим словом (см. пример файла транслита выше), и согласно региональной принадлежности клиента выводится перевод на его языке.
Если региональная принадлежность клиента не выявлена, то инфа будет выводится в оригинальном варианте, т.е., в данном случае, по английски.
Этот спец символ так же подразумевает использование текстовой информации, как и спец символ "%s" (от англ. "simbol") но по умолчанию берет данные из файла транслита, который подключается следующим образом (как и указано в примере Den Marko):
public OnPluginStart()
{
LoadTranslations("название файла который содержит перевод"); //подзагружаем перевод
}
Далее идет более сложный вариант представления вывода инфы в переводе:
Format(buffer, sizeof(buffer), "%T", "hello", LANG_SERVER /*или*/ client/*но я передпочитаю client так как перевод будет точнее*/);
// С помощью команды "Format" , мы можем внести строковые данные в переменную "bufer", которая должна быть заранее объявлена методом декларирования:
decl String:buffer[128];
далее идет цепь синтактических вложений:
(buffer, sizeof(buffer), "%T", "hello", LANG_SERVER);
// В переменную "bufer" , с вычислением ее размера "sizeof(buffer)", вносится перевод с помощью спец.символа "%T" , примером перевода служит слово в оригинальном написании "hello". Далее мы даем команду вывода движку "LANG_SERVER", точнее это скорее некая коррекция, своеобразная подсказка, каким образом вывод нужно ориентировать. В данном случае, как можно видеть - LANG, это означает принадлежность к транслиту (от англ. Language), и SERVER - принадлежность к серверной части исполнения.
или
(buffer, sizeof(buffer), "%T", "hello", client);
Что собственно все то же самое, но вместо "LANG_SERVER", используются данные конкретного клиента "client". Как и подсказал Den Marko, в данном случает, перевод находится более точнее, на самом деле используется региональная принадлежность клиента напрямую, и по ней сразу выбирается языковой вариант перевода, в ином случае используется оригинал представления, в данном случае, англоязычный вариант.
Надеюсь я достаточно ясно и подробно описал все особенности использования транслита в работе с плагином на примере приведенном Den Marko
Fasendas :: ИГРОСТРОЙ :: Сервера Left 4 Dead 1/2 :: Особенности программирования скриптов (краткий справочник)
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|
Пт Май 08, 2020 6:18 pm автор Gedifilyte
» Создание точки появления противников (Устаревшее)
Сб Дек 14, 2019 2:34 am автор Gedifilyte
» Создание инвентаря (устаревшее)
Пт Апр 13, 2018 7:43 pm автор Eris
» Программное создание Mesh
Пн Фев 05, 2018 12:05 am автор Eris
» Помогите !!! (вопросы, советы, обсуждения)
Вт Июн 06, 2017 11:39 am автор Zhuravlev Yuri
» Редакторы карт и ресурсов
Ср Май 24, 2017 10:23 pm автор Чумной Доктор
» Создание "Игрового типа" (GameType)
Ср Апр 05, 2017 2:19 am автор Filat
» Экспорт из 3ds Max
Сб Мар 11, 2017 12:22 pm автор Uggo
» Создание "Выбор персонажа"
Сб Фев 25, 2017 11:32 am автор Filat