Демонстрация перевода https://youtu.be/lW0SU54VSB8
Проект не связан с ArenaNet, NCSOFT и не одобрен ими. Guild Wars 2 и все связанные названия, логотипы и материалы принадлежат ArenaNet, LLC и NCSOFT Corporation.
Перевод выполнен пользователем добровольно и распространяется как есть, без гарантий. Автор перевода не несёт ответственности за возможные последствия использования, включая проблемы с игровым аккаунтом.
Использование сторонних программ в Guild Wars 2 регулируется политикой ArenaNet: Policy: Third-Party Programs. ArenaNet не проверяет и не одобряет сторонние программы, использование происходит на собственный риск игрока.
Это краудсорс-перевод игрового текста Guild Wars 2 для локализатора GlyphCore (https://github.com/nourlie/GlyphCore). Ниже — как поставить перевод и как помочь с переводом.
- Поставь прокси-локализатор GlyphCore — по инструкции из его репозитория:
https://github.com/nourlie/GlyphCore. Он создаст рядом с игрой папку
glyphCore\. - Скачай
dictionary.binиз последнего релиза: https://github.com/K13or/crowdsource/releases/latest - Положи файл в папку
glyphCore\(рядом сGw2-64.exe), заменив прежний. - Запусти игру. Перевод подхватится сам — запускать что-то отдельно не нужно.
Обновление перевода: скачать новый dictionary.bin и заменить старый. Больше ничего
делать не надо.
Если ставишь поверх старой версии русификатора: удали из папки glyphCore\ словари
main_strings.csv и dict_*.csv. Весь перевод теперь лежит в одном dictionary.bin,
и, пока он есть, старые CSV прокси всё равно не читает.
В dictionary.bin входит всё: интерфейс, предметы, диалоги, достижения, слой имён
собственных (pn_*) и строки, выученные прокси на лету. config.ini в релиз намеренно
не кладём — настройки у каждого свои, они правятся в оверлее локализатора (Insert).
Дальше — для тех, кто хочет переводить. Весь непереведённый текст нарезан на батчи
по ~500 строк. Берёшь батч, переводишь колонку translate, сдаёшь — и он попадает в игру.
Правим батчи. dictionary.bin не правим никогда — он собирается из них.
Причина простая: батчи лежат в git, у них есть история и откат. dictionary.bin
весит больше сотни мегабайт, на GitHub не помещается и потому не версионируется
вовсе. Ошибка в нём необратима, кроме как через бэкапы .dict_bak/, а разъезд
между ним и батчами не видит ни один линтер: обе стороны сами по себе чисты.
правим батчи -> python tools/dict_tool.py frombatches --batches-win --apply
-> python tools/index.py build # граф пересобрать
--batches-win и означает «батч побеждает»: запись в bin заменяется всегда,
когда текст разошёлся, а не только когда наша битая. Без этого флага команда
работает по-старому и молча оставит в игре прежний текст.
Что живёт только в bin и в батчи не заводится (слой имён pn_* сюда НЕ
относится — он лежит в батчах pn/*.csv и вливается вместе с ними):
- русские имена словарей для оверлея —
dict_tool.py dictnames.
Всё остальное — перевод строк — правится в батчах.
У пишущих по bin команд есть парные по батчам, и звать надо их:
| правка | по батчам |
|---|---|
canon (канон терминов) |
canonbatches |
tidy (мелкие починки) |
canonbatches --tidy |
typo (типографика) |
tools/typofix.py |
combat.py apply |
combat.py batches |
gw2s_import.py apply |
gw2s_import.py batches |
Если правка всё же легла в bin первой — не оставляй так: доведи её до батчей парной командой в тот же заход, иначе следующая сборка bin из батчей её сотрёт.
- Открой CLAIMS.md — доску захвата.
- Найди свободный батч (🟢), впиши свой ник в колонку «Кто взял» и смени статус на 🔨 (в работе). (через Pull Request, комментарий или как договоритесь в чате проекта.)
- Скачай свой файл из папки батчей, напр.
ui/ui_042.csvилиitems/items_010.csv. - Переведи и сдай (см. ниже). Смени статус на ✅.
Файл батча — это CSV с двумя колонками:
english,translate
Achievement Complete,
A cache key is required to open this chest.,- Заполняй только вторую колонку (
translate). Первую (english) не меняй. - Строки, которые не знаешь как перевести, оставляй пустыми — их возьмёт кто-то другой.
- Сохраняй файл в кодировке UTF-8.
-
Сохраняй плейсхолдеры дословно:
%str1%,%num1%,%str2%… — игра подставляет в них имена/числа. Их набор в переводе должен совпадать с оригиналом.%str1% has joined the party.→%str1% присоединился к группе. -
Сохраняй теги:
<c=@flavor>…</c>,<c=#ff8c00>…</c>,<br>,[null],[lbracket]/[rbracket]. Переводи только текст внутри, сами теги оставляй как есть. -
Склонения по числу — ровно ТРИ формы. Английское
[s]/[pl:"…"]в русском передаётся тремя формами через|в скобках — движок сам выберет по числу:[форма_для_1 | форма_для_2-4 | форма_для_5+]Пример:%num1% Snowflake[s]→%num1% снежин[ка|ки|ок]. Форма 2 — это родительный ЕДИНСТВЕННОГО числа («2 рецепта»), а не множественного:Рецепт[|а|ов]✅,Рецепт[|ы|ов]❌ (даст «2 рецепты»). Две формы допустимы только для рода — там, где в оригинале не[s], а[f:"…"]:You are ready[f:"ready"]→Вы готов[|а]. Если в оригинале[s]— двух форм не бывает, линтер такое считает ошибкой. -
Ничего не выкидывай из строки — особенно префикс до двоеточия.
Recipe[s]: Burl Orichalcum Ring→Рецепт[|а|ов]: сучковатое орихалковое кольцо. Убрать «Рецепт» нельзя: в игре это имя предмета-рецепта, без префикса он станет неотличим от того, что по нему изготавливают. Скобочная группа ставится на то слово, к которому в оригинале приклеено[s]. ВRecipe[s]: Feast of Avocado Salsaво множественном числе стоят рецепты, а не пиры:Рецепт[|а|ов]: пир сальсы из авокадо✅,Пир[|ы] сальсы из авокадо❌. Если склоняется всё словосочетание — оберни его целиком:Marsh Frog[pl:"Frogs"]→[Болотная лягушка|Болотные лягушки|Болотных лягушек]. -
Счётчики вида
%num1%/%num2%(прогресс достижений) группы не требуют — ставь родительный падеж множественного:Salvaged %num1%/%num2% Item[s]→Разобрано %num1%/%num2% предметов. -
Имена и названия. Любое название — персонажа, локации, предмета, облика, умения, маунта, титула — автоматически превращается в кириллицу на лету (слой
pn_*.csv). Поэтому известные названия можно оставлять латиницей — движок сам подставит русскую форму. Если пишешь по-русски — бери форму изpn_*.csvдословно, не сочиняй свою: иначе одна и та же локация будет называться в игре по-разному (в одной строке «Угольная Бухта», в соседней — «Залив Углей»). Сверяйся с файламиpn_names.csv,pn_terms.csv,pn_world_map.csvв папкеglyphCore\. Встретил название, которого в слое нет, — заведи его туда, а не переводи только в своей строке: слой нужен, чтобы игрок мог вернуть английский вид и найти вещь на вики или на торговой площадке. Подробности — раздел «Словари названий». Линтер это проверяет, и это ОШИБКА: если название из слоя есть в оригинале, а в переводе его нет — переведено или выброшено, —validate.pyскажет «название из слоя пропало из перевода». Внутри фразы имя обязано остаться латиницей: выключатель имён подставляет русское НА английское, а когда английского в строке не осталось, подставлять уже некуда. На строку, которая сама целиком является названием, это не распространяется — её гасит своя категория.Класс заведён 2026-08-30 и сразу ловит 6,55% корпуса: правило было записано давно, но не стереглось. Пока старые батчи не расчищены,
--warn-namesопускает его до предупреждения. -
Никаких знаков ударения (
Балли́ста) и никаких символов не из русского/латинского алфавита. Многоточие пиши как в оригинале (...). -
Служебные символы не выкидывай. Переносы строк, неразрывные пробелы, краевые пробелы, маркеры списка
•— часть вёрстки: игра рисует строку так, как её разбил оригинал. Потерянный перенос склеивает фразы («…на площадке.Примечание:»), потерянный краевой пробел ломает склейку «Рецепт: » + название. И наоборот: невидимые символы (zero-width, мягкий перенос), принесённые копипастой из вики, надо убирать — их в оригинале нет, а поиск по строке они ломают. -
Сомневаешься в скобке, кавычке или проценте — спроси в чате проекта. Фигурные и квадратные скобки, прямые кавычки и
%в этом переводе служебные:%пишется только удвоенным (%%), одиночный движок примет за начало спецификатора и съест соседний текст.
Если по дороге попалась строка, где перевод рассказывает не о том, что в
оригинале, — чини её тут же, не откладывая в список. Это не отвлечение от
задачи, а самое ценное, что можно найти: ни линтер, ни charscan, ни любой
гейт такого не видят. Они проверяют форму — теги, плейсхолдеры, числа, символы,
— а тут форма безупречна, и неверно содержание.
Примеры, найденные так и починенные на месте:
| EN | было | стало |
|---|---|---|
…a growing raptor needs! |
…растущему спрингеру! | …растущему раптору! |
Enter a frenzy. Attack faster… |
Призвать косяк рыб-умертвий | (откачено, это описание другого умения) |
Carnivore |
Кража здоровья у обездвиженного врага | у них полнее: с питомцем и условием |
Как чинить: правку вносим в батч (см. «Порядок работы»), канон термина берём из
GLOSSARY.md или из корпуса — python tools/index.py who <имя> покажет, как
проект уже переводил это слово и сколько раз. У раптора, например, 443 вхождения
и запись в слое, так что вариантов не было.
Заодно стоит проверить соседей: такие ошибки ходят семьями — одинаковые предметы для разных маунтов переводят копированием, и если у одного подставился не тот зверь, у остальных может быть то же самое.
Перевод большой, и по имени файла батча не понять, что в нём лежит: ui, new,
zone, site — это корзины сбора, а не смысл. Смысл несёт словарь. Чтобы
не гадать, собери граф перевода:
python tools/index.py build # ~2 минуты, база в sync/index.db (не версионируется)
Дальше пять запросов:
python tools/index.py find "Steel Warband vision" # где лежит строка: категория и файл батча
python tools/index.py who "Rytlock Brimstone" # досье: канон, где встречается, кто рядом
python tools/index.py cat # состав словаря по категориям
python tools/index.py dup # записи, лежащие в нескольких категориях
python tools/index.py proof items/items_015.csv 1 60 # лист вычитки батча
Место на карте подтягивается отдельной выгрузкой — теми же данными, на которых работают интерактивные карты вроде maps.gw2.io:
python tools/mapdata.py fetch # sync/api/places.csv
python tools/mapdata.py show "Lion's Arch"
Игра отдаёт места деревом «континент -> регион -> карта -> сектор -> точка», и в
графе они ложатся в таблицу geo. Для переводчика это отвечает на вопрос, на
который сама строка не отвечает: «Fridgardr Lodge» — это застава в Dredgehaunt
Cliffs, а не предмет и не персонаж, и соседние постройки того же региона должны
звучать с ней в одном ключе.
Тем же графом можно пользоваться как базой с поиском — поверх него есть локальный веб-интерфейс:
python tools/graphserve.py # http://127.0.0.1:8765
Он даёт то, чего нет у команд: выбрать не одну строку, а пачку по признаку — категория словаря, тип вещи по данным игры (оружие/броня/украшение), «только с дефектом», «без перевода», «латиница в переводе», — и уже потом читать. Поиск идёт и по оригиналу, и по переводу; клик по строке открывает карточку: чем вещь является в игре, в каких категориях и файлах батчей лежит, какие дефекты на ней висят, какие имена и термины глоссария в ней упомянуты. База открывается только на чтение, писать через интерфейс нельзя.
who — главный: он показывает канон имени, в каких категориях (то есть в каких
эпизодах и дополнениях) персонаж встречается и какие имена стоят рядом с ним в
одних строках. По нему видно контекст, которого в самой строке нет.
Правило: прежде чем переводить незнакомое имя или термин — спроси who. Если
имя уже в слое, бери оттуда форму дословно. Если рядом с ним стабильно стоят
другие имена, скорее всего, это одна фракция или отряд, и перевод должен
держать их вместе.
Батчи с пометкой «Автозаполнение из словаря» переведены машинно и вслепую: в
названии предмета тип вещи спрятан за словом сета, и переводчик пишет «тарг»,
«вирга», «ринблейд». proof ставит рядом с каждой строкой две опоры:
- ЧТО — чем вещь является по данным игры:
Weapon/Shield,Armor/Boots/Heavy,Trinket/Ring. Отсюда видно, чтоTarge— щит,Greaves— сапоги, аLegsиGreavesв одном сете это разные слоты, и одним словом их звать нельзя. Источник —python tools/itemfacts.py fetch(≈25 минут, 77 тысяч предметов и обликов вsync/api/facts/items.csv); - ЛЮДИ — как ту же вещь звали в батчах, заполненных человеком. Стат-префикс
(
Assassin's,Berserker's) при поиске отбрасывается: «Assassin's Tengu Axe» и «Berserker's Tengu Axe» — один и тот же топор, и прецедент лежит в чужом батче. Кто заполнял батч, граф берёт изCLAIMS.md(таблицаbatch).
Машинный батч в прецеденты не идёт никогда — иначе вычитка будет сверяться сама с собой.
Часть перевода взята у других проектов. Ссылки здесь стоят не для красоты: это условие, на котором мы вправе их материал использовать.
- Gw2Skills.Net — русские описания умений и талантов. Оттуда взято 1 467 описаний (заход 2026-08-11, подробности в DEFECTS.md), а также сверен канон боевых терминов: даров, состояний и эффектов контроля. Сайт требует ссылку при использовании переводов, и это требование выполняется здесь и в GLOSSARY.md. Переводы принадлежат авторам сайта.
- Официальная вики GW2 — лор: устройство отрядов чарров, составы, принадлежность к легионам. Факты, не текст.
- Официальный API GW2 — что чем является: предмет, квест, карта, умение, талант. По нему же чинится раскладка строк по словарям.
По порядку, от надёжного к спорному:
GLOSSARY.md— принятые решения, они выше всего остального;- корпус —
index.py whoиfind: как проект уже переводил это слово; - официальная вики https://wiki.guildwars2.com — лор и устройство мира.
Есть машинный доступ:
curl "https://wiki.guildwars2.com/api.php?action=query&prop=extracts&explaintext=1&titles=Warband&format=json"Русская вики (wiki.guildwars-2.ru) закрыта Cloudflare, автоматикой не берётся; - официальный API https://api.guildwars2.com — что чем является: предмет,
квест, карта, титул. Им же чинится раскладка по категориям:
python tools/apicat.py fetchиcheck; - и только потом — собственное решение, с записью в
GLOSSARY.md.
Пример, зачем это нужно: отряд чарра — общий элемент фамилии, и вики показывает, что стоять он может с любого края. Ритлок Бримстоун и Кресия Стоунглоу — оба из отряда Stone, хотя по виду фамилий этого не скажешь.
python validate.py new/new_042.csv
Ноль ошибок — обязательное условие. --warnings покажет ещё и мягкие замечания —
там же живут проверки по разделу «Русская типографика и грамотность»: буква ё,
кавычки, знаки препинания, окончания при цифрах, стандарты интерфейса. Они не
блокируют сдачу, но батч без них выглядит заметно лучше.
Среди мягких есть сверка с выгрузкой строк игры: она ловит случай, когда до нас
доехал уже испорченный оригинал — «Complete event.» вместо «Complete %num2%
event[s].» или «Applied / Area Damage Level 2 Upgrades» вместо
«Applied %num1%/%num2% …». Сам по себе такой оригинал выглядит целым, и перевод
без числа проходит молча. Эталон лежит в sync/server_strings.csv (только строки
с плейсхолдером или плюрал-разметкой). Обновить:
curl -s http://glyphcore.ddns.net:8080/list -o /tmp/list.csv
python tools/server_ref.py /tmp/list.csv
Без этого файла проверка просто выключается — на голом клоне линтер работает.
Тот же линтер прогоняется автоматически при заливке через crowdsource/tools/batch_tool.py fill
и не даст записать файл, если что-то из списка выше нарушено.
| ❌ Так не надо | ✅ Как надо | Почему |
|---|---|---|
Recipe[s]: Pearl Sabre → Жемчужная сабля Командора |
`Рецепт[ | а |
| `Рецепт[ | ы]` | `Рецепт[ |
| `Пир[ | ы] сальсы(дляRecipe[s]: Feast…`) |
`Рецепт[ |
| `Взрывающийся хвост дрейка[ | ов]` | `[Взрывающийся хвост дрейка |
| «Вы сделали всё… Ты доказал…» | одно обращение на всю строку | разнобой «ты/вы» внутри реплики |
Пики Громоглавия, Угольная Бухта |
Громоглавые Пики, Бухта Углей |
самодельные топонимы вместо канона |
- Естественный литературный русский, а не подстрочник. Сохраняй тон (грубый чарр — грубо, учёный асура — заумно, шутка — шуткой).
- Термины — по канону. Боевые/механические термины (профессии, благодати, состояния, контроль,
комбо, атрибуты) бери из GLOSSARY.md и с русской вики
https://ru.gw2skills.net/wiki (эталон). Имена/локации — из глоссариев
pn_*. Единообразие важнее личных предпочтений. - Обращение к игроку — на «вы» в интерфейсе/подсказках; в живых репликах — по ситуации. Внутри одной строки обращение должно быть одно. Письмо от NPC целиком на «ты» или целиком на «вы» — смешивать нельзя.
Это свод правил перевода, а не вкусовщина: каждый пункт — типовая ошибка, которую
проверяющий иначе ловит руками в каждом батче. Помеченные [линтер] проверяет
validate.py — они выходят в --warnings (вид, а не поломка, поэтому релиз не блокируют).
-
Буква ё — обязательна. «Ещё», «придёт», «чёрный», «тяжёлый». Отсутствие ё мешает читать и мешает тем, кто озвучивает. Деёфикация делается за минуту, обратная ёфикация — за день. [линтер] ругается только на слова, где написания через «е» не существует; «все» / «всё» и «сестра» / «сёстры» он не различает — это на тебе.
-
К игроку — на «вы». Исключения редки и осознанны.
-
«Вы» с прописной — нельзя. Прописная «Вы» — из деловой переписки с одним человеком; в диалоге и при обращении к нескольким лицам она недопустима, а руководство пользователя — не переписка. Титул — другое дело: «Ваше Величество». [линтер]
-
Знаки конца фразы — только из русского набора. Вопросительный знак может быть только один, восклицательные идут после него, а не наоборот. [линтер]
✅ Можно ❌ Нельзя ?!?!!!!!!!?..!..?!....!??!???!???!!!???!!!...?...!,.....,.... -
Пробела перед знаком препинания в русском не бывает. [линтер]
-
Точка ставится за кавычкой, а не внутри.
«Иди»., а не«Иди.»— внутрь точку убирает только английский. [линтер] -
Кавычки: снаружи «ёлочки», внутри „лапки“.
Пушкин писал Дельвигу: «Жду „Цыганов“ и тотчас тисну».Если шрифт не тянет — “внешние лапки” и ‘внутренние одиночные’, в безвыходном случае "прямые" и 'одиночные прямые'. Игровой шрифт«…»тянет, так что прямые кавычки в переводе — почти всегда просто копипаста из оригинала. Кавычки одного рисунка вложенными не бывают:««Меч «Змеиная ярость» берсерка»»— брак. [линтер] -
Капитализация — не английская. В английских названиях с большой буквы все слова, в русском так нельзя, если в этом нет отдельного смысла (иронического, стилистического: «Таинственный Ужас Неизведанных Глубин»).
Intercontinental Ballistic Missiles— «межконтинентальные баллистические ракеты», а не «Межконтинентальные Баллистические Ракеты». [линтер] (проверка спрашивает у корпуса: если слово в середине фразы почти всегда строчное, заглавная в нём подозрительна) -
Звукоподражания — через дефис. По-английски пишут слитно, по-русски одинаковые буквы разделяют: «А-а-а!», «о-о-о», «хр-р-р». То же для заикания: «д-д-дефис» или «т... три т... т... точки» при особо тяжёлом. [линтер]
-
«Свой» вместо «мой/твой/его». «Я хочу получить назад свой меч», а не «мой меч». Если принадлежность и так ясна, местоимение можно опустить вовсе: «Верните мне меч».
-
Капслок — на ударном слове. Английский оригинал часто ставит капс на слово ПЕРЕД ударным; это их ошибка, а не образец. «Это МОЙ меч».
-
Названия языков в меню выбора языка не переводятся. Меню существует ровно для того, чтобы носитель нашёл свой язык, когда настройки сбились и перед ним чужой. Правило общее для техники, не только для игр. [линтер]
-
Стандарты интерфейса. [линтер]
❌ ✅ опции настройки ( Options)назначение клавиш управление ( Controls)кликнуть, левый/правый щелчок щёлкнуть по чему-либо, щелчок левой кнопкой хиты, юниты единицы здоровья (здоровье), боевые единицы (здания, объекты) Щёлкают — по чему-либо. Нажимают — на что-либо или просто что-либо (лучше то, что физически нажимается: клавишу, но не ссылку). Применяют — что-либо или что-либо к чему-либо. Используют — просто что-либо, не «на» что-то.
-
Падежное окончание при арабских цифрах — однобуквенное после гласной, двухбуквенное после согласной.
5-й,5-я,5-е,5-м,5-х,5-го,5-му,30-ми; но не5-ый,5-ая,5-ого,30-ыми,2-ух. [линтер] -
«Бог» в устойчивых оборотах — со строчной. «Не дай бог», «ради бога», «бог его знает», «бог с ним», «ей-богу», «боже мой», «господи». С прописной — только когда это настоящее обращение к Богу.
Слава Богу(благодарит) ислава богу(расхожий оборот) различаются контекстом, а в «у него всё не слава богу» прописная невозможна. [линтер]
Технические строки (чистые коды, ссылки, числа) в батчи не попали — их отфильтровали. Если в батче попалась строка на другом языке (напр. немецком) — оставь пустой.
Сдай заполненный CSV так, как договорено в чате проекта: Pull Request в репозиторий, загрузка в общую папку или в Discord. Мейнтейнер вольёт его в игру скриптом merge_back.py:
python merge_back.py <путь_к_папке_glyphCore> <папка_или_файл_с_готовыми_батчами>
Скрипт сам находит строки во всех игровых файлах, заполняет их переводом, проверяет плейсхолдеры и не трогает уже переведённое.
С ключом --upgrade он вдобавок вытесняет заведомо худший перевод батчевым: если в игре
строка сломана (линтер ругается, а батчевая чистая), лежит копия английского, осталась
латиница вне слоя pn_* («гонке на roller beetle») или потеряно число из оригинала.
Просто «другая формулировка» не трогается — такие расхождения выписываются в
sync/reports/batch_conflicts.csv на просмотр человеком.
Названия и описания разведены по разным словарям — у предметов, достижений и
умений (2026-08-11, tools/dictsplit.py):
| словарь | имя в оверлее | записей |
|---|---|---|
item_names |
Предметы: названия | 42 816 |
item_descriptions |
Предметы: описания | 10 504 |
achievement_names |
Достижения: названия | 7 344 |
achievement_descriptions |
Достижения: описания | 9 241 |
skill_names |
Умения: названия | 2 987 |
skill_descriptions |
Умения: описания | 4 228 |
Благодаря этому русские названия можно отключить штатной функцией переводчика
(отключение дополнительных словарей) — названия в игре снова станут английскими,
что удобно для вики, торговли и LFG, а описания при этом останутся русскими.
Пока названия и описания лежали в одной категории, такой выключатель был
невозможен. То же самое работает для dict_skins.csv (облики), dict_maps.csv
(локации), dict_colors.csv (краски) и других профильных словарей. Имена
персонажей и мест переключаются отдельно — опцией translate_proper_nouns
в config.ini (слой pn_*.csv).
Правило для названий: все названия (предметов, оружия, брони — включая
шаблоны линковки %str1%%str2%Название%str3%%str4%) живут в dict_item_names.csv
или в профильных словарях (dict_skins, dict_maps…), а НЕ в main_strings.csv —
иначе их нельзя будет отключить. Новые отдельные словари не создаём — добавляем
строки в уже существующие.
Всё, что игрок может пойти гуглить, обязано лежать в слое pn_*. Персонажи,
локации, предметы, облики, краски, умения, таланты, маунты, мини, титулы,
достижения, события, отряды, фракции — любое название, по которому ищут на вики,
в гайде, на торговой площадке или в LFG.
Смысл правила не в переводе, а в обратимости: слой подставляет русскую форму
на лету, и его можно выключить (translate_proper_nouns в config.ini). Название,
попавшее в слой, игрок в один клик возвращает к английскому виду и находит по нему
что угодно снаружи игры. Название, переведённое «намертво» прямо в строке, ищется
только по догадке.
Отсюда же следует, что латиницу в русском тексте бояться не надо: если название заведено в слой, движок сам покажет его по-русски, а игрок при нужде вернёт английское.
Граница простая: в слой идут НАЗВАНИЯ, а не фразы. Описание умения, реплика NPC, условие достижения — это текст, ему в слое не место; название того же умения или достижения — место. Практический признак: строка короткая, начинается с заглавной, без завершающей точки, без плейсхолдеров и разметки.
Пополнять слой — dict_tool.py pnadd --file <csv> (колонки english,translate,layer),
собирать канон из корпуса — pnharvest. Проверять состав слоя только через
read_sections: load_map схлопывает записи по хешу между категориями и
показывает вместо записи слоя её двойника из maps/item_names.
Чтобы выключатель имён работал, у названия должно быть два свойства сразу, и до 2026-08-28 не проверялось ни одно:
- оно заведено в
pn_*— иначе гасить нечего, и словарь общей категории покажет русское название при любых настройках; - общий словарь его не переводит — имя внутри фразы стоит латиницей. Иначе гасить бесполезно: игрок выключил слой, а в строке уже кириллица.
Первое свойство проверяет python tools/names.py gap, второе —
python tools/names.py inline. Сам реестр строится вместе с графом
(tools/index.py build) и живёт в таблицах name и route базы sync/index.db:
для каждой строки — класс названия, откуда мы про класс знаем (API, категория
словаря, улика по корпусу), целевой словарь pn_* и целевой файл батча.
В слой идёт не всякое название. Строка, которая целиком является названием,
уже гасится своей категорией («Предметы: названия»), и копия в pn_* только
заставит игрока щёлкать два выключателя вместо одного. Слою нужны названия,
которые встречаются внутри чужих фраз — в описании достижения, в формулировке
события, в реплике NPC: там категория бессильна. Поэтому у слоя есть словари,
парные к категориям, — pn_items, pn_skills, pn_achievements (заведены
2026-08-30).
Класс строке ставится по источнику, а не по её виду: официальное API, категория
словаря, а для существ и NPC (их API не отдаёт) — две улики по корпусу, ранговый
префикс Champion/Veteran/Legendary/Elite и перекрёстная улика
«строка встречается и отдельной табличкой, и целью в формулировке задачи».
Эвристика «похоже на название» не годится: под неё подходят счётчики событий
вроде «Gate Repair Progress».
Раскладка «класс названия → словарь pn_*» версионируется отдельно, в
NAMEMAP.md — это решение мейнтейнера, от него зависит, сколько
выключателей увидит игрок.
Спасибо, что помогаешь! 💛