Publish German language pack template

This commit is contained in:
AverageConsumer
2026-08-11 01:43:22 +02:00
parent 6be3a5684b
commit cbce56c86f
8 changed files with 412 additions and 5 deletions
+9 -4
View File
@@ -7,7 +7,7 @@
Turn a dual-screen Android handheld into a complete Gen 1 companion for [Gen1Recomp](https://github.com/bryanthaboi/gen1recomp): keep the game on one display and put maps, party data, battles and touch controls on the other.
<p>
<a href="https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.1"><img src="https://img.shields.io/badge/release-v1.7.1-5c8a3c" alt="Latest release: v1.7.1"></a>
<a href="https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.2"><img src="https://img.shields.io/badge/release-v1.7.2-5c8a3c" alt="Latest release: v1.7.2"></a>
<a href="#supported-devices"><img src="https://img.shields.io/badge/platform-Android-3DDC84" alt="Platform: Android"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/code-MIT-blue.svg" alt="Code license: MIT"></a>
</p>
@@ -18,7 +18,7 @@ Turn a dual-screen Android handheld into a complete Gen 1 companion for [Gen1Rec
<img src="kanto-gear-full-gear-battle.png" width="32%" alt="Kanto Gear Full Gear battle controls and status panels">
</p>
<p><strong><a href="https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.1">Download Kanto Gear</a></strong> · <strong><a href="#install-on-android">Install on Android</a></strong> · <strong><a href="https://github.com/AverageConsumer/kanto-gear/issues">Report a problem</a></strong></p>
<p><strong><a href="https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.2">Download Kanto Gear</a></strong> · <strong><a href="#install-on-android">Install on Android</a></strong> · <strong><a href="https://github.com/AverageConsumer/kanto-gear/issues">Report a problem</a></strong></p>
</div>
@@ -45,7 +45,8 @@ optional; the host and Kanto Gear mod are required.
| Download | Required | Purpose |
| --- | :---: | --- |
| [Gen1Recomp Android Test 0.1.76-kanto.7](https://github.com/AverageConsumer/gen1recomp/releases/tag/v0.1.76-kanto.7) | **Yes** | Android host with the dual-display bridge |
| [Kanto Gear 1.7.1](https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.1) | **Yes** | The second-screen companion mod |
| [Kanto Gear 1.7.2](https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.2) | **Yes** | The second-screen companion mod |
| [Kanto Gear Deutsch 0.1.0](https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.2) | No | German text for the Kanto Gear interface |
| [Dramatic Shape 1.7.0-android.1](https://github.com/AverageConsumer/DramaticShapeVoxelMod/releases/tag/v1.7.0-android.1) | No | Tested optional 3D renderer for Android |
> [!IMPORTANT]
@@ -58,12 +59,16 @@ You need your own supported Pokémon Red, Blue or Yellow ROM. No ROM or
ROM-extracted game data is included.
1. Install the [Gen1Recomp Android Test APK](https://github.com/AverageConsumer/gen1recomp/releases/tag/v0.1.76-kanto.7).
2. Download [Kanto Gear 1.7.1](https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.1).
2. Download [Kanto Gear 1.7.2](https://github.com/AverageConsumer/kanto-gear/releases/tag/v1.7.2).
3. Open **Gen1Recomp Android Test → MODS → Import mod .zip** and select the
Kanto Gear ZIP.
4. Enable **Kanto Gear** and start the game. The companion opens automatically
when Android reports a suitable second display.
For a German Kanto Gear interface, import the optional
`Kanto-Gear-Deutsch-0.1.0.zip` from the same release. Other translations can
use the small [language-pack template](translations/README.md).
When updating the host, install the newer APK over the existing app. Do not
uninstall it first unless you have exported your save.
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "kanto_gear",
"name": "Kanto Gear",
"version": "1.7.1",
"version": "1.7.2",
"api": 2,
"entry": "main.lua",
"category": "UI",
+17
View File
@@ -0,0 +1,17 @@
# Translating Kanto Gear
The folders here are normal Gen1Recomp companion mods. They translate only
text drawn by Kanto Gear; the base game still needs its own language mod.
Install them alongside Kanto Gear 1.7.2 or newer.
To add a language:
1. Copy `kanto_gear_de` and give the folder and manifest a unique mod ID.
2. Replace the values in `lang/de.lua` while keeping every source key and
format placeholder (`%s`, `%d`, and `%%`) unchanged.
3. Rename the language file and update its path in `main.lua`.
4. Run the copied `tests/catalog_test.lua` with LuaJIT. Its fixed-field checks
catch translations that would overflow Kanto Gear's compact UI.
Missing entries safely remain in English. No Kanto Gear source changes are
needed for another language.
+259
View File
@@ -0,0 +1,259 @@
return {
-- Start, navigation and common controls.
["START GAME ABOVE"] = "SPIEL OBEN STARTEN",
["TAP TO CONTINUE"] = "ZUM STARTEN TIPPEN",
["HOST UPDATE REQUIRED"] = "HOST-UPDATE NÖTIG",
["LOADING AREA"] = "GEBIET LÄDT",
["KEEP EXPLORING"] = "WEITER ERKUNDEN",
["MAP"] = "KARTE",
["LOCAL"] = "LOKAL",
["GUIDE"] = "GUIDE",
["AREA"] = "GEBIET",
["TRAINER"] = "TRAINER",
["PARTY"] = "TEAM",
["TOOLS"] = "TOOLS",
["BACK"] = "ZURÜCK",
["CLOSE"] = "SCHLIESSEN",
["CONTINUE"] = "WEITER",
["CONFIRM"] = "BESTÄTIGEN",
["CHOOSE"] = "WÄHLEN",
["USE"] = "NUTZEN",
["SWAP"] = "TAUSCHEN",
["RESET"] = "ZURÜCKSETZEN",
["YES"] = "JA",
["NO"] = "NEIN",
["OK"] = "OK",
["INFO"] = "INFO",
-- Map, guide, area and tools.
["AREA MAP"] = "GEBIETSKARTE",
["MAP + FLY"] = "KARTE + FLUG",
["FLY TO"] = "FLIEGEN NACH",
["CONTEXT REQUIRED"] = "KONTEXT NÖTIG",
["NO ACTION HERE"] = "KEINE AKTION HIER",
["NO TOOLS UNLOCKED"] = "KEINE TOOLS FREI",
["ITEM RADAR"] = "ITEM-RADAR",
["NEED ITEMFINDER"] = "ITEMRADAR NÖTIG",
["SCAN"] = "SCANNEN",
["SCANNING"] = "SUCHE LÄUFT",
["NO SIGNAL"] = "KEIN SIGNAL",
["SIGNALS %d"] = "SIGNALE %d",
["DUAL DISPLAY"] = "DUAL-DISPLAY",
["LINK READY"] = "LINK BEREIT",
["GUIDE %d/%d"] = "GUIDE %d/%d",
["DEX %d/%d"] = "DEX %d/%d",
["AREA %d/%d"] = "GEBIET %d/%d",
["+ AREA COMPLETE +"] = "+ GEBIET KOMPLETT +",
["+ %s CLEARED +"] = "+ %s ERLEDIGT +",
["NO %s"] = "KEINE %s",
["NO WILD ENCOUNTERS"] = "KEINE WILDEN POKÉMON",
["WALK"] = "LAUFEN",
["SURF"] = "SURFER",
["OLD"] = "ANGEL",
["GOOD"] = "PROFIANGEL",
["SUPER"] = "SUPERANGEL",
["EXIT"] = "AUSG.",
["TOTAL"] = "GESAMT",
["LOST"] = "VERLOREN",
["CAUGHT"] = "GEF.",
["DONE"] = "FERT.",
["OPEN"] = "OFFEN",
["HIDDEN"] = "GEHEIM",
["TRAINERS"] = "TRAINER",
["%d COINS"] = "%d MÜNZEN",
-- Trainer card and party.
["BADGES"] = "ORDEN",
["MONEY"] = "GELD",
["TIME"] = "ZEIT",
["POKEDEX"] = "POKÉDEX",
["STEPS"] = "SCHRITTE",
["LEVEL UP"] = "LEVELAUFSTIEG",
["STATS"] = "WERTE",
["STATS %d/2"] = "WERTE %d/2",
["STATUS"] = "STATUS",
["STATUS %s"] = "STATUS %s",
["HP"] = "KP",
["HP %d/%d"] = "KP %d/%d",
["PP"] = "AP",
["PP --"] = "AP --",
["PP %d"] = "AP %d",
["PP %d/%d"] = "AP %d/%d",
["%s PP %s"] = "%s AP %s",
["NEXT MAX"] = "NÄCHSTES MAX",
["NEXT L.%d %d"] = "NÄCHSTES L.%d %d",
["ATTACK"] = "ANGRIFF",
["DEFENSE"] = "ABWEHR",
["SPEED"] = "INITIATIVE",
["SPECIAL"] = "SPEZIAL",
["ACCURACY"] = "GENAUIGK.",
["EVADE"] = "FLUCHTWERT",
["ATK %d"] = "ANG %d",
["DEF %d"] = "VERT %d",
["SPD %d"] = "INIT %d",
["SPC %d"] = "SPEZ %d",
["TYPE1 %s"] = "TYP1 %s",
["TYPE2 %s"] = "TYP2 %s",
-- Battle, move selection and PC screens.
["BATTLE"] = "KAMPF",
["Wild battle"] = "WILDER KAMPF",
["Trainer battle"] = "TRAINERKAMPF",
["FIGHT"] = "KAMPF",
["PKMN"] = "PKMN",
["ITEM"] = "ITEM",
["RUN"] = "FLUCHT",
["SAFARI"] = "SAFARI",
["BALL"] = "BALL",
["BALL x%d"] = "BALL x%d",
["BAIT"] = "KÖDER",
["THROW ROCK"] = "STEIN WERFEN",
["SAFARI BALLS %d"] = "SAFARIBÄLLE %d",
["MOVES"] = "ATTACKEN",
["MOVE"] = "ATTACKE",
["POWER"] = "STÄRKE",
["HIT"] = "TREFFER",
["MATCHUP"] = "WIRKUNG",
["CHOOSE MOVE"] = "ATTACKE WÄHLEN",
["MOVE WHERE?"] = "WELCHE ATTACKE?",
["CHOOSE ROD"] = "ANGEL WÄHLEN",
["FOLLOW TOP SCREEN"] = "OBEREM SCREEN FOLGEN",
["HEAL WITH"] = "HEILEN MIT",
["HEAL TARGET"] = "ZIEL HEILEN",
["MAKE A CHOICE"] = "AUSWAHL TREFFEN",
["PAUSE THEN CHOOSE"] = "PAUSE, DANN WÄHLEN",
["NEW MOVE"] = "NEUE ATTACKE",
["FORGET MOVE"] = "ATTACKE VERGESSEN",
["POKEMON PC"] = "POKÉMON-PC",
["ITEM PC"] = "ITEM-PC",
["WITHDRAW"] = "ABHEBEN",
["DEPOSIT"] = "ABLEGEN",
["RELEASE"] = "FREILASSEN",
["BOXES"] = "BOXEN",
["CHANGE BOX"] = "BOX WECHSELN",
["BOX USED"] = "BOX BELEGT",
["TOSS"] = "WEGWERFEN",
["QUANTITY"] = "ANZAHL",
["NOTHING HERE"] = "NICHTS VORHANDEN",
["LOG OFF"] = "ABMELDEN",
["PRINT"] = "DRUCKEN",
["NEXT"] = "WEITER",
["ROCK"] = "STEIN",
["PAGE %d/%d"] = "SEITE %d/%d",
["NAME INPUT"] = "NAMENSEINGABE",
["CASE"] = "UMSCHALTEN",
["UPPER CASE"] = "GROSS",
["TO LOWER"] = "KLEINBUCHSTABEN",
["TO UPPER"] = "GROSSBUCHSTABEN",
["NO DETAILS AVAILABLE"] = "KEINE DETAILS VERFÜGBAR",
-- Move detail templates.
["DEALS %d FIXED DAMAGE"] = "MACHT %d FESTSCHADEN",
["HITS %d TIMES"] = "TRIFFT %d-MAL",
["HITS %d-%d TIMES"] = "TRIFFT %d-%d-MAL",
["RAISES USER %s"] = "ERHÖHT %s",
["LOWERS TARGET %s"] = "SENKT ZIEL-%s",
["LOWERS TARGET"] = "SENKT ZIELWERT",
["TARGET %s"] = "ZIEL-%s",
["BY ONE STAGE"] = "UM 1 STUFE",
["BY TWO STAGES"] = "UM 2 STUFEN",
["33.2% CHANCE TO LOWER"] = "33,2% SENK-CHANCE",
["DEALS DAMAGE"] = "RICHTET SCHADEN AN",
["HITS TWICE"] = "TRIFFT ZWEIMAL",
["STORES DAMAGE 2-3"] = "SAMMELT SCHADEN 2-3",
["TURNS THEN RETURNS 2X"] = "DANN 2X ZURÜCK",
["10.2% CHANCE"] = "10,2% CHANCE",
["20.3% CHANCE"] = "20,3% CHANCE",
["30.1% CHANCE"] = "30,1% CHANCE",
["40.2% CHANCE"] = "40,2% CHANCE",
["9.8% CHANCE"] = "9,8% CHANCE",
["TO BURN TARGET"] = "AUF VERBRENNUNG",
["TO CONFUSE TARGET"] = "AUF VERWIRRUNG",
["TO FLINCH TARGET"] = "AUF ZURÜCKSCHRECKEN",
["TO FREEZE TARGET"] = "AUF EINFRIEREN",
["TO PARALYZE TARGET"] = "AUF PARALYSE",
["TO POISON TARGET"] = "AUF VERGIFTUNG",
["CHARGES THIS TURN"] = "LÄDT DIESE RUNDE",
["ATTACKS NEXT TURN"] = "ANGRIFF NÄCHSTE RUNDE",
["CONFUSES THE TARGET"] = "VERWIRRT DAS ZIEL",
["COPIES TARGET TYPES"] = "KOPIERT ZIELTYPEN",
["DISABLES RANDOM MOVE"] = "SPERRT ZUFALLSATTACKE",
["FOR 1-8 TURNS"] = "FÜR 1-8 RUNDEN",
["HEALS USER BY HALF"] = "HEILT ANWENDER 50%",
["OF DAMAGE DEALT"] = "DES SCHADENS",
["ONLY HITS SLEEPING"] = "NUR GEGEN SCHLAFENDE",
["DRAINS HALF DAMAGE"] = "HEILT 50% SCHADEN",
["USER FAINTS AFTER"] = "ANWENDER K.O. NACH",
["THE ATTACK"] = "DER ATTACKE",
["FLIES UP THIS TURN"] = "FLIEGT DIESE RUNDE",
["CLEARS BOTH SIDES"] = "LÖSCHT BEIDE SEITEN",
["STATS AND CONDITIONS"] = "WERTE UND STATUS",
["RESTORES HALF OF"] = "HEILT DIE HÄLFTE DER",
["USER MAX HP"] = "MAX-KP DES ANWENDERS",
["USER LOSES 1 HP"] = "ANW. VERLIERT 1 KP",
["IF ATTACK MISSES"] = "WENN ATTACKE VERFEHLT",
["DRAINS TARGET HP"] = "ENTZIEHT ZIEL-KP",
["EACH TURN"] = "JEDE RUNDE",
["DOUBLES USER SPECIAL"] = "DOPPELT ANW.-SPEZIAL",
["DEFENSE UNTIL SWITCH"] = "SCHUTZ BIS WECHSEL",
["USES A RANDOM MOVE"] = "NUTZT ZUFALLSATTACKE",
["COPIES A TARGET MOVE"] = "KOPIERT ZIELATTACKE",
["REPEATS TARGET LAST"] = "WIEDERHOLT LETZTE",
["PREVENTS ENEMY STAT"] = "BLOCKT GEGNERISCHE",
["REDUCTIONS"] = "WERTSENKUNGEN",
["ONE-HIT KO"] = "SOFORT-K.O.",
["FAILS IF USER SLOWER"] = "SCHEITERT: ZU LANGSAM",
["PARALYZES THE TARGET"] = "PARALYSIERT DAS ZIEL",
["SCATTERS 2X LEVEL"] = "STREUT 2X LEVEL",
["COINS AFTER BATTLE"] = "MÜNZEN NACH KAMPF",
["POISONS THE TARGET"] = "VERGIFTET DAS ZIEL",
["ATTACK RISES WHEN"] = "ANGRIFF STEIGT WENN",
["USER IS HIT"] = "ANWENDER GETROFFEN",
["USER TAKES 1/4"] = "ANWENDER NIMMT 1/4",
["DOUBLES USER DEFENSE"] = "DOPPELT ANW.-ABWEHR",
["UNTIL SWITCHING"] = "BIS ZUM WECHSEL",
["PUTS TARGET TO SLEEP"] = "ZIEL SCHLÄFT EIN",
["DOES NOTHING"] = "BEWIRKT NICHTS",
["USES 1/4 MAX HP"] = "NUTZT 1/4 MAX-KP",
["TO CREATE A DECOY"] = "FÜR EINEN DECOY",
["HALVES TARGET"] = "HALBIERT ZIELS",
["CURRENT HP"] = "AKTUELLE KP",
["NEVER MISSES"] = "VERFEHLT NIE",
["ENDS WILD BATTLE"] = "BEENDET WILDEN KAMPF",
["FAILS VS TRAINERS"] = "NICHT GEGEN TRAINER",
["ATTACKS 3-4 TURNS"] = "GREIFT 3-4 RUNDEN AN",
["THEN CONFUSES USER"] = "DANN ANW. VERWIRRT",
["COPIES TARGET STATS"] = "KOPIERT ZIELWERTE",
["TYPES AND MOVES"] = "TYPEN UND ATTACKEN",
["TRAPS FOR 2-5 HITS"] = "FESSELT 2-5 TREFFER",
["TARGET CANNOT MOVE"] = "ZIEL IST BEWEGUNGSLOS",
["20.3% POISON CHANCE"] = "20,3% GIFT-CHANCE",
["HITS 2-5 TIMES"] = "TRIFFT 2-5-MAL",
["2X LAST NORMAL/FIGHT"] = "2X LETZTE NORM/KAMPF",
["DAMAGE"] = "SCHADEN",
["DIGS UNDERGROUND"] = "GRÄBT SICH EIN",
["DEALS 40 FIXED DAMAGE"] = "MACHT 40 FESTSCHADEN",
["DAMAGE EQUALS"] = "SCHADEN ENTSPRICHT",
["USER LEVEL"] = "ANWENDER-LEVEL",
["DEALS 1 TO 1.5X"] = "MACHT 1 BIS 1,5X",
["USER LEVEL DAMAGE"] = "ANWENDER-LEVEL",
["FULLY HEALS USER"] = "HEILT ANWENDER VOLL",
["THEN SLEEPS 2 TURNS"] = "DANN 2 RUNDEN SCHLAF",
["DEALS 20 FIXED DAMAGE"] = "MACHT 20 FESTSCHADEN",
["USER TAKES HALF"] = "ANWENDER NIMMT 1/2",
["ESCAPES WILD BATTLE"] = "FLIEHT AUS WILDKAMPF",
["BADLY POISONS TARGET"] = "VERGIFTET ZIEL SCHWER",
["DAMAGE GROWS PER TURN"] = "SCHADEN STEIGT/RUNDE",
["HIGH CRITICAL-HIT"] = "HOHE VOLLTREFFER-",
["RATE"] = "CHANCE",
["RAISES CRITICAL-HIT"] = "ERHÖHT VOLLTREFFER-",
["LOWERS CRITICAL-HIT"] = "SENKT VOLLTREFFER-",
["RATE DUE TO GEN 1 BUG"] = "CHANCE DURCH GEN1-BUG",
["USER MUST RECHARGE"] = "ANWENDER MUSS LADEN",
["NEXT TURN"] = "NÄCHSTE RUNDE",
["RECHARGES NEXT TURN"] = "LÄDT NÄCHSTE RUNDE",
["UNLESS TARGET FAINTS"] = "AUSSER ZIEL IST K.O.",
["SPECIAL DAMAGE"] = "SPEZIALSCHADEN",
["DEALS CUSTOM"] = "MACHT SPEZIELLEN",
["FIXED DAMAGE"] = "FESTSCHADEN",
}
+11
View File
@@ -0,0 +1,11 @@
return function(mod)
local body = assert(mod:read("lang/de.lua"), "lang/de.lua fehlt")
local chunk = assert(loadstring(body, "lang/de.lua"))
local translations = assert(chunk())
local count = 0
for source, translated in pairs(translations) do
mod.content.strings:override(source, translated)
count = count + 1
end
mod.log:info("Kanto Gear Deutsch: %d Texte geladen", count)
end
+16
View File
@@ -0,0 +1,16 @@
{
"id": "kanto_gear_de",
"name": "Kanto Gear Deutsch",
"version": "0.1.0",
"api": 2,
"entry": "main.lua",
"category": "UI",
"profile": "content",
"game_version": "0.0.0-dev || >=0.1.75 <2.0.0",
"affects_link": false,
"dependencies": [],
"optional_dependencies": ["kanto_gear", "deutsch"],
"conflicts": [],
"permissions": [],
"description": "Deutsche Übersetzung für die von Kanto Gear gezeichnete Benutzeroberfläche."
}
@@ -0,0 +1,80 @@
local path = (...) or "translations/kanto_gear_de/lang/de.lua"
local catalog = assert(loadfile(path))()
local function countFormats(value)
local count = 0
for spec in value:gmatch("%%(.)") do
if spec ~= "%" then count = count + 1 end
end
return count
end
local count = 0
for source, translated in pairs(catalog) do
assert(type(source) == "string" and source ~= "")
assert(type(translated) == "string" and translated ~= "")
if countFormats(source) > 0 then
assert(countFormats(source) == countFormats(translated),
"Formatanzahl stimmt nicht: " .. source)
end
count = count + 1
end
assert(count >= 180, "Übersetzungskatalog ist unvollständig")
local function glyphs(value)
return select(2, value:gsub("[^\128-\193]", ""))
end
-- These labels are drawn into fixed-width fields instead of buttons or headers.
-- Keep deliberate translations within the actual renderer budgets so they do
-- not fall back to automatic dot truncation.
local layoutLimits = {
["LOADING AREA"] = 16,
["EXIT"] = 7,
["ITEM"] = 7,
["HIDDEN"] = 7,
["CAUGHT"] = 7,
["DONE"] = 5,
["OPEN"] = 5,
["MONEY"] = 11,
["TIME"] = 11,
["POKEDEX"] = 11,
["STEPS"] = 11,
["POWER"] = 7,
["HIT"] = 8,
["PP"] = 4,
["MATCHUP"] = 13,
}
for source, limit in pairs(layoutLimits) do
local translated = catalog[source] or source
assert(glyphs(translated) <= limit,
source .. " passt nicht ins Layout: " .. translated)
end
local kantoPath = os.getenv("KANTO_GEAR_MAIN")
local movesPath = os.getenv("KANTO_GEAR_MOVES")
if kantoPath and movesPath then
local entry = assert(loadfile(kantoPath))()
local theme
for index = 1, debug.getinfo(entry, "u").nups do
local name, value = debug.getupvalue(entry, index)
if name == "THEME" then theme = value break end
end
assert(theme, "Kanto-Gear-Theme nicht gefunden")
theme.strings = { get = function(_, source) return catalog[source] end }
for id, definition in pairs(assert(loadfile(movesPath))()) do
local lines = theme:moveDescription({ id = id }, definition, {
focusEnergyBug = true,
hyperBeamSkipRechargeOnKO = true,
})
for _, line in ipairs(lines) do
line = theme:translate(line)
assert(glyphs(line) <= 21, id .. " ist zu lang: " .. line)
end
end
end
print(('%d Kanto-Gear-Texte geprüft'):format(count))
@@ -0,0 +1,19 @@
package.path = "./?.lua;./?/init.lua;" .. package.path
local T = require("tests.modkit")
local root = assert(os.getenv("KANTO_GEAR_ROOT"))
local run = T.sdk.loadMods({
root .. "/mod/kanto_gear",
root .. "/translations/kanto_gear_de",
}, { data = T.fixtures.load() })
T.eq(#run.errors, 0,
"Kanto Gear und deutsche Begleitmod laden gemeinsam")
T.eq(run.data.strings["START GAME ABOVE"], "SPIEL OBEN STARTEN",
"Begleitmod registriert eigene Kanto-Gear-Texte")
T.eq(run.data.strings["DEALS %d FIXED DAMAGE"],
"MACHT %d FESTSCHADEN",
"Begleitmod registriert formatierte Attackendetails")
run.release()
T.finish("Kanto Gear Deutsch integration")