Adding more support for stuf
This commit is contained in:
parent
696ee730a6
commit
e014e1c3f9
4 changed files with 196 additions and 2 deletions
|
|
@ -54,6 +54,8 @@ class RPGMakerTab(QWidget):
|
||||||
"BRFLAG": False,
|
"BRFLAG": False,
|
||||||
"FIXTEXTWRAP": True,
|
"FIXTEXTWRAP": True,
|
||||||
"IGNORETLTEXT": False,
|
"IGNORETLTEXT": False,
|
||||||
|
"TLSYSTEMVARIABLES": False,
|
||||||
|
"TLSYSTEMSWITCHES": False,
|
||||||
|
|
||||||
# Main Codes (enabled by default)
|
# Main Codes (enabled by default)
|
||||||
"CODE401": True, # Show Text
|
"CODE401": True, # Show Text
|
||||||
|
|
@ -274,6 +276,16 @@ class RPGMakerTab(QWidget):
|
||||||
)
|
)
|
||||||
col1.addLayout(layout)
|
col1.addLayout(layout)
|
||||||
|
|
||||||
|
self.tlsystemvariables_cb, layout = self._create_checkbox_with_description(
|
||||||
|
"System Variables", "Translate variable names in System.json", "Translates the variables array in System.json. Can break stuff."
|
||||||
|
)
|
||||||
|
col1.addLayout(layout)
|
||||||
|
|
||||||
|
self.tlsystemswitches_cb, layout = self._create_checkbox_with_description(
|
||||||
|
"System Switches", "Translate switch names in System.json", "Translates the switches array in System.json."
|
||||||
|
)
|
||||||
|
col1.addLayout(layout)
|
||||||
|
|
||||||
self.join408_cb, layout = self._create_checkbox_with_description(
|
self.join408_cb, layout = self._create_checkbox_with_description(
|
||||||
"Merge 408 Lines", "Join multi-line comments together", "Joins CODE408 lines into one string."
|
"Merge 408 Lines", "Join multi-line comments together", "Joins CODE408 lines into one string."
|
||||||
)
|
)
|
||||||
|
|
@ -494,6 +506,8 @@ class RPGMakerTab(QWidget):
|
||||||
self.brflag_cb.stateChanged.disconnect()
|
self.brflag_cb.stateChanged.disconnect()
|
||||||
self.fixtextwrap_cb.stateChanged.disconnect()
|
self.fixtextwrap_cb.stateChanged.disconnect()
|
||||||
self.ignoretltext_cb.stateChanged.disconnect()
|
self.ignoretltext_cb.stateChanged.disconnect()
|
||||||
|
self.tlsystemvariables_cb.stateChanged.disconnect()
|
||||||
|
self.tlsystemswitches_cb.stateChanged.disconnect()
|
||||||
self.join408_cb.stateChanged.disconnect()
|
self.join408_cb.stateChanged.disconnect()
|
||||||
if self.engine == "ACE":
|
if self.engine == "ACE":
|
||||||
self.speakers408_cb.stateChanged.disconnect()
|
self.speakers408_cb.stateChanged.disconnect()
|
||||||
|
|
@ -534,6 +548,8 @@ class RPGMakerTab(QWidget):
|
||||||
self.brflag_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
self.brflag_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
||||||
self.fixtextwrap_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
self.fixtextwrap_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
||||||
self.ignoretltext_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
self.ignoretltext_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
||||||
|
self.tlsystemvariables_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
||||||
|
self.tlsystemswitches_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
||||||
self.join408_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
self.join408_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
||||||
if self.engine == "ACE":
|
if self.engine == "ACE":
|
||||||
self.speakers408_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
self.speakers408_cb.stateChanged.connect(lambda: self.apply_to_module(show_messages=False))
|
||||||
|
|
@ -572,6 +588,8 @@ class RPGMakerTab(QWidget):
|
||||||
"BRFLAG": self.brflag_cb.isChecked(),
|
"BRFLAG": self.brflag_cb.isChecked(),
|
||||||
"FIXTEXTWRAP": self.fixtextwrap_cb.isChecked(),
|
"FIXTEXTWRAP": self.fixtextwrap_cb.isChecked(),
|
||||||
"IGNORETLTEXT": self.ignoretltext_cb.isChecked(),
|
"IGNORETLTEXT": self.ignoretltext_cb.isChecked(),
|
||||||
|
"TLSYSTEMVARIABLES": self.tlsystemvariables_cb.isChecked(),
|
||||||
|
"TLSYSTEMSWITCHES": self.tlsystemswitches_cb.isChecked(),
|
||||||
"JOIN408": self.join408_cb.isChecked(),
|
"JOIN408": self.join408_cb.isChecked(),
|
||||||
|
|
||||||
# Main Codes
|
# Main Codes
|
||||||
|
|
@ -614,6 +632,8 @@ class RPGMakerTab(QWidget):
|
||||||
self.brflag_cb.setChecked(config.get("BRFLAG", False))
|
self.brflag_cb.setChecked(config.get("BRFLAG", False))
|
||||||
self.fixtextwrap_cb.setChecked(config.get("FIXTEXTWRAP", True))
|
self.fixtextwrap_cb.setChecked(config.get("FIXTEXTWRAP", True))
|
||||||
self.ignoretltext_cb.setChecked(config.get("IGNORETLTEXT", False))
|
self.ignoretltext_cb.setChecked(config.get("IGNORETLTEXT", False))
|
||||||
|
self.tlsystemvariables_cb.setChecked(config.get("TLSYSTEMVARIABLES", False))
|
||||||
|
self.tlsystemswitches_cb.setChecked(config.get("TLSYSTEMSWITCHES", False))
|
||||||
self.join408_cb.setChecked(config.get("JOIN408", False))
|
self.join408_cb.setChecked(config.get("JOIN408", False))
|
||||||
|
|
||||||
# Only set SPEAKERS408 for ACE engine
|
# Only set SPEAKERS408 for ACE engine
|
||||||
|
|
|
||||||
119
modules/json.py
119
modules/json.py
|
|
@ -165,6 +165,9 @@ def parseJSON(data, filename):
|
||||||
# RdData format (RdData.json - dgnDatas with dungeon/dialogue data)
|
# RdData format (RdData.json - dgnDatas with dungeon/dialogue data)
|
||||||
elif "dgnDatas" in data:
|
elif "dgnDatas" in data:
|
||||||
result = translateRdData(data, filename)
|
result = translateRdData(data, filename)
|
||||||
|
# GameSetting format (Nupu_GameSetting.json - fzCardDatas, fzDeckDatas, rentalDecks)
|
||||||
|
elif any(k in data for k in ["fzCardDatas", "fzDeckDatas", "rentalDecks"]):
|
||||||
|
result = translateGameSetting(data, filename)
|
||||||
else:
|
else:
|
||||||
result = translateJSON(data, filename, [])
|
result = translateJSON(data, filename, [])
|
||||||
else:
|
else:
|
||||||
|
|
@ -726,6 +729,122 @@ def translateRdData(data, filename):
|
||||||
return tokens
|
return tokens
|
||||||
|
|
||||||
|
|
||||||
|
def translateGameSetting(data, filename):
|
||||||
|
"""Translate GameSetting JSON format (e.g. Nupu_GameSetting.json).
|
||||||
|
|
||||||
|
Handles card data, deck definitions, and rental decks.
|
||||||
|
Only translates player-visible text fields.
|
||||||
|
"""
|
||||||
|
global LOCK, ESTIMATE, FILENAME, PBAR, MISMATCH
|
||||||
|
tokens = [0, 0]
|
||||||
|
|
||||||
|
def batchTranslate(stringList, context):
|
||||||
|
"""Translate a list of strings and return translations. Returns [] on mismatch."""
|
||||||
|
nonlocal tokens
|
||||||
|
if not stringList:
|
||||||
|
return []
|
||||||
|
response = translateAI(stringList, context, True)
|
||||||
|
tokens[0] += response[1][0]
|
||||||
|
tokens[1] += response[1][1]
|
||||||
|
if len(stringList) != len(response[0]):
|
||||||
|
with LOCK:
|
||||||
|
if FILENAME not in MISMATCH:
|
||||||
|
MISMATCH.append(FILENAME)
|
||||||
|
return []
|
||||||
|
return response[0]
|
||||||
|
|
||||||
|
# ================================================================
|
||||||
|
# PASS 1: Collect all translatable strings
|
||||||
|
# ================================================================
|
||||||
|
|
||||||
|
# -- fzCardDatas: card descriptions --
|
||||||
|
desc1S, desc1I = [], []
|
||||||
|
desc2S, desc2I = [], []
|
||||||
|
|
||||||
|
if "fzCardDatas" in data:
|
||||||
|
for i, card in enumerate(data["fzCardDatas"]):
|
||||||
|
if card.get("desc1") and re.search(LANGREGEX, card["desc1"]):
|
||||||
|
desc1S.append(card["desc1"].replace("\r\n", " ").replace("\n", " ").strip())
|
||||||
|
desc1I.append(i)
|
||||||
|
if card.get("desc2") and re.search(LANGREGEX, card["desc2"]):
|
||||||
|
desc2S.append(card["desc2"].replace("\r\n", " ").replace("\n", " ").strip())
|
||||||
|
desc2I.append(i)
|
||||||
|
|
||||||
|
# -- fzDeckDatas: deck name and description --
|
||||||
|
deckNameS, deckNameI = [], []
|
||||||
|
deckDescS, deckDescI = [], []
|
||||||
|
|
||||||
|
if "fzDeckDatas" in data:
|
||||||
|
for i, deck in enumerate(data["fzDeckDatas"]):
|
||||||
|
if deck.get("name") and re.search(LANGREGEX, deck["name"]):
|
||||||
|
deckNameS.append(deck["name"])
|
||||||
|
deckNameI.append(i)
|
||||||
|
if deck.get("desc") and re.search(LANGREGEX, deck["desc"]):
|
||||||
|
deckDescS.append(deck["desc"].replace("\r\n", " ").replace("\n", " ").strip())
|
||||||
|
deckDescI.append(i)
|
||||||
|
|
||||||
|
# -- rentalDecks: memo label --
|
||||||
|
rentalMemoS, rentalMemoI = [], []
|
||||||
|
|
||||||
|
if "rentalDecks" in data:
|
||||||
|
for i, rental in enumerate(data["rentalDecks"]):
|
||||||
|
if rental.get("memo") and re.search(LANGREGEX, rental["memo"]):
|
||||||
|
rentalMemoS.append(rental["memo"])
|
||||||
|
rentalMemoI.append(i)
|
||||||
|
|
||||||
|
# Set progress bar total
|
||||||
|
totalItems = (
|
||||||
|
len(desc1S) + len(desc2S)
|
||||||
|
+ len(deckNameS) + len(deckDescS)
|
||||||
|
+ len(rentalMemoS)
|
||||||
|
)
|
||||||
|
PBAR.total = totalItems
|
||||||
|
PBAR.refresh()
|
||||||
|
|
||||||
|
# ================================================================
|
||||||
|
# PASS 2: Translate each batch and apply results back to data
|
||||||
|
# ================================================================
|
||||||
|
|
||||||
|
# -- fzCardDatas --
|
||||||
|
if "fzCardDatas" in data:
|
||||||
|
cards = data["fzCardDatas"]
|
||||||
|
|
||||||
|
for tl, idx in zip(batchTranslate(desc1S, "Card Description"), desc1I):
|
||||||
|
cards[idx]["desc1"] = dazedwrap.wrapText(tl, WIDTH)
|
||||||
|
if desc1S:
|
||||||
|
save_progress_json(data, filename)
|
||||||
|
|
||||||
|
for tl, idx in zip(batchTranslate(desc2S, "Card Description"), desc2I):
|
||||||
|
cards[idx]["desc2"] = dazedwrap.wrapText(tl, WIDTH)
|
||||||
|
if desc2S:
|
||||||
|
save_progress_json(data, filename)
|
||||||
|
|
||||||
|
# -- fzDeckDatas --
|
||||||
|
if "fzDeckDatas" in data:
|
||||||
|
decks = data["fzDeckDatas"]
|
||||||
|
|
||||||
|
for tl, idx in zip(batchTranslate(deckNameS, "Deck Name"), deckNameI):
|
||||||
|
decks[idx]["name"] = tl
|
||||||
|
if deckNameS:
|
||||||
|
save_progress_json(data, filename)
|
||||||
|
|
||||||
|
for tl, idx in zip(batchTranslate(deckDescS, "Deck Description"), deckDescI):
|
||||||
|
decks[idx]["desc"] = dazedwrap.wrapText(tl, WIDTH)
|
||||||
|
if deckDescS:
|
||||||
|
save_progress_json(data, filename)
|
||||||
|
|
||||||
|
# -- rentalDecks --
|
||||||
|
if "rentalDecks" in data:
|
||||||
|
rentals = data["rentalDecks"]
|
||||||
|
|
||||||
|
for tl, idx in zip(batchTranslate(rentalMemoS, "Deck Label"), rentalMemoI):
|
||||||
|
rentals[idx]["memo"] = tl
|
||||||
|
if rentalMemoS:
|
||||||
|
save_progress_json(data, filename)
|
||||||
|
|
||||||
|
return tokens
|
||||||
|
|
||||||
|
|
||||||
def translateJSON(data, filename, translatedList):
|
def translateJSON(data, filename, translatedList):
|
||||||
global LOCK, ESTIMATE, FILENAME, PBAR, MISMATCH
|
global LOCK, ESTIMATE, FILENAME, PBAR, MISMATCH
|
||||||
if translatedList:
|
if translatedList:
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,8 @@ FIXTEXTWRAP = True
|
||||||
IGNORETLTEXT = False
|
IGNORETLTEXT = False
|
||||||
# TLSYSTEMVARIABLES: Translate System Variables. (Optional but sometimes necessary. Can break stuff.)
|
# TLSYSTEMVARIABLES: Translate System Variables. (Optional but sometimes necessary. Can break stuff.)
|
||||||
TLSYSTEMVARIABLES = False
|
TLSYSTEMVARIABLES = False
|
||||||
|
# TLSYSTEMSWITCHES: Translate System Switches. (Optional. Translates switch names in System.json.)
|
||||||
|
TLSYSTEMSWITCHES = False
|
||||||
# Join 408 codes into a single string like 401.
|
# Join 408 codes into a single string like 401.
|
||||||
JOIN408 = False
|
JOIN408 = False
|
||||||
# SPEAKERS408: Process speakers in code 408 the same way as code 401.
|
# SPEAKERS408: Process speakers in code 408 the same way as code 401.
|
||||||
|
|
@ -1012,6 +1014,7 @@ def parseSystem(data, filename):
|
||||||
if isinstance(gt, str) and gt:
|
if isinstance(gt, str) and gt:
|
||||||
count += 1
|
count += 1
|
||||||
count += len(sysobj.get("variables", []) or [])
|
count += len(sysobj.get("variables", []) or [])
|
||||||
|
count += len(sysobj.get("switches", []) or [])
|
||||||
count += len(sysobj.get("weapon_types", []) or [])
|
count += len(sysobj.get("weapon_types", []) or [])
|
||||||
count += len(sysobj.get("armor_types", []) or [])
|
count += len(sysobj.get("armor_types", []) or [])
|
||||||
count += len(sysobj.get("skill_types", []) or [])
|
count += len(sysobj.get("skill_types", []) or [])
|
||||||
|
|
@ -3551,6 +3554,29 @@ def searchSystem(data, pbar):
|
||||||
if pbar is not None:
|
if pbar is not None:
|
||||||
pbar.refresh()
|
pbar.refresh()
|
||||||
|
|
||||||
|
# Switches (Optional) — batch translate to reduce calls
|
||||||
|
if TLSYSTEMSWITCHES and "switches" in data and isinstance(data["switches"], list):
|
||||||
|
switch_indices = []
|
||||||
|
switch_values = []
|
||||||
|
for idx, val in enumerate(data["switches"]):
|
||||||
|
if isinstance(val, str) and val.strip():
|
||||||
|
switch_indices.append(idx)
|
||||||
|
switch_values.append(val)
|
||||||
|
if switch_values:
|
||||||
|
response = translateAI(
|
||||||
|
switch_values,
|
||||||
|
'Reply with only the ' + LANGUAGE + ' translation of the switch name',
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
totalTokens[0] += response[1][0]
|
||||||
|
totalTokens[1] += response[1][1]
|
||||||
|
tl_list = response[0]
|
||||||
|
# Assign back translations to corresponding indices
|
||||||
|
for n, idx in enumerate(switch_indices[: len(tl_list)]):
|
||||||
|
data["switches"][idx] = tl_list[n].replace('"', '').strip()
|
||||||
|
if pbar is not None:
|
||||||
|
pbar.refresh()
|
||||||
|
|
||||||
# Messages — batch translate to reduce calls (check if exists)
|
# Messages — batch translate to reduce calls (check if exists)
|
||||||
if "messages" in data["terms"]:
|
if "messages" in data["terms"]:
|
||||||
messages = data["terms"]["messages"]
|
messages = data["terms"]["messages"]
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,8 @@ FIXTEXTWRAP = True
|
||||||
IGNORETLTEXT = False
|
IGNORETLTEXT = False
|
||||||
# TLSYSTEMVARIABLES: Translate System Variables. (Optional but sometimes necessary. Can break stuff.)
|
# TLSYSTEMVARIABLES: Translate System Variables. (Optional but sometimes necessary. Can break stuff.)
|
||||||
TLSYSTEMVARIABLES = False
|
TLSYSTEMVARIABLES = False
|
||||||
|
# TLSYSTEMSWITCHES: Translate System Switches. (Optional. Translates switch names in System.json.)
|
||||||
|
TLSYSTEMSWITCHES = True
|
||||||
# Join 408 codes into a single string like 401.
|
# Join 408 codes into a single string like 401.
|
||||||
JOIN408 = False
|
JOIN408 = False
|
||||||
|
|
||||||
|
|
@ -892,7 +894,7 @@ def parseNames(data, filename, context):
|
||||||
note_regexes = [
|
note_regexes = [
|
||||||
(r"<note:(.*?)>", False),
|
(r"<note:(.*?)>", False),
|
||||||
(r"<PE拡張:(.*?)>", False),
|
(r"<PE拡張:(.*?)>", False),
|
||||||
(r"<hint:(.*?)>", False),
|
(r"<[Hh]int:(.*?)>", False),
|
||||||
(r"<SGDescription:(.*?)>", False),
|
(r"<SGDescription:(.*?)>", False),
|
||||||
(r"<SG説明:\n?(.*?)>", True),
|
(r"<SG説明:\n?(.*?)>", True),
|
||||||
(r"<SG説明2:\n?(.*?)>", False),
|
(r"<SG説明2:\n?(.*?)>", False),
|
||||||
|
|
@ -1083,6 +1085,7 @@ def parseSystem(data, filename):
|
||||||
if isinstance(gt, str) and gt:
|
if isinstance(gt, str) and gt:
|
||||||
count += 1
|
count += 1
|
||||||
count += len(sysobj.get("variables", []) or [])
|
count += len(sysobj.get("variables", []) or [])
|
||||||
|
count += len(sysobj.get("switches", []) or [])
|
||||||
count += len(sysobj.get("weaponTypes", []) or [])
|
count += len(sysobj.get("weaponTypes", []) or [])
|
||||||
count += len(sysobj.get("armorTypes", []) or [])
|
count += len(sysobj.get("armorTypes", []) or [])
|
||||||
count += len(sysobj.get("skillTypes", []) or [])
|
count += len(sysobj.get("skillTypes", []) or [])
|
||||||
|
|
@ -1229,7 +1232,7 @@ def searchNames(data, pbar, context, filename):
|
||||||
note_regexes = [
|
note_regexes = [
|
||||||
(r"<note:(.*?)>", False),
|
(r"<note:(.*?)>", False),
|
||||||
(r"<PE拡張:(.*?)>", False),
|
(r"<PE拡張:(.*?)>", False),
|
||||||
(r"<hint:(.*?)>", False),
|
(r"<[Hh]int:(.*?)>", False),
|
||||||
(r"<SGDescription:(.*?)>", False),
|
(r"<SGDescription:(.*?)>", False),
|
||||||
(r"<SG説明:\n?(.*?)>", True),
|
(r"<SG説明:\n?(.*?)>", True),
|
||||||
(r"<SG説明2:\n?(.*?)>", False),
|
(r"<SG説明2:\n?(.*?)>", False),
|
||||||
|
|
@ -3887,6 +3890,32 @@ def searchSystem(data, pbar):
|
||||||
if pbar is not None:
|
if pbar is not None:
|
||||||
pbar.refresh()
|
pbar.refresh()
|
||||||
|
|
||||||
|
# Switches (Optional) — batch translate to reduce calls
|
||||||
|
if TLSYSTEMSWITCHES and "switches" in data and isinstance(data["switches"], list):
|
||||||
|
switch_indices = []
|
||||||
|
switch_values = []
|
||||||
|
for idx, val in enumerate(data["switches"]):
|
||||||
|
if isinstance(val, str) and val.strip():
|
||||||
|
# Skip if IGNORETLTEXT is enabled and no Japanese text
|
||||||
|
if IGNORETLTEXT and not re.search(LANGREGEX, val):
|
||||||
|
continue
|
||||||
|
switch_indices.append(idx)
|
||||||
|
switch_values.append(val)
|
||||||
|
if switch_values:
|
||||||
|
response = translateAI(
|
||||||
|
switch_values,
|
||||||
|
'Reply with only the ' + LANGUAGE + ' translation of the switch name',
|
||||||
|
True,
|
||||||
|
)
|
||||||
|
totalTokens[0] += response[1][0]
|
||||||
|
totalTokens[1] += response[1][1]
|
||||||
|
tl_list = response[0]
|
||||||
|
# Assign back translations to corresponding indices
|
||||||
|
for n, idx in enumerate(switch_indices[: len(tl_list)]):
|
||||||
|
data["switches"][idx] = tl_list[n].replace('"', '').strip()
|
||||||
|
if pbar is not None:
|
||||||
|
pbar.refresh()
|
||||||
|
|
||||||
# Messages — batch translate to reduce calls
|
# Messages — batch translate to reduce calls
|
||||||
messages = data["terms"]["messages"]
|
messages = data["terms"]["messages"]
|
||||||
if messages:
|
if messages:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue