RimWorld

RimWorld

Not enough ratings
Как переводить моды RimWorld?
By 【 GUTELBERGN 】
Детальный, но простой гайд по локализации модов из Steam Workshop для RimWorld и дальнейшей публикации как "перевода" в мастерской.
2
   
Award
Favorite
Favorited
Unfavorite
Введение
Этот гайд посвящён тому, как делать переводы модов для RimWorld и выкладывать их в Steam Workshop.
Он рассчитан на новичков и объясняет самые простые и минимальные способы локализации - от копирования файлов до загрузки готового перевода.

Важно: этот гайд не является универсальным решением на все случаи жизни. У каждого мода может быть своя структура и особенности, поэтому где-то придется действовать иначе. Здесь я собрал базовые методы, которые помогут быстро начать переводить и разбираться в процессе.
Раздел 1: Где хранятся файлы модов?
Файлы модов хранятся по пути:
Steam\steamapps\workshop\content\294100

В этой папке находятся все моды, скачанные из Steam Workshop для RimWorld.

Чтобы быстро открыть папку нужного мода:
- Запустите RimWorld;
- Перейдите в меню Моды;
- Выберите нужный мод;
- Нажмите Расширенные настройки;
- Кликните Открыть папку.

После этого откроется директория с оригинальными файлами выбранного мода.

Внутри обязательно будет папка About, а также папки с файлами строк, где хранятся названия предметов, событий, рецептов и других элементов игры.

💡 Примечание: все эти файлы переводятся одинаково, независимо от того, содержат ли они предметы, события или рецепты.
Раздел 2: Как создать свой мод (для перевода)?
Заходим в директорию Rimworld. Сделать это можно через библиотеку Steam:
- Кликаем ПКМ по игре в библиотеке;
- Нажимаем “Свойства”;
- Переходим в “Установленные файлы”;
- Затем “Обзор”

Для корректной работы игры необходимо создать определенные папки и файлы (названия должны быть точными, иначе при запуске возникает ошибка).

Шаг 1. Структура мода

- Создаем папку About
- Создаем папку Languages

Внутри них:
- В папке Languages создайте папку с названием языка. Для русского — Russian.
- В папке About создайте файл About.xml.

💡 Чтобы правильно сохранить файл как .xml:
В проводнике включите отображение расширений файлов:
В Windows 10/11: Вид → Показать → Расширения имен файлов.

Теперь можно переименовать файл с About.txt на About.xml.

Шаг 2. Картинки мода

Для обложки (превью) используйте изображение Preview.png.

- Обязательно название: Preview.png.
- Размер файла — не более 2 Мб.
- Рекомендуемое разрешение: 1600×900.

Дополнительно можно добавить иконку мода — файл modicon.png (64×64 px). Эта иконка будет отображаться в списке модов в игре.

Шаг 3. XML код для About.xml

<?xml version= "1.0" encoding= "utf-8" ?> <ModMetaData> <name>НАЗВАНИЕ ВАШЕГО МОДА</name> <author>ВАШ НИКНЕЙМ</author> <url></url> <supportedVersions> <li>1.6</li> </supportedVersions> <packageId>ID</packageId> <description>ОПИСАНИЕ ВАШЕГО МОДА</description> </ModMetaData>

<name> - Укажите название вашего мода (на английском), например "ModTranslationRUS";

<author> - Укажите ваш никнейм;

<li> - Укажите поддерживаемые версии, например 1.6;

<packageId> - Укажите ID, например "nickname.modrus";

<description> - Укажите описание вашего мода.
Раздел 3: Как редактировать строки?
В папке Languages создайте папки DefInjected, Keyed, Strings.
P.S. В основном используются папки DefInjected и Keyed.

DefInjected - в этой папке хранятся переводы ВСЕХ предметов, описаний, событий и т.д.
Keyed - в этой папке хранятся строки для перевода интерфейса и т.д.

Создавайте эти папки только в том случае, если они присутствуют в оригинальном моде!

Шаг 1. Создание папок.
Чтобы перевод заработал нужно разделить все .xml файлы на различные директории.

Например: В оригинальном (переводимом) моде .xml файлы находятся по пути:
“D:\Steam\steamapps\workshop\content\294100\код мода\1.6\Defs”

Возьмем в пример один мод: в папке Defs у него хранятся другие, со следующими названиями: AbilityDef, DamageDef, ResearchProjectDef, ResearchTabDef и т.д.

В этих папках хранятся .xml файлы, описывающие предметы, события и т.д, а также подпапки, разделяющие .xml файлы на категории (исключительно для удобства).

Чтобы создать папки с правильными названиями (это важно) нужно открыть один из .xml файлов и посмотреть начало кода.

Пример
В папке AbilityDefs хранится один файл AbilityDefs.xml, начало его кода:
<?xml version="1.0" encoding="utf-8" ?> <Defs> <AbilityDef> <defName>Cookie</defName> <label>Cookie</label> <description>Very tasty.</description> …

После <Defs> идёт строка <AbilityDef>, это и есть название папки, в которой должен хранится ваш .xml файл с переводом.
Таким образом, необходимо скопировать файл AbilityDefs.xml в папку вашего мода с именем AbilityDef.

После этого мы получаем путь (только пример):
D:\Steam\steamapps\common\RimWorld\Mods\SuperModRUS\Languages\Russian\DefInjected\AbilityDef\AbilityDefs.xml
... ↓Languages ↓Russian ↓DefInjected ↓AbilityDef ↓AbilityDefs.xml
(это лишь пример)

Шаг 2. Как создать код с переводом?
ВАЖНО: Нельзя просто переводить английский текст на русский и копировать весь файл — игра выдаст ошибку при загрузке!

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

Как писать код (вручную)?
Для примера возьмем предыдущий код.
РЕКОМЕНДУЮ работать в бесплатном Notepad++

ВАЖНО: Переводить можно только:

<label> - Название
<description> - Описание

Ничего другого переводить не нужно!

Создаем код:
* В шапке всегда кодировка: <?xml version="1.0" encoding="utf-8" ?>
* Код начинается с <LanguageData> и заканчивается </LanguageData>

Далее нужно писать строки. Они отличаются от оригинального кода. Чтобы перевести (например) предмет - смотрим на его defname:
<defName>Cookie</defName>
Имя предмета “Cookie”.
Теперь нужно прописать теги и закрыть их соответственно через “/”.

Пишем так:
<Cookie.label>Печенька</Cookie.label>
В начале строки мы пишем имя defname, затем тег label (название), потом перевод самого предмета, в конце то же самое только в начале "/".

Аналогично с описанием:
<description>Very tasty.</description>
В нашем коде пишем как:
<Cookie.description>Очень вкусная.<Cookie.description>

Переводим так каждую строку.



Раздел 4: Важная информация
Краткая структура:

1. Создайте папку с названием вашего мода-перевода в директории RimWorld/mods.

2. Внутри неё создайте папки About и Languages.

3. В папке About добавьте файл About.xml и отредактируйте его, а также добавьте Preview.png.

4. В папке Languages создайте папку Russian (или любую другую, например, Czech).

5. Откройте папку с оригинальным модом, который вы переводите, и найдите папку с файлами .xml (в разных модах она может называться по-разному, чаще всего это название версии, например 1.6).

6. В папке Russian вашего мода создайте директории DefInjected (обязательно) и Keyed (только если такая папка есть в оригинальном моде).

7. В папке DefInjected создайте подпапки с названиями, к которым обращается код из файлов оригинального мода (чаще всего названия почти совпадают).

8. По очереди проверяйте каждый .xml файл из папок оригинального мода и создавайте соответствующие подпапки в вашем DefInjected.

9. Копируйте (для удобства) или создавайте .xml файлы с теми же названиями, что и в оригинальном моде. Копируйте только в соответствующие файлу папки!

10. Для удобства откройте два .xml файла одновременно: один — в вашем моде (скопированный), другой — из оригинального мода.

11. Следуя инструкции, расписывайте теги и переводите текст, не забывая про кодировку в шапке файлов, затем сохраняйте изменения.

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

  • Структуры некоторых модов могут быть сложными, например в одной папке могут храниться несколько файлов .xml, которым нужны разные папки. Будьте внимательны и создавайте папки, соответствующие коду каждого .xml файла!

  • В модах может быть адаптация под другие моды или DLC, такая папка называется Patches. Её не нужно переводить, так как она содержит .xml файлы, которые лишь адаптируют мод под DLС а не вносят новые предметы, названия и т.д.

Раздел 5: Пример создания мода локализации
Выбор мода
- Зайдем в Мастерскую RimWorld
- В фильтрах выберем Mod и версию 1.6
- Далее в сортировке подбираем нужный нам мод

P.S. Выбирайте моды для которых ещё нет перевода, например самые новые или трендовые.

Для примера мод sbzFridge:
https://gtm.steamproxy.vip/sharedfiles/filedetails/?id=3486264784
Заходим в две директории

- В папку с ориг. модом
- В папку Mods игры RimWorld

В Mods создаем папку с названием "sbzFridgeRUS", в ней: About и Languages.
Редактируем файлы как в руководстве.

В моде [sbz]Fridge все файлы хранятся в директории 1.6. Структура такая:

↓3486264784 1.5 1.6 About Languages Textures

Выбираем папку 1.6, её структура:

↓1.6 ↓Defs ↓ThingCategoryDef ThingCategory.xml ↓ThingDefs_Buildings Buildings_Fridge.xml ↓Patches VanillaNutrientPasteExpanded.xml

В Defs хранятся подпапки, а в них файлы.

В нашей папке DefInjected создаем соответствующие папки: в файле ThingCategory.xml код следующий:
<?xml version="1.0" encoding="utf-8" ?> <Defs> <ThingCategoryDef> <defName>BuildingsNeatStorage</defName> <label>Storage</label> <parent>Buildings</parent> </ThingCategoryDef> </Defs>
Он обращается к папке ThingCategoryDef, такую и создаем в DefInjected.

В новую папку копируем ThingCategory.xml, заменяем строки, получается так:
<LanguageData> <BuildingsNeatStorage.label>Хранилище</BuildingsNeatStorage.label> </LanguageData>

В файле Buildings_Fridge.xml код довольно громоздкий, т.к. в нем описаны все свойства и механики предметов, поэтому часть кода:
<?xml version="1.0" encoding="utf-8"?> <Defs> ... <ThingDef ParentName="sbzFridgeBase"> <defName>sbz_Fridge</defName> <label>fridge</label> <graphicData> ...

Он обращается к папке ThingDef, создаем её в DefInjected.

Так же копируем и меняем код на следующий (файл большой, так что только часть):
<?xml version="1.0" encoding="utf-8" ?> <LanguageData> <sbz_Fridge.label>холодильник</sbz_Fridge.label> <sbz_Fridge.description>Холодильник, способный заморозить до 2-х продуктов. Не работает при температуре выше 100С.</sbz_Fridge.description> <sbz_LargeFridge.label>большой холодильник</sbz_LargeFridge.label> <sbz_LargeFridge.description>Холодильник, способный заморозить до 10 продуктов. Не работает при температуре выше 100С.</sbz_LargeFridge.description>

Так как мод маленький, то на этом вся работа заканчивается.

Раздел 6: Как протестировать и выложить мод в Мастерскую?
Когда вы закончили работу с переводом и проверили всю структуру вашего мода, можно запускать игру.

ВАЖНО: Включите режим разработчика в настройках игры!

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

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

- Включаем "Режим Бога" (вверху есть кнопки Dev, режим бога в самом конце) и тестируем перевод.

- В Разделе 5 я переводил мод [sbz]Fridge, этот мод добавляет холодильники. Режим бога позволяет построить что угодно. Холодильники это раздел "Температура".

Попробуйте перевести этот мод самостоятельно и проверить его работоспособность!

Режим Бога позволяет заспавнить нужные предметы, события и т.д.

Как выложить мод в Мастерскую?
- Зайдите в менеджер модов
- Выберите ваш мод > Расширенные настройки > Загрузить в Мастерскую Steam
- Мод соберётся и откроется окно Steam.
Далее прописывайте описание, видимость, настройки и т.д.

Теперь ваш мод можно скачать из Мастерской.

Если вы хотите обновить мод (если вышла новая версия ориг. мода), то:
- После публикации вашего мода в папке с ним в Mods (директории игры) в папке About появится файл PublishedFileId - это ID вашего мода в мастерской, он нужен для обновлений.

- Теперь, если вы обновили мод, вместо "Загрузить в Мастерскую Steam" будет "Обновить в Мастерской Steam", а далее всё как раньше.
Раздел 7: Программа для генерации XML файлов
XML_Generator 2.0

XML_Generator 2.0[drive.google.com] - авторское консольное приложение на языке C++, которое автоматически преобразует все .xml файлы в код <LanguageData>.

Я создал эту программу для упрощения процесса создания модов-переводов для игры RimWorld. Она абсолютно бесплатна и скачать её может каждый нуждающийся. Программа будет дорабатываться и улучшаться.

Структура архива

Перейдя по кликабельной ссылке, указанной выше, вы можете скачать .exe файл и прилагающиеся к нему файлы:
README.txt SourceCode.txt SourceCode.xml XML_Generator v 2.0.exe

Программа запускается через .exe.
Необходимо ознакомиться с файлов README.txt - это инструкция по использованию.

Для тех, кто боится запускать сторонние .exe файлы я прикрепил текстовый и xml документ с исходным кодом на C++ для VisualStudio.

P.S. Для тех кто выбрал копировать исходник в свой проект VS: если программа выдает ошибки, это значит, что она требует другого стандарта языка, а именно ISO C++ 17 (/std:c++ 17).

Если вы создали проект и не можете выполнить отладку:
Зайдите в свойства проекта > C/C++ > Язык > Стандарт языка C++ > Стандарт ISO C++ 17.
После применения программа будет работать корректно.

Как пользоваться?

После запуска программа потребует путь к папке с исходниками, то есть с оригинальными .xml файлами. В руководстве рассказано где найти эти файлы.

Затем нужно вписать конечный путь, в котором программа создаст папку "XMLsLGD". В эту папку программа закинет те .xml файлы, которые находились по первому пути. Эти файлы уже готовы, их осталось только перевести и закинуть в нужные папки (см. Раздел 3).

Как это работает?
Программа XML_Generator 2.0 получает на вход путь и парсит все .xml и .txt файлы. Она проверяет теги и генерирует готовый код в новые файлы, которые сохраняются по указанному пути.

Плюсы:
- Цикличность — программа не выключается после первого использования.
- Скорость — файлы создаются мгновенно.
- Удобство — нужно указать только два пути, больше ничего делать не надо.
- Универсальность — программа работает с любым .xml и .txt кодом.
- Корректность — программа преобразует .txt в .xml, чтобы файлы корректно работали в вашем моде.

Минусы:
А минусов я пока не нашел 😄
Если вы сможете найти их, или выявить какие-либо ошибки в программе, то сообщите об этом в комментариях.
Заключение
Надеюсь это руководство поможет вам начать переводить моды для RimWorld на ваш язык. Используйте его, чтобы создавать контент для личного пользования или делитесь вашими работами в мастерской!

⠀⠀⠀⠀⠀⠀⠀⠀⠀Если вы неравнодушны к моей работе, то оцените её по достоинству!
⠀⠀⠀Оставляйте комментарии с замечаниями и разумной критикой по данному руководству.

⠀⠀⠀⠀⠀⠀Если у вас возникли проблемы в ходе практического применения этого гайда:
⠀Пишите комментарий с подробным описанием проблемы, а я отвечу вам как можно быстрее!



5 Comments
Rincewind 14 Sep @ 4:26am 
Ну и последняя придирка :D

Использовать юникод, когда программка расчитана на запуск из-под виндовой "консоли" - не очень хорошая практика имхо.
Это повершелл наверно его поддердивает из-под коробки и вариации conemu
А вот обычный cmd.exe - нет

Вместо "✔", можно использовать что-то из первой половины ascii таблицы.

Ну это я все так, несерьёзно. Удачи в развитии утилитки.
Rincewind 14 Sep @ 4:11am 
Еще не совсем понял насчет txt, откуда они вообще возьмутся в модах помимо:
- списка имён для генерации пешек
- PublishedFileID
- каких-то частных настроек модов, вроде мода на анимацию оружия
- прочие чисто текстовые файлы с ченжлогами и прочим
ни один из них не нуждается в конвертации в xml

ну и если занудствовать :) в txt/xml не может быть "кода", это язык разметки
Rincewind 14 Sep @ 4:04am 
Посмотрел пока на исходный код утилиты и моих околонулевых познаний в Ц++ хватило, чтобы понять что утилита запрашивает ручной ввод директории с файлами.

Может правильнее их брать из параметров запуска? Было бы удобнее для пакетной обработки.

Аля

XMLGenerator "_indir_" "_outdir_"
Rincewind 14 Sep @ 3:54am 
помимо easymode тэгов label и descritption, которые нужно переводить, есть еще:

labelShort
customLabel
title
titleShort
helpText

и ряд других, путь к которым не так тривиален.
например, может быть вот такой:


<МонстрНэйм.corePart.parts.left_lung.customLabel>...

а вот за утилитку спасибо, надо глянуть
Master Xort 9 Sep @ 3:32pm 
Спасибо, это очень полезно.