Skip to content

Пустые ячейки в четырёх батчах + вычитка тридцати шести батчей (196 + 5129 строк) - #4

Merged
K13or merged 51 commits into
K13or:mainfrom
Arelion999:fill-empty-ach-ui
Aug 18, 2026
Merged

Пустые ячейки в четырёх батчах + вычитка тридцати шести батчей (196 + 5129 строк)#4
K13or merged 51 commits into
K13or:mainfrom
Arelion999:fill-empty-ach-ui

Conversation

@Arelion999

@Arelion999 Arelion999 commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Две части: сначала добиты пустые ячейки в четырёх батчах, затем вычитан машинный черновик ui_132 — там, где он звал одних и тех же существ каждый раз по-новому.

Часть 1. Пустые ячейки — 196 строк

Все ячейки, которые машинное автозаполнение не осилило. Батчи стали полными, доска и шапка пересчитаны stats.py --mark-done.

батч пустых было о чём строки
ach/ach_006.csv 71 события по локациям, фракталы по уровням сложности, сердца почёта, «Return to …»
ach/ach_032.csv 52 PvP-матчи по профессиям и их парам
ui/ui_132.csv 45 скайскейлы, яйца, чешуя, «Skyscale Lost — …»
ach/ach_005.csv 28 механическое оружие, Конвергенции, сбор эссенции

Формы не выдумывал: канон — слой pn_* (через index.py who), затем GLOSSARY.md, затем корпус батчей.

  • локации — из слоя дословно, падеж по фразе: Auric Basin → «в Золотой лощине», Sandswept Isles → «на Островах, заметаемых песком»;
  • профессии — из GLOSSARY.md; PvP не переводится (решение 2026-08-08): «Выиграйте %num2% матчей PvP за стража»;
  • формулировки — по прецедентам самих батчей: «Complete %num2% events in Bitterfrost Frontier.» → «Завершите %num2% событий на Границе Горького Мороза.»;
  • две строки с [s] получили ровно три формы: «мета-событи[е|я|й]», «круг[|а|ов]».

Названия, которых нет ни в слое, ни в корпусе, оставлены латиницей, а не переведены на свой вкус — по правилу обратимости из README: Return to Heart of Thorns, WvW Fall Tournament 2014, Bazaar of the Four Winds, Wisp Pockets, Skimmer Slalom, Goemm's Lab. Если для них есть канон — скажите, поправлю.

Часть 2. Вычитка ui_132 — 123 строки

Батч помечен как «Автозаполнение из словаря», и видно, чем это кончилось: три существа разъехались на десяток форм, иногда в соседних строках.

канон что стояло в батче
Skimmer → скиммер Скаймер, скат, скакун
Skritt → скритт Скрыт, шритт
Skyscale → скайскейл небесный скакун, небесный дракон, скайлейн, скайскейль, скайскелл, Скалайл, Смертокрыл, Скайсэйл

Попутно починены плюрал-группы, которые линтер пропускал:

  • подменённые числаSkyscale #1[pl:"#1"] переводился как «Скайскейл №[1|2|3]», то есть в игре при разном числе показывал бы разные номера маунта;
  • четыре формы вместо трёх — «Чешуя скайскейля №4[|а|и|]»;
  • группа на пустом месте — «Скайскейл [|л|л]ост», «Скайскейлоранен[а|ы|о]»;
  • группа навешена на несклоняемое название вместо склоняемого слова — «Сундук командира с архипелага Скайвотч[|а|и|ов]» → «Сундук[|а|ов] командира с Архипелага Небесного дозора».

Снят английский Title Case: «Мастерство Адаптации Скаймера» → «Мастерство адаптации скиммера».

Канон локаций: Divinity's Reach → «Божественный предел» (стояло «Предел Божественности»; в списке запрещённых форм в GLOSSARY.md такой нет, поэтому линтер молчал), Skywatch Archipelago → «Архипелаг Небесного дозора» (в соседних строках было и «архипелаг Скайвотч», и «архипелаг «Небесный дозор»»).

Glider намеренно не трогал. Слой даёт «Глайдер», но корпус пишет «планер» 582 раза против 34 — правка в одном батче только добавила бы разнобоя. Это решение за вами.

Пометку в CLAIMS.md поставил честную: канон имён вычитан, сплошной вычитки по смыслу у остальных строк батча не было.

Часть 3. Вычитка items_075 — 198 строк

Батч выбран не наугад: проверкой канона по всем 883 батчам он вышел на первое место (142 подозрительные строки из 498). Заодно цифра по корпусу — 15 110 строк расходятся с каноном слоя, так что материала для вычитки хватит надолго.

Класс Orrian — 166 строк. Канон слоя pn_terms — «Оррианский» (964 упоминания), в батче стояло «Орианский» с одной «р». А половина строк вместо прилагательного получила родительный падеж топонима, причём каждый раз по-своему:

EN было стало
Orrian Mace of Air Булава Воздуха из Орриана Оррианская булава воздуха
Orrian Short Bow of Earth Короткий лук Орриана из земли Оррианский короткий лук земли
Orrian Glaive of Rage Главнокол Орриана Ярости Оррианская глефа ярости
Orrian Speargun of Accuracy Орианский арбалет с повышенной точностью Оррианское гарпунное ружьё точности
Orrian Pistol Skin Орианский пистолет Облик оррианского пистолета

Последняя строка — отдельный класс: слово «облик» терялось, и облик становился неотличим от самого предмета. Суффиксы привёл к тому, что чаще пишет корпус: of Corruption → «порчи» (107 против 33 «скверны»), of Vision → «видения» (81 против 3 «провидца»).

Наборы обликов Pact Fleet, Painter's Brilliance, Paladin's Decree — 54 строки. Здесь подменялся сам тип вещи:

  • Painter's Brilliance Mace Skin → «Кольчуга «Блистающая кисть»»;
  • Paladin's Decree Staff Skin → «Скипетр «Указ Паладина»» — и совпал с настоящим Scepter Skin, то есть в игре два разных облика назывались одинаково;
  • Pact Fleet Greatsword Skin → «Великий меч флота пакта», Painter's Brilliance Greatsword Skin → «Великолепный меч «Художник»».

Приведено к виду «Облик ‹оружие в родительном› ‹набор›», как это делает корпус. Названия наборов — оттуда же: «флота Пакта», «Блеск художника», «Указ паладина».

Остальное: знаки ударения, которые README запрещает («Ски́н для була́вы "Ука́з палади́на"»); прямые кавычки вместо ёлочек (43 строки); английский Title Case; Skin как «Кожа» и «Ски́н» вместо «Облик» (канон корпуса — 2646 против 44 и 31); Wintersday → «День Зимы», Spearmarshal → «копьемаршал», Roller Beetle → «роллер-битл». У наплечников копьемаршала название было подменено на «Знаменосец». Восстановлен неразрывный пробел в браслете Орсиппуса.

validate.py по батчу: было 43 предупреждения, стало 0 ошибок и 0 предупреждений.

Часть 4. Вычитка items_099 — 138 строк

Наборы обликов (62 строки). Название набора гуляло внутри одного набора: «Ярость змеи» / «Ярость змея» / «Гнев змеи»; «Семь Жнецов» / «Семь жнецов»; «Тёмный рыцарь» / «Теневой рыцарь». Канон из корпуса: «Гнев Змея», «Семь жнецов», «Теневой рыцарь». Подмены типа вещи те же, что в items_075: Mace Skin → «Кольчуга», Shield Skin → «Облик брони», Greatsword Skin → «Великий меч». Отдельно стоит Seven Reapers Grasps Skin → «Семь жнецов хватают за кожу»: Grasps здесь слот перчаток, а машина приняла его за глагол.

Seraph Pearl (18 строк). Здесь очень пригодился index.py proof — к этому моменту догрузились itemfacts, и колонка ЛЮДИ показала те же предметы в человеческом батче items_006, описанные рецептами. По ним и правил:

EN было стало (по items_006)
Seraph Pearl Bludgeoner Булава Серафима с жемчужной отделкой Жемчужная дубина Серафима
Seraph Pearl Broadsword Широкий меч Серафима из жемчуга Жемчужный палаш Серафима
Seraph Pearl Carver Серафийский резчик по жемчугу Жемчужный резак Серафима
Seraph Pearl Stinger Жемчужный жалящий серраф Жемчужное жало Серафима
Seraph Pearl Reaver Серафимская жемчужная сабля Жемчужный жнец Серафима

Последняя строка — коллизия: Reaver носил то же имя, что настоящий Seraph Pearl Sabre, и два разных предмета в игре назывались одинаково.

Cabalist (37 строк). Разнобой в порядке слов и Title Case («Кабалиста Шамана»), слот Shoulders то «Плечи», то «Наплечники», Legs местами «Ноги». Суффикс of Scavenging шёл тремя формами подряд: «собирательства», «облегчающие сбор ресурсов», «искателя кладов». Две прямые подмены: Settler's Cabalist Coat → «Паладинский плащ поселенца» и Settler's Cabalist Legs of Scavenging → «Поношенные штаны искателя кладов» — потеряны и сет, и стат.

Слоты и суффиксы приведены к большинству корпуса: сапоги (25), перчатки (22), капюшон (27), наплечники (14 против «плечи» 11), силы (71), проникновения (57), Грента (64), Цитадели (59). Legs корпус чаще всего зовёт «ноги» (13) — это явный машинный брак, взято «штаны»; «поножи» оставлены за Greaves, как предупреждает README.

validate.py по батчу: было 72 предупреждения, стало 0 ошибок и 0 предупреждений. Сеты Banded, Privateer, Conjurer и Reinforced Scale не тронуты — в CLAIMS.md это отмечено.

Часть 5. Вычитка ui_129 — 70 строк

Канон. Sentinel звался четырьмя способами — «часовой», «страж», «стражник», «стражничий», — при том что слой pn_terms и корпус согласны на «страже» (331 против 93). Dominion шёл «Владычеством» при каноне «Доминион» (257 против 32), Sentinel Bay — «Бухтой Часового» при каноне слоя «Сентинел-Бэй», Xhunn — «Кхунном» при «Ксунне». Отдельная подмена: Sentinel's Orichalcum Imbued Inscription → «Скрипт из орихалкового рунического камня» — потерян и стат, и тип вещи, хотя соседние строки того же ряда переведены верно.

Коллизии имён. Это класс брака, которого не видит ни один гейт: два разных предмета получают одно название. Проверяется тривиально — одинаковый перевод при разном оригинале:

  • Shadow Fiend и Shadow Imp оба были «Теневым бесом», рядом Shadow Demon — «теневым демоном»; у Fiend вдобавок была третья форма «Теневой прислужник». Развёл: Fiend — изверг (есть прецедент «Призвать теневого изверга»), Imp — бес, Demon — демон.
  • Набор Shade-Touched звался «Теневым обликом» и после первых же правок совпал бы с набором Shadow — проверка это поймала, и Shade-Touched приведён к «Тронутый тенью» (форма уже стояла в самом батче, строка Shade-Touched Weapons).

Наборы обликов. Shadow Chevalier разъехался на три формы внутри одного набора: «Теневой шевалье», «Теневой кавалер», «Теневой рыцарь». Канон корпуса — рыцарь.

Мелочи: тавтологии «[Краска|Краски|Красок] «Теневая красная краска»», прямые кавычки, строчная буква в начале строки, название облика в именительном вместо родительного, обрывок вместо окончания в группе («Сумочк[а|и|из]»). Заодно заполнена единственная пустая ячейка батча.

validate.py: 0 ошибок, 0 предупреждений, коллизий в батче не осталось.

Часть 6. Вычитка ui_162 — 40 строк

White Mantle шёл четырьмя формами вперемешку: «Белая Мантия» (канон слоя и корпуса, 75 против 13), «Белый Плащ», «белые мантии» и «Белое Пламя» — последнее уже подмена самой организации (White Mantle Battle Mage → «Боевой маг Белого Пламени»). Все 35 строк сведены к «Белой Мантии».

Loot Box у половины зверей потерял слово «ящик» и стал самим зверем: White Bear Loot Box → «Белый медведь», White Shark Loot Box → «Белая акула». Корпус зовёт это ящиком в 174 случаях из 183. Из-за той же потери White Deer Loot Box совпал с White Stag — снова два разных предмета под одним именем.

Имена по канону: Tyria → «Тирия» (113 против 35 «Тайрии»), Braham → «Брейхам» (132 против 1; GLOSSARY.md это прямо оговаривает, а в соседней строке батча уже стояла верная форма).

Плюрал-группы: «Белый окунь|белого окуня|белых окуней» — вообще без скобок, в игре отрендерилось бы литералом вместе с палками; четыре формы вместо трёх у белого кролика; группа на названии вместо склоняемого слова у маски элитного стража. Плюс вложенные кавычки одного рисунка в «Крыльях любви» и «дельтаплан» → «планер» (канон корпуса, 582 употребления).

Wintersday намеренно не трогал. Слой даёт «День Зимы», но корпус пишет «Зимний день» (111 против 61), и в батче стоит он же — правка в одном батче только добавила бы разнобоя. Поправлены только выбросы внутри батча («Зимний праздник», «Белые Зимние Дни»). Это к вам, как и Glider.

validate.py: 0 ошибок, 0 предупреждений, коллизий нет.

Часть 7. Вычитка ui_036 — 129 строк

Коробки рецептов и брони (80 строк). Один шаблон переведён десятком способов: Box — «Ящик», «Коробка», «Сундук»; группа то [Ящик|Ящика|Ящиков], то «Ящики», то Ящик[|и|я], то Коробка[и|ок|ок]; броня — «драконья», «из драконьей стали», «из драконьей кожи», «кованая»; часть строк взята в ёлочки целиком, часть получила точку в конце.

Канон Box взял из корпуса: для «Box of …» там «коробка» 162 раза против 11 «ящиков» (а «ящик» закреплён за Loot Box — 174). В самом батче было наоборот, 107 против 45, поэтому класс сведён к корпусу.

Названия легендарного оружия — из слоя (Carcharias, «Пушка хаоса», «Сумерки», «Хоул», «Шторм», «Колосс», «Пламя Родгорта») и корпуса («Рассвет», «Искра», «Ярость», «Избранный», «Охотник»). В батче Howl шёл сразу как «Вой» и «Рёв», а Carcharias — как «Кархариас» и «Кархарий» в соседних строках. Стат-префиксы по корпусу: Assassin's → «ассасина» (235, а не «убийцы»), Rampager's → «разрушителя» (140), Viper's → «гадюки» (70).

Класс Branded (49 строк). «Клейменый» и «клеймёный» шли поровну — 37 против 36; свёл к «клеймёному», как требует правило про ё. Отдельно девять строк, где Brand принят за маркетинговый бренд:

EN было стало
Branded Devourer[s] Брендовый пожиратель Клеймёный пожиратель
Branded Eel[pl:"Eels"] Брендированный угорь Клеймёный угорь
Branded Seed Семя Бренда Клеймёное семя
Branded Dredge Resonator Меченый резонатор землероев Клеймёный резонатор землероев
Branded Accumulation Накопление Скверны Клеймёное накопление

Коллизии имён. Branded Jab, Branded Punch и Branded Strike — три разные способности — сошлись в двух названиях; развёл на тычок, удар и атаку. Box of Giver's и Box of Viper's Draconic Armor тоже носили одно имя, хотя это разные статы.

validate.py: 0 ошибок, 0 предупреждений, коллизий не осталось. Класс Bowl[s] (123 строки, еда) не тронут — в CLAIMS.md отмечено.

Часть 8. Вычитка items_122 — 142 строки

Батч формально был чистым: ни пустых ячеек, ни предупреждений линтера, ни коллизий. И при этом почти каждый класс переведён несколькими способами сразу.

класс как шло в батче канон
Wupwup Вупув, Вупвупа, Вупу, Вупвуп Вупвуп (корпус)
Woad вайда, вайды, вадов племя Воад (слой)
Writ Свиток, Предписание, Писание, Указ, Грамота Грамота (ui-батчи)
Worn Поношенная, Потрепанный, Потертая, Вытертая потёртый (14)
Wizard's волшебника, Мага волшебника (16 против 3)
Glider Планёр, параплан планер (582)

Woad — ложный друг: машина приняла название племени за растение вайду и выдала «сапоги вайда», «перчатки вайды», «сапоги вадов». Слой знает «Ученый из племени Воад».

Writ — градация, и степени в ней разъезжались: Calculated шёл как «Рассчитанная», «расчётливого» и «расчёта». Из-за этого Writ of Learned Malice и Writ of Studied Malice носили одно название. Свёл к шаблону «Грамота ‹степень› ‹атрибут›».

Набор обликов Winter's целиком есть в слое, но батч перевёл его по-своему: «Горечь зимы» стала «Зимней стужей», «Досягаемость зимы» — «Зимним простором», «Резак зимы» — «Зимним резаком», «Лезвие зимы» — «Кромкой зимы». У щита вместо облика стояла «Шкура щита». Взял формы слоя дословно.

Облики Wintersday сведены к «Зимнему дню» — форме, которая доминирует и в батче, и в корпусе; у топора слово «Облик» было потеряно вовсе, и облик стал неотличим от предмета. Сам выбор «Зимний день» против слоевого «День Зимы» снова не трогал.

Локации по слою: Echovald Wilds → «Эховальдские дебри» (было «Эхо-Вальдские пустоши»), New Kaineng City → «Нью-Кайнэнг» (было «Новый Каинег»). White Mantle — опять «Белый Плащ» и «Белое Пламя» вместо «Белой Мантии».

validate.py: 0 ошибок, 0 предупреждений, коллизий не осталось.

Часть 9. Вычитка items_034 — 63 строки

Слоты брони — главное здесь. Плечи в игре это четыре разных слота по типу брони: Epaulets (лёгкая), Shoulderguards и Shoulderpads (средняя), Pauldrons (тяжёлая). В батче все стали «наплечниками», и разные предметы одного сета получили одно имя:

  • Defender's Mist-Touched Epaulets и …Pauldrons — оба «Наплечники защитника, тронутые туманом»;
  • Defender's Pauldrons of Dhuum и Defender's Shoulderguards of Dhuum — оба «Наплечники Защитника Дхуума».

Развёл: эполеты (канон корпуса, 66), наплечи, оплечья, наплечники (закреплены за Pauldrons, 231).

То же с ногами, и здесь корпус не помощник: Greaves и Leggings он переводит одинаково — «поножи», 260 и 219. Но в одном сете это разные предметы, поэтому внутри батча разведены поножи / штаны / бриджи. Вскрывалось каскадом: развёл Greaves и Leggings — всплыла пара Leggings и Breeches, которой до правки видно не было, потому что Leggings дублировал Greaves. Это, кстати, аргумент за то, чтобы гейт на одинаковый перевод при разном оригинале жил в validate.py.

Стат Defender's писался то с заглавной (48 строк), то со строчной (97) — свёл к строчной. В трёх строках стат потерялся вовсе: «Защитные сапоги стража», «Защитные оплоты стража», «Шлем стража крепости».

Fractals of the Mists переведены как «Бездны Туманников» при каноне «Фракталы Туманов» (115 против 15), а Fractal Attunement Mastery — как «Постижение бездн» при слоевом «Настройка фрактала». Decade's Reach взят из слоя — «Досягаемость десятилетия».

Dhuum намеренно не трогал: слой даёт «Дуум», но корпус пишет «Дхуум» (88 против 36).

validate.py: 0 ошибок, 0 предупреждений, коллизий не осталось.

Часть 10. Вычитка ach_026 — 110 строк

Skyscale во всех 50 строках был «чешуйчатым драконом» или «небесным драконом» при каноне GLOSSARY.md «Скайскейл». Тот же класс, что в ui_132, только там форм было семь, а тут две — зато сплошняком. Заодно «Святилище небесных чешуйников» стало «Святилищем скайскейлов».

Семнадцать строк нарушали правило про точку и кавычки: «…сейфа с "Mellaggan's Valor."» — кавычки прямые, а точка загнана внутрь. Названия внутри оставил латиницей: в слой они не заведены, а по правилу обратимости игрок должен уметь найти их снаружи игры.

Топонимы шли то латиницей, то по канону, в соседних строках: «Исследователь провинции Seitung» рядом с «Тренировка скайскейла в Архипелаге Небесного дозора». Свёл к слою — «Сейтунг», «Архипелаг Небесного дозора» (и предлог «на», а не «в»). Остальное оттуда же: Sea of Sorrows → «Море Скорби» (было «Море Печалей»), Snowden Drifts → «Сноуденские сугробы» (было «Снежные дрейфы»), Hoelbrak → «Хоэльбрак» (был без мягкого знака).

Insight переводился и «Прозрением», и «Обзором» — взят «Обзор» (корпус, 137 против 90). Наборы обликов приведены к формам из остальных частей этого PR: Shadow Chevalier — «Теневой рыцарь» (было «Теневой кавалер»), Shade-Touched — «Тронутый тенью».

validate.py: было 17 предупреждений, стало 0 ошибок и 0 предупреждений.

Часть 11. Вычитка items_119 — 63 строки

Набор Vigil's Honor (42 строки) переведён пятью разными структурами: «Топор Чести Дозора», «Сапоги чести Дозора», «Нагрудник Честь Дозора», «Обувь Дозора Чести», «Перчатки Дозора в честь». Местами орден стал «Стражей» («Поножи „Честь Стражи"») или потерялся вовсе — «Поношенные ножные латы „Печать Бдительности"». Канон ордена — «Дозор» (GLOSSARY.md), структура сведена к «‹предмет› чести Дозора». Слоты внутри набора разведены заранее, иначе после приведения к одной структуре совпали бы Pauldrons с Shoulderguards и Harpoon со Speargun.

Стат-префиксы: Vigorous → «энергичный» (были ещё «Сильная», «Добротная», «Бодрящий»), Vigilant → «бдительный» (было «Настороженные»), Veteran → «ветеран» (65 в батче против «опытного», «матёрого», «бывалого»). Acolyte → «аколит» (43 против 23 «послушника»), Apprentice → «ученик» (24) — так они перестают сливаться друг с другом.

Conch и Shell снова дали одно имя, как в items_099 — развёл на раковину и ракушку.

Поправка к части 6 — про Loot Box

В ui_162 я привёл Loot Box к «ящику», сославшись на корпус. Полный пересчёт показал, что единого канона нет: «сундук» 229 против «ящика» 182 — мой прежний подсчёт был по узкой выборке и дал смещённую картину. Поэтому в items_119 54 строки с «сундуком» я не трогал.

Правки в ui_162 при этом остаются в силе по сути: там проблема была не в выборе слова, а в его потереWhite Bear Loot Box переводился просто «Белый медведь», и предмет было не отличить от существа. Но если вы предпочитаете «сундук», в ui_162 это меняется одной заменой — скажите.

validate.py: 0 ошибок, 0 предупреждений, коллизий нет.

Часть 12. Вычитка items_063 — 76 строк

Стат-префикс Lingering переведён пятью способами: «Затяжной», «Забытый», «Наследие», «Неустойчивые», «негаснущей». Корпус пишет «затяжной». В двух строках структура развалилась совсем: «Наследие искусных поножей», «Дыхательный прибор из негаснущей чёрной земли Цитадели».

класс как шло канон
Lionguard львиной стражи (строчная) Львиная стража (слой)
Luxon луксонский, луксов Люксоны (слой)
Lucky счастливый, удачливый счастливый (10 против 1)
Luminous сияющий, светящийся сияющий (26 против 14)
Lunatic безумный, лунатик безумный (19)

При этом Luminescent и Lucent остались «светящимися» — это другие слова, и сливать их с Luminous нельзя.

Расхождение слоя и глоссария: Ember Bay

В батче стояла «Бухта Пепла». Слой подставляет «Залив Углей», а GLOSSARY.md прямо решает «Бухта Углей» и запрещает «Угольную Бухту» и «бухту Эмбер». По README глоссарий старше слоя, поэтому взял его форму — но само расхождение стоит свести, иначе слой будет спорить с решением в глоссарии.

Crystal Oasis был «Кристальной Оазой» при каноне «Кристальный оазис».

validate.py: было 3 предупреждения, стало 0 ошибок и 0 предупреждений.

Часть 13. Вычитка ui_096 — 57 строк

Батч целиком про миниатюры, и в 32 строках слово «Мини» потерялось или подменилось: «Маленький», «Малый», «Малышка», «Микро-», а то и вовсе ничего — Mini Lion Cub[s] переводился как «[Львёнок|Львёнка|Львят]». Так миниатюру не отличить от самого существа: тот же класс, что потеря «Облик» у обликов и «Рецепт» у рецептов. Канон корпуса — «Мини» в начале, 1306 строк из 1423.

Восстанавливая префикс, важно попасть внутрь плюрал-группы: «[Львёнок|Львёнка|Львят]» → «[**Мини-**львёнок|**Мини-**львёнка|**Мини-**львят]», а не «Мини-[Львёнок|…]», иначе склонение отвалится от префикса. Вариант с дефисом и без корпус делит 741 на 431 — он свободный, дефисные строки не трогал.

Битые группы: «вор[|ьи|ы]» и «рысь[и|ей|их]» давали «2 ворьи» и «1 рыси» — формы не от того слова. Mini Thundershrimp вообще нёс три формы через слэш плюс группу.

Имена: «Малышка Май Трин» → «Мини-Май Трин» (механическая вставка префикса опускает первую букву, а имя собственное строчным быть не может), Slothasor → «Слотазор» по слою (был «Слозасор»), Cloudseeker → «Искатель облаков», Gourdon → «Гурдон» (был «Гудон»), «мадам Кукы» → «мадам Куки». SERV Golem — «служебный», а не «СЛУЖБЕННЫЙ». Skimmer → «скиммер» по GLOSSARY (в батче был «скаймер»), Pact → «Пакт».

Коллизия: Mini White Journeykin и Journeykit носили одно имя — это разные существа.

Слово «фигурка» в шестнадцати строках («Мини-фигурка морской черепахи» при оригинале Mini Sea Turtle) оставлено: в оригинале его нет, но и ошибкой это не назвать, а переделка требует ручного склонения. В CLAIMS.md отмечено.

validate.py: 0 ошибок, 0 предупреждений.

Часть 14. Вычитка items_029 — 258 строк

Самый показательный батч: он целиком стоит на одном стат-префиксе Cleric's, и тот переведён семью способами.

форма строк
клирика (канон корпуса) 319
клерика 50
священника 47
жреца 24
клерический 15
клирический 5
целителя 3

Сеты внутри разъезжались так же: Destroyer — «разрушитель» и «уничтожитель» (корпус 370 против 24), Diviner — «прорицатель» и «провидец» (171 против 47), Soft Wood — «мягкая древесина» и «мягкое дерево» (491 против 12). Scallywag звался плутом, негодяем, проходимцем, пройдохой, молодцем и шалопаем.

Два дефекта формы. Часть строк целиком взята в ёлочки, и кавычки попадали в название предмета: «Скипетр уничтожителя клирика». В других префикс уезжал в начало или превращался в прилагательное — «Клирика пика разрушителя», «Клирический длинный лук разрушителя»; приведены к структуре большинства: «‹предмет› ‹сет в родительном› клирика».

validate.py: было 5 предупреждений, стало 0 ошибок и 0 предупреждений.

Часть 15. Вычитка items_060 — 157 строк

Тот же расклад, что в части 14: стат-префикс Knight's на 316 строках, канон «рыцаря» в 220 из них, а ещё в 94 префикс превращён в прилагательное — «Рыцарский аурический молот», «Рыцарские сапоги каббалиста».

Две строки потеряли стат и подменили его чужим:

EN было стало
Knight's Diviner Leggings Походные поножи прорицателя Штаны прорицателя рыцаря
Knight's Exalted Coat Превосходный панцирь Клерика Возвышенное пальто рыцаря

Слоты: Greaves и Legs снова дали одно имя — «Закаленные чешуйчатые поножи рыцаря». Разведены на поножи и штаны, как в части 9.

Дефекты формы: в Knight's Auric Sword плюрал-группа навешена на прилагательное и рассогласована с существительным — «[Рыцарские|Рыцарских|Рыцарских] аурический меч»; в Knight's Masquerade Raiments скобка стоит без разделителей — «Одеяния маскарада [Рыцаря]», в игре это отрендерится литералом вместе со скобками.

По корпусу: Auric → «аурический» (237 против 48 «золотого»), Cabalist → «кабалист» (193 против 132 «каббалиста»), Kodan → «кодан» (249), Privateer → «капер».

validate.py: было 4 предупреждения, стало 0 ошибок и 0 предупреждений.

Часть 16. Вычитка items_024 — 275 строк

Рекорд разнобоя за весь PR: один стат-префикс Carrion на все 500 строк и восемь форм перевода.

форма строк
падали (канон) 172
падальщик 99
падаль 45
падальный 44
стервятник 43
трупный 27
мертвечина 4
карриона 2

Сверх того — «трупоед», «пожиратель трупов», «Мертвец», «Мертвящий».

Структура гуляла тремя способами сразу: префикс уезжал в начало («Падальщик посох Разрушителя»), превращался в прилагательное («Падальный короткий лук разрушителя») и выносился в скобки в конец («Поножи прорицателя (падаль)»).

Pauldrons в одной строке остались транслитерацией — «Паулероны из драконьей стали Падальщика».

Коллизии после сведения: Greatsword и Sword дали один «Мифриловый меч падали», Conch и Shell — одну «Жемчужную раковину падали». Пара Conch/Shell всплывает уже четвёртый батч подряд — возможно, её стоит закрепить в GLOSSARY.md как раковину и ракушку.

validate.py: 0 ошибок, 0 предупреждений.

Часть 17. Вычитка ui_071 — 27 строк

Самый чистый батч из вычитанных, но нашлось важное.

Имена Старших драконов мимо канона: Jormag шёл «Жормагом» вместо «Йормага», Zhaitan — «Жаитаном» вместо «Зайтана». По второму GLOSSARY.md принимал отдельное решение (2026-08-03) и прямо запрещает форму через «Ж».

Коллизии имён:

  • Ghost Leap и Ghostbore Leap дали один «Призрачный прыжок», хотя Ghostbore — название оружия (слой: Ghostbore Musket → «Призрачный мушкет»);
  • Gift of Expertise и Gift of Mastery — оба «Дар мастерства», при том что Expertise по GLOSSARY «Экспертиза», а «Дар мастерства» закреплён в слое за Mastery.

Топонимы по слою:

EN было стало
Verdant Brink Вердант Бринк Зелёный рубеж
Broadhollow Bluffs Утёсы Широкой Лощины Утесы Бродхоллоу
Provernic Crypt Склеп Проверна Провернийская крипта
Stonebore Vaults Своды Камнебура Склепы Стоунбора
Shiverpeaks Дрожащие вершины Дрожащие горы
Siren's Landing Земля Сирены Пристань сирен

«Гендарранские Поля» с заглавной шли вперемешку со строчными — 15 против 17, сведено к форме слоя. В дарах локации тоже были мимо: «Нового Каинэна» и «провинции Сэйтунг».

validate.py: 0 ошибок, 0 предупреждений.

Часть 18. Вычитка items_083 — 237 правок

Стат-префикс Ravaging на всех 500 строках. Шесть «законных» форм — «опустошающий» (263, канон корпуса), «разорительный» (95), «разрушительный» (58), «опустошительный» (5), «губительный» (2), «разоряющий» (2) — и сверх того десяток выдумок: Буйный, Грабящий, Яростный, Свирепый, Растерзающий, Сокрушающий, Гневный, Поджигающий, Пожирающая, Разрушающий, Драные, Рваный.

54 строки переводили стат не определением, а существительным: «Чешуйчатая куртка разорения», «Маска разорителя-мага», «Ботинки пирата (Разоритель) Лиссы», «Плечи кабалиста «Опустошение» Хоэльбрака». Стат там читается как часть названия вещи, а не как её характеристика.

Эти 54 строки сначала пробовал переделать автоматически — и отказался: удаление существительного регуляркой съедало пробелы («капюшон кабалистаЦитадели») и теряло слова («Штаны разорителя-мага» → «Опустошающие штаны», маг пропал). Выписал руками.

Коллизия при сведении: Ravaging Soft Wood Focus и Ravaging Soft Wood Staff оказались одним «посохом из мягкой древесины» — Focus переводился посохом, хотя это разное оружие.

Итог: канон стоит во всех 500 строках, коллизий нет, validate.py0 ошибок, 0 предупреждений.

Часть 19. Вычитка items_100 — 131 строка

Сам стат Shaman's тут почти в порядке («шамана» в 390 строках) — брак сидит в сетах и в форме.

Privateer шёл шестью способами: «Частный корсар», «Личная куртка», «частный штормовой», «Частный отряд», «частный судовладелец», «частный штурман» — при каноне корпуса «капер» (279 против 61 «пирата», 32 «частного», 18 «корсара»).

Shiverpeak: «Шиверпик» (25), «Ледяная Вершина» (18), «Ледяной пик», «Ледяные вершины». Слой знает Shiverpeaks как «Дрожащие горы»; в корпусе паритет 94 на 93, поэтому взят слой. Skeggox (бородатый топор) стал «шкурником» при корпусном «скеггоксе».

Семь коллизий, почти все знакомые по прошлым частям: Mace/Staff, Staff/Wand, Reaver/Sabre, Conch/Shell, плюс Hatchet и Maul, слитые в «топор», и Dirk of Earth, потерявший суффикс и совпавший с простым Dirk.

Восемь пустых строк — Einhänder и Zweihänder, немецкие названия одноручного и двуручного меча.

Плюс 35 строк с прямыми кавычками и одна со знаками ударения, которые README запрещает: «Шамáнский резной дуби́н я́рости».

validate.py: было 35 предупреждений, стало 0 ошибок и 0 предупреждений.

Часть 20. Вычитка items_107 — 296 правок

Стат Strong шёл четырьмя формами почти поровну: «прочный» (172), «крепкий» (158), «сильный» (105), «мощный» (11). Корпус тоже их делит — 88 / 46 / 85 / 4, — но «прочный» впереди и там, и там.

Плюс 17 строк, где стат стал существительным «силы» («Перчатки мага Силы», «Штаны разбойника силы») или чужим прилагательным: могучий, лихой, ловкий, могущественный, грозный.

Greatsword переводился то «двуручным мечом», то «большим мечом», то просто «мечом» — из-за последнего сливался с обычным Sword. Сведён к «большому мечу».

Подмены: Strong Iron Sword of Earth переводился скипетром, Strong Scout's Coat — «курткой заклинателя», хотя это разведчик. Focus и Scepter звались посохом и сливались со Staff — тот же класс, что в части 18.

Итог: канон стоит во всех 464 строках класса, коллизий нет, validate.py0 ошибок, 0 предупреждений.

Проверки

validate.py --warnings по всем двадцати восьми батчам: 0 ошибок, и 0 предупреждений на изменённых строках (в семнадцати вычитанных батчах чисто вообще; в items_081 осталось 97 предупреждений — они на строках с названиями сетов, которые я сознательно не трогал). Всё заливалось через tools/batch_tool.py fill, колонка english сверена с бэкапом байт-в-байт.

Часть 21. Вычитка items_081 — 307 строк

Стат Rampager's в пяти формах: «разрушителя» (121), «яростный» (114), «рампейджер» (78), «берсерк» (18), «буйство» (3).

Особенность батча — 157 строк, где стат вынесен в кавычки как обёртка: «Наплечники "Разрушитель"», «Великий меч "Яростный натиск"», «Плащ Бхалтазара "Ярость"». В игре кавычки попадают прямо в название предмета. В 92 строках внутри стоял только стат — сняты, стат переставлен в конец по общей структуре батча.

Коллизии: Hammer и Mace дали один «Железный молот» — трижды (сам по себе, со льдом и с убийством огров); Exalted Coat и Exalted Mantle — одну «Возвышенную мантию».

Чего я не сделал

В оставшихся 97 строках внутри кавычек не стат, а искажённое название сета: «Архангел Балтазара» вместо Armageddon, «Аврора Балтазара» вместо Aurora, «Мститель Разрушителя» вместо Avenger's, «Яростный грабитель» вместо Cabalist. Это уже не форматирование, а перевод названий — делать его наспех вместе с механикой неправильно. В CLAIMS.md отмечено, validate.py их видит (97 предупреждений из бывших 157).

Часть 22. Вычитка items_080 — 22 строки

Сам стат Rabid здесь почти в порядке («бешеный» в 396 строках), поэтому работа вся в точечных дефектах — и они показательные.

Подмены типа вещи: Rabid Iron Axe переводился «железным щитом» и совпадал с настоящим Rabid Iron Shield; Rabid Rubicon Hat — шляпа — стал «Яростной топор-секирой».

Коллизии, где машина свела разное оружие к одному слову:

пара стало
Bandit Sunderer / Demolisher раскалыватель / разрушитель
Ceremonial Scimitar / Sabre ятаган / сабля
Glyphic Edge / Handblade грань / ручной клинок
Armageddon Leggings / Greaves штаны / поножи

Aurora переводилась «зарёй» при каноне «Аврора» (97 против 23), а в одной строке стат превратился в «шлем Лиссы от бешенства». Quaggan — «Куакка» при каноне «квагган» (288).

Стат уходил не туда: «Сапоги бешеной дриады» — бешеная не дриада, а сама вещь; «Сапоги дракона «Бешенство»» — стат в кавычках; «Бешеная бусинная утренняя звезда» носила чужой стат «берсерка».

Skin снова переведён «Кожей» — «Кожа для тигриного грифона» вместо облика.

validate.py: 0 ошибок, 0 предупреждений.

Часть 23. Вычитка items_035 — 145 строк

Стат Dire в пяти формах: «грозный» (184), «жуткий» (51), «ужасный» (27), «мрачный» (26), «зловещий» (20), плюс выдумки «устрашающий», «свирепый», «яростный». Канон корпуса — «грозный».

Коллизии. Aureate Charm и Aureate Targe свелись к одному «тарчу» — это талисман и щит, разные вещи; README как раз приводит Targe примером типа, спрятанного за словом сета. Krytan Greatsword и Sword — оба «меч», причём в трёх суффиксных парах сразу.

Заодно у Greatsword разнобой: «великий меч», «горский меч», просто «меч». Aureate шёл «ауреатным» и «золотым» при каноне «золочёный» (73). Krytan в одной строке стал «кванским», в другой потерял стат целиком — «Крайтанский меч немощи» вместо грозного.

validate.py: 0 ошибок, 0 предупреждений.

Часть 24. Вычитка items_082 и дочистка items_081 — 315 строк

items_082 — тот же расклад, что в части 21: стат Rampager's четырьмя формами и 217 строк, где стат вынесен в кавычки как обёртка. В 96 из них внутри стоял только стат.

Коллизии: Pearl Conch / Pearl Shellшестой батч подряд с этой парой; Rogue Gloves / Scallywag Gauntlets свелись к «перчаткам скрытности», хотя это разные сеты; Rampart Heavy Armor / Heavy Warplate — к одному «тяжёлому доспеху»; Reinforced Scale / Tempered Scale — к «усиленной чешуе», хотя второе закалённое.

Дочистка части 21

После первого захода в items_081 осталось 97 строк с кавычками — но 33 из них содержали внутри уже правильный стат, кавычки просто не сняло: моя регулярка требовала точного совпадения всей строки. Тем же приёмом прошёл по обоим батчам: было 97 и 153, стало 56 и 101.

Что осталось

В оставшихся строках обоих батчей внутри кавычек не стат, а искажённые названия сетов: «Грозовой», «Пожиратель», «Истребитель змеев», «Призыватель демонов», «Подкрадывающийся хищник», «Скрытный вор». Это перевод названий, а не форматирование — в CLAIMS.md отмечено.

validate.py: items_082 — было 217 предупреждений, стало 108; items_081 — было 97, стало 56.

Часть 25. Вычитка items_103 — 9 строк

Батч оказался почти вычитанным: стат Soldier's стоит «солдатом» в 297 строках из 300. Работа свелась к дефектам формы.

  • «[Толстые тяжёлые пластинчатые поножи солдата]» — квадратная скобка без разделителей, в игре отрендерится литералом вместе со скобками;
  • «Сапоги капера с характеристиками «Солдат»» — вложенные ёлочки одного рисунка плюс стат вынесен в кавычки;
  • в браслете Соггорсорта потерян неразрывный пробел, который в оригинале держит имя и «дружбу» вместе.

Выбросы стата: «Великий меч воина-ауреата», «Крайтанский короткий лук», «Поножи странника тумана» — во всех трёх Soldier's пропал, а в первой ещё и Aureate стал «ауреатом» при каноне «золочёный».

Коллизия: Bronze Greatsword of Force и Bronze Sword of Force — оба «Бронзовый меч солдата силы». Пара Greatsword/Sword всплывает четвёртый батч подряд.

validate.py: было 5 предупреждений, стало 0 ошибок и 0 предупреждений.

Часть 26. Вычитка items_064 — 60 строк

Рекорд PR по числу коллизий — двенадцать, включая две тройные.

Full Moon (17 строк) развалился в структуре: «Топор "Полная луна" мага», «Кинжал "Полная луна мага"», «Полная лунная булава мага», «Полный лунный щит мага», «Скипетр полной луны мага». У трёх строк тип вещи потерялся вовсе — Focus, Pistol и Torch все стали просто «Полной луной мага».

Ursan Ornamented (17 строк): структура цела, но подменены типы. Mace стал «боевым молотом», Scepter — «посохом» и совпал со Staff, Rifle получил рассогласование «Украшенный ружьё», а Greatsword расплылся в «Великий меч Урсана, украшенный магическими рунами».

Тройная коллизия в Pearl: Broadsword, Reaver и Sabre — все «Жемчужная сабля мага». Разведены на палаш, жнеца и саблю по прецедентам items_006.

Прочие коллизии знакомые: Ceremonial Sabre/Scimitar, Banded Greaves/Legs, Aureate Mace/Staff, Iron Hammer/Mace, Magical Mace/Scepter Skin, а также Aureate и Verdant Short Bow, у которых потерялся сет. Conch/Shellседьмой батч подряд.

Кавычки (26 строк) здесь, в отличие от части 21, снимаются полностью: внутри известные названия сетов. Aurora сведена к канону «Аврора» (было «Северное сияние»), Highlander оказался «горняком» вместо горца, Rogue Pants — транслитерацией «Мэджик Роуг». Skin в шести строках снова переведён «Кожей».

validate.py: было 36 предупреждений, стало 0 ошибок и 0 предупреждений.

Часть 27. Синхронизация с main и канон Rampager's — 554 строки

Влил ваш 0f24757 в ветку: PR снова мержится. Конфликты были в четырёх файлах, и один из них оказался важнее остальных.

items_024 взял целиком вашим. Вы вычитали его заново, и ваша версия точнее моей: у меня после пословной замены осталось «падали посох Разрушителя». Претензию в CLAIMS.md переписал на вас, свою снял.

items_060 — построчно. Две строки ваши (Двуручный меч Рыцаря из тёмной стали, Мифриловая гравировка с накладками Рыцаря), две мои — там я снимал кавычки-обёртки, а формулировка совпадала.

Стат Rampager's — вы поправили шесть строк, и вы правы

В items_081 вы заменили мой «разрушителя» на «Буяна». Ошибка была моя, и класс её знакомый: Destroyer в тех же строках тоже «Разрушитель», то есть стат и набор схлопывались в одно слово — ровно та коллизия, которую я ищу в каждом батче и в этом проглядел.

Канон подтверждается и без вашей правки: 77 строк рецептов по всему корпусу пишут «с характеристиками «Буян»». Прогнал по обоим батчам, 554 строки:

что строк
стат стоял в хвосте отдельным словом — прямая замена 397
хвост «для яростных воинов» снят, стат переставлен в конец 23
стат отдельным словом в середине фразы 107
набор Destroyer выписан по эталону серии Apothecary's Destroyer 19
остались обе формы сразу — лишнюю убрал вторым проходом 14
набор Emblazoned сведён к «гербовый» по корпусу 7

Набор Destroyer теперь идёт вашей же структурой — «Топор Буяна из разрушителя», «Ружьё Буяна из разрушителя», — то есть вещь, стат, материал в хвосте.

Строка «Наплечники Буяна» после чистки досталась сразу двум ключам (Assassin's Shoulderpads и Emblazoned Shoulders) — развёл: «Наплечники убийцы Буяна» и «Гербовые наплечники Буяна».

Коллизии, вылезшие на постпроверке по всему корпусу

По одной строке в чужих машинных черновиках, все правки точечные:

  • «Жемчужное жало» одинаково звало четыре стата (Magi's, Marauder, Trailblazer's, Rampager's) — сведены к «мага», «мародёра», «первопроходца», «Буяна» по структуре остальных двадцати строк семейства;
  • Shredded Garment отделён от Ragged Garment — «Изодранная одежда»;
  • Scallywag Legs отделены от Rascal Pants — «Штаны негодяя», как в соседних Scallywag Greaves/Pauldrons.

validate.py по items_081/082: ошибок 0, коллизий 0. Предупреждений 165 — это прежний долг по кавычкам, он не вырос.

Что осталось

108 строк, где стат вписан внутрь фразы: «Кабалистский плащ Двайны яростного», «Ноги странника из экипировки берсерк». Заменой их не вытащить — нужен перевод строки целиком. В CLAIMS.md отмечено числом, не галочкой.

Два расхождения с корпусом в вашей правке

Не трогал, выношу как есть — решение ваше:

  • Greatsword → «Двуручный меч»: корпус даёт «большой меч» 126 против «двуручный меч» 56;
  • Plated Inscription → «гравировка с накладками»: корпус даёт «пластинчатая надпись» 18 против 3.

Если это новый канон — скажите, прогоню по корпусу разом, а не по одному батчу.

Часть 28. Вычитка items_069 — 284 строки, класс Mini

Батч выбран скриптом однородности и вышел на первое место с большим отрывом: доля первого слова english100%, все 372 коротких строки начинаются с Mini, а перевод расходится на 142 формы. Это же и весь дефект: приставка стояла тремя способами вперемешку — «Мини Х», «Мини-Х», «Миниатюрный Х».

Канон взят из слоя pn_*: Mini Jungle Boar → «Мини-лесной кабан», Mini White Kitten → «Мини-белый котенок». Его же держат описания в minis/. Сведено 185 строк с пробелом и 13 с «Миниатюрным».

Регистр — 43 строки. Из английского тянулся Title Case: «Мини Золотой Щенок Шакала». Решать по корпусу «строчных больше заглавных» нельзя — корпус сам полон машинного Title Case, и такая проверка защищала бы как раз брак. Правило другое: слово опускается, если встречается строчным хоть где-то (имя собственное строчным не встречается никогда), и опускание идёт только до первого имени собственного — дальше стоит прозвище, где заглавные законны: «Мини-Элоб Ядовитый Клык», «Мини-Фустиву Весёлый».

Семейства, сведённые вручную:

класс что было стало
ламы Fancy шёл «шикарной», «изысканной», «Нарядной»; Elegant — «элегантной» и «изящной»; «элегантный чёрный лама» нарядная / элегантная / роскошная, род исправлен
детёныши Hatchling — «детёныш», «птенец», «детеныш» вперемешку у птиц птенец, у ящеров и черепах детёныш
Kit «набор спрингера», «спрингерёнок» детёныш спрингера — GLOSSARY говорит это прямо
экзокостюмы «Мини-экзокостюм «Спрингер»», «Мини-шакал экзо-костюма» зверь в экзокостюме
скритты «подарок скритта», «Щедрый Дар Скритт» «Мини-дар скриттов» по minis/minis_001

Подмены зверя, запрещённые таблицей маунтов в GLOSSARY.md: Skimmer стоял «скатом», «скаймером», «скимером»; Skyscale — «небесной чешуёй» и «скайскейлем»; Raptor — «ящером»; Jackal — «джакалом» и «жаком».

validate.py: было 7 предупреждений, стало 0 ошибок и 0 предупреждений.

Часть 29. Сверка с README: четыре отклонения, все закрыты

Пользователь попросил перечитать README и проверить, не отклоняемся ли мы от правил. Отклонялись — в четырёх местах, и три из них тянулись через весь PR. Разбор ниже; всё перечисленное уже исправлено в ветке.

1. Слой pn_* — 369 названий не заведено (п.6)

Самое крупное. Правило говорит прямо: «Встретил название, которого в слое нет, — заведи его туда, а не переводи только в своей строке», а раздел «Слой pn_* — реестр ВСЕХ названий» перечисляет мини отдельной строкой. За 30 коммитов в слой не ушло ни одного названия: из 372 имён мини в items_069 в слое лежало ноль.

Смысл правила не в переводе, а в обратимости: игрок выключает translate_proper_nouns, получает английское имя и ищет мини на вики или на торговой площадке. Что это ломало на практике, видно в самом репозитории — в minis/minis_001 названия мини склоняются внутри фраз («Объедините 3 Мини-барона фон Скрэбблбаттса»), и каждая такая строка переводилась заново вручную.

Добавил 369 строк в pn_additions.csv, слой pn_names. Отсеял по признаку из README («в слой идут НАЗВАНИЯ, а не фразы»): восемь длинных описаний и три сундука с наградой — это предметы, а не сами мини. Дублей с существующим слоем нет.

Чтобы это доехало до bin, нужен dict_tool.py pnadd --file pn_additions.csv. Сам bin не трогал.

Названия вещей из items_081/082 в слой не понёс: у них обратимость обеспечивает отдельный словарь dict_item_names, который выключается штатной опцией. Тысяча записей в pn_* — это решение по устройству слоя, и принимать его вам.

2. Три формы склонения — 73 строки (п.3)

Строки из части 1 этого PR заполнялись родительным множественного: «Выполните %num2% достижений». В игре при единице это даёт «Выполните 1 достижений». Правило п.5 про родительный множественного касается только счётчиков %num1%/%num2%, а здесь одиночный %num2% и [s] в оригинале.

Линтер это и говорил в --warnings — в тех коммитах я смотрел только на ошибки. Оформление взял из человеческих батчей ach_*: одиночное существительное — группа на окончании («достижени[е|я|й]»), связка прилагательного с существительным — группа на всю связку («[ежегодное достижение|ежегодных достижения|ежегодных достижений]»). Форма 2 везде родительный единственного, как требует п.3.

ach_005/006/032: было 74 предупреждения, стало 0.

3. Знаки ударения — 5 строк (п.7)

README запрещает их без исключений, а validate.py:649 ругается только на ударение не на гласной — «Самаро́г» для него корректен, поэтому класс проходил молча. Снял в items_069, items_063, items_099 (там же Skin сведён к «облику») и ui_096.

В ui_096 вместе с ударением обнаружился пример из README прямо в переводе: Mini[pl:"Minis of"] Eelob Poisonfang → «Мини[Болотная лягушка|Болотные лягушки|Болотных лягушек] Еело́б Ядокуса». Группа склонения про болотных лягушек скопирована в имя мини. Переписал тремя формами по п.3.

4. index.py proof и who — не использовались

README называет proof штатным способом вычитки машинного батча, а who — правилом перед переводом незнакомого имени. Я ходил в pn-файлы грепом и считал корпус питоном: данные те же, но колонку ЛЮДИ не смотрел вовсе. Граф при этом был собран и лежал под рукой.

Прогнал proof по всем 380 строкам items_069 — 131 подсказка ЛЮДИ, 25 правок:

  • слой против моей отсебятины: Evon Gnashblade → «Эвон Гнашблейд» (у меня «Гнашиблейд»), Priory → «Приорат» (у меня «Орден»), drake → «дрейк» (Risen Drake Broodmother была «праматерью восставших драконов»), Grawl → «Граул»;
  • человеческие батчи против черновика: старпом Хоррик, работорговец крайтов, расплавленный берсерк, грибной бомбардир, квагган ледяного отродья, рифовый наездник, кукла-принцесса, нефритовый бот, страж Министерства, «Безумные мемуары» в кавычках, Око Суда.

Дважды прав оказался не человек. Порядок источников из README ставит слой выше корпуса, и это спасло от порчи: Seraph — в слое «Сераф», и new_025 с «Лучником Серафимов» ему уступает; Queen Nadijeh — в слое ровно эта запись, «Королева Надиджа», а ui_126 пишет «Надижи». Оба оставил как было. Колонка ЛЮДИ — подсказка, а не приговор.

Батч дополнительно прогнан через batch_tool.py fill --dry-run: гейты пройдены, сверка колонки english байт-в-байт чистая. Остаточные предупреждения о латинице — обозначения моделей (G.O.X. 2.1.23, GL-XC S7S, Mark I) и бренд Funko POP!.

Чего не нарушали

Колонку english не трогали ни в одном из 33 файлов (сверено побайтно с main), dictionary.bin не правили, плейсхолдеры и теги на месте — validate.py по всем нашим файлам даёт 0 ошибок.

Часть 30. Вычитка ui_095 — 188 строк, группы склонения в классе Mini

Соседний батч к items_069, и ошибки, как предупреждает README, ходят семьями: тот же класс Mini, но здесь у каждой второй строки в оригинале стоит [s] или [pl:…], и весь брак сидит в группах склонения. Линтер по батчу молчал: 0 ошибок и 0 предупреждений до правок.

Форма 2 была сломана системно — 47 строк

Пункт 3 требует для формы 2 (числа 2–4) существительное в родительном единственного, а прилагательное при нём стоит во множественном: «2 бур-ых медвед-я». В батче прилагательное стояло в родительном единственного:

было в игре при двойке стало
[Мини-бурый медведь|Мини-бурого медведя|…] «2 мини-бурого медведя» Мини-бур**ых** медведя
[Мини-бронзовая лама|Мини-бронзовой ламы|…] «2 мини-бронзовой ламы» Мини-бронзов**ые** ламы

Пример самого README — «[Болотная лягушка|Болотные лягушки|Болотных лягушек]» — даёт ровно это. Линтер такое пропускает: он проверяет, что форм три, а не что они верные.

Род брал из формы 1, плюс правило жи-ши — без него выходило «императорскые» и «арктическых». Отдельно пришлось ограничить замену прилагательными перед главным словом: в «детёныш арктической лисы» «арктическая» относится к лисе, а не к детёнышу.

Приставка — 81 строка

Стояла тремя способами сразу:

  • Мини [щенок аква-шакала|щенка…|щенков…] — снаружи через пробел (72 строки);
  • Мини-[синий кот|синего кота|синих котов] — снаружи через дефис;
  • [Мини-лама|Мини-ламы|Мини-лам] «Нарядная чёрная» — внутри группы.

Оставлен третий: группа обязана покрывать склоняемое имя целиком, а приставка — его часть. Плюс 8 строк с «Маленьким» и «Миниатюрным».

Группа на чужом слове — 13 строк

[Мини|Мини|Мини] золотой щенок шакала — три одинаковые формы на приставке, а склоняется имя. Это ровно случай из п.4 про «Пир[|ы] сальсы»: группа навешена не на то слово.

Трёх форм не было вовсе — 13 строк

Там же самые грубые ошибки: «Маленький злой снеговики», «миниатюрный чёрный грифончики», а Mini Fire Raptor Hatchling и Mini Green Raptor Hatchling оба звались «Маленький зелёный Раптор Вылупляющийся» — у огненного цвет чужой.

Три пустые ячейки заполнены: Mini "Knuckles", Mini Hylek Nahualli, Mini Hylek Tlamatini — имена взяты из слоя.

Имена по слою

EN было слой
Braham Eirsson Брэм Эйрссон Брейхам Эйрссон (корпус 78:70, и ваш коммит за Брейхама)
Kryptis Крит Криптис
Kasmeer Meade Касмиир Мид Касмир Мид
Scarlet Скарлетт Скарлет

Mini Kryptis Skyscale был «Криптис-небоспин» — Skyscale по таблице маунтов в GLOSSARY.md скайскейл.

Коллизии

Mighty Impact, Mighty Smash и Mighty Leap схлопывались с Power Crash, Power Strike, Forceful Blow и Heavy Leap в «Мощный удар» и «Мощный прыжок» — семь английских ключей на одно имя. Mighty разведён на «Могучий» (корпус даёт 80 вхождений), Impact на «столкновение». Осталась пара Midnight Yew Dye и Midnight Yew Dye[s] — одна и та же краска в двух контекстах, разводить нечего.

Слой

184 названия мини из батча заведены в pn_additions.csv по п.6, как и для items_069. Имя бралось из формы 1 группы, разметка [s] и [pl:…] из ключа снята — в слой идут названия, а не строки с разметкой. Итого в файле теперь 608 строк, ждущих dict_tool.py pnadd.

validate.py: 0 ошибок, 0 предупреждений. batch_tool.py fill --dry-run: гейты пройдены, сверка колонки english чистая.

Часть 31. Вычитка items_084 — 232 строки, стат Ravaging и рамка Recipe Unlock

Батч на одном стат-префиксе — по метрике самый выгодный тип. Канон был известен заранее: Ravaging → «опустошающий», корпус даёт 141 против 45 «разорительного» и 22 «разрушительного». В самом батче он уже стоял в 116 строках из 208 — они и дали структуру-эталон: «Опустошающий паровой пистолет точности».

Стат — 55 строк заменой, 37 руками

Прилагательные менял полными формами, а не склейкой основы с окончанием: у «разорительный» и «опустошающий» окончания совпадают, а у «грабительский» нет, и склейка дала бы «опустошающский». Замена работала только там, где english начинается с Ravaging; омонимов вроде Destroyer в ключах не оказалось ни одного.

Руками пришлось брать 37 строк, где стат стоял существительным или пропал вовсе:

EN было стало
Ravaging Swindler Boots Сапоги мошенника опустошения Опустошающие сапоги мошенника
Ravaging Student Shoes Обувь студента разрушения Опустошающие студенческие ботинки
Ravaging Studded Gloves Рваные шипованные перчатки Опустошающие клепаные перчатки
Ravaging Steam Scepter of Grawl Slaying Разъяряющий скипетр пара из Убийства граулов Опустошающий паровой скипетр убийства граулов
Ravaging Steamcaller of Debility Грабящий паро-зовник немощи Опустошающий паровой боевой рог немощи

Это ровно признак из части 19: удаляемый фрагмент стоит в середине строки — регулярка съест соседние слова.

Канон сетов взят из корпуса: Steam «паровой» (89), Swindler «мошенника» (58), Worn Scale «поношенные» (27), Verdant «зелёный» (26 — и ваше решение в items_020..028), Studded «клепаные» (8). Типы вещей: Mace «булава» (501), Gauntlets «перчатки» (239). Суффикс of Ogre Slaying — «убийства огров» (61).

Recipe Unlock — 138 строк, и это крупнее самого стата

183 строки батча несли один и тот же префикс десятью способами:

RU строк
Открытие рецепта: 73
Разблокировка рецепта: 71
Рецепт: 31
Рецепт открыт: / Раскрыть рецепт: / Открыть рецепт: / Изучение рецепта: / Разучить рецепт: по 1–2

Глагол расходился тоже: «открыть» 96, «разблокировать» 71, «изучить» 9.

Канона нет ни в GLOSSARY.md, ни в слое — это фраза, а не название, — а корпус сам машинный: items_085 даёт те же четыре варианта. По README это случай «и только потом — собственное решение, с записью в GLOSSARY.md». Записал туда отдельным пунктом, помеченным как предложение:

Recipe Unlock: Double-click to unlock the ‹ремесло› recipe for ‹X›.Открытие рецепта: Дважды щёлкните, чтобы открыть рецепт ‹ремесла› для ‹X›.

Выбрано по большинству внутри батча и потому, что «разблокировка» — калька. Решение моё, не ваше — если рамка должна быть другой, скажите, прогоню по корпусу разом. Правил только рамку; название ремесла и блюда осталось как было.

Коллизии — все четыре разведены

  • Ravaging Worn Chain Greaves и Ravaging Worn Chain Legs схлопнулись в «поножи» — README прямо говорит, что Legs и Greaves в одном сете разные слоты;
  • Reaper of Souls совпал с Soul Reaper из ui_134 → «Пожинатель душ»;
  • Reaver of the Mists — с Mistrender из new_120 → «Жнец Туманов»;
  • два рецепта чили, огненный и пряный, стали одной строкой.

validate.py: было 2 предупреждения, стало 0 ошибок и 0 предупреждений. batch_tool.py fill --dry-run: гейты пройдены. Знаков ударения нет.

Часть 32. Вычитка items_118 — 247 строк, стат Valkyrie развёрнут в родительный

Батч выбран не только скриптом однородности. После части 31 я добавил вторую проверку — разнобой служебных рамок в переводе, которого метрика по первому слову english не видит. У items_118 она дала худший результат из всех кандидатов: у семейства Valkyrie Eagle Eye шестнадцать форм рамки на шестнадцать строк, то есть каждая строка своя.

Канон дал человеческий батч

В ui_157 пятнадцать строк Valkyrie из пятнадцати пишут «Амулет Валькирии», «Гравировка Валькирии из старой древесины», «Вышитая льняная инсигния Валькирии» — родительный после вещи, материал в хвосте. Ровно та структура, которую вы задали для Rampager: вещь, стат, материал. В слое и GLOSSARY.md записи нет, корпус вне батча даёт те же «валькирии» 18 раз.

Это не замена слова, а разворот структуры

В батче стат стоял прилагательным перед вещью — «Валькирийский аурический кинжал» — в 125 строках. Пословная замена тут бессильна: нужно снять прилагательное с начала, поднять регистр у нового первого слова и поставить «Валькирии» после вещи, но перед хвостом с материалом:

было стало
Валькирийское копьё из тёмной стали Копьё Валькирии из тёмной стали
Валькирийский посох из старой древесины Посох Валькирии из старой древесины
Валькирийские благородные сапоги Благородные сапоги Валькирии

Ещё 80 строк имели верную структуру, но стат со строчной.

39 строк развернуть автоматом не вышло — и там же худшее

  • «Валькирия: Фокус ауры», «Валькирия: Посох ауры» — стат вынесен в заголовок через двоеточие;
  • «Мстительный великий меч разрушителя», «Наплечья драконьи трупные», «Тесак огров доблести» — стат потерян вовсе, а в двух последних ещё и отсебятина;
  • «Боец с крайтами-валькириями», «Предвестник огров-валькирий» — стат прилеплен к существу, и название предмета превратилось в описание;
  • «Валькирическая», «Валькирийный», «Валькирий», «Валькрийский» — четыре несуществующих формы слова.

Набор Destroyer выписан по эталону серии Apothecary's Destroyer, как в части 27: «Двуручный меч Валькирии из разрушителя». Канон прочих сетов из корпуса: Auric «аурический» (178), Speargun «гарпунное ружьё» (165), Draconic «драконьи» (196), Emblazoned «гербовый» (181, как свёл в части 28), Tempered «закалённый» (67), Feathered «пернатый» (31), Prowler «бродяги» (16).

Коллизии — все пять разведены

  • Pearl Conch и Pearl Shellвосьмой батч подряд с этой парой;
  • Tempered Scale Greaves и Legsвторой батч подряд после части 31, поножи против штанов;
  • Valkyrie's Amulet совпал с Valkyrie Amulet из ui_157 — это разные предметы;
  • Ventari's Greaves и Leggings, а после правки ещё и Breeches — три слота на одно название, разведены на поножи, штаны и бриджи.

validate.py: 0 ошибок и 0 предупреждений и до, и после — батч был формально чистым, как ui_095. batch_tool.py fill --dry-run: гейты пройдены. Остаточная латиница — PvP, служебный идентификатор и легендарка Velocitas Eradico, которая по вашему канону остаётся латиницей.

Пара Conch/Shell встретилась восьмой раз, Greaves/Legs — второй подряд. Это тот самый аргумент за таблицу устойчивых пар в GLOSSARY.md, которую я предлагаю ниже.

Часть 33. Вычитка items_036 — 287 строк, два стата сразу

Батч выбран проверкой на разнобой служебных рамок: у семейства Diviner's Mist Shard пятнадцать форм на восемнадцать строк. Внутри оказались два стат-префиксаDire на 263 строки и Diviner's на 97, и структура у них разная.

Dire → «грозный», прилагательное перед вещью

Канон подтверждён с двух сторон: человеческие батчи дают 323 вхождения против 3 машинных, и свёл его я сам в items_035, соседнем файле. 101 строка заменой.

Своя же ошибка, пойманная на первом прогоне. Таблицу форм я сперва собрал программно из основ и получил «Грозний»: у «жуткий» основа заднеязычная и мужской род на «-ий», у «грозный» твёрдая и на «-ый». Ровно то, от чего меня уберегли части 22 и 23, — и на что я всё равно наступил, стоило понадеяться на генерацию вместо явного списка. Переписал списком из тридцати пяти форм.

Diviner's → «Прорицателя», родительный после вещи

Канон дал человеческий ui_055: «Снаряжение Прорицателя», «Врата Прорицателя», «Книга рецептов брони Прорицателя». В батче стояли «провидца» 30, «предсказателя» 7 и даже «дивинера». 85 строк.

Семья Orrian пересобрана целиком — 191 строка

Сначала я собрал по таблицам только те 36 строк, где стат потерялся, а остальные пропустил как готовые. Постпроверка коллизий показала, чего это стоило:

ключи оба звались
Orrian Longsword of Water и of Earth длинный меч Земли
Orrian Rifle of Rage и of Agony ружьё агонии
Orrian Staff of Blood и of Bloodlust посох крови
Orrian Spear of Blood и Speargun of Blood копьё крови

Стат стоял верно, а суффикс был чужой — и такие строки мой фильтр считал готовыми. Пересобрал все 191 по ключу: стат, набор, тип вещи, суффикс, с согласованием рода (булава и сабля женского, копьё и ружьё среднего). Заодно ушли подмены типа вещи: ятаган вместо сабли, копьё вместо гарпунного ружья, дробитель вместо крушителя.

Вывод на будущее: «стат уже стоит» не значит «строка готова». Фильтр по стату пропускает битый хвост.

30 строк вне семьи Orrian — руками

Канон сетов из корпуса и слоя: Diviner's Reach — «Владения Прорицателя» (слой pn_*), Privateer «капер» (255), Rogue «разбойник» (93), Crusher «дробитель» (50), Reaver «жнец» (60), Sneakthief «скрытный вор» (42), Bludgeoner «дубина» (50), Brazier «жаровня» (197 — стоял «треножник»), Broadsword «палаш».

Коллизии — все семь разведены

Pearl Conch и Shellдевятый батч подряд с этой парой. Ещё две пары слотов в одном сете: Bracers и Gauntlets, Pauldrons и Shoulders — по README это разные слоты, одним словом звать нельзя.

validate.py: было 2 предупреждения, стало 0 ошибок и 0 предупреждений. batch_tool.py fill --dry-run: гейты пройдены. Знаков ударения нет.

Часть 34. Вычитка items_068 — 83 строки, стат Mighty

Батч выбран проверкой на разнобой рамок: у семейства Mighty Soft Wood восемнадцать форм на двадцать семь строк.

Канон — «мощный»

Человеческие батчи дают 34 вхождения против 16 «могучего», по всему корпусу 126 против 33. Стат остаётся прилагательным перед вещью. 74 строки заменой: «Могучий», «Могущественный», «Крепкий», «Сильный», «Прочный» — пять слов на один стат.

Таблицу писал явным списком, не собирал из основ. После «Грозния» в части 33 это уже не гипотеза: у «могуч» основа шипящая, у «мощн» твёрдая, и склейка дала бы тот же брак.

Расхождение с моей же правкой в части 28 — называю честно

В ui_095 я развёл Mighty Impact, Mighty Smash и Mighty Leap на «Могучий», потому что семь английских ключей схлопывались в «Мощный удар» и «Мощный прыжок». Здесь канон противоположный.

Считаю, что случаи разные: там названия умений, где коллизию надо было чем-то разбивать, здесь стат-префикс на снаряжении. Если хотите единообразия — скажите, сведу обе стороны.

Три строки, где стат пропал вовсе: «Дубовый длинный лук Доблести (слабость)», «Короткий лук охотника на огров Силы», «Дубовый посох из мягкой древесины силы «Лед»» — во всех трёх дуб взялся ниоткуда, Soft Wood это мягкая древесина.

Коллизии — все шесть, и пять из них подмена типа или слота

ключи было стало
Bronze Greatsword и Sword оба «бронзовый меч» большой меч против меча (пятый батч с этой парой)
Chain Helm и Chainmail Helm оба «кольчужный шлем» Chain «кольчужный», Chainmail «латный» — по корпусу
Chain Pauldrons и Chainmail Shoulders оба «кольчужные наплечники» плюс разведены слоты: наплечники против наплечей
Harpoon и Speargun оба «гарпун» Speargun — гарпунное ружьё (канон 165)
Soft Wood Focus of Hobbling назывался посохом фокус; совпадал с настоящим Staff
Mighty Ring и Powerful Ring оба «мощное кольцо» одна строка в машинном items_078 переписана на «Могучее кольцо», чтобы канон «мощный» остался за Mighty

Прямые кавычки: «'Мешок шахтёра'» в тройных кавычках и «Мини "Кэрн Неукротимый"» — сняты, второй заодно приведён к канону приставки «Мини-».

validate.py: было 2 предупреждения, стало 0 ошибок и 0 предупреждений. batch_tool.py fill --dry-run: гейты пройдены. Знаков ударения нет.

Часть 35. Вычитка ach_009 — 121 строка, топонимы к слою с падежом

Батч выбран проверкой на разнобой рамок: у семейства Daily Drizzlewood Coast одиннадцать форм на двадцать одну строку. Линтер при этом молчал — 0 ошибок и 0 предупреждений до правок, третий такой случай после ui_095 и items_118.

Топонимы — 89 строк, пункт 6

Один и тот же Drizzlewood Coast шёл тремя способами: латиницей «на побережье Drizzlewood», выдуманным «Побережье Моросящего Леса» и — ни разу — канонным «Побережье Дриззлвуд» из слоя. Правило говорит прямо: бери форму из pn_*.csv дословно, не сочиняй свою.

Слой даёт именительный, а в батче предложный оборот. Прямая подстановка даёт «в Пустынное нагорье» и «вокруг Дебри Эховальда». Поэтому таблица на каждый топоним хранит три формы — именительный, после «в/на» и после «вокруг/из», — и подстановка смотрит на предлог:

было стало
завершение событий в Crystal Oasis завершение событий в Кристальном оазисе
камней вокруг Echovald Wilds камней вокруг Дебрей Эховальда
охота на Доминион на побережье Drizzlewood охота на Доминион на Побережье Дриззлвуд

Двадцать пять топонимов: Кристальный оазис, Дебри Эховальда, Долина Гротмар, Речные земли Элона, Сухие Топи, Залив Углей, Каледонский лес, Опустошение, Пики Громовой головы и прочие.

Отдельная ловушка: латинский остаток без головы словосочетания. «на побережье Drizzlewood» и «в Grothmar» при наивной замене превращались в «на Дриззлвуд» и «в Гротмар» — голова терялась. Развернул по английскому ключу: если в нём стоит Drizzlewood Coast, то и в переводе должно быть полное название.

Легендарки — 21 строка

По вашему канону из 0f24757 они остаются латиницей в кавычках, а стояли голыми: «Создайте легендарное оружие Bolt.» Обёрнуты.

Восемь строк начинались наречием «Ежедневно» вместо названия достижения — переписаны. Три пустые ячейки заполнены с тремя формами склонения по пункту 3.

Коллизии — три, и одна нашла нарушение другого правила

Cultural Exchange совпал с Intercambio cultural и Kultureller Austauschэто испанский и немецкий оригиналы, и README велит оставлять такие строки пустыми, а не переводить. Очистил обе в new_069 и new_072. Ещё Crash Land в new_048 и Pruning the Weed в ach_024 — по одной строке в машинных черновиках.

Чего не сделал

В переводе осталось 61 латинское название, из них 36 лежат в слое — там латиница законна, движок подставит русскую форму сам и игрок сможет вернуть английскую. Остальные 25 в слое отсутствуют, и по пункту 6 их надо заводить.

Не стал: в pn_additions.csv уже 608 строк ждут вашего dict_tool.py pnadd, и добавлять туда ещё до разбора первой партии смысла нет. Отмечено в CLAIMS.md числом, а не галочкой.

validate.py: 0 ошибок и 0 предупреждений. batch_tool.py fill --dry-run: гейты пройдены. Знаков ударения нет.

Часть 36. Вычитка ui_152 — 269 строк, форма 2 склонения в семье Track

Батч выбран новым способом — по графу, а не по однородности первого слова. После того как в ветку влился ваш graphserve, я посчитал по базе дефекты и латиницу отдельно по файлам батчей.

Первая попытка вывела наверх ui_010ui_014, но это оказался ложный след: метрика считала латиницей плейсхолдеры %str1%%str2% в шаблонах линковки гардероба, где перевод как раз русский. С вырезанием служебных токенов (как это делает batch_tool.py) наверх вышел ui_152356 дефектов при одной строке с латиницей.

Главное: запрещённая форма склонения в 323 строках

Пункт 3 README запрещает её прямым примером: Рецепт[|а|ов] ✅, Рецепт[|ы|ов] ❌ — «даст „5 рецепты“». В батче стояло Трек[|и|ов], то есть ровно «2 треки». Форма 2 — родительный единственного: «2 трека».

Линтер это пропускает — он проверяет, что форм три, а не что они верные. Третий такой случай за PR после частей 28 и 32.

По той же семье

  • 13 строк потеряли номер трека из оригинала: «Трек[|а|ов]: Солнечный остров» вместо «Трек 10: …». Вот это линтер как раз ловил;
  • 17 строк прочли Track как глагол: «След 10», «Отслежено 11», «Отслеживайте 14», «Выследите», «Найдите». Это музыкальный трек из саундтрека, а не выслеживание. Одиннадцать настоящих глагольных строк — Track down the magic orb, Track Story — не трогал, они переведены верно;
  • 4 строки затащили в видимый текст саму плюрал-форму: [Трек|Трека|Треков]: «Копии трека» 15: …;
  • 5 строк с обрезанной кавычкой в названии трека.

Название трека везде сохранено как было — правил только рамку. Исключение одно: «Кристальная Оаза» сведена к «Кристальному оазису» по слою.

Коллизии — все три разведены

  • Toxic Pauldron[s] и Toxic Shoulderpad[s] звались одинаково, хотя это разные слоты;
  • Toxic Spider совпал с Poison Spider из new_022 — токсичный против ядовитого;
  • Track Prints совпал с Footprints и Tracks из new_058 и new_123.

validate.py: было 13 предупреждений, стало 0 ошибок и 0 предупреждений. batch_tool.py fill --dry-run: гейты пройдены. Остаточная латиница — римские цифры I и II в названиях треков.

Два отступления от порядка, оба мои

Называю сам, чтобы вы не искали.

index.py proof я прогнал после правок, а не до. Пошёл сразу от метрики графа к разбору батча, а лист вычитки открыл, только когда перепроверял себя. Результат: 139 подсказок ЛЮДИ, 27 совпали по ключевым словам, брака в моих решениях не нашлось — но порядок нарушен, и это ровно то отклонение, которое я закрывал как системное в части 29.

Канон «Трек» принял по большинству внутри файла, а не по цепочке. Проверил задним числом: в GLOSSARY.md нет, в слое нет, корпус даёт «Трек» 459 против «Дорожка» 3, человеческих батчей с этой семьёй нет вовсе. Решение верное, обоснование запоздало.

Одна тревога не подтвердилась. proof показал, что человеческие строки зовут Toxic Spider Queen «ядовитой», и я решил, что развёл коллизию не в ту сторону. По корпусу Toxic — «токсичный» 181 раз, Poison — «ядовитый»; правка верна, те строки выбиваются из общего счёта.

Спасибо за graphserve

Инструмент сразу окупился. Два наблюдения на будущее, если пригодятся:

  1. Фильтр «латиница в переводе» стоит применять после вырезания служебных токенов — иначе шаблоны линковки %str1%%str2%Название%str3%%str4% дают шесть батчей ложных срабатываний подряд.
  2. Дефект quotes срабатывает на [pl:"…"] в английском ключе: в ui_152 он дал 341 запись, из которых настоящих кавычечных проблем оказалось пять.

Отдельно: при пересборке графа вашим новым index.py фактов о предметах стало 77 455 вместо нуля — у меня колонка ЧТО в index.py proof была пуста все тридцать с лишним прогонов, и подмены типа вещи я ловил вручную через корпус. Теперь работает.

Предложение: закрепить пары в GLOSSARY.md

За двадцать частей одни и те же пары сливались снова и снова. Их стоит вынести отдельной таблицей — это снимет целый класс брака на будущих батчах:

EN RU
Conch / Shell раковина / ракушка (слились 5 раз)
Reaver / Sabre жнец / сабля
Greatsword / Sword большой меч / меч
Staff / Wand / Focus / Scepter посох / жезл / фокус / скипетр
Hatchet / Maul / Axe топорик / молот / топор
Charm / Targe / Amulet талисман / тарч (щит) / амулет
Sunderer / Demolisher раскалыватель / разрушитель
Scimitar / Sabre ятаган / сабля
Greaves / Legs / Leggings / Breeches поножи / штаны / штаны / бриджи
Epaulets / Shoulderguards / Pauldrons эполеты / наплечи / наплечники
Jab / Punch / Strike тычок / удар / атака
Fiend / Imp / Demon изверг / бес / демон

Замечено по дороге

  1. batch_tool.py claim расходится с README. Он ставит сразу и затирает колонку «Кто взял» целиком — при захвате батча пропадает пометка «Автозаполнение из словаря … нужна вычитка», а появляется на батче, где работа ещё не начата. README же говорит ставить 🔨, а — только при 100%. Доску в итоге правил руками. Возможно, стоит научить claim ставить 🔨 и дописывать ник, а не заменять поле.
  2. GLOSSARY.md сам себе противоречит про WvW. В разделе решений: «PvP и WvW не переводятся нигде… Запрещены МпМ»; в таблице «Локации и имена» ниже: World vs. World / WvW | МпМ. Следовал первому как более позднему и явному.
  3. Расхождения слоя и корпуса, кроме Glider: Convergence — слой «Конвергенция», корпус чаще «Схождения»; Crown Pavilion — слой «Коронный павильон», корпус даёт ещё «Королевский Павильон» и «Павильон королевы». Брал слой.
  4. Проверка канона именами не покрыта линтером. validate.py сверяется со списком «НЕ так» из GLOSSARY.md, а туда попадают не все кривые формы — «Предел Божественности» проходил молча. Похоже, напрашивается проверка вида «в оригинале есть имя из слоя pn_* → в переводе должна быть его форма»: именно она и вытащила весь список выше.

Сборка графа на голом клоне

tools/index.py build падает без dictionary.bin (FileNotFoundError на ../dictionary.bin), а он в git не лежит. Помогает только скачать dictionary.bin из релиза и положить репозиторий внутрь glyphCore\, как задумано. В README это прямо не сказано, а раздел «Где посмотреть, что это за строка» начинается сразу с index.py build — новичок на этом спотыкается. Может, стоит дописать строчку.

196 непереведённых строк в четырёх батчах. Каноны брались из слоя pn_*
(index.py who), GLOSSARY.md и корпуса батчей; названий, которых нет ни
там, ни там, не выдумывал — оставил латиницей.

ach_006 (71): события по локациям, фракталы по уровням сложности,
сердца почёта; «Return to ...» оставлены латиницей как названия событий.
ach_032 (52): PvP-матчи по профессиям; PvP не переводится (GLOSSARY).
ach_005 (28): механическое оружие, Конвергенции, сборы эссенции.
ui_132 (45): Skyscale -> Скайскейл по GLOSSARY (в корпусе рядом семь
разных форм, вплоть до «Скалайл» и «небесного дракона»).

validate.py: 0 ошибок, 0 предупреждений на изменённых строках.
123 строки. Машинный черновик звал одних и тех же существ как придётся,
канон брал из GLOSSARY.md и слоя pn_*:

  Skimmer  -> скиммер   (было: Скаймер, скат, скакун)
  Skritt   -> скритт    (было: Скрыт, шритт)
  Skyscale -> скайскейл (было: небесный скакун, небесный дракон, скайлейн,
                         скайскейль, скайскелл, Скалайл, Смертокрыл, Скайсэйл)

Заодно починены плюрал-группы: подменённые числа («Скайскейл №[1|2|3]» при
оригинале «Skyscale K13or#1»), четыре формы вместо трёх («Чешуя скайскейля №4[|а|и|]»),
группы на пустом месте («Скайскейл [|л|л]ост»), группа на несклоняемом названии
вместо склоняемого слова («архипелага Скайвотч[|а|и|ов]»).

Снят английский Title Case: «Мастерство Адаптации Скаймера» -> «Мастерство
адаптации скиммера».

Канон локаций: Divinity's Reach -> «Божественный предел» (был «Предел
Божественности», в списке запрещённых форм GLOSSARY его не было, линтер
пропускал), Skywatch Archipelago -> «Архипелаг Небесного дозора» (был
«архипелаг Скайвотч» и «архипелаг «Небесный дозор»» в соседних строках).

Glider намеренно не трогал: слой даёт «Глайдер», корпус пишет «планер»
582 раза против 34 — это вопрос к мейнтейнеру, а не к вычитке батча.

validate.py: 0 ошибок.
@Arelion999 Arelion999 changed the title Добиты пустые ячейки в ach_005, ach_006, ach_032, ui_132 (196 строк) Пустые ячейки в ach_005/006/032, ui_132 и вычитка ui_132 (196 + 123 строки) Aug 16, 2026
198 строк. Батч был машинным черновиком, и это видно.

Orrian (166 строк). Канон слоя pn_terms — «Оррианский», в батче стояло
«Орианский» с одной «р», а половина строк вместо прилагательного получила
родительный падеж топонима: «Булава Орриана», «Короткий лук Орриана из земли»,
«Булава Воздуха из Орриана». Плюс выдумки: Glaive -> «Главнокол», Speargun ->
«арбалет» и «копьевидный пневматический пистолет», Trident -> «тризубец».
Суффиксы приведены к тому, что чаще пишет корпус: of Corruption -> «порчи»
(107 против 33), of Vision -> «видения» (81 против 3).

Наборы обликов Pact Fleet, Painter's Brilliance, Paladin's Decree (54 строки).
Здесь подменялся сам тип вещи: «Mace Skin» стал «Кольчугой», «Staff Skin» —
«Скипетром» и совпал с настоящим «Scepter Skin», «Greatsword Skin» —
«Великолепным мечом». Слово «облик» часто терялось, и облик было не отличить
от предмета. Приведено к виду «Облик <оружие в родительном> <набор>», как
переводит корпус.

Остальное: знаки ударения («Ски́н для була́вы "Ука́з палади́на"») — README их
запрещает; прямые кавычки вместо ёлочек (43 строки); английский Title Case;
Skin как «Кожа» и «Ски́н» вместо «Облик» (канон корпуса — 2646 против 44 и 31);
Wintersday -> «День Зимы», Spearmarshal -> «копьемаршал», Roller Beetle ->
«роллер-битл»; у наплечников копьемаршала название было подменено на
«Знаменосец». Восстановлен неразрывный пробел в браслете Орсиппуса.

validate.py: 0 ошибок, 0 предупреждений на весь батч (было 43).
@Arelion999 Arelion999 changed the title Пустые ячейки в ach_005/006/032, ui_132 и вычитка ui_132 (196 + 123 строки) Пустые ячейки в ach_005/006/032, ui_132 + вычитка ui_132 и items_075 Aug 16, 2026
138 строк.

Наборы обликов (62 строки). Название набора гуляло внутри одного набора:
«Ярость змеи» / «Ярость змея» / «Гнев змеи», «Семь Жнецов» / «Семь жнецов»,
«Тёмный рыцарь» / «Теневой рыцарь». Канон взят из корпуса: «Гнев Змея»,
«Семь жнецов», «Теневой рыцарь». Снова подмены типа вещи: «Mace Skin» ->
«Кольчуга», «Shield Skin» -> «Облик брони», «Greatsword Skin» -> «Великий меч».
Отдельно хорош «Seven Reapers Grasps Skin» -> «Семь жнецов хватают за кожу»:
Grasps здесь слот перчаток, а машина приняла его за глагол.

Seraph Pearl (18 строк). Формы взяты дословно из человеческого батча items_006,
где те же предметы описаны рецептами — их показала колонка ЛЮДИ в index.py proof
(для неё догрузились itemfacts). Bludgeoner оказался дубиной, а не булавой,
Broadsword — палашом, а не «широким мечом», Carver — резаком, а не «резчиком по
жемчугу», Stinger — жалом, а не «жалящим серрафом». Reaver переводился как
«Серафимская жемчужная сабля» и дублировал настоящий Sabre — два разных
предмета носили одно имя.

Cabalist (37 строк). Разнобой в порядке слов, Title Case («Кабалиста Шамана»),
слот Shoulders то «Плечи», то «Наплечники», Legs местами «Ноги». Суффикс
of Scavenging шёл тремя формами подряд. Две подмены: «Settler's Cabalist Coat»
-> «Паладинский плащ поселенца», «Settler's Cabalist Legs of Scavenging» ->
«Поношенные штаны искателя кладов» (потеряны и сет, и стат).

Заодно кавычки-ёлочки, ударения и Title Case в красках: «Теневая Бездня» ->
«Теневая бездна».

validate.py: было 72 предупреждения, стало 0 ошибок и 0 предупреждений.
Сеты Banded, Privateer, Conjurer и Reinforced Scale не тронуты — в доске
отмечено.
@Arelion999 Arelion999 changed the title Пустые ячейки в ach_005/006/032, ui_132 + вычитка ui_132 и items_075 Пустые ячейки в четырёх батчах + вычитка ui_132, items_075 и items_099 Aug 16, 2026
70 строк, включая одну оставшуюся пустой.

Канон. Sentinel звался четырьмя способами — «часовой», «страж», «стражник»,
«стражничий», — при том что слой pn_terms и корпус согласны на «страже»
(331 против 93). Dominion шёл «Владычеством» при каноне «Доминион» (257 против
32), Sentinel Bay — «Бухтой Часового» при каноне слоя «Сентинел-Бэй», Xhunn —
«Кхунном» при «Ксунне». Отдельная подмена: «Sentinel's Orichalcum Imbued
Inscription» -> «Скрипт из орихалкового рунического камня», потерян и стат,
и тип вещи, хотя соседние строки того же ряда переведены верно.

Наборы обликов. Shadow Chevalier разъехался на три формы внутри одного набора:
«Теневой шевалье», «Теневой кавалер», «Теневой рыцарь». Канон корпуса — рыцарь.

Коллизии имён — класс, которого не видит ни один гейт. Shadow Fiend и Shadow Imp
оба переводились «Теневым бесом», а рядом Shadow Demon — «теневым демоном»;
Fiend вдобавок имел третью форму «Теневой прислужник». Развёл: Fiend — изверг
(есть прецедент «Призвать теневого изверга»), Imp — бес, Demon — демон.
Набор Shade-Touched звался «Теневым обликом» и после первых правок совпал бы
с набором Shadow — проверка на одинаковый перевод при разном оригинале это
поймала, и Shade-Touched приведён к «Тронутый тенью» (форма уже стояла в самом
батче, строка «Shade-Touched Weapons»).

Мелочи: тавтологии «[Краска|Краски|Красок] «Теневая красная краска»», прямые
кавычки, строчная буква в начале строки, название облика в именительном вместо
родительного, обрывок вместо окончания в группе («Сумочк[а|и|из]»).

validate.py: 0 ошибок, 0 предупреждений. Коллизий в батче не осталось.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка ui_132, items_075 и items_099 Пустые ячейки в четырёх батчах + вычитка ui_132, items_075, items_099, ui_129 Aug 16, 2026
40 строк, включая четыре оставшихся пустыми.

White Mantle шёл в батче четырьмя формами вперемешку: «Белая Мантия» (канон
слоя и корпуса, 75 против 13), «Белый Плащ», «белые мантии» и «Белое Пламя» —
последнее уже подмена самой организации. Все 35 строк сведены к «Белой Мантии».

Loot Box у половины зверей потерял слово «ящик» и стал самим зверем: «White Bear
Loot Box» -> «Белый медведь», «White Shark Loot Box» -> «Белая акула». Корпус
зовёт это ящиком в 174 случаях из 183. Из-за той же потери «White Deer Loot Box»
совпал с «White Stag» — оба «Белый олень», два разных предмета под одним именем.

Имена по канону: Tyria -> Тирия (113 против 35 «Тайрии»), Braham -> Брейхам
(132 против 1; GLOSSARY.md прямо это оговаривает, а в соседней строке батча уже
стояла верная форма).

Заодно плюрал-группы: «Белый окунь|белого окуня|белых окуней» без скобок вообще
(в игре отрендерилось бы литералом вместе с палками), четыре формы вместо трёх
у белого кролика, группа на названии вместо склоняемого слова у маски элитного
стража. Вложенные кавычки одного рисунка в «Крыльях любви» разведены, «дельтаплан»
заменён на «планер» — канон корпуса, 582 употребления.

Wintersday намеренно НЕ трогал: слой даёт «День Зимы», но корпус пишет «Зимний
день» (111 против 61), и в батче стоит он же. Поправлены только выбросы внутри
батча — «Зимний праздник» и «Белые Зимние Дни». Вопрос к мейнтейнеру.

validate.py: 0 ошибок, 0 предупреждений. Коллизий в батче нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка ui_132, items_075, items_099, ui_129 Пустые ячейки в четырёх батчах + вычитка пяти батчей (196 + 559 строк) Aug 16, 2026
129 строк, включая 14 оставшихся пустыми.

Коробки (80 строк). Один и тот же шаблон был переведён десятком способов:
Box — «Ящик», «Коробка» и «Сундук»; группа то [Ящик|Ящика|Ящиков], то «Ящики»,
то «Ящик[|и|я]», то «Коробка[и|ок|ок]»; броня — «драконья», «из драконьей стали»,
«из драконьей кожи» и даже «кованая»; часть строк взята в ёлочки целиком, часть
получила точку в конце. Канон Box взят из корпуса: для «Box of …» там «коробка»
162 раза против 11 «ящиков» («ящик» закреплён за Loot Box, 174). В батче было
наоборот — 107 против 45.

Названия легендарного оружия — из слоя pn (Carcharias, Пушка хаоса, Сумерки,
Хоул, Шторм, Колосс, Пламя Родгорта) и корпуса (Рассвет, Искра, Ярость,
Избранный, Охотник). В батче Howl шёл сразу как «Вой» и «Рёв», а Carcharias —
как «Кархариас» и «Кархарий» в соседних строках.

Стат-префиксы по корпусу: ассасина (235, а не «убийцы»), берсерка (804),
падали (162), клирика (211), разрушителя (140), гадюки (70).

Branded (49 строк). «Клейменый» и «клеймёный» шли поровну, 37 против 36 —
свёл к «клеймёному», как требует правило про ё. Отдельно девять строк, где
Brand принят за маркетинговый бренд: «Брендовый пожиратель», «Брендированный
угорь», «Брендовая матрица», «Семя Бренда», «Кристальный щит Бренда»; ещё в
двух название фракции пропало вовсе — «Меченый резонатор», «Накопление Скверны».

Коллизии имён: Branded Jab, Branded Punch и Branded Strike — три разные
способности — сошлись в двух названиях. Развёл: тычок, удар, атака. Box of
Giver's и Box of Viper's Draconic Armor тоже носили одно имя, хотя это разные
статы.

validate.py: 0 ошибок, 0 предупреждений. Коллизий не осталось.
Класс Bowl[s] (123 строки, еда) не тронут — отмечено в доске.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка пяти батчей (196 + 559 строк) Пустые ячейки в четырёх батчах + вычитка шести батчей (196 + 688 строк) Aug 16, 2026
142 строки. Батч формально был чистым — ни пустых ячеек, ни предупреждений
линтера, ни коллизий, — но почти каждый класс переведён несколькими способами
сразу.

Wupwup шёл как «Вупув», «Вупвупа», «Вупу» и «Вупвуп»; корпус пишет «Вупвуп».

Woad машина приняла за растение вайду и получила «сапоги вайда», «перчатки
вайды», «сапоги вадов». Это название племени: слой знает «Ученый из племени
Воад» и «Искатель приключений из племени Воад».

Writ переводился пятью словами на один шаблон — «Свиток», «Предписание»,
«Писание», «Указ», «Грамота». Взята «Грамота»: в ui-батчах тот же «Writ of X»
переведён именно так. Сам класс — градация (Basic / Calculated / Learned /
Masterful / Studied на атрибут), и степени тоже разъезжались: Calculated шёл
как «Рассчитанная», «расчётливого» и «расчёта». Из-за этого «Writ of Learned
Malice» и «Writ of Studied Malice» носили одно название.

Worn — «Поношенная», «Потрепанный», «Потертая», «Вытертая»; корпус пишет
«потёртый» (14). Wizard's — «волшебника» и «Мага» вперемешку (16 против 3).
White Mantle опять «Белый Плащ» и «Белое Пламя» вместо «Белой Мантии».
Glider — «Планёр» и «параплан» при корпусном «планере» (582).
Wolfborn правил только орфографически: «Волкорожденный» -> «Волкорождённый».

Набор обликов Winter's целиком есть в слое, но батч перевёл его по-своему:
«Горечь зимы» стала «Зимней стужей», «Досягаемость зимы» — «Зимним простором»,
«Резак зимы» — «Зимним резаком», «Лезвие зимы» — «Кромкой зимы». У щита вместо
облика стояла «Шкура щита». Формы взяты из слоя дословно.

Облики Wintersday сведены к «Зимнему дню» — форме, которая доминирует и в
батче, и в корпусе; у топора слово «Облик» было потеряно вовсе. Сам выбор
«Зимний день» против слоевого «День Зимы» не трогал — это к мейнтейнеру.

Локации по слою: Echovald Wilds -> «Эховальдские дебри» (было «Эхо-Вальдские
пустоши»), New Kaineng City -> «Нью-Кайнэнг» (было «Новый Каинег»).

validate.py: 0 ошибок, 0 предупреждений. Коллизий не осталось.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка шести батчей (196 + 688 строк) Пустые ячейки в четырёх батчах + вычитка семи батчей (196 + 830 строк) Aug 16, 2026
63 строки.

Главное — слоты. В игре плечи это четыре разных слота по типу брони: Epaulets
(лёгкая), Shoulderguards и Shoulderpads (средняя), Pauldrons (тяжёлая). В батче
все стали «наплечниками», и разные предметы одного сета получили одно имя:
«Defender's Mist-Touched Epaulets» и «…Pauldrons» — оба «Наплечники защитника,
тронутые туманом»; «Defender's Pauldrons of Dhuum» и «Defender's Shoulderguards
of Dhuum» — оба «Наплечники Защитника Дхуума». Развёл: эполеты (канон корпуса,
66), наплечи, оплечья, наплечники (за Pauldrons, 231).

То же с ногами, и здесь корпус не помощник: Greaves и Leggings он переводит
одинаково — «поножи», 260 и 219. В одном сете это разные предметы, поэтому
внутри батча разведены поножи / штаны / бриджи. Вскрывалось каскадом: развёл
Greaves и Leggings — всплыла пара Leggings и Breeches, которой до правки видно
не было, потому что Leggings дублировал Greaves.

Стат Defender's писался то с заглавной (48 строк), то со строчной (97) — свёл
к строчной. В трёх строках стат потерялся вовсе: «Защитные сапоги стража»,
«Защитные оплоты стража», «Шлем стража крепости».

Fractals of the Mists переведены как «Бездны Туманников» при каноне «Фракталы
Туманов» (115 против 15), Fractal Attunement Mastery — как «Постижение бездн»
при слоевом «Настройка фрактала». Decade's Reach взят из слоя — «Досягаемость
десятилетия», заодно прямые кавычки заменены ёлочками.

Dhuum намеренно не трогал: слой даёт «Дуум», но корпус пишет «Дхуум» (88
против 36), и в батче стоит он же. Вопрос к мейнтейнеру.

validate.py: 0 ошибок, 0 предупреждений. Коллизий не осталось.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка семи батчей (196 + 830 строк) Пустые ячейки в четырёх батчах + вычитка восьми батчей (196 + 893 строки) Aug 16, 2026
110 строк.

Skyscale во всех 50 строках был «чешуйчатым драконом» или «небесным драконом»
при каноне GLOSSARY «Скайскейл» — тот же класс, что в ui_132, только там форм
было семь, а тут две, зато сплошняком. Заодно «Святилище небесных чешуйников»
стало «Святилищем скайскейлов».

Семнадцать строк нарушали правило про точку и кавычки: «…сейфа с "Mellaggan's
Valor."» — кавычки прямые, точка загнана внутрь. Названия внутри оставлены
латиницей: в слой они не заведены, а по правилу обратимости игрок должен уметь
найти их снаружи игры.

Топонимы шли то латиницей, то по канону, причём в соседних строках:
«Исследователь провинции Seitung» рядом с «Тренировка скайскейла в Архипелаге
Небесного дозора». Свёл к слою: Сейтунг, Архипелаг Небесного дозора (и предлог
«на», а не «в»). Остальное по слою же: Sea of Sorrows -> «Море Скорби» (было
«Море Печалей»), Snowden Drifts -> «Сноуденские сугробы» (было «Снежные
дрейфы»), Hoelbrak -> «Хоэльбрак» (был без мягкого знака), «Ученый» -> «Учёный».

Insight переводился и «Прозрением», и «Обзором» — взят «Обзор» (корпус, 137
против 90). Наборы обликов приведены к формам из остальных батчей этого PR:
Shadow Chevalier — «Теневой рыцарь» (было «Теневой кавалер»), Shade-Touched —
«Тронутый тенью» (было «оружие, коснувшееся тени»).

validate.py: было 17 предупреждений, стало 0 ошибок и 0 предупреждений.
Коллизий нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка восьми батчей (196 + 893 строки) Пустые ячейки в четырёх батчах + вычитка девяти батчей (196 + 1003 строки) Aug 16, 2026
63 строки.

Набор «Vigil's Honor» (42 строки) переведён пятью разными структурами:
«Топор Чести Дозора», «Сапоги чести Дозора», «Нагрудник Честь Дозора»,
«Обувь Дозора Чести», «Перчатки Дозора в честь». Местами орден стал «Стражей»
(«Поножи «Честь Стражи»») или потерялся вовсе — «Поношенные ножные латы
«Печать Бдительности»». Канон ордена — «Дозор» (GLOSSARY), структура сведена
к «‹предмет› чести Дозора».

Слоты внутри набора разведены заранее, иначе после приведения к одной структуре
совпали бы Pauldrons с Shoulderguards и Harpoon со Speargun.

Стат-префиксы по корпусу: Vigorous -> «энергичный» (в батче были ещё «Сильная»,
«Добротная», «Бодрящий»), Vigilant -> «бдительный» (были «Настороженные»).
Acolyte -> «аколит» (43 против 23 «послушника»), Apprentice -> «ученик» (24) —
так они перестают сливаться друг с другом. Veteran -> «ветеран» (65 в батче
против «опытного», «матёрого», «бывалого»).

Conch и Shell снова дали одно имя, как в items_099: развёл на раковину и ракушку.

Loot Box намеренно НЕ трогал. В ui_162 я привёл его к «ящику», но полный
пересчёт по корпусу показал, что канона нет: «сундук» 229 против «ящика» 182.
В этом батче стоит «сундук» (54 строки) — оставлено как есть, вопрос вынесен
мейнтейнеру.

validate.py: 0 ошибок, 0 предупреждений. Коллизий нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка девяти батчей (196 + 1003 строки) Пустые ячейки в четырёх батчах + вычитка десяти батчей (196 + 1066 строк) Aug 16, 2026
76 строк.

Стат-префикс Lingering переведён пятью способами: «Затяжной», «Забытый»,
«Наследие», «Неустойчивые», «негаснущей». Корпус пишет «затяжной». В двух
строках структура развалилась совсем: «Наследие искусных поножей» и
«Дыхательный прибор из негаснущей чёрной земли Цитадели».

Lionguard — название организации, слой знает его как «Львиная стража», а в
батче оно шло со строчной. Luxon в слое «Люксоны», в батче «луксонский» и
«луксов». Lucky — «счастливый» (корпус 10 против 1 «удачливого»), в батче
половина строк «удачливые». Luminous — «сияющий» (26 против 14 «светящегося»);
при этом Luminescent и Lucent остались «светящимися» — это другие слова, и
сливать их с Luminous нельзя. Lunatic — «безумный» (19), местами был «лунатик».

Ember Bay в батче — «Бухта Пепла». Здесь слой и глоссарий расходятся: слой
подставляет «Залив Углей», а GLOSSARY.md прямо решает «Бухта Углей» и запрещает
«Угольную Бухту» и «бухту Эмбер». По README глоссарий старше слоя, взята его
форма. Расхождение вынесено в PR.

Crystal Oasis был «Кристальной Оазой» при каноне GLOSSARY «Кристальный оазис».

Прямые кавычки и вложенные ёлочки одного рисунка: «Мини-набор "Лама"»,
«Воссоединение «Потерянной винтовки»», «Облик топора «Лунная астролябия»».

validate.py: было 3 предупреждения, стало 0 ошибок и 0 предупреждений.
Коллизий нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка десяти батчей (196 + 1066 строк) Пустые ячейки в четырёх батчах + вычитка одиннадцати батчей (196 + 1142 строки) Aug 16, 2026
57 строк, включая 8 оставшихся пустыми.

Батч целиком про миниатюры, и в 32 строках слово «Мини» потерялось или
подменилось: «Маленький», «Малый», «Малышка», «Микро-», а то и вовсе ничего —
«Mini Lion Cub[s]» переводился как «[Львёнок|Львёнка|Львят]». Так миниатюру
не отличить от самого существа: тот же класс, что потеря «Облик» у обликов и
«Рецепт» у рецептов. Канон корпуса — «Мини» в начале, 1306 строк из 1423.

Восстанавливая префикс, важно попасть ВНУТРЬ плюрал-группы: «[Львёнок|Львёнка|
Львят]» стало «[Мини-львёнок|Мини-львёнка|Мини-львят]», а не «Мини-[Львёнок|…]»,
иначе в игре склонение отвалится от префикса. Вариант с дефисом и без корпус
делит 741 на 431, то есть он свободный, — дефисные строки не трогал.

Битые группы: «вор[|ьи|ы]» и «рысь[и|ей|их]» давали «2 ворьи» и «1 рыси» —
формы не от того слова. «Mini Thundershrimp» вообще нёс три формы через слэш
ПЛЮС группу.

Имена: «Малышка Май Трин» -> «Мини-Май Трин» (механическая вставка префикса
опускает первую букву, а имя собственное строчным быть не может), Slothasor ->
«Слотазор» по слою (был «Слозасор»), Cloudseeker -> «Искатель облаков»,
Gourdon -> «Гурдон» (был «Гудон»), «мадам Кукы» -> «мадам Куки». SERV Golem —
«служебный», а не «СЛУЖБЕННЫЙ».

Skimmer -> «скиммер» по GLOSSARY (в батче «скаймер», как было в ui_132),
Pact -> «Пакт», буква ё в «детёныше».

Коллизия: Mini White Journeykin и Journeykit носили одно имя — это разные
существа.

Слово «фигурка» в шестнадцати строках («Мини-фигурка морской черепахи» при
оригинале «Mini Sea Turtle») оставлено: в оригинале его нет, но и ошибкой это
не назвать, а переделка требует ручного склонения. Отмечено в доске.

validate.py: 0 ошибок, 0 предупреждений. Коллизий нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка одиннадцати батчей (196 + 1142 строки) Пустые ячейки в четырёх батчах + вычитка двенадцати батчей (196 + 1199 строк) Aug 16, 2026
258 строк — больше половины батча.

Батч целиком стоит на одном стат-префиксе Cleric's, и тот переведён семью
способами: «клирика» (319 строк), «клерика» (50), «священника» (47), «жреца»
(24), «клерический» (15), «клирический» (5), «целителя» (3). Канон корпуса —
«клирика».

Сеты внутри разъезжались так же: Destroyer шёл «разрушителем» и «уничтожителем»
(корпус 370 против 24), Diviner — «прорицателем» и «провидцем» (171 против 47),
Soft Wood — «мягкой древесиной» и «мягким деревом» (491 против 12), Hard Wood
местами терял ё. Scallywag звался плутом, негодяем, проходимцем, пройдохой,
молодцем и шалопаем — сведён к плуту.

Два дефекта формы. Часть строк целиком взята в ёлочки, и кавычки попадали в
название предмета: «Скипетр уничтожителя клирика». В других префикс уезжал в
начало или превращался в прилагательное: «Клирика пика разрушителя»,
«Клирический длинный лук разрушителя» — приведены к структуре большинства,
«‹предмет› ‹сет в родительном› клирика».

Flame Legion -> «Легион Пламени» по GLOSSARY.

validate.py: было 5 предупреждений, стало 0 ошибок и 0 предупреждений.
Коллизий нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка двенадцати батчей (196 + 1199 строк) Пустые ячейки в четырёх батчах + вычитка тринадцати батчей (196 + 1457 строк) Aug 16, 2026
157 строк.

Тот же расклад, что в items_029: канон «рыцаря» стоит в 220 строках, а ещё в 94
префикс превращён в прилагательное — «Рыцарский аурический молот», «Рыцарские
сапоги каббалиста». Приведено к структуре большинства: «‹предмет› ‹сет
в родительном› рыцаря».

Две строки потеряли стат и подменили его чужим: «Knight's Diviner Leggings»
переводился как «Походные поножи прорицателя», «Knight's Exalted Coat» — как
«Превосходный панцирь Клерика». В игре это предметы Knight's, а не Diviner
и не Cleric's.

Слоты: Greaves и Legs дали одно имя — «Закаленные чешуйчатые поножи рыцаря».
Разведены на поножи и штаны, как в items_034.

По корпусу: Auric -> «аурический» (237 против 48 «золотого»), Cabalist ->
«кабалист» (193 против 132 «каббалиста», и так же в items_099), Kodan ->
«кодан» (249), Privateer -> «капер» (как в ui_129), «перьяные» -> «перьевые»,
буква ё в «закалённых».

Дефекты формы: в «Knight's Auric Sword» плюрал-группа навешена на прилагательное
и рассогласована с существительным — «[Рыцарские|Рыцарских|Рыцарских] аурический
меч»; в «Knight's Masquerade Raiments» скобка стоит без разделителей —
«Одеяния маскарада [Рыцаря]», в игре это отрендерится литералом вместе со
скобками. Несколько строк целиком взяты в ёлочки, и кавычки попадают в название.

validate.py: было 4 предупреждения, стало 0 ошибок и 0 предупреждений.
Коллизий нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка тринадцати батчей (196 + 1457 строк) Пустые ячейки в четырёх батчах + вычитка четырнадцати батчей (196 + 1624 строки) Aug 16, 2026
Батч выбран не только скриптом однородности. После items_084 я добавил вторую
проверку — разнобой служебных рамок в переводе, которого метрика по первому
слову english не видит. У items_118 она дала худший результат из всех
кандидатов: у семейства «Valkyrie Eagle Eye» шестнадцать форм рамки на
шестнадцать строк, то есть каждая строка своя.

КАНОН ДАЛ ЧЕЛОВЕЧЕСКИЙ БАТЧ. В ui_157 пятнадцать строк Valkyrie из пятнадцати
пишут «Амулет Валькирии», «Гравировка Валькирии из старой древесины»,
«Вышитая льняная инсигния Валькирии» — родительный ПОСЛЕ вещи, материал в
хвосте. Ровно та структура, которую вы задали для Rampager: вещь, стат,
материал. В слое и GLOSSARY записи нет, корпус вне батча даёт те же
«валькирии» 18 раз.

ЭТО НЕ ЗАМЕНА СЛОВА, А РАЗВОРОТ СТРУКТУРЫ. В батче стат стоял прилагательным
ПЕРЕД вещью — «Валькирийский аурический кинжал» — в 125 строках. Пословная
замена тут бессильна: нужно снять прилагательное с начала, поднять регистр у
нового первого слова и поставить «Валькирии» после вещи, но ПЕРЕД хвостом
с материалом: «Копьё Валькирии из тёмной стали», а не «Копьё из тёмной стали
Валькирии». Ещё 80 строк имели верную структуру, но стат со строчной.

39 строк развернуть автоматом не вышло, выписаны руками. Там же и худшее:
* «Валькирия: Фокус ауры» и «Валькирия: Посох ауры» — стат вынесен в заголовок
  через двоеточие;
* «Мстительный великий меч разрушителя», «Наплечья драконьи трупные», «Тесак
  огров доблести» — стат потерян вовсе, а в последних двух ещё и отсебятина;
* «Боец с крайтами-валькириями» и «Предвестник огров-валькирий» — стат
  прилеплен к существу, и предмет превратился в описание;
* «Валькирическая», «Валькирийный», «Валькирий», «Валькрийский» — четыре
  несуществующих формы слова.

Набор Destroyer выписан по эталону серии Apothecary's Destroyer, как в
items_081: «Двуручный меч Валькирии из разрушителя». Канон прочих сетов из
корпуса: Auric «аурический» (178), Speargun «гарпунное ружьё» (165), Draconic
«драконьи» (196), Emblazoned «гербовый» (181, как свёл в items_069), Tempered
«закалённый» (67), Feathered «пернатый» (31), Prowler «бродяги» (16).

Коллизии, все пять разведены:
* Pearl Conch и Pearl Shell — ВОСЬМОЙ батч подряд с этой парой, раковина
  против ракушки;
* Tempered Scale Greaves и Legs — второй батч подряд после items_084, поножи
  против штанов;
* Valkyrie's Amulet совпал с Valkyrie Amulet из ui_157 — это разные предметы;
* Ventari's Greaves и Leggings, а после правки ещё и Breeches — три слота на
  одно название, разведены на поножи, штаны и бриджи.

validate.py: 0 ошибок и 0 предупреждений и до, и после — батч был формально
чистым, как ui_095. batch_tool.py fill --dry-run: гейты пройдены. Остаточная
латиница — PvP, служебный идентификатор и легендарка Velocitas Eradico,
которая по вашему канону остаётся латиницей.
Батч выбран проверкой на разнобой служебных рамок: у семейства «Diviner's
Mist Shard» пятнадцать форм на восемнадцать строк. В батче оказались ДВА
стат-префикса — Dire на 263 строки и Diviner's на 97, и структура у них
разная.

DIRE -> «грозный», прилагательное перед вещью. Канон подтверждён с двух
сторон: человеческие батчи дают 323 вхождения против 3 машинных, и свёл его
я сам в items_035, соседнем файле. 101 строка заменой.

СВОЯ ЖЕ ОШИБКА, ПОЙМАННАЯ НА ПЕРВОМ ПРОГОНЕ. Таблицу форм я сперва собрал
программно из основ и получил «Грозний»: у «жуткий» основа заднеязычная и
мужской род на «-ий», у «грозный» твёрдая и на «-ый». Ровно то, от чего
меня уберегли items_107 и items_035 — и на что я всё равно наступил, стоило
понадеяться на генерацию. Переписал явным списком из тридцати пяти форм.

DIVINER'S -> «Прорицателя», родительный ПОСЛЕ вещи. Канон дал человеческий
ui_055: «Снаряжение Прорицателя», «Врата Прорицателя», «Книга рецептов брони
Прорицателя». В батче стояли «провидца» 30, «предсказателя» 7 и «дивинера».
85 строк.

СЕМЬЯ ORRIAN ПЕРЕСОБРАНА ЦЕЛИКОМ — 191 строка. Сначала я собрал по таблицам
только те 36 строк, где стат потерялся, а остальные пропустил как готовые.
Постпроверка коллизий показала, чего это стоило: «Dire Orrian Longsword of
Water» и «of Earth» оба звались «длинный меч Земли», «Rifle of Rage» и «of
Agony» — «ружьё агонии», «Staff of Blood» и «of Bloodlust» — «посох крови».
Стат стоял верно, а суффикс был чужой, и такие строки мой фильтр считал
готовыми. Пересобрал все 191 по ключу: стат, набор, тип вещи, суффикс — с
согласованием рода (булава и сабля женского, копьё и ружьё среднего).
Заодно ушли подмены типа: ятаган вместо сабли, копьё вместо гарпунного
ружья, дробитель вместо крушителя.

30 строк вне семьи Orrian выписаны руками. Канон сетов из корпуса и слоя:
Diviner's Reach — «Владения Прорицателя» (слой), Privateer «капер» (255),
Rogue «разбойник» (93), Crusher «дробитель» (50), Reaver «жнец» (60),
Sneakthief «скрытный вор» (42), Bludgeoner «дубина» (50), Brazier «жаровня»
(197, стоял «треножник»), Broadsword «палаш».

Коллизии, все семь разведены. Pearl Conch и Shell — ДЕВЯТЫЙ батч подряд с
этой парой. Ещё две пары слотов в одном сете: Bracers и Gauntlets, Pauldrons
и Shoulders — по README это разные слоты, одним словом звать нельзя.

validate.py: было 2 предупреждения, стало 0 ошибок и 0 предупреждений.
batch_tool.py fill --dry-run: гейты пройдены. Знаков ударения нет.
Батч выбран проверкой на разнобой рамок: у семейства «Mighty Soft Wood»
восемнадцать форм на двадцать семь строк.

КАНОН: «мощный». Человеческие батчи дают 34 вхождения против 16 «могучего»,
по всему корпусу 126 против 33. Стат остаётся прилагательным перед вещью.
74 строки заменой полными формами: «Могучий», «Могущественный», «Крепкий»,
«Сильный», «Прочный» — пять слов на один стат.

Таблицу писал явным списком, не собирал из основ. После «Грозния» в
items_036 это уже не гипотеза: у «могуч» основа шипящая, у «мощн» твёрдая,
и склейка дала бы тот же брак.

РАСХОЖДЕНИЕ С МОЕЙ ЖЕ ПРАВКОЙ В ui_095, честно называю. Там я развёл
Mighty Impact, Mighty Smash и Mighty Leap на «Могучий», потому что семь
английских ключей схлопывались в «Мощный удар» и «Мощный прыжок». Здесь
канон противоположный. Считаю, что это разные случаи: там названия умений,
где коллизию надо было чем-то разбивать, здесь стат-префикс на снаряжении.
Если хотите единообразия — скажите, сведу обе стороны.

Три строки, где стат пропал вовсе: «Дубовый длинный лук Доблести (слабость)»,
«Короткий лук охотника на огров Силы», «Дубовый посох из мягкой древесины
силы «Лед»» — во всех трёх дуб взялся ниоткуда, Soft Wood это мягкая
древесина.

Коллизии, все шесть разведены, и пять из них — подмена типа или слота:
* Bronze Greatsword и Sword — оба «бронзовый меч», хотя большой меч и меч
  разные вещи (пара всплывает пятый батч);
* Chain Helm и Chainmail Helm, Chain Pauldrons и Chainmail Shoulders — два
  разных набора звались одинаково; развёл по корпусу: Chain «кольчужный»,
  Chainmail «латный». Заодно Pauldrons против Shoulders — разные слоты;
* Harpoon и Speargun — оба «гарпун», хотя Speargun это гарпунное ружьё
  (канон корпуса, 165);
* Soft Wood Focus of Hobbling назывался посохом и совпал с настоящим Staff;
* Mighty Ring совпал с Powerful Ring из машинного items_078 — там одна
  строка переписана на «Могучее кольцо», чтобы канон «мощный» остался за
  Mighty.

Прямые кавычки: «'Мешок шахтёра'» в тройных кавычках и «Мини "Кэрн
Неукротимый"» — сняты, второй заодно приведён к канону приставки Мини.

validate.py: было 2 предупреждения, стало 0 ошибок и 0 предупреждений.
batch_tool.py fill --dry-run: гейты пройдены. Знаков ударения нет.
Батч выбран проверкой на разнобой рамок: у семейства «Daily Drizzlewood
Coast» одиннадцать форм на двадцать одну строку. Линтер по батчу молчал —
0 ошибок и 0 предупреждений до правок, третий такой случай после ui_095 и
items_118.

ТОПОНИМЫ — 89 строк, README п.6. Один и тот же Drizzlewood Coast шёл ТРЕМЯ
способами: латиницей «на побережье Drizzlewood», выдуманным «Побережье
Моросящего Леса» и — ни разу — канонным «Побережье Дриззлвуд» из слоя.
Правило говорит прямо: бери форму из pn_*.csv дословно, не сочиняй свою.

СЛОЙ ДАЁТ ИМЕНИТЕЛЬНЫЙ, А В БАТЧЕ ПРЕДЛОЖНЫЙ ОБОРОТ. Прямая подстановка даёт
«в Пустынное нагорье» и «вокруг Дебри Эховальда». Поэтому таблица на каждый
топоним хранит три формы — именительный, после «в/на» и после «вокруг/из», —
и подстановка смотрит на предлог. Двадцать пять топонимов: Кристальный оазис,
Дебри Эховальда, Долина Гротмар, Речные земли Элона, Сухие Топи, Залив Углей,
Каледонский лес, Опустошение, Пики Громовой головы и прочие.

ОТДЕЛЬНАЯ ЛОВУШКА: латинский остаток без головы словосочетания. «на побережье
Drizzlewood» и «в Grothmar» при наивной замене превращались в «на Дриззлвуд»
и «в Гротмар» — голова терялась. Развернул по английскому ключу: если в нём
стоит Drizzlewood Coast, то и в переводе должно быть полное название.

ЛЕГЕНДАРКИ — 21 строка. По вашему канону из 0f24757 они остаются латиницей
В КАВЫЧКАХ, а стояли голыми: «Создайте легендарное оружие Bolt.» Обёрнуты.

Восемь строк начинались наречием «Ежедневно» вместо названия достижения —
переписаны в «Ежедневное достижение …». Три пустые ячейки заполнены с тремя
формами склонения по п.3.

КОЛЛИЗИИ, все три разведены, и одна нашла нарушение другого правила: «Cultural
Exchange» совпал с «Intercambio cultural» и «Kultureller Austausch» — это
испанский и немецкий оригиналы, и README велит оставлять такие строки
ПУСТЫМИ, а не переводить. Очистил обе в new_069 и new_072. Ещё Crash Land в
new_048 и Pruning the Weed в ach_024 — по одной строке в машинных черновиках.

ЧЕГО НЕ СДЕЛАЛ: в переводе осталось 61 латинское название, из них 36 лежат в
слое — там латиница законна, движок подставит русскую форму сам. Остальные 25
в слое отсутствуют, и по п.6 их надо заводить. Не стал: в pn_additions.csv уже
608 строк ждут вашего dict_tool.py pnadd, добавлять туда ещё до разбора первой
партии смысла нет. Отмечено в CLAIMS числом.

validate.py: 0 ошибок и 0 предупреждений. batch_tool.py fill --dry-run: гейты
пройдены. Знаков ударения нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка двадцати пяти батчей (204 + 3440 строк) Пустые ячейки в четырёх батчах + вычитка тридцати одного батча (196 + 4522 строки) Aug 17, 2026
@Arelion999

Arelion999 commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Привет! Накопилось три вопроса, без которых дальше двигаюсь вслепую.

1. Слой имён. По п.6 README завёл в pn_additions.csv 608 названий мини из items_069 и ui_095 — раздел «реестр ВСЕХ названий» перечисляет мини прямо. Пока не пройдёт dict_tool.py pnadd --file pn_additions.csv, они не доедут до bin. Прогоните, или лучше оформить как-то иначе?

2. Названия обычных вещей. Нести ли в pn_* названия снаряжения — это около тысячи записей только из items_081/082? Или у них обратимость и так есть через отключаемый dict_item_names, и в слое им делать нечего? Сам не стал: решение по устройству слоя ваше, а не моё.

3. Как удобнее принимать. Влить одним куском или разбить на PR-ы по пять батчей? Спрашиваю не из-за объёма — вижу, что #2 был вдесятеро больше и прошёл нормально, — а потому что этот PR в отличие от прежних требует решений, а не только проверки дифа. Если по частям смотреть легче, переоформлю без вопросов.

Остальное в теле PR: тринадцать мест, где канона не нашлось ни в GLOSSARY.md, ни в слое, ни в корпусе, — там я выбрал сторону и пометил решение как отменяемое. Если подход в целом не тот, скажите сразу: переделать тридцать батчей дешевле, чем сто.

Батч выбран новым способом — по графу, а не по однородности первого слова.
После того как в ветку влился ваш graphserve, я посчитал по базе дефекты и
латиницу отдельно по файлам батчей. Первая попытка вывела наверх ui_010..014,
но это оказался ложный след: метрика считала латиницей плейсхолдеры
%str1%%str2% в шаблонах линковки гардероба. С вырезанием служебных токенов
наверх вышел ui_152 — 356 дефектов при одной строке с латиницей.

ГЛАВНОЕ: 323 строки из 358 несли форму склонения, которую README запрещает
ПРЯМЫМ ПРИМЕРОМ. Пункт 3: «Рецепт[|а|ов] ✅, Рецепт[|ы|ов] ❌ (даст „5
рецепты“)». В батче стояло «Трек[|и|ов]», то есть ровно «2 треки». Форма 2 —
родительный ЕДИНСТВЕННОГО, «2 трека». Линтер это пропускает: он считает, что
форм три, а не что они верные, — уже третий раз за PR.

Заодно по той же семье:
* 13 строк потеряли номер трека из оригинала — «Трек[|а|ов]: Солнечный
  остров» вместо «Трек 10: ...». Вот это линтер как раз ловил;
* 17 строк прочли Track как ГЛАГОЛ: «След 10», «Отслежено 11», «Отслеживайте
  14», «Выследите», «Найдите». Это музыкальный трек из саундтрека, а не
  выслеживание. Одиннадцать настоящих глагольных строк — «Track down the
  magic orb», «Track Story» — я не трогал, они переведены верно;
* 4 строки затащили в видимый текст саму плюрал-форму: «[Трек|Трека|Треков]:
  «Копии трека» 15: ...»;
* 5 строк с обрезанной кавычкой в названии трека.

Название трека везде сохранено как было — правил только рамку. Исключение
одно: «Кристальная Оаза» сведена к «Кристальному оазису» по слою.

Коллизии, все три разведены: Toxic Pauldron и Toxic Shoulderpad звались
одинаково, хотя это разные слоты; Toxic Spider совпал с Poison Spider из
new_022 — токсичный против ядовитого; Track Prints совпал с Footprints и
Tracks из new_058 и new_123.

validate.py: было 13 предупреждений, стало 0 ошибок и 0 предупреждений.
batch_tool.py fill --dry-run: гейты пройдены. Остаточная латиница — римские
цифры I и II в названиях треков. Знаков ударения нет.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка тридцати одного батча (196 + 4522 строки) Пустые ячейки в четырёх батчах + вычитка тридцати двух батчей (196 + 4791 строка) Aug 17, 2026
Порядок исправлен: index.py proof прогнан ДО единой правки (257 подсказок
ЛЮДИ), канон записан до генератора, а не задним числом. В ui_152 я делал
наоборот и в теле PR это признал.

КАНОН, установленный по человеческим батчам до правок:
* одушевлённые — «игрок[а|а|ов]» из new_018, «босс[а|а|ов]» и
  «противник[а|а|ов]» из ui_051;
* неодушевлённые — «предмет[|а|ов]», «фрактал[|а|ов]», 90 вхождений;
* форма 2 везде родительный ЕДИНСТВЕННОГО, как требует README п.3.

27 строк несли счётчик %num2% и [s] в оригинале, а форм не имели вовсе:
«Победите %num2% врагов» вместо «враг[а|а|ов]». Плюс одна строка обращалась
на «ты» — «Победи» вместо «Победите».

5 пустых ячеек заполнены. Имена из слоя: Palawa Joko — Палава Джоко, Aspect
Arena — Арена Аспектов, Dragonstorm — Драконий шторм, Mount Maelstrom — Гора
Мальстрем.

КОЛЛИЗИИ, все три разведены: Mad King's Labyrinth и Mad King's Maze звались
одинаково, хотя это разные инстансы — Labyrinth остался Лабиринтом по слою,
Maze стал Западнёй; Queen's Gauntlet opponent[s] совпал с opponents — у
второго нет [s] в оригинале, поэтому там родительный множественного по п.5.

СВОЯ ОШИБКА, ПОЙМАННАЯ ЛИНТЕРОМ. Две строки несут литеральную квадратную
скобку — редакторскую пометку, которая есть и в оригинале. Линтер называет её
«скобка без разделителей», и я перевёл её в теги [lbracket]/[rbracket] по
п.2. Стало хуже: теги не совпали с оригиналом, и предупреждение превратилось
в ОШИБКУ. Хуже того, [lbracket] сам содержит скобку, мои две замены наложились
и покорёжили строки. Восстановил их из git. Вывод: литеральная скобка тут
верна, предупреждение ложное — оригинал устроен так же.

Заодно свёл разнобой в этой пометке: одна строка переводила её целиком,
вторая оставляла «Living World Season 1», «Scrying Pool» и «Eye of the North»
латиницей.

ЛАТИНИЦУ НЕ ТРОГАЛ — 300 строк. Проверил: имена лежат в слое (Canach — Канах,
Queen's Gauntlet — Перчатка Королевы, Thunderhead Peaks — Пики Громовой
головы), движок подставит форму сам, и ровно так делает человеческий ui_051:
«Победите %num2% босс[а|а|ов] Queen's Gauntlet в Crown Pavilion». Разнобоя
внутри файла почти нет, а где был — сведён. Массово переводить их, как я
сделал в ach_009, здесь было бы отсебятиной.

validate.py: было 29 предупреждений, стало 0 ошибок и 2 — те самые ложные про
литеральную скобку. batch_tool.py fill --dry-run: гейты пройдены.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка тридцати двух батчей (196 + 4791 строка) Пустые ячейки в четырёх батчах + вычитка тридцати трёх батчей (196 + 4826 строк) Aug 17, 2026
Порядок соблюдён: линтер и index.py proof до правок, канон записан до
генератора.

КАНОН ИЗ ЧЕЛОВЕЧЕСКОГО БАТЧА ui_151, а не из корпуса машинных черновиков:
  Tormented Axe Skin        -> Облик истязающего топора
  Tormented Harpoon Gun Skin -> Облик истязающей гарпунной пушки
  Tormented Heart           -> Истязаемое сердце
То есть Skin разворачивается в «Облик ‹оружие в родительном›», как в
items_075, стат — «истязающий» у вещей и «истязаемый» у существ.

В батче стат шёл ЧЕТЫРЬМЯ словами сразу: изувеченный, истерзанный,
мучительный, искажённый. А Skin — то «облик», то «кожа», то «внешняя
оболочка», то «внешний вид», то терялся вовсе:
  «Истерзанная кожа молота»              -> Облик истязающего молота
  «Истерзанная внешняя оболочка посоха»  -> Облик истязающего посоха
  «Внешний вид: Истерзанный меч»         -> Облик истязающего меча
  «Копьё мучений»                        -> Облик истязающего копья

ПОДМЕНЫ ТИПА ВЕЩИ в том же наборе: Mace Skin звался скипетром и совпадал со
Scepter Skin, Rifle Skin — винтовкой вместо ружья, Longbow Skin — просто
луком, Harpoon Gun Skin — «гарпунным ружьё» с рассогласованием. Tourmaline
переведён «изумрудом», хотя это турмалин.

СЕМЬЯ TRACK. В отличие от ui_152 здесь в оригинале НЕТ плюрал-разметки — 372
строки из 372, — поэтому группы склонения не нужны и линтер молчал. Дефект
другой: 14 строк обёрнуты кавычками, а 358 нет. Кавычки сняты. Заодно два
нарушения канона: «Львиный Шпиль» вместо Львиной Арки (ваше решение из
0f24757) и «Белая Мантия» вместо Белого Плаща.

Коллизии: Torn Pelt и Torn Rag совпадали с Ripped Pelt из items_095 и
Shredded Rag из items_101. Развёл по словам: Torn — драный, Ripped — рваный,
Shredded — изодранный.

validate.py: 0 ошибок и 0 предупреждений и до, и после. batch_tool.py fill
--dry-run: гейты пройдены, остаточная латиница — пять названий треков с
именами из слоя.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка тридцати трёх батчей (196 + 4826 строк) Пустые ячейки в четырёх батчах + вычитка тридцати четырёх батчей (196 + 4868 строк) Aug 17, 2026
Порядок соблюдён: линтер и index.py proof до единой правки (646 подсказок
ЧТО, 916 ЛЮДИ — колонка ЧТО работает после пересборки графа), канон записан
до генератора.

КАНОН — «стража», родительный ПОСЛЕ вещи: «Надпись стража», «Знак стража из
шёлка». Оговорюсь честно: подтверждение идёт из ui_129, а это мой же прошлый
батч, независимого человеческого источника у этого стата нет. Но 118 строк
самого items_098 уже стояли ровно так, и структура совпадает с той, что вы
задали для Rampager's: вещь, стат, материал в хвосте.

Разбор классов: 118 строк были в каноне, 90 несли «Стража» с прописной,
31 — иные формы («стражников», «Стражей», «часового», «Сентинская»),
14 потеряли стат вовсе. Формы менял полными словами, не склейкой основ.

Набор Destroyer — 18 строк — выписан по эталону серии Apothecary's
Destroyer, как в items_081 и items_118: «Топор стража из разрушителя».
Прежде там стояло «Великий меч «Разрушитель стражей»» и «Фокус "Разрушитель
Стражей"» — стат и набор менялись местами и слипались в кавычках.

14 строк, где стат был приклеен к вещи дефисом: «кинжал-страж», «меч-страж»,
«Мачете "Страж"», «Сапоги "Подкрадывающийся страж"». Развёрнуты в родительный.

КОЛЛИЗИИ — двенадцать, и семь из них внутри самого батча:
* Iron Hammer и Iron Mace, Mithril Hammer и Mithril Mace — молот против
  булавы, канон корпуса 501;
* Pearl Conch и Pearl Shell — ДЕСЯТЫЙ батч подряд с этой парой;
* Pearl Quarterstaff и Pearl Rod — посох против жезла;
* Exalted Coat и Exalted Mantle — куртка против мантии;
* Sentinel Rifle совпал со Sniper Rifle из ui_133, Sentry Turret с Guard
  Turret из ui_074, Seer Mantle с Mantle of the Seer из new_076;
* Search and Rescue Training звалось «Мешком удачи» — строка не про то
  вовсе, это обучение поиску и спасению;
* Secret Missive пришлось разводить дважды: сперва с Confidential Missive,
  потом с Hidden Communique из ui_077.

validate.py: было 25 предупреждений, стало 0 ошибок и 11 — прямые кавычки в
строках вне семьи Sentinel. batch_tool.py fill --dry-run: гейты пройдены.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка тридцати четырёх батчей (196 + 4868 строк) Пустые ячейки в четырёх батчах + вычитка тридцати пяти батчей (196 + 5017 строк) Aug 17, 2026
Порядок соблюдён: линтер и index.py proof до правок (745 подсказок ЧТО,
1048 ЛЮДИ), канон записан до генератора.

КАНОН ПРОТИВ БОЛЬШИНСТВА. В батче доминирует «Крепкий» — 75 строк, — но
человеческий ui_076 даёт «сытный» четырнадцать раз подряд: «Сытная хлопковая
инсигния», «Сытная пропитанная железная гравировка». Большинство внутри файла
вело не туда, и если бы я взял его за канон, как делал в ui_152, получил бы
ошибку. Взял человеческий батч.

Сведено 112 строк из шести слов: крепкий, здоровый, сердечный, бодрый,
плотный, харти. Таблица полных форм, не склейка основ — четвёртый батч
подряд, где это правило спасает: у «крепк» основа заднеязычная и мужской род
на «-ий», у «сытн» твёрдая и на «-ый».

БАТЧ СДАН НЕПОЛНЫМ, отмечено в CLAIMS числом:
* 129 строк потеряли стат вовсе — это отдельный ручной пласт, сопоставимый по
  объёму со всей сделанной частью;
* 31 коллизия осталась. Проверил: их было 34 ДО моей правки, стало 31 —
  я их не создавал, наоборот убрал три. Это долг самого черновика: Hearty
  сталкивается со Strong (items_107), Enduring, Fullweight и Heavyweight.

validate.py: 0 ошибок, 1 предупреждение — как и до правок.
@Arelion999 Arelion999 changed the title Пустые ячейки в четырёх батчах + вычитка тридцати пяти батчей (196 + 5017 строк) Пустые ячейки в четырёх батчах + вычитка тридцати шести батчей (196 + 5129 строк) Aug 17, 2026
Его коммит 124eb2b добавил 25 721 строку в 52 новых батча, из-за чего
разошлась строка-шапка CLAIMS: у него счётчик не знает про наши 36 батчей,
у нас — про его новые файлы. Конфликт был только в ней.

Взял его структурные числа (992 батча, 476 243 строки) и пересчитал шапку
скриптом stats.py --mark-done, для того она и генерируется. Наши 36 записей
в доске на месте.

Доля вычитанного человеком показывает 17.0% вместо вчерашних 18.0% — это не
потеря, а рост знаменателя: вычитано по-прежнему 81 072 строки, но общий
объём вырос с 450 522 до 476 243.
Его 5518f7c убрал 1 116 не-английских строк из ручки. Конфликт снова только
в строке-шапке CLAIMS: его счётчик не знает про наши батчи, наш — про его
чистку. Взял его числа и пересчитал шапку через stats.py --mark-done.

Это третий такой конфликт за сутки, и все три — в одной и той же строке.
Пока PR открыт, каждый его синк будет её задевать: мы оба пишем в один файл,
а шапка генерируется скриптом из содержимого доски.
@Arelion999

Copy link
Copy Markdown
Contributor Author

Ещё одно наблюдение, уже чисто техническое.

За сутки ветка трижды падала в конфликт с main, и последние два раза — ровно в одной строке: шапке CLAIMS.md со счётчиком.

ваш коммит что конфликтовало
0f24757 CLAIMS + три батча
124eb2b только шапка
5518f7c только шапка

Расхождения в данных при этом ни разу не было: строка Всего батчей: … вычитано человеком: … генерируется через stats.py --mark-done из содержимого самой доски. То есть конфликтуют не правки, а два снимка одного вычисляемого значения — у вас без моих батчей, у меня без ваших. Разрешение каждый раз одно: взять ваши числа и прогнать скрипт заново.

Пока PR открыт, это будет повторяться на каждый ваш синк. Если однажды дойдут руки — просится одно из двух:

  • вынести шапку в отдельный генерируемый файл, который не версионируется (как sync/index.db);
  • либо считать её при сборке релиза, а в CLAIMS.md оставить только таблицу — там правки всегда построчные и мержатся сами.

Ни то, ни другое не срочно, я просто разрешаю конфликт по мере появления. Но если планируете принимать батчи от нескольких человек одновременно, эта строка будет ронять всем.

Его 85334f1 — перепроверка не-английских строк вручную и починка
классификатора. Конфликт четвёртый за сутки и снова только в строке-шапке
CLAIMS: его счётчик не знает про наши батчи, наш — про его чистку.
Разрешено как прежде: взяты его числа, шапка пересчитана stats.py --mark-done.

Про этот класс конфликтов написал отдельным комментарием к PR: строка
генерируется скриптом, расхождения в данных нет ни разу, и пока PR открыт,
она будет падать на каждый синк.
Его 809e368 и b5fd65a: ещё 942 французские строки по признаку неразрывного
пробела и 326 строк new_125 вручную. Конфликт пятый за сутки и снова только
в строке-шапке CLAIMS. Взяты его числа, шапка пересчитана stats.py.

GLOSSARY.md слился без конфликта — предложение про рамку Recipe Unlock на
месте.
@K13or

K13or commented Aug 18, 2026

Copy link
Copy Markdown
Owner

Супер, сегодня смерджу

@Arelion999

Copy link
Copy Markdown
Contributor Author

Готово, конфликт снят — ветка синхронизирована с 58a28d7, PR снова MERGEABLE / CLEAN.

Конфликтовала опять одна строка — шапка CLAIMS.md. Разрешил по прежней схеме: взял вашу версию, прогнал stats.py --mark-done, так что числа в ней пересчитаны из самой доски — 996 батчей, вычитано человеком 86 915 (18.4%).

Гейт по моим 49 файлам: validate.py — 23 837 строк, ошибок 0.

Если для мержа нужно ещё что-то поправить — скажите, сделаю.

@K13or
K13or merged commit 9c05be1 into K13or:main Aug 18, 2026
K13or added a commit that referenced this pull request Aug 18, 2026
Два прохода по bin после мержа PR #4: pnadd по ишью #5 (561 новое имя мини в
pn_names, изменено 0) и frombatches --batches-win --apply (изменено 5 228,
добавлено 236, в bin 473 527 записей).

Гейт charscan compare против 20260818-163236: по незатронутым классам +0.
Три роста разобраны, два из них ростом не являются:

* quotes +87 — артефакт c_quotes: кавычки считаются вместе с разметкой
  [pl:"…"]. С вырезанной разметкой настоящих потерь 314 до и 314 после;
* plural 47 «регрессий» — деградация мусорных групп до единственного числа
  (у 24 было четыре формы вместо трёх), валидных троек не потеряно, класс −71;
* colon-prefix +5 — настоящая регрессия и долг: вычитка ach_009 убрала из
  восьми ежедневок наречие «Ежедневно» вместе с префиксом «Daily …:», по
  которому игра их группирует. Чинить в батче, не в bin.

Отдельно записан конфликт гейта «латиница» с правилом обратимости: 867 строк
отклонены только за латинское имя внутри русского перевода, в игре остаётся
оригинал целиком.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Arelion999
Arelion999 deleted the fill-empty-ach-ui branch August 18, 2026 15:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants