mirror of
https://github.com/AverageConsumer/kanto-gear.git
synced 2026-08-28 18:24:42 +02:00
Publish German language pack template
This commit is contained in:
@@ -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,7 +1,7 @@
|
||||
{
|
||||
"id": "kanto_gear",
|
||||
"name": "Kanto Gear",
|
||||
"version": "1.7.1",
|
||||
"version": "1.7.2",
|
||||
"api": 2,
|
||||
"entry": "main.lua",
|
||||
"category": "UI",
|
||||
|
||||
@@ -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.
|
||||
@@ -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",
|
||||
}
|
||||
@@ -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
|
||||
@@ -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")
|
||||
Reference in New Issue
Block a user