Don't Starve вики
Advertisement
Don't Starve вики
2144
страницы

Нативная поддержка русского языка подразумевает, что мод не нужно никак настраивать. Он сам определяет наличие русификации в игре и тоже переводит свои названия на русский.

Ключевые моменты для копипаста в свой мод[]

  • Для 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.

Advertisement