diff --git a/modules/json.py b/modules/json.py
index e335972..bb64d67 100644
--- a/modules/json.py
+++ b/modules/json.py
@@ -36,16 +36,19 @@ MAXHISTORY = 10
ESTIMATE = ""
TOKENS = [0, 0]
NAMESLIST = []
+FILENAME = None
NAMES = False # Output a list of all the character names found
BRFLAG = False # If the game uses
instead
FIXTEXTWRAP = True # Overwrites textwrap
IGNORETLTEXT = False # Ignores all translated text.
MISMATCH = [] # Lists files that throw a mismatch error (Length of GPT list response is wrong)
+PBAR = None
# tqdm Globals
BAR_FORMAT = "{l_bar}{bar:10}{r_bar}{bar:-10b}"
POSITION = 0
LEAVE = False
+PBAR = None
# Regex - Need to change this if you want to translate from/to other languages. Default is Japanese Regex
LANGREGEX = r"[一-龠ぁ-ゔァ-ヴーa-zA-Z0-9\uFF61-\uFF9F]+"
@@ -154,147 +157,124 @@ def parseJSON(data, filename):
totalTokens = [0, 0]
totalLines = 0
totalLines = len(data)
- global LOCK
+ global LOCK, PBAR
with tqdm(bar_format=BAR_FORMAT, position=POSITION, total=totalLines, leave=LEAVE) as pbar:
pbar.desc = filename
- pbar.total = totalLines
+ PBAR = pbar
try:
- result = translateJSON(data, pbar)
+ result = translateJSON(data, [])
totalTokens[0] += result[0]
totalTokens[1] += result[1]
except Exception as e:
+ traceback.print_exc()
return [data, totalTokens, e]
return [data, totalTokens, None]
-def translateJSON(data, pbar):
- textHistory = []
- batch = []
- maxHistory = MAXHISTORY
+def translateJSON(data, translatedList):
+ global LOCK, ESTIMATE, FILENAME, PBAR, MISMATCH
+ if translatedList:
+ stringList = translatedList[0]
+ else:
+ stringList = []
tokens = [0, 0]
- speaker = "None"
- insertBool = False
+ speaker = ""
i = 0
- batchStartIndex = 0
while i < len(data):
- item = data[i]
+ speakerKey = "name"
+ messageKey = "message"
+
# Speaker
- if "VA" in item:
- if item["name"] not in [None, "-"]:
- response = getSpeaker(item["name"])
- speaker = response[0]
- tokens[0] += response[1][0]
- tokens[1] += response[1][1]
- item["name"] = speaker
- else:
- speaker = "None"
- pbar.update(1)
- i += 1
-
- # Text
- elif "me" in item:
- for text in [
- "text",
- "text2",
- "help1",
- "help2",
- "help3",
- "like",
- "message",
- "me",
- ]:
- if text in item:
- if item[text] != None:
- jaString = item[text]
-
- # Remove any textwrap
- if FIXTEXTWRAP == True:
- finalJAString = jaString.replace("\n", " ")
-
- # [Passthrough 1] Pulling From File
- if insertBool is False:
- # Append to List and Clear Values
- batch.append(finalJAString)
- speaker = ""
-
- # Translate Batch if Full
- if len(batch) == BATCHSIZE:
- # Translate
- response = translateGPT(batch, textHistory, True)
- tokens[0] += response[1][0]
- tokens[1] += response[1][1]
- translatedBatch = response[0]
- textHistory = translatedBatch[-10:]
-
- # Set Values
- if len(batch) == len(translatedBatch):
- i = batchStartIndex
- insertBool = True
-
- # Mismatch
- else:
- pbar.write(f"Mismatch: {batchStartIndex} - {i}")
- MISMATCH.append(batch)
- batchStartIndex = i
- batch.clear()
-
- if insertBool is False:
- pbar.update(1)
- i += 1
-
- currentGroup = []
-
- # [Passthrough 2] Setting Data
- else:
- # Get Text
- translatedText = translatedBatch[0]
-
- # Remove added speaker
- translatedText = re.sub(r"^.+?:\s", "", translatedText)
-
- # Textwrap
- translatedText = dazedwrap.wrapText(translatedText, width=WIDTH)
-
- # Set Text
- item[text] = translatedText
- translatedBatch.pop(0)
- speaker = ""
- currentGroup = []
- i += 1
-
- # If Batch is empty. Move on.
- if len(translatedBatch) == 0:
- insertBool = False
- batchStartIndex = i
- batch.clear()
- else:
- i += 1
- pbar.update(1)
-
- # Translate Batch if not empty and EOF
- if len(batch) != 0 and i >= len(data):
- # Translate
- response = translateGPT(batch, textHistory, True)
+ if speakerKey in data[i]:
+ # Grab and TL
+ speaker = data[i][speakerKey]
+ response = getSpeaker(speaker)
+ speaker = response[0]
tokens[0] += response[1][0]
tokens[1] += response[1][1]
- translatedBatch = response[0]
- textHistory = translatedBatch[-10:]
- # Set Values
- if len(batch) == len(translatedBatch):
- i = batchStartIndex
- insertBool = True
+ # Set Speaker
+ data[i][speakerKey] = speaker
- # Mismatch
+ # Dialogue
+ if messageKey in data[i]:
+ jaString = data[i][messageKey]
+
+ # Save Original String
+ originalString = jaString
+
+ # Pass 1
+ if not translatedList:
+ # Strip Spaces
+ jaString = jaString.strip()
+
+ # Remove Textwrap
+ jaString = jaString.replace('\n', ' ')
+
+ if jaString:
+ if speaker:
+ stringList.append(f"[{speaker}]: {jaString}")
+ else:
+ stringList.append(jaString)
+
+ # Pass 2
else:
- pbar.write(f"Mismatch: {batchStartIndex} - {i}")
- MISMATCH.append(batch)
- batchStartIndex = i
- batch.clear()
+ # Get Text
+ if stringList:
+ # Grab and Pop
+ translatedText = stringList[0]
+ stringList.pop(0)
- currentGroup = []
+ # Set to None if empty list
+ if len(stringList) <= 0:
+ stringList = None
+
+ # Remove speaker
+ translatedText = re.sub(r"^\[?(.+?)\]?\s?[|:]\s?", "", translatedText)
+
+ # Escape Quotes
+ translatedText = re.sub(r'(?", ")")
+ translatedText = translatedText.replace("『", "")
+ translatedText = translatedText.replace("』", "")
+
+ # Textwrap
+ translatedText = dazedwrap.wrapText(translatedText, width=WIDTH)
+
+ # Set Data
+ if "『" in data[i][messageKey] and "』" not in translatedText:
+ data[i][messageKey] = data[i][messageKey].replace(originalString, f"『{translatedText}』")
+ else:
+ data[i][messageKey] = data[i][messageKey].replace(originalString, f"{translatedText}")
+ # Next Value
+ i += 1
+
+ # EOF
+ if not translatedList:
+ stringListTL = []
+
+ # String List
+ if stringList:
+ PBAR.total = len(stringList)
+ PBAR.refresh()
+ response = translateGPT(stringList, "Reply with the English Translation", True)
+ tokens[0] += response[1][0]
+ tokens[1] += response[1][1]
+ stringListTL = response[0]
+
+ if len(stringList) != len(stringListTL):
+ # Mismatch
+ with LOCK:
+ if FILENAME not in MISMATCH:
+ MISMATCH.append(FILENAME)
+
+ # Set Strings
+ translateJSON(data, [stringListTL])
return tokens
@@ -315,7 +295,7 @@ def getSpeaker(speaker):
response = translateGPT(
f"{speaker}",
"Reply with the " + LANGUAGE + " translation of the NPC name.",
- True,
+ False,
)
response[0] = response[0].title()
response[0] = response[0].replace("'S", "'s")
@@ -374,9 +354,10 @@ def translateText(system, user, history, penalty, format, model=MODEL):
# History
if isinstance(history, list):
- msg.extend([{"role": "system", "content": h} for h in history])
+ msg.append({"role": "system", "content": "Translation History:"})
+ msg.extend([{"role": "assistant", "content": h} for h in history])
else:
- msg.append({"role": "system", "content": history})
+ msg.append({"role": "assistant", "content": history})
# Response Format
if format == "json":
@@ -411,8 +392,11 @@ def cleanTranslatedText(translatedText):
"】": "]",
"【": "[",
"é": "e",
- "ō": "o",
+ "this guy": "this bastard",
+ "This guy": "This bastard",
"Placeholder Text": "",
+ "```json": "",
+ "```": "",
# Add more replacements as needed
}
for target, replacement in placeholders.items():
@@ -474,7 +458,7 @@ def countTokens(system, user, history):
inputTotalTokens += len(enc.encode(user))
# Output
- outputTotalTokens += round(len(enc.encode(user)) * 3)
+ outputTotalTokens += round(len(enc.encode(user)) * 2.5)
return [inputTotalTokens, outputTotalTokens]
@@ -538,7 +522,8 @@ def translateGPT(text, history, fullPromptFlag):
# AI Refused, Try Again
if not translatedText:
- response = translateText(f"{system}\n You translate ALL content.", user, history, 0.1, format)
+ response = translateText(f"{system}\n You translate ALL content.", user, history, 0.1, format, model="gpt-4o")
+ translatedText = response.choices[0].message.content
# Report Tokens
totalTokens[0] += response.usage.prompt_tokens
diff --git a/modules/rpgmakerace.py b/modules/rpgmakerace.py
index 265368e..9639c44 100644
--- a/modules/rpgmakerace.py
+++ b/modules/rpgmakerace.py
@@ -704,6 +704,14 @@ def searchNames(data, pbar, context):
tokensResponse = translateNote(data[i], r"")
totalTokens[0] += tokensResponse[0]
totalTokens[1] += tokensResponse[1]
+ if "図鑑特徴" in data[i]["note"]:
+ tokensResponse = translateNote(data[i], r"<図鑑特徴:(.+?)>")
+ totalTokens[0] += tokensResponse[0]
+ totalTokens[1] += tokensResponse[1]
+ if "図鑑説明" in data[i]["note"]:
+ tokensResponse = translateNote(data[i], r"<図鑑説明:(.+?)>")
+ totalTokens[0] += tokensResponse[0]
+ totalTokens[1] += tokensResponse[1]
i += 1
else:
batchFull = True
@@ -1109,6 +1117,7 @@ def searchCodes(page, pbar, jobList, filename):
finalJAString = finalJAString.replace(" ", "")
finalJAString = finalJAString.replace("「", '"')
finalJAString = finalJAString.replace("」", '"')
+ finalJAString = finalJAString.replace("\\,", ',')
### Remove format codes
# Furigana
diff --git a/modules/rpgmakermvmz.py b/modules/rpgmakermvmz.py
index 863a1e9..9310a74 100644
--- a/modules/rpgmakermvmz.py
+++ b/modules/rpgmakermvmz.py
@@ -1130,6 +1130,7 @@ def searchCodes(page, pbar, jobList, filename):
finalJAString = finalJAString.replace(" ", "")
finalJAString = finalJAString.replace("「", '"')
finalJAString = finalJAString.replace("」", '"')
+ finalJAString = finalJAString.replace("\\,", ',')
### Remove format codes
# Furigana
diff --git a/modules/wolf.py b/modules/wolf.py
index 2cd4041..b313e1e 100644
--- a/modules/wolf.py
+++ b/modules/wolf.py
@@ -1279,7 +1279,7 @@ def searchDB(events, pbar, jobList, filename):
dbValueList[0].pop(0)
# Grab Items
- if table["name"] == "アイテム" and ITEMFLAG == True:
+ if table["name"] == "勲章コモン" and ITEMFLAG == True:
# Write Category
if setData:
with open("translations.txt", "a", encoding="utf-8") as file:
@@ -1293,7 +1293,7 @@ def searchDB(events, pbar, jobList, filename):
font = 20
for j in range(len(dataList)):
# Name
- if dataList[j].get("name") == "アイテム名":
+ if dataList[j].get("name") == "勲章名":
jaString = dataList[j].get("value")
if jaString != "":
# Pass 1 (Grab Data)
@@ -1311,7 +1311,7 @@ def searchDB(events, pbar, jobList, filename):
itemList[0].pop(0)
# Description
- if dataList[j].get("name") == "NULL":
+ if dataList[j].get("name") == "説明文":
# Pass 1 (Grab Data)
if setData == False:
if dataList[j].get("value") != "":
@@ -1328,7 +1328,7 @@ def searchDB(events, pbar, jobList, filename):
if dataList[j].get("value") != "":
# Textwrap
translatedText = itemList[1][0]
- # translatedText = dazedwrap.wrapText(translatedText, LISTWIDTH)
+ translatedText = dazedwrap.wrapText(translatedText, LISTWIDTH)
# Font
if font:
diff --git a/vocab.txt b/vocab.txt
index 89a7598..a525e90 100644
--- a/vocab.txt
+++ b/vocab.txt
@@ -115,6 +115,7 @@ ME 音量 (ME Volume)
討伐 (Extermination)
破滅 (Destruction)
魂 (Soul)
+魄 (Spirit)
巫女 (Shrine Maiden)
刀 (Blade)
剣 (Sword)