Don't Starve вики
Регистрация
Advertisement
Don't Starve вики

Гайд для мододелов.
О том, как включить поддержку русского языка в своём моде (для DS, не для DST).

Введение[]

Представьте, вот, вы устанавливаете новый мод. Входите в игру, а мод уже русифицирован. Сюрприз! Круто, да? Сразу чувствуется качество, подход автора мода к своему творению с душой, со всей аккуратностью. А еще чувствуется что-то родное, русское, - наш человек делал! Возможно, это гордость за земляков и их способности... :)

Со стороны пользователя - подписался на мод, а он уже на русском. Здорово! Не так ли?

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

Как же сделать такую магию?

Для DST инструкция здесь:
Руководства/Нативная_поддержка_русского_в_модах_для_DST

Russian Language Pack[]

Модификация Russian Language Pack (далее RLP) является на данный момент основным языковым пакетом для Голодайки. Поэтому всё, что нам нужно для определения, нужен ли перевод на русский - обнаружить наличие RLP. Если этот мод включен и активирован, то мы имеем дело с русскоязычным игроком. Причем, это не просто русский игрок, а человек, предпочитающий русский язык английскому! Это важно, т.к. некоторые любят играть на английском. Таким образом, мы не прогадаем, включив режим русского, если RLP задействован.

Как определить наличие RLP и тот факт, что он включён?
Вот простой код для копипаста:

--Проверяем наличие русификатора.
_G=GLOBAL
RegisterRussianName=_G.rawget(_G,"RegisterRussianName")

--Переводим.
if RegisterRussianName then
end

Уже можно копипастить к себе!!!

Все дальнейшие действия по переводу нужно делать внутри блока "if-then-end".

Небольшой нюанс[]

В RLP приоритет равен единице, поэтому вам желательно указать приоритет вашего мода меньше этого значения. По умолчанию он равен нулю, так что если вы не в курсе, что это, можно не заморачиваться. Если по каким-то причинам вам важен высокий приоритет (больше 1), то придётся всю работу по переводу перенести в какой-нибудь AddGamePostInit.

Кодировка файлов[]

Здесь всё проще. Вам достаточно соблюдать лишь простое правило:
все файлы мода должны быть в кодировке windows-1251. В первую очередь, конечно же, - modmain.lua

Независимо от платформы, RLP использует свои собственные шрифты. Символы русского алфавита хранятся в однобайтовом виде в кодировке windows-1251 по принципу: один байт — один символ. Именно в таком виде эти данные передаются в игровые функции вывода на экран. Игра берёт символ — байт от 0 до 255, смотрит таблицу графических букв, и подставляет соответствующую букву.

В последней версии игры разработчики, вроде, сделали нативную поддержку windows-1251 и кодирования символов выше 255. Но в игровых шрифтах на данный момент нет дополнительных символов вне диапазона 0-255. Хотя в Don't Starve Together (DST) уже давно есть полноценная поддержка UTF-8.

Реализация[]

Самый простой способ - хранить все игровые названия, фразы и реплики в modmain.lua:

if RegisterRussianName then
  GLOBAL.STRINGS.NAMES.MYITEM = "Мой предмет"
  GLOBAL.STRINGS.NAMES.ANOTHERITEM = "Другой предмет"
else
  GLOBAL.STRINGS.NAMES.MYITEM = "My Item"
  GLOBAL.STRINGS.NAMES.ANOTHERITEM = "Another Item"
end

Более правильный способ - перенести все строки в отдельный файл. Например, mod_strings.lua, тогда перевод пусть будет в файле mod_strings_rus.lua:

if RegisterRussianName then
  require "mos_strings_rus"
else
  require "mod_strings"
end

Ни в коем случае не располагайте названия в префаб-файлах мода! Это создает дополнительные сложности тем, кто, возможно, однажды захочет перевести ваш мод на свой родной язык (к примеру, китайский или португальский). Сами строки перевода включайте в глобальную таблицу STRINGS - это хороший, джентльменский тон.


Падежи и склонения[]

Эта проблема на первый взгляд незаметна. Тем не менее, она есть. В коде игры есть различные приставки вида "Идти к", "Осмотреть", "Активировать", "Съесть" и т.д. На английском проблем с этим нет, но на русском это будет выглядеть примерно так: "съесть тыква" (вместо "съесть тыкву").

RLP подменяет некоторые игровые функции и пытается многое делать автоматически. Чтобы проверить, как это работает, наберите в консоли: testname("тыква"). Учтите, эта функция не учитывает исключения, а они есть. В вашем переводе тоже могут быть необычные названия, которые не получится склонять автоматически. Их нужно будет добавить в таблицу исключений русификатора.

Поэтому сразу предлагаю решение:

--Примеры:
if RegisterRussianName then

  RegisterRussianName("MYITEM","Мой предмет","he")
  -- Автоматически склоняется корректно.
  -- Пол указывать не обязательно, т.к. он мужской (he) по умолчанию.
  -- Для отличных от мужского или одушевленных, пол нужен обязавтельно,
  -- иначе они все будут "влажный", "скользкий" и т.д.

  RegisterRussianName("ANOTHERITEM","Другая вещь","she","Другой вещи","Другую вещь")
  -- Пол обязательно указываем.
  -- И все склонения.
  -- Иначе будет: идти к другой вещь

  RegisterRussianName("COFFEE","Кофе","he","Кофе","Кофе")
  -- Иначе будет: Идти к кофю

  RegisterRussianName("JOHN","Джон","he2","Джону","Джона",true)
  -- Иначе будет: Осмотреть джон (без 'а' и с маленькой буквы)

end

Функция RegisterRussianName добавляет перевод объекта в таблицу исключений русификатора. Она уже включена в RLP и доступна для использования.

Краткая документация по ней:
RegisterRussianName(key, val, gender, walk_to, default_act, capped)

  • key - Ключ объекта. Например, MYITEM (из GLOBAL.STRINGS.NAMES.MYITEM).
  • val - Русский перевод названия объекта (первое слово - с большой буквы).
  • gender - Пол объекта. Варианты: he, he2, she, it, plural, plural2. Род нужен для склонения префиксов жары и влажности. "he" и "he2" - это мужской род, но не одно и то же, сравните: изучить влажный курган слизнепах (he), но изучить влажного паука (he2). "plural2" - одушевлённое во множественном числе (например, слово "Чайки", "Слоны" и т.д.).
  • walk_to - Склонение при подстановке во фразу "Идти к". Лучше писать с большой буквы, а имена собственные - обязательно с большой.
  • default_act - Аналогично при подстановке во фразу "Осмотреть" (кого? что?). Это применяется ко всем остальным действиям в игре.
  • capped - Нужно ли писать имя с большой буквы. Маленькая буква в названии не станет большой. Но если не указать true, то большая станет маленькой. Особенно это касается аббревиатур: СССР превратится в сССР, а ТАРДИС - в тАРДИС и т.д.
  • В DST добавлен еще один параметр killed_by (убит кем? чем?), но функция обратно-совместима с DS, так что всё в порядке.

Помните, что этой функцией можно пользоваться, только если RLP включён. Её лучше располагать в файле перевода (или блоке перевода), который сработает только после проверки на наличие RLP. То есть в блоке, который начинается с "if RegisterRussianName then" (см. пример выше).

Как вы понимаете, это интеграция с RLP. Поэтому избавлю вас от деталей. Просто пользуйтесь. Спасибо Some1 за сам русификатор и помощь в создании API!

Этика[]

Прежде всего, желательно не мешать энтузиастам переводить ваш мод. Это может быть не обязательно русский язык, а, например, французский или немецкий. Для этого необходимо соблюдать пару простых правил вежливости:

  1. Все языковые константы хранить в структуре STRINGS
  2. Инициализацию этой структуры делать в файле modmain.lua

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

--склоняет существительное за числительным
function StringTime(n,s)
    local pl_type=n%10==1 and n%100~=11 and 1 or(n%10>=2 and n%10<=4
        and(n%100<10 or n%100>=20)and 2 or 3)
    if s=="дней" then
        local days = {"день","дня","дней"}
        return n.." "..days[pl_type]
    else
        return n.." "..s
    end
end

--пример:
local test_str = "22 "..StringTime(22,"дней") --получится 22 дня

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

Вариант для ленивых[]

Присылаете мне все ключи и перевод на русский - и я добавляю их в свой переводчик модов.

Но еще раз прошу: не инициализируйте никаких STRINGS в префаб файлах мода!
Также избегайте включений голых строк в код функций мода - это делает перевод почти полностью невозможным. Детали обсудим лично, если что-то будет не ясно.

Вместо заключения[]

Товарищи, поддержим отечественного потребителя!
Чтобы у него всё работало "из коробки".

Я считаю это просто хорошим тоном, когда всё работает, как и должно. Без лишнего шаманства с файлами. Так давайте же делать свои моды качественно! Спасибо за внимание и понимание.

Advertisement