Нативная поддержка русского языка подразумевает, что мод не нужно никак настраивать. Он сам определяет наличие русификации в игре и тоже переводит свои названия на русский.
Ключевые моменты для копипаста в свой мод[]
- Для modmain.lua
--Проверяем наличие русификатора.
_G=GLOBAL
mods=_G.rawget(_G,"mods")or(function()local m={}_G.rawset(_G,"mods",m)return m end)()
rus=mods.RussianLanguagePack or mods.UniversalTranslator
RegisterRussianName=rus and (rus.SelectedLanguage=="ru")
and (rus.RegisterRussianName or rus.RegisterNameTranslation)
--Переводим.
if RegisterRussianName then
end
- Для modinfo.lua
--Проверяем наличие русификатора.
russian = ("").utf8len and (russian or language == "ru")
- Код выше учитывает будущие изменения.
- Все файлы должны быть в кодировке UTF-8. Внимание, в обычной Don't Starve файлы с русскими строками должны быть по-прежнему в кодировке Windows-1251.
- Русификатор создает глобальную переменную mods. А в ней API функции:
- mods.RussianLanguagePack.RegisterRussianName
- mods.RussianLanguagePack.RegisterRussianPhrase
- mods.RussianLanguagePack.RenameAction
- В файле modinfo.lua доступна переменная language, которая может иметь значение "ru". В этом случае все строки можно сделать на русском. Файл также должен быть в UTF-8.
Как проверить кодировку файла в Notepad++[]
В нижнем правом углу Notepad++ в строке состояния должна быть указана кодировка. Обычно это либо ANSI, либо UTF-8.
Должно быть так: UTF-8 w/o BOM
Если указана отличная кодировка, то файл нужно конвертировать в нужную. Делается это из меню:
Кодировки --> Преобразовать в UTF-8 без BOM.
Затем нажмите "Сохранить".
В Notepad++ есть баг с автоматическим определением кодировки. При наличии русских "Р" кодировка может определиться как "Macintosh" с одновременным искажением текста. Лечится очень просто:
Опции --> Настройки --> Разное --> Снять галку с "Авто-определение кодировки символов"
Желательно это проделать один раз и больше не испытывать проблем с этим блокнотом.
Правила перевода[]
Теперь рассмотрим подробнее, что же происходит в вышеприведенном коде. Ниже даются пояснения в виде комментариев.
Файл с переведенными строками должен быть в кодировке UTF-8 (т.е. файл modmain.lua). Например, добавьте в конец файла modmain.lua следующий код:
--Проверяем наличие русского языка (то есть русификатора).
_G=GLOBAL --Алиас на глоабальное пространство имён.
--Алиас на глобальную переменную mods, либо её создание в случае отсутствия
mods=_G.rawget(_G,"mods")or(function()local m={}_G.rawset(_G,"mods",m)return m end)()
--Алиас на таблицу API функций русификатора
rus = mods.RussianLanguagePack or mods.UniversalTranslator
--Алиас на функцию перевода имён с учётом падежей
RegisterRussianName = rus and (rus.SelectedLanguage=="ru")
and (rus.RegisterRussianName or rus.RegisterNameTranslation)
--Переводим
if rus then --Если игра на русском языке, то
--Здесь наш код перевода с использованием функции RegisterRussianName
end
Код содержит дополнительные, ни к чему не обязывающие проверки, чтобы улучшить совместимость. Так или иначе, разные люди будут использовать разные русифицирующие моды. Данный код старается поддерживать все варианты, в том числе будущие или устаревшие.
Документация к API функциям русификатора содержится в комментариях к этим функциям в самом русификаторе. Найдите файл RLP_support.lua и прочтите, как работает каждая функция. Также можете при желании вникнуть в особенности их реализации на языке lua.
Рекомендуется проверять наличие этих функций всегда перед использованием. В старых версиях их могло не быть, а в будущих опять-таки может не быть (они могут быть переименованы, игнорируя обратную совместимость).
Перевод настроек мода[]
В файл modinfo.lua необходимо добавить строку:
russian = russian or (language == "ru")
Затем для любой строковой константы можно указать два варианта перевода через конструкцию A-and-B-or-C (это аналог A?B:C из Си-подобных языков). Например:
local str = (russian and "Русское название" or "English Name")
Она означает: если выполнено условие A, то использовать B, иначе использовать C. В нашем случае используется русская строка, если переменная russian принимает истинное значение (true).
Готовые примеры перевода модов[]
Wanda (для DST)[]
В modmain.lua перевод включён в виде модуля отдельным файлом:
modimport("russian.lua")
Сам же файл с переводом (russian.lua) имеет кодировку UTF-8 и следующее содержание:
--Native Russian Support.
--Players with "Russian Language Pack" will see Russian names and text.
--Проверяем наличие русификатора.
_G=GLOBAL
mods=_G.rawget(_G,"mods")or(function()local m={}_G.rawset(_G,"mods",m)return m end)()
rus = mods.RussianLanguagePack or mods.UniversalTranslator
mk = rus and (rus.SelectedLanguage == "ru")
and (rus.RegisterRussianName or rus.RegisterNameTranslation)
--Если русификатор обнаружен, то пользуемся шрифтами и средствами, которые он предоставляет.
if mk then
--Создаем алиасы, чтобы было меньше писанины.
local STRINGS = _G.STRINGS
local rec = STRINGS.RECIPE_DESC
--Переводим описание персонажа.
STRINGS.CHARACTER_TITLES.wanda = "Друид Ванда"
--STRINGS.CHARACTER_NAMES.wanda = "wanda" --А вот это переводить не надо.
STRINGS.CHARACTER_DESCRIPTIONS.wanda = "Природные знания.\nЦветочные волосы.\nЭнты ёе ненавидят."
STRINGS.CHARACTER_QUOTES.wanda = "\"Я вынуждена быть с природой\""
--Переводим названия предметов и описания рецептов.
mk("PLANTMEAT_DRIED","Вяленое лиственное мясо",4)
rec.HONEY = "Выдави самостоятельно весь нектар из цветов!"
rec.POOP = "Круг жизни!"
mk("SUMMONLUREPLANTSCROLL","Свиток призыва приманкоцвета",1,0,1)
mk("WANDA_BUSHHAT","Кустошляпа",3)
rec.WANDA_BUSHHAT = "Будь одним целым с природой!"
mk("WANDA_FERTILIZER","Ведро с удобрениями",4)
rec.WANDA_FERTILIZER = "Удобряй эффективно!"
mk("WANDA_FAST_FARMPLOT","Улучшенная грядка",3)
rec.WANDA_FAST_FARMPLOT = "Семена её любят!"
mk("WANDA_PUMPKIN_LANTERN","Светильник Джека",1,0,1)
rec.WANDA_PUMPKIN_LANTERN = "Жуткий свет!"
mk("WANDA_TROWEL","Магический мастерок")
rec.WANDA_TROWEL = "Для всего, что лопата не сможет."
mk("DUG_CACTUS","Кактус")
--Переводим реплики персонажа.
local Desc = rus.RegisterRussianPhrase or mods.RusMods and mods.RusMods.pp
if Desc then
Desc("It's Wanda!","Это Ванда!")
Desc("That Wanda looks shifty...","Эта Ванда выглядит подозрительно...")
--Desc("Murderer!",
Desc("Wanda, friend of ghosts.","Ванда - друг привидений, помогает друзьям.")
Desc("Wanda could use a heart.","Дух Ванды. Ей нужна помощь.")
Desc("Leafy AND Jerky, just the way I like it","Сушёная часть природы, как я и люблю.")
Desc("A bad idea... on theory.","Плохая идея... В теории.")
end
--Переводим название действия.
local RenameAction = rus.RenameAction or mods.RusMods and mods.RusMods.RenameAction
if RenameAction then
RenameAction("SUMMONLUREPLANT", "Призвать приманкоцвет")
end
end
Мод Matches[]
Еще один мод, который переводит сам себя в случае обнаружения русского языка.
Здесь есть небольшая сложность, т.к. название меняется динамически в зависимости от состояния предмета ("Спички" или "Отсыревшие спички"). Но для программиста это не должно стать проблемой.
_G=GLOBAL
s = _G.STRINGS
nm = s.NAMES
nm.MATCHES = "Matches"
s.CHARACTERS.GENERIC.DESCRIBE.MATCHES = "Nice gift for winter."
--Проверяем наличие русификатора.
mods=_G.rawget(_G,"mods")or(function()local m={}_G.rawset(_G,"mods",m)return m end)()
rus = mods.RussianLanguagePack or mods.UniversalTranslator
mk = rus and (rus.SelectedLanguage == "ru")
and (rus.RegisterRussianName or rus.RegisterNameTranslation)
if mk then
--nm.MATCHES = "Спички"
mk("MATCHES","Спички",5)
AddPrefabPostInit("matches",function(inst)
--фикс имени на клиенте
inst.displaynamefn = function()
if inst.damp then
return "Отсыревшие спички"
else
return "Спички"
end
end
end)
--Реплики
local pp = rus.RegisterRussianPhrase or mods.RusMods and mods.RusMods.pp
if pp then --Поддержка реплик
pp("Nice gift for winter.","Замечательный подарок для зимы.")
pp("Now it's useless junk.","Отсырели. Теперь это просто мусор.")
end
--s.CHARACTERS.GENERIC.DESCRIBE.MATCHES = ""
end
Готовые примеры перевода настроек[]
Sprinter Set (для DST)[]
Файл также должен быть в кодировке UTF-8.
name = "Sprinter Set"
russian = name.utf8len and (russian or language == "ru")
version = "0.33"
version_compatible = "0.3"
description = "Adds a running set, that lets you sprint at the huge cost in hunger and some sanity.\nVer "..version
author = "Madman666. Ported to DST by star."
forumthread = ""
api_version = 10
dont_starve_compatible = false
reign_of_giants_compatible = false
dst_compatible = true
all_clients_require_mod = true
client_only_mod = false
icon_atlas = "modicon.xml"
icon = "modicon.tex"
server_filter_tags = {"sprinter"}
priority = 0.00557800575 --unique
local russian = russian or language == "ru"
local too_high = russian and "Слишком большое значение!" or "Too high!!!"
options_rate =
{
{description = "+5%", data = 0.05},
{description = "+10%", data = 0.10},
{description = "+15%", data = 0.15},
{description = "+20%", data = 0.20},
{description = "+25%", data = 0.25},
{description = "+30%", data = 0.30},
{description = "+35%", data = 0.35},
{description = "+40%", data = 0.40},
{description = "+50%", data = 0.50},
{description = "+60%", data = 0.60},
{description = "+70%", data = 0.70},
{description = "+80%", data = 0.80},
{description = "+90%", data = 0.90},
{description = "+100%", data = 1.00},
{description = "+120%", data = 1.20, hover = too_high},
{description = "+150%", data = 1.50, hover = too_high},
{description = "+200%", data = 2.00, hover = too_high},
}
configuration_options =
{
{
name = "hunger_rate",
label = russian and "Штраф голода" or "Hunger Rate",
hover = russian and "При ношении предмета" or "While equipping",
options = options_rate,
default = 0.3,
},
{
name = "hunger_rate_run",
label = russian and "Штраф бега" or "Run Rate",
hover = russian and "Штраф голода во время бега" or "Hunger rate while running",
options = options_rate,
default = 0.3,
},
{
name = "hunger_rate_speed",
label = russian and "Штраф сета" or "Set Rate",
hover = russian and "Дополнительный голод\nпри ношении сета\n(2-3 вещи на скорость)" or "Additional hunger rate\while equipping speed set\n(2-3 items with speed bonus).",
options = options_rate,
default = 1,
},
{
name = "hunger_speen_count",
label = russian and "Сколько вещей в сете" or "Set Count",
hover = russian and "Сколько нужно скоростных\nвещей для создания сета." or "How many speed items\nare required for set.",
options = {
{description = "2", data = 2},
{description = "3", data = 3},
{description = "4", data = 4, hover = russian and "Без дополнительных модов\nне получится собрать сет." or "You need third party mods\nto complete the set."},
},
default = 3,
},
{
name = "craft_mode",
label = russian and "Сложность крафта" or "Craft Mode",
--hover = russian and "Сколько нужно скоростных\nвещей для создания сета." or "How many speed items\nare required for set.",
options = {
{description = russian and "Простая" or "Easy", data = 1, hover = russian and "Повязка:\n5 паутины\n1 красное перо\n1 ветка (заколка)\n\nМайка:\n8 паутины\n1 папирус" or "Sprinter's Headband:\n5 - silk\n1 - feather robin\n1 - twigs (barrette)\n\nSprinter's shirt:\n8 - silk\n1 - papyrus"},
{description = russian and "Обычная" or "Normal", data = 2, hover = russian and "Повязка:\n5 паутины\n2 красных пера\n2 чёрных пера\n\nМайка:\n8 паутины\n1 набор для шитья\n2 папируса" or "Sprinter's Headband:\n5 - silk\n2 - feather robin\n2 - feather crow\n\nSprinter's shirt:\n8 - silk\n1 - sewing kit\n2 - papyrus"},
{description = russian and "Сложная" or "Hard", data = 3, hover = russian and "Повязка:\n5 паутины\n3 красных пера\n3 чёрных пера\n1 зуб гончей (заколка)\n\nМайка:\n10 паутины\n1 набор для шитья\n3 папируса" or "Sprinter's Headband:\n5 - silk\n3 - feather robin\n3 - feather crow\n1 - hounds tooth (barrette)\n\nSprinter's shirt:\n10 - silk\n1 - sewing kit\n3 - papyrus"},
},
default = 2,
},
{
name = "runnerhat_walkspeedmult",
label = russian and "Скорость повязки" or "Speed with Headband",
options = options_rate,
default = 0.1,
},
{
name = "sprinter_shirt_walkspeedmult",
label = russian and "Скорость рубашки" or "Speed with Shirt",
options = options_rate,
default = 0.2,
},
}
Мод Matches[]
name = "Matches"
russian = name.utf8len and (russian or language == "ru")
description = russian and "Спички" or "Matches"
author = "star"
version = "0.07"
version_compatible = "0.03"
forumthread = ""
dont_starve_compatible = false
reign_of_giants_compatible = false
all_clients_require_mod = true
dst_compatible = true
api_version = 10
icon_atlas = "preview.xml"
icon = "preview.tex"
priority = 0.00539045984 --unique
server_filter_tags = {"matches"}
configuration_options =
{
{
name = "to_give",
label = russian and "Выдавать спички" or "Give Matches",
hover = russian and "При первом входе в игру.\nОпция имеет смысл только в режиме Wilderness." or 'Give Matches on create new character.\nOptions makes sense only on Wilderness mode.',
options =
{
{description = russian and "Всегда" or "Always", data = 0},
{description = russian and "Единожды" or "Once", data = 1},
{description = russian and "Дважды" or "Twice", data = 2},
},
default = 0,
},
{
name = "how_many",
label = russian and "Количество спичек" or "The Number of Matches",
--hover = '',
options =
{
{description = russian and "Бесконечно" or "No Limit", data = 0},
{description = "2", data = 2},
{description = "3", data = 3},
{description = "4", data = 4},
{description = "5", data = 5},
{description = "10", data = 10},
{description = "15", data = 15},
{description = "20", data = 20},
{description = "25", data = 25},
{description = "50", data = 50},
{description = "100", data = 100},
},
default = 0,
},
{
name = "craft_torch",
label = russian and "Крафт факела" or "Torch Craft",
hover = russian and "Можно изменить механику факела,\nчтобы спички стали более востребованы." or 'Nerf torch so matches\nwill be more useful.',
options =
{
{description = russian and "Разрешить" or "Allow", data = 0, hover = russian and "Не трогать то, как устроен факел." or "Default.\nWon't change torch recipe."},
{description = russian and "Запретить" or "Forbid", data = 1},
{description = russian and "Сложный" or "Difficult", data = 2, hover = russian and "Верёвка + 2 ветки" or "Rope + 2 twigs"},
{description = russian and "Невозможный" or "Hard", data = 3, hover = russian and "Уголь + папирус + 2 ветки" or "Charcoal + Papyrus + 2 twigs"},
},
default = 0,
},
}
Историческая справка[]
7 декабря 2015 было выпущено обновление для мультиплеера, меняющее способ многоязыковой поддержки для модов. До этого момента в обоих версиях игры использовалась однобайтовая кодировка (Windows-1251). Но потом DST перевели полностью на UTF-8, включая названия серверов, никнеймы, чат и способ ввода. В общем, всё.
Как видно, это сильно повлияло на русификатор. Теперь он вынужден поддерживать UTF-8, в то время как русификатор для DS по-прежнему использует Windows-1251.