Keep card names in English, translate only effect text

Dropped nameRu from the translation workflow and from content validation warnings. Progress now counts cards whose text is filled; vanilla cards without text count as done.
This commit is contained in:
MpakobecEx 2026-10-20 21:40:45 +05:00
parent 625ed36f94
commit edd6a7506c
6 changed files with 12 additions and 128 deletions

View File

@ -238,7 +238,7 @@
### Блок 5. Локализация `[MVP]`
- [ ] **P0** Unity Localization: String Tables `en`/`ru`, ключи по схеме `ui.menu.play`, runtime-переключение без перезагрузки сцены.
- [ ] **P0** Сервер: параметр `lang` в запросах карт/глоссария, fallback `en`.
- [ ] **P0** Сервер: параметр `lang` в запросах карт/глоссария, fallback `en`. **Имена карт не переводятся** — остаются английскими в обеих локалях; переводится только текст эффекта.
- [x] **P1** Токенизация текста карт: `content/keywords.yaml` (иконки + подписи), шаблоны с токенами `{cb:3}`, `{vcrc}`, `{clan:kagero}`; проверка целостности токенов при переводе.
- [ ] **P1** Рендер шаблона в клиенте: подстановка иконок по токенам, rich-text, авто-фит текста на карте.
- [ ] **P1** Проверка шрифтов TMP: кириллица, fallback-атлас, авто-фит текста на карте.

View File

@ -86,8 +86,8 @@ python tools/import_cards.py
```
Список токенов и их иконок — `content/keywords.yaml`.
Русские тексты — `content/translations/ru.yaml`: заполняются `nameRu` и `textRu`,
токены в `textRu` нужно сохранить в том же количестве.
Русские тексты — `content/translations/ru.yaml`: заполняется только `textRu`.
Имена карт не переводятся и остаются английскими.
```powershell
# создать файл переводов или обновить шаблоны, сохранив введённые переводы
@ -97,8 +97,9 @@ dotnet run --project server/src/Vanguard.Cli -- translations build
dotnet run --project server/src/Vanguard.Cli -- translations check
```
Проверка ловит: незаполненные имена и тексты, потерянные или лишние токены,
токены, которых нет в справочнике.
Проверка ловит: незаполненные тексты, потерянные или лишние токены,
токены, которых нет в справочнике. Карты без эффекта считаются готовыми
сразу — им переводить нечего.
## Документация

View File

@ -1,6 +1,7 @@
# Русские тексты карт.
#
# Заполняйте только nameRu и textRu. Остальные поля не меняйте.
# Имена карт остаются английскими — переводим только текст эффекта.
# Заполняйте только textRu. Остальные поля не меняйте.
# Токены в фигурных скобках — это иконки: {auto}, {cb:3}, {vcrc}, {clan:kagero}.
# Их нужно сохранить в textRu ровно в таком же количестве, иначе проверка не пройдёт.
# Список всех токенов — content/keywords.yaml.
@ -10,88 +11,74 @@ version: 1
cards:
- nameId: assault-dragon-blightops
nameEn: "Assault Dragon, Blightops"
nameRu: ""
template: |-
{auto}:{cb:1} When this unit is put into the drop zone from {rc}, you may pay the cost. If you do, search your deck for up to one card named "Ironclad Dragon, Shieldon", reveal it to your opponent, put it into your hand, and shuffle your deck.
textRu: ""
- nameId: asura-kaiser
nameEn: "Asura Kaiser"
nameRu: ""
template: |-
{cont}{vcrc}:If you do not have another {clan:nova-grappler} vanguard or rear-guard, this unit gets {power} -2000.
{auto}{vc}:When this unit's drive check reveals a grade 3 {clan:nova-grappler}, choose one of your rear-guards, and {stand} it.
textRu: ""
- nameId: barcgal
nameEn: "Barcgal"
nameRu: ""
template: |-
{auto}:When another {clan:royal-paladin} rides this unit, you may call this card to {rc}.
{act}{rc}:{rest} Search your deck for up to one card named "Future Knight, Llew" or "Flogal", call it to {rc}, and shuffle your deck.
textRu: ""
- nameId: battle-sister-chocolat
nameEn: "Battle Sister, Chocolat"
nameRu: ""
template: |-
{cont}:{sentinel} (You may only have up to four cards with "{cont}:{sentinel}" in a deck.){auto}:[Choose a {clan:oracle-think-tank} from your hand, and discard it] When this unit is placed on {gc}, you may pay the cost. If you do, choose one of your {clan:oracle-think-tank} that is being attacked, and that unit cannot be hit until end of that battle.
textRu: ""
- nameId: battle-sister-cocoa
nameEn: "Battle Sister, Cocoa"
nameRu: ""
template: |-
{auto}:When this unit is placed on {vc} or {rc}, if you have an {clan:oracle-think-tank} vanguard, look at the top card of your deck, and put that card on the top or the bottom of your deck.
textRu: ""
- nameId: battle-sister-mocha
nameEn: "Battle Sister, Mocha"
nameRu: ""
template: |-
{auto}{vcrc}:When this unit attacks, if the number of cards in your hand is four or greater, this unit gets {power} +3000 until end of that battle.
textRu: ""
- nameId: battleraizer
nameEn: "Battleraizer"
nameRu: ""
template: |-
{auto}:When another {clan:nova-grappler} rides this unit, you may call this card to {rc}.
{auto}{rc}:When this unit boosts, the boosted unit gets {power} +3000 until end of that battle, and at the begininng of the end phase of that turn, return this unit to your deck, and shuffle your deck.
textRu: ""
- nameId: berserk-dragon
nameEn: "Berserk Dragon"
nameRu: ""
template: |-
{auto}:{cb:2} When this unit is placed on {vc} or {rc}, if you have a {clan:kagero} vanguard, you may pay the cost. If you do, choose an opponent's grade 2 or less rear-guard, and retire it.
textRu: ""
- nameId: blaster-blade
nameEn: "Blaster Blade"
nameRu: ""
template: |-
{auto}:{cb:2} When this unit is placed on {vc}, you may pay the cost. If you do, choose an opponent's rear-guard, and retire it.
{auto}:{cb:2} When this unit is placed on {rc}, if you have a {clan:royal-paladin} vanguard, you may pay the cost. If you do, choose an opponent's grade 2 or greater rear-guard, and retire it.
textRu: ""
- nameId: bloody-hercules
nameEn: "Bloody Hercules"
nameRu: ""
template: ""
textRu: ""
- nameId: blue-dust
nameEn: "Blue Dust"
nameRu: ""
template: |-
{auto}{vcrc}:When this unit's attack hits, if you have a {clan:dark-irregulars} vanguard, you may {sc:1}.
textRu: ""
- nameId: bringer-of-good-luck-epona
nameEn: "Bringer of Good Luck, Epona"
nameRu: ""
template: ""
textRu: ""
- nameId: brutal-jack
nameEn: "Brutal Jack"
nameRu: ""
template: |-
{cont}{vcrc}:Restraint (This unit cannnot attack.){act}{vcrc}:{cb:1} Until end of turn, this unit loses "Restraint".
{auto}{vc}:When this unit is boosted by a {clan:nova-grappler}, this unit gets {power} +5000 until end of that battle.
textRu: ""
- nameId: ceo-amaterasu
nameEn: "CEO Amaterasu"
nameRu: ""
template: |-
{cont}{vc}:During your turn, if the number of cards in your hand is four or greater, this unit gets {power} +4000.
{auto}{vc}:At the beginning of your main phase, {sc:1}, look at the top card of your deck, and put that card on the top or the bottom of your deck.
@ -99,198 +86,165 @@ cards:
textRu: ""
- nameId: clay-doll-mechanic
nameEn: "Clay-doll Mechanic"
nameRu: ""
template: |-
{auto}:When this unit is placed on {rc}, if you have a {clan:nova-grappler} vanguard, choose a card from your damage zone, and turn it face up.
textRu: ""
- nameId: commodore-blueblood
nameEn: "Commodore Blueblood"
nameRu: ""
template: ""
textRu: ""
- nameId: covenant-knight-randolf
nameEn: "Covenant Knight, Randolf"
nameRu: ""
template: |-
{auto}{vcrc}:When this unit attacks, if the number of cards in your hand is greater than your opponent's, this unit gets {power} +3000 until end of that battle.
textRu: ""
- nameId: crimson-butterfly-brigitte
nameEn: "Crimson Butterfly, Brigitte"
nameRu: ""
template: |-
{auto}{vc}:When this unit's drive check reveals a grade 3 {clan:royal-paladin}, this unit gets {power} +5000 until end of that battle.
textRu: ""
- nameId: dandy-guy-romario
nameEn: "Dandy Guy, Romario"
nameRu: ""
template: ""
textRu: ""
- nameId: demon-eater
nameEn: "Demon Eater"
nameRu: ""
template: |-
{auto}{vc}:At the beginning of your main phase, {sc:1}, and this unit gets {power} +2000 until end of turn.
{auto}{vcrc}:{sb:8} & {cb:5} When this unit's attack hits, you may pay the cost. If you do, retire all of your opponent's rear-guards.
textRu: ""
- nameId: demon-slaying-knight-lohengrin
nameEn: "Demon Slaying Knight, Lohengrin"
nameRu: ""
template: |-
{auto}{vc}:At the beginning of your main phase, {sc:1}, and this unit gets {power} +2000 until end of turn.
{auto}{vcrc}:{sb:8} & {cb:5} When this unit's attack hits, you may pay the cost. If you do, retire all of your opponent's rear-guards.
textRu: ""
- nameId: demonic-dragon-berserker-yaksha
nameEn: "Demonic Dragon Berserker, Yaksha"
nameRu: ""
template: |-
{auto}{hand}:During your main phase, when an opponent's rear-guard is put into the drop zone, if you have a grade 2 vanguard, you may reveal this card. If you do, ride this card.
textRu: ""
- nameId: demonic-dragon-madonna-joka
nameEn: "Demonic Dragon Madonna, Joka"
nameRu: ""
template: |-
{auto}{rc}:During your main phase, when an opponent's rear-guard is put into the drop zone, this unit gets {power} +3000 until end of turn.
textRu: ""
- nameId: demonic-dragon-mage-rakshasa
nameEn: "Demonic Dragon Mage, Rakshasa"
nameRu: ""
template: |-
{auto}{rc}:During your main phase, when an opponent's rear-guard is put into the drop zone, this unit gets {power} +3000 until end of turn.
textRu: ""
- nameId: dragon-dancer-monica
nameEn: "Dragon Dancer, Monica"
nameRu: ""
template: ""
textRu: ""
- nameId: dragon-knight-aleph
nameEn: "Dragon Knight, Aleph"
nameRu: ""
template: |-
{act}{vc}:[{cb:1} & Choose a unit named "Embodiment of Armor, Bahr" and a unit named "Embodiment of Spear, Tahr" from your {rc}, and put them into your soul] Search your deck for up to one card named "Embodiment of Victory, Aleph", ride it, and shuffle your deck.
textRu: ""
- nameId: dragon-knight-nehalem
nameEn: "Dragon Knight, Nehalem"
nameRu: ""
template: ""
textRu: ""
- nameId: dragon-monk-genjo
nameEn: "Dragon Monk, Genjo"
nameRu: ""
template: |-
(You may only have up to four cards with "{heal} HEAL" in a deck.)
textRu: ""
- nameId: dragon-monk-gojo
nameEn: "Dragon Monk, Gojo"
nameRu: ""
template: |-
{act}{vcrc}:[{rest} & Choose a card from your hand, and discard it] Draw a card.
textRu: ""
- nameId: dragon-monk-goku
nameEn: "Dragon Monk, Goku"
nameRu: ""
template: |-
{auto}{vc}:When this unit's drive check reveals a grade 3 {clan:kagero}, choose an opponent's grade 1 or less rear-guard, and retire it.
textRu: ""
- nameId: dragonic-overlord
nameEn: "Dragonic Overlord"
nameRu: ""
template: |-
{cont}{vcrc}:If you do not have another {clan:kagero} vanguard or rear-guard, this unit gets {power} -2000.
{act}{vcrc}:{cb:3} Until end of turn, this unit gets {power} +5000, gets "Own{vcrc}:When this unit's attack hits an opponent's rear-guard, {stand} this unit," and loses "{twin-drive}".
textRu: ""
- nameId: dream-eater
nameEn: "Dream Eater"
nameRu: ""
template: ""
textRu: ""
- nameId: embodiment-of-armor-bahr
nameEn: "Embodiment of Armor, Bahr"
nameRu: ""
template: ""
textRu: ""
- nameId: embodiment-of-spear-tahr
nameEn: "Embodiment of Spear, Tahr"
nameRu: ""
template: ""
textRu: ""
- nameId: embodiment-of-victory-aleph
nameEn: "Embodiment of Victory, Aleph"
nameRu: ""
template: |-
{act}{vcrc}:{cb:4} This unit gets {power} +3000/{critical} +1 until end of turn.
{act}{vc}:[Choose a card named "Dragon Knight, Aleph", a card named "Embodiment of Armor, Bahr", and a card named "Embodiment of Spear, Tahr" from your soul, and put them into your drop zone] Turn all cards in your damage zone face up.
textRu: ""
- nameId: flame-of-hope-aermo
nameEn: "Flame of Hope, Aermo"
nameRu: ""
template: |-
{auto}{rc}:[Choose a card from your hand, and discard it] When an attack hits during the battle that this unit boosted, you may pay the cost. If you do, draw a card.
textRu: ""
- nameId: flash-shield-iseult
nameEn: "Flash Shield, Iseult"
nameRu: ""
template: |-
{cont}:{sentinel} (You may only have up to four cards with "{cont}:{sentinel}" in a deck.)
{auto}:[Choose a {clan:royal-paladin} from your hand, and discard it] When this unit is placed on {gc}, you may pay the cost. If you do, choose one of your {clan:royal-paladin} that is being attacked, and that unit cannot be hit until end of that battle.
textRu: ""
- nameId: flogal
nameEn: "Flogal"
nameRu: ""
template: ""
textRu: ""
- nameId: future-knight-llew
nameEn: "Future Knight, Llew"
nameRu: ""
template: |-
{act}{rc}:[{cb:1} & Choose a unit named "Future Knight, Llew", a unit named "Barcgal", and a unit named "Flogal" from your {rc}, and put them into your soul] If you have a grade 1 vanguard, search your deck for up to one card named "Blaster Blade", ride it, and shuffle your deck.
textRu: ""
- nameId: guiding-zombie
nameEn: "Guiding Zombie"
nameRu: ""
template: |-
{auto}:When another {clan:granblue} rides this unit, you may call this card to {rc}.
{act}{rc}:[Put this unit into your soul] Put three cards from the top of your deck into your drop zone.
textRu: ""
- nameId: hell-spider
nameEn: "Hell Spider"
nameRu: ""
template: |-
{cont}{vc}:During your turn, if all of your opponent's vanguard and rear-guards are Rest , this unit gets {power} +3000.
{auto}:{cb:2} When this unit is placed on {vc} or {rc}, you may pay the cost. If you do, choose one of your opponent's rear-guards, and the chosen unit cannot {stand} during your opponent's next stand phase.
textRu: ""
- nameId: highspeed-brakki
nameEn: "Highspeed, Brakki"
nameRu: ""
template: |-
{auto}{rc}:{sb:1} When this unit attacks, you may pay the cost. If you do, this unit gets {power} +5000 until end of that battle, and at the beginning of the close step of that battle, return this unit to your deck, and shuffle your deck.
textRu: ""
- nameId: hungry-dumpty
nameEn: "Hungry Dumpty"
nameRu: ""
template: |-
{auto}:When this unit is placed on {rc}, if you have a {clan:nova-grappler} vanguard, choose a card from your damage zone, and turn it face up.
textRu: ""
- nameId: ironclad-dragon-shieldon
nameEn: "Ironclad Dragon, Shieldon"
nameRu: ""
template: ""
textRu: ""
- nameId: juggernaut-maximum
nameEn: "Juggernaut Maximum"
nameRu: ""
template: |-
{cont}{vcrc}:If you do not have another {clan:spike-brothers} vanguard or rear-guard, this unit gets {power} -2000.
{auto}{rc}:{sb:1} When this unit attacks, you may pay the cost. If you do, this unit gets {power} +5000 until end of that battle, and at the beginning of the close step of that battle, return this unit to your deck, and shuffle your deck.
textRu: ""
- nameId: karma-queen
nameEn: "Karma Queen"
nameRu: ""
template: |-
{auto}:{cb:2} When this unit is placed on {vc} or {rc}, you may pay the cost. If you do, choose one of your opponent's rear-guards, and the chosen unit cannot {stand} during your opponent's next stand phase.
textRu: ""
- nameId: king-of-knights-alfred
nameEn: "King of Knights, Alfred"
nameRu: ""
template: |-
{cont}{vc}:Your units cannot boost this unit.
{cont}{vc}:During your turn, this unit gets {power} +2000 for each of your {clan:royal-paladin} rear-guards.
@ -298,63 +252,52 @@ cards:
textRu: ""
- nameId: king-of-sword
nameEn: "King of Sword"
nameRu: ""
template: ""
textRu: ""
- nameId: knight-of-conviction-bors
nameEn: "Knight of Conviction, Bors"
nameRu: ""
template: |-
{auto}{vcrc}:{cb:1} When this unit attacks, you may pay the cost. If you do, this unit gets {power} +3000 until end of that battle.
textRu: ""
- nameId: knight-of-rose-morgana
nameEn: "Knight of Rose, Morgana"
nameRu: ""
template: |-
{auto}{vcrc}:[Choose a card from your hand, and discard it] When this unit attacks, you may pay the cost. If you do, this unit gets {power} +4000 until end of turn.
textRu: ""
- nameId: knight-of-silence-gallatin
nameEn: "Knight of Silence, Gallatin"
nameRu: ""
template: ""
textRu: ""
- nameId: knight-of-the-harp-tristan
nameEn: "Knight of the Harp, Tristan"
nameRu: ""
template: |-
{auto}{vc}:When this unit's drive check reveals a grade 3 {clan:royal-paladin}, this unit gets {power} +5000 until end of that battle.
textRu: ""
- nameId: lake-maiden-lien
nameEn: "Lake Maiden, Lien"
nameRu: ""
template: |-
{act}{vcrc}:[{rest} & Choose a card from your hand, and discard it] Draw a card.
textRu: ""
- nameId: little-sage-marron
nameEn: "Little Sage, Marron"
nameRu: ""
template: ""
textRu: ""
- nameId: lizard-runner-undeux
nameEn: "Lizard Runner, Undeux"
nameRu: ""
template: ""
textRu: ""
- nameId: lizard-soldier-conroe
nameEn: "Lizard Soldier, Conroe"
nameRu: ""
template: |-
{auto}:When another {clan:kagero} rides this unit, you may call this card to a {rc}.
{act}{rc}:[{cb:1} & Retire this unit] Search your deck for up to one grade 1 or less {clan:kagero}, reveal it to your opponent, put it into your hand, and shuffle your deck.
textRu: ""
- nameId: lizard-soldier-ganlu
nameEn: "Lizard Soldier, Ganlu"
nameRu: ""
template: ""
textRu: ""
- nameId: lozenge-magus
nameEn: "Lozenge Magus"
nameRu: ""
template: |-
(You may only have up to four cards with "{heal} HEAL" in a deck.)
{auto}:When another {clan:oracle-think-tank} rides this unit, you may call this card to {rc}.
@ -362,211 +305,175 @@ cards:
textRu: ""
- nameId: lucky-girl
nameEn: "Lucky Girl"
nameRu: ""
template: ""
textRu: ""
- nameId: madame-mirage
nameEn: "Madame Mirage"
nameRu: ""
template: ""
textRu: ""
- nameId: maiden-of-libra
nameEn: "Maiden of Libra"
nameRu: ""
template: |-
{auto}{vcrc}:{cb:2} When this unit's attack hits, if you have an {clan:oracle-think-tank} vanguard, you may pay the cost. If you do, draw a card.
textRu: ""
- nameId: miracle-kid
nameEn: "Miracle Kid"
nameRu: ""
template: ""
textRu: ""
- nameId: monster-frank
nameEn: "Monster Frank"
nameRu: ""
template: |-
{act}{drop}:{cb:3} If you have a grade 2 vanguard, ride this card.
textRu: ""
- nameId: mr-invincible
nameEn: "Mr. Invincible"
nameRu: ""
template: |-
{auto}{vc}:At the beginning of your main phase, {sc:1}, choose a card from your damage zone, and turn it face up.
{auto}{vcrc}:{sb:8} & {cb:5} When this unit's attack hits, you may pay the cost. If you do, {stand} all of your units.
textRu: ""
- nameId: nightmare-baby
nameEn: "Nightmare Baby"
nameRu: ""
template: |-
{auto}{rc}:When this unit boosts a unit named "Blue Dust", the boosted unit gets {power} +4000 until end of that battle.
textRu: ""
- nameId: oracle-guardian-apollon
nameEn: "Oracle Guardian, Apollon"
nameRu: ""
template: |-
{auto}{vc}:{cb:2} When this unit's attack hits, you may pay the cost. If you do, draw two cards, choose a card from your hand, return it to your deck, and shuffle your deck.
{auto}{rc}:{cb:2} When this unit's attack hits, you may pay the cost. If you do, draw a card.
textRu: ""
- nameId: oracle-guardian-gemini
nameEn: "Oracle Guardian, Gemini"
nameRu: ""
template: ""
textRu: ""
- nameId: oracle-guardian-nike
nameEn: "Oracle Guardian, Nike"
nameRu: ""
template: ""
textRu: ""
- nameId: oracle-guardian-wiseman
nameEn: "Oracle Guardian, Wiseman"
nameRu: ""
template: ""
textRu: ""
- nameId: queen-of-heart
nameEn: "Queen of Heart"
nameRu: ""
template: |-
{auto}{rc}:When this unit boosts a unit named "King of Sword", the boosted unit gets {power} +4000 until end of that battle.
textRu: ""
- nameId: redshoe-milly
nameEn: "Redshoe, Milly"
nameRu: ""
template: |-
{auto}:When this unit is put into the drop zone from {gc}, put this card into your soul.
textRu: ""
- nameId: ring-girl-clara
nameEn: "Ring Girl, Clara"
nameRu: ""
template: |-
(You may only have up to four cards with "{heal} HEAL" in a deck.)
textRu: ""
- nameId: rock-the-wall
nameEn: "Rock the Wall"
nameRu: ""
template: |-
{auto}:When this unit is put into the drop zone from {gc}, put this card into your soul.
textRu: ""
- nameId: screamin-and-dancin-announcer-shout
nameEn: "Screamin' and Dancin' Announcer, Shout"
nameRu: ""
template: |-
{act}{vcrc}:[{rest} & Choose a card from your hand, and discard it] Draw a card.
textRu: ""
- nameId: shining-lady
nameEn: "Shining Lady"
nameRu: ""
template: ""
textRu: ""
- nameId: solitary-knight-gancelot
nameEn: "Solitary Knight, Gancelot"
nameRu: ""
template: |-
{act}{vc}:{cb:2} If you have a card named "Blaster Blade" in your soul, this unit gets {power} +5000/{critical} +1 until end of turn.
{act}{hand}:[Reveal this card to your opponent, and put it on top of your deck] Search your deck for up to one card named "Blaster Blade", reveal it to your opponent, put it into your hand, and shuffle your deck.
textRu: ""
- nameId: sonic-noa
nameEn: "Sonic Noa"
nameRu: ""
template: ""
textRu: ""
- nameId: stardust-trumpeter
nameEn: "Stardust Trumpeter"
nameRu: ""
template: ""
textRu: ""
- nameId: starlight-unicorn
nameEn: "Starlight Unicorn"
nameRu: ""
template: |-
{auto}:When this unit is placed on {rc}, choose another of your {clan:royal-paladin}, and that unit gets {power} +2000 until end of turn.
textRu: ""
- nameId: stealth-beast-chigasumi
nameEn: "Stealth Beast, Chigasumi"
nameRu: ""
template: |-
{auto}{vcrc}:When this unit attacks, if the number of cards in your hand is greater than your opponent's, this unit gets {power} +3000 until end of that battle.
textRu: ""
- nameId: stealth-beast-hagakure
nameEn: "Stealth Beast, Hagakure"
nameRu: ""
template: |-
{auto}:{cb:1} When this unit is placed on {gc}, if you have a {clan:nubatama} vanguard, and the number of cards in your hand is less than your opponent's, you may pay the cost. If you do, your opponent chooses a card from his or her hand, and discards it.
textRu: ""
- nameId: stealth-dragon-dreadmaster
nameEn: "Stealth Dragon, Dreadmaster"
nameRu: ""
template: |-
{auto}{rc}:{cb:1} When an attack hits during the battle that this unit boosted a {clan:nubatama}, if the number of cards in your hand is less than your opponent's, you may pay the cost. If you do, your opponent chooses a card from his or her hand, and discards it.
textRu: ""
- nameId: stealth-dragon-voidmaster
nameEn: "Stealth Dragon, Voidmaster"
nameRu: ""
template: |-
{auto}{vc}:When this unit attacks, if the number of cards in your hand is greater than your opponent's, this unit gets {power} +3000 until end of that battle.
{auto}{vcrc}:{cb:1} When this unit's attack hits, if the number of cards in your hand is less than your opponent's, you may pay the cost. If you do, your opponent chooses a card from his or her hand, and discards it.
textRu: ""
- nameId: tough-boy
nameEn: "Tough Boy"
nameRu: ""
template: ""
textRu: ""
- nameId: tyrant-deathrex
nameEn: "Tyrant, Deathrex"
nameRu: ""
template: |-
{auto}{vc}:When this unit attacks, this unit gets {power} +5000 until end of that battle.
{auto}{vc}:When this unit's attack hits, choose one of your rear-guards, and retire it.
textRu: ""
- nameId: vortex-dragon
nameEn: "Vortex Dragon"
nameRu: ""
template: |-
{auto}{vc}:At the begininng of your main phase, {sc:1}, and this unit gets {power} +2000 until end of turn.
{act}{vcrc}:{sb:8} & {cb:5} Choose up to three of your opponent's rear-guards, and retire them.
textRu: ""
- nameId: weapons-dealer-govannon
nameEn: "Weapons Dealer, Govannon"
nameRu: ""
template: ""
textRu: ""
- nameId: weather-girl-milk
nameEn: "Weather Girl, Milk"
nameRu: ""
template: |-
{auto}{rc}:When this unit boosts an {clan:oracle-think-tank} vanguard, if the number of cards in your hand is four or greater, the boosted unit gets {power} +4000 until end of that battle.
textRu: ""
- nameId: wingal
nameEn: "Wingal"
nameRu: ""
template: |-
{auto}{rc}:When this unit boosts a card named "Blaster Blade", the boosted unit gets {power} +4000 until end of that battle.
textRu: ""
- nameId: wonder-boy
nameEn: "Wonder Boy"
nameRu: ""
template: ""
textRu: ""
- nameId: wyvern-guard-barri
nameEn: "Wyvern Guard, Barri"
nameRu: ""
template: |-
{cont}:{sentinel} (You may only have up to four cards with "{cont}:{sentinel}" in a deck.){auto}:[Choose a {clan:kagero} from your hand, and discard it] When this unit is placed on {gc}, you may pay the cost. If you do, choose one of your {clan:kagero} that is being attacked, and that unit cannot be hit until end of that battle.
textRu: ""
- nameId: wyvern-strike-jarran
nameEn: "Wyvern Strike, Jarran"
nameRu: ""
template: |-
{auto}{rc}:When this unit boosts a card named "Wyvern Strike, Tejas", the boosted unit gets {power} +4000 until end of that battle.
textRu: ""
- nameId: wyvern-strike-tejas
nameEn: "Wyvern Strike, Tejas"
nameRu: ""
template: |-
{cont}{vcrc}:If this unit would attack, it may instead attack an opponent's unit in the back row of the same column as this unit.
textRu: ""
- nameId: yggdrasil-maiden-elaine
nameEn: "Yggdrasil Maiden, Elaine"
nameRu: ""
template: |-
(You may only have up to four cards with "{heal} HEAL" in a deck.)
textRu: ""

View File

@ -28,7 +28,6 @@ public static class ContentValidator
public static ContentReport Validate(CardCatalog catalog)
{
var issues = new List<ContentIssue>();
var missingRu = new List<string>();
foreach (var card in catalog.Cards)
{
@ -69,19 +68,6 @@ public static class ContentValidator
$"{card.NameId}: NormalUnit не может иметь триггер {card.Trigger}."));
}
if (card.NameRu is null)
{
missingRu.Add(card.NameId);
}
}
if (missingRu.Count > 0)
{
var sample = string.Join(", ", missingRu.Take(5));
issues.Add(new ContentIssue(
IssueSeverity.Warning,
"card.no-ru-name",
$"Без русского названия: {missingRu.Count} карт ({sample}{(missingRu.Count > 5 ? ", …" : string.Empty)})."));
}
foreach (var printing in catalog.Printings.Where(p => p.IsParallel))

View File

@ -15,7 +15,6 @@ public sealed class TranslationEntry
{
public string NameId { get; set; } = string.Empty;
public string NameEn { get; set; } = string.Empty;
public string? NameRu { get; set; }
/// <summary>Английский текст с токенами вместо иконок. Источник для перевода.</summary>
public string? Template { get; set; }
@ -29,7 +28,8 @@ public static class TranslationYaml
"""
# Русские тексты карт.
#
# Заполняйте только nameRu и textRu. Остальные поля не меняйте.
# Имена карт остаются английскими — переводим только текст эффекта.
# Заполняйте только textRu. Остальные поля не меняйте.
# Токены в фигурных скобках — это иконки: {auto}, {cb:3}, {vcrc}, {clan:kagero}.
# Их нужно сохранить в textRu ровно в таком же количестве, иначе проверка не пройдёт.
# Список всех токенов — content/keywords.yaml.
@ -53,7 +53,6 @@ public static class TranslationYaml
{
sb.Append(" - nameId: ").Append(card.NameId).Append('\n');
sb.Append(" nameEn: ").Append(Quote(card.NameEn)).Append('\n');
sb.Append(" nameRu: ").Append(Quote(card.NameRu ?? string.Empty)).Append('\n');
AppendBlock(sb, "template", card.Template);
sb.Append(" textRu: ").Append(Quote(card.TextRu ?? string.Empty)).Append('\n');
}
@ -121,7 +120,6 @@ public static class TranslationService
{
NameId = card.NameId,
NameEn = card.NameEn,
NameRu = old?.NameRu ?? string.Empty,
Template = CardText.CardTextTokenizer.ToTemplate(card.TextEn),
TextRu = old?.TextRu ?? string.Empty,
};
@ -139,18 +137,12 @@ public static class TranslationService
foreach (var card in file.Cards)
{
var hasName = !string.IsNullOrWhiteSpace(card.NameRu);
var hasText = string.IsNullOrWhiteSpace(card.Template) || !string.IsNullOrWhiteSpace(card.TextRu);
if (hasName && hasText)
if (hasText)
translated++;
else
{
if (!hasName)
issues.Add(new TranslationIssue(card.NameId, "name.missing", "Не заполнено nameRu."));
if (!hasText)
issues.Add(new TranslationIssue(card.NameId, "text.missing", "Не заполнено textRu."));
}
issues.Add(new TranslationIssue(card.NameId, "text.missing", "Не заполнено textRu."));
var source = CardText.CardTextTokenizer.ExtractTokens(card.Template);
var target = CardText.CardTextTokenizer.ExtractTokens(card.TextRu);

View File

@ -78,7 +78,6 @@ public class CardTextTests
{
NameId = "test",
NameEn = "Test",
NameRu = "Тест",
Template = "{auto}{vc}:Draw a card.",
TextRu = "Взять карту.",
},
@ -101,7 +100,6 @@ public class CardTextTests
{
NameId = "test",
NameEn = "Test",
NameRu = "Тест",
Template = "{auto}{vc}:Draw a card.",
TextRu = "{auto}{vc}:Взять карту.",
},