diff --git a/.env.example b/.env.example index a59c906..82972d3 100644 --- a/.env.example +++ b/.env.example @@ -6,4 +6,6 @@ timeout="" fileThreads="" threads="" width="" -listWidth="" \ No newline at end of file +listWidth="" +#The language to translate TO, Don't forget to change the prompt +language="" diff --git a/modules/alltext.py b/modules/alltext.py index defd384..4e36dc0 100644 --- a/modules/alltext.py +++ b/modules/alltext.py @@ -16,15 +16,16 @@ import openai from retry import retry from tqdm import tqdm -#Globals +# Globals load_dotenv() openai.api_base = os.getenv('proxy') openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE = os.getenv('language').capitalize() -APICOST = .002 # Depends on the model https://openai.com/pricing +APICOST = .002 # Depends on the model https://openai.com/pricing PROMPT = Path('prompt.txt').read_text(encoding='utf-8') THREADS = int(os.getenv('threads')) # For GPT4 rate limit will be hit if you have more than 1 thread. LOCK = threading.Lock() @@ -37,10 +38,10 @@ TOKENS = 0 TOTALTOKENS = 0 NAMESLIST = [] -#tqdm Globals -BAR_FORMAT='{l_bar}{bar:10}{r_bar}{bar:-10b}' -POSITION=0 -LEAVE=False +# tqdm Globals +BAR_FORMAT = '{l_bar}{bar:10}{r_bar}{bar:-10b}' +POSITION = 0 +LEAVE = False def handleAllText(filename, estimate): global ESTIMATE, TOKENS, TOTALTOKENS, TOTALCOST @@ -58,7 +59,7 @@ def handleAllText(filename, estimate): TOTALTOKENS += TOKENS TOKENS = 0 os.remove('translated/' + filename) - + else: # Print Result end = time.time() @@ -77,7 +78,7 @@ def openFiles(filename, writeFile): def getResultString(translatedData, translationTime, filename): # File Print String tokenString = Fore.YELLOW + '[' + str(translatedData[1]) + \ - ' Tokens/${:,.4f}'.format(translatedData[1] * .001 * APICOST) + ']' + ' Tokens/${:,.4f}'.format(translatedData[1] * .001 * APICOST) + ']' timeString = Fore.BLUE + '[' + str(round(translationTime, 1)) + 's]' if translatedData[2] == None: @@ -90,9 +91,9 @@ def getResultString(translatedData, translationTime, filename): raise translatedData[2] except Exception as e: errorString = str(e) + '|' + translatedData[3] + Fore.RED - return filename + ': ' + tokenString + timeString + Fore.RED + u' \u2717 ' +\ - errorString + Fore.RESET - + return filename + ': ' + tokenString + timeString + Fore.RED + u' \u2717 ' + \ + errorString + Fore.RESET + @retry(exceptions=Exception, tries=5, delay=5) def translateGPT(t, history, fullPromptFlag): # If ESTIMATE is True just count this as an execution and return. @@ -100,23 +101,22 @@ def translateGPT(t, history, fullPromptFlag): enc = tiktoken.encoding_for_model(MODEL) tokens = len(enc.encode(t)) * 2 + len(enc.encode(str(history))) + len(enc.encode(PROMPT)) return (t, tokens) - + # Sub Vars varResponse = subVars(t) subbedT = varResponse[0] # If there isn't any Japanese in the text just skip - if not re.search(r'[��-�]+|[��-?]+|[�@-��]+|[\uFF00-\uFFEF]', subbedT): - return(t, 0) + if not re.search(r'[一-龠]+|[ぁ-ゔ]+|[ァ-ヴ]+|[\uFF00-\uFFEF]', subbedT): + return (t, 0) # Characters context = '```\ - Game Characters:\ - Character: �r�m�� ��C == Ikenoue Takumi - Gender: Male\ - Character: ���i ���͂� == Fukunaga Koharu - Gender: Female\ - Character: �_�� ���� == Kamiizumi Rio - Gender: Female\ - Character: �g�ˎ� �A���T == Kisshouji Arisa - Gender: Female\ - Character: �v�� �F���q == Kuga Yuriko - Gender: Female\ + Character: 池ノ上 拓海 == Ikenoue Takumi - Gender: Male\ + Character: 福永 こはる == Fukunaga Koharu - Gender: Female\ + Character: 神泉 理央 == Kamiizumi Rio - Gender: Female\ + Character: 吉祥寺 アリサ == Kisshouji Arisa - Gender: Female\ + Character: 久我 友里子 == Kuga Yuriko - Gender: Female\ ```' # Prompt @@ -124,7 +124,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the ' + LANGUAGE + ' translation in the following format: `Translation: <' + LANGUAGE.upper() + '_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -155,18 +155,13 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE + ' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') - translatedText = translatedText.replace('Translation = ', '') + translatedText = translatedText.replace(LANGUAGE + ' Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') - translatedText = translatedText.replace('Translation:', '') - translatedText = translatedText.replace('Line to Translate =', '') - translatedText = translatedText.replace('Translation =', '') - translatedText = translatedText.replace('Translate =', '') translatedText = re.sub(r'Note:.*', '', translatedText) - translatedText = translatedText.replace('��', '') + translatedText = translatedText.replace('っ', '') # Return Translation if len(translatedText) > 15 * len(t) or "I'm sorry, but I'm unable to assist with that translation" in translatedText: diff --git a/modules/csv.py b/modules/csv.py index 1a662e4..96f8c21 100644 --- a/modules/csv.py +++ b/modules/csv.py @@ -23,6 +23,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() APICOST = .002 # Depends on the model https://openai.com/pricing PROMPT = Path('prompt.txt').read_text(encoding='utf-8') @@ -174,7 +175,7 @@ def translateCSV(row, pbar, writer, textHistory, format): text = match[1] # Translate Speaker - response = translateGPT (speaker, 'Reply with the English translation of the NPC name.', True) + response = translateGPT (speaker, 'Reply with the '+ LANGUAGE +' translation of the NPC name.', True) translatedSpeaker = response[0] tokens += response[1] @@ -350,7 +351,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -381,12 +382,12 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '') diff --git a/modules/json.py b/modules/json.py index def8baa..fddf2d1 100644 --- a/modules/json.py +++ b/modules/json.py @@ -22,6 +22,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() INPUTAPICOST = .002 # Depends on the model https://openai.com/pricing OUTPUTAPICOST = .002 @@ -143,7 +144,7 @@ def translateJSON(data, pbar): # Speaker if 'name' in item[1]: if item[1]['name'] not in [None, '-']: - response = translateGPT(item[1]['name'], 'Reply with only the english translation of the NPC name', False) + response = translateGPT(item[1]['name'], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', False) speaker = response[0] tokens[0] += response[1][0] tokens[1] += response[1][1] @@ -331,7 +332,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -362,12 +363,12 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '') diff --git a/modules/kansen.py b/modules/kansen.py index a48bbe3..ae82e0d 100644 --- a/modules/kansen.py +++ b/modules/kansen.py @@ -21,6 +21,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() APICOST = .002 # Depends on the model https://openai.com/pricing PROMPT = Path('prompt.txt').read_text(encoding='utf-8') @@ -130,7 +131,7 @@ def translateTyrano(data, pbar): if '[ns]' in data[i]: matchList = re.findall(r'\[ns\](.+?)\[', data[i]) if len(matchList) != 0: - response = translateGPT(matchList[0], 'Reply with only the english translation of the NPC name', True) + response = translateGPT(matchList[0], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', True) speaker = response[0] tokens += response[1] data[i] = '[ns]' + speaker + '[nse]\n' @@ -491,7 +492,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -522,12 +523,12 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '') diff --git a/modules/lune.py b/modules/lune.py index 77c322a..952ca4b 100644 --- a/modules/lune.py +++ b/modules/lune.py @@ -22,6 +22,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() INPUTAPICOST = .002 # Depends on the model https://openai.com/pricing OUTPUTAPICOST = .002 @@ -144,7 +145,7 @@ def translateJSON(data, pbar): # Speaker if 'name' in item: if item['name'] not in [None, '-']: - response = translateGPT(item['name'], 'Reply with only the english translation of the NPC name', False) + response = translateGPT(item['name'], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', False) speaker = response[0] tokens[0] += response[1][0] tokens[1] += response[1][1] @@ -331,7 +332,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -362,12 +363,12 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '') diff --git a/modules/lune2.py b/modules/lune2.py index fb284b3..a0ffe75 100644 --- a/modules/lune2.py +++ b/modules/lune2.py @@ -23,6 +23,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() APICOST = .002 # Depends on the model https://openai.com/pricing PROMPT = Path('prompt.txt').read_text(encoding='utf-8') @@ -188,7 +189,7 @@ def translateText(data, pbar): jaString = jaString.replace('友里子', 'Yuriko') # Translate Speaker - response = translateGPT(jaString, 'Reply with only the english translation of the NPC name', True) + response = translateGPT(jaString, 'Reply with only the '+ LANGUAGE +' translation of the NPC name', True) tokens += response[1] speaker = response[0].strip('.') data[i] = speaker + '\n' @@ -377,7 +378,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -408,12 +409,12 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '') diff --git a/modules/rpgmakerace.py b/modules/rpgmakerace.py index 8233a1f..5fd7744 100644 --- a/modules/rpgmakerace.py +++ b/modules/rpgmakerace.py @@ -24,6 +24,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() INPUTAPICOST = .002 # Depends on the model https://openai.com/pricing OUTPUTAPICOST = .002 @@ -61,7 +62,7 @@ CODE108 = False NAMES = False # Output a list of all the character names found BRFLAG = False # If the game uses
instead FIXTEXTWRAP = True -IGNORETLTEXT = False +IGNORETLTEXT = True def handleACE(filename, estimate): global ESTIMATE, totalTokens @@ -203,7 +204,7 @@ def parseMap(data, filename): # Translate displayName for Map files if 'Map' in filename: - response = translateGPT(data['displayName'], 'Reply with only the english translation of the RPG location name', False) + response = translateGPT(data['display_name'], 'Reply with only the '+ LANGUAGE +' translation of the RPG location name', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['display_name'] = response[0].replace('\"', '') @@ -245,7 +246,7 @@ def translateNote(event, regex): jaString = re.sub(r'\n', ' ', oldJAString) # Translate - response = translateGPT(jaString, 'Reply with the English translation of the note.', True) + response = translateGPT(jaString, 'Reply with the '+ LANGUAGE +' translation of the note.', True) translatedText = response[0] # Textwrap @@ -412,11 +413,17 @@ def parseScenario(data, filename): def searchThings(name, pbar): totalTokens = [0, 0] + # If there isn't any Japanese in the text just skip + if IGNORETLTEXT == True: + if not re.search(r'[一-龠]+|[ぁ-ゔ]+|[ァ-ヴー]+', name['name']) and re.search(r'[一-龠]+|[ぁ-ゔ]+|[ァ-ヴー]+', name['description']): + pbar.update(1) + return totalTokens + # Name - nameResponse = translateGPT(name['name'], 'Reply with only the english translation of the RPG item name.', False) if 'name' in name else '' + nameResponse = translateGPT(name['name'], 'Reply with only the '+ LANGUAGE +' translation of the RPG item name.', False) if 'name' in name else '' # Description - descriptionResponse = translateGPT(name['description'], 'Reply with only the english translation of the description.', False) if 'description' in name else '' + descriptionResponse = translateGPT(name['description'], 'Reply with only the '+ LANGUAGE +' translation of the description.', False) if 'description' in name else '' # Note if ' 0: + jaString = codeList[i]['p'][0] + firstJAString = jaString + else: + codeList[i]['c'] = -1 + continue # If there isn't any Japanese in the text just skip if IGNORETLTEXT == True: @@ -576,12 +587,14 @@ def searchCodes(page, pbar): if len(codeList) > i+1: while (codeList[i+1]['c'] == 401 or codeList[i+1]['c'] == 405): - codeList[i]['p'][0] = '' - codeList[i]['c'] = 0 + codeList[i]['p'] = [] + codeList[i]['c'] = -1 i += 1 - jaString = codeList[i]['p'][0] - currentGroup.append(jaString) + # Only add if not empty + if len(codeList[i]['p']) > 0: + jaString = codeList[i]['p'][0] + currentGroup.append(jaString) # Make sure not the end of the list. if len(codeList) <= i+1: @@ -595,7 +608,7 @@ def searchCodes(page, pbar): # Color Regex: ^([\\]+[cC]\[[0-9]\]+(.+?)[\\]+[cC]\[[0]\]) matchList = re.findall(r'(.*?([\\]+[nN]<(.+?)>).*)', finalJAString) if len(matchList) > 0: - response = translateGPT(matchList[0][2], 'Reply with only the english translation of the NPC name', False) + response = translateGPT(matchList[0][2], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] speaker = response[0].strip('.') @@ -621,30 +634,30 @@ def searchCodes(page, pbar): if speaker not in NAMESLIST: with LOCK: NAMESLIST.append(speaker) - elif '\\kw' in finalJAString: - match = re.findall(r'\\+kw\[[0-9]+\]', finalJAString) - if len(match) != 0: - if '1' in match[0]: - speaker = 'Ayako Nagatsuki' - if '2' in match[0]: - speaker = 'Rei' + # elif '\\kw' in finalJAString: + # match = re.findall(r'\\+kw\[[0-9]+\]', finalJAString) + # if len(match) != 0: + # if '1' in match[0]: + # speaker = 'Ayako Nagatsuki' + # if '2' in match[0]: + # speaker = 'Rei' - # Set name var to top of list - codeList[j]['p'][0] = match[0] - codeList[j]['c'] = code + # # Set name var to top of list + # codeList[j]['p'][0] = match[0] + # codeList[j]['c'] = code - # Set next item as dialogue - j += 1 - codeList[j]['p'][0] = match[0] - codeList[j]['c'] = code + # # Set next item as dialogue + # j += 1 + # codeList[j]['p'][0] = match[0] + # codeList[j]['c'] = code - # Remove nametag from final string - finalJAString = finalJAString.replace(match[0], '') + # # Remove nametag from final string + # finalJAString = finalJAString.replace(match[0], '') elif '\\nc' in finalJAString: matchList = re.findall(r'(\\+nc<(.*?)>)(.+)?', finalJAString) if len(matchList) != 0: # Translate Speaker - response = translateGPT(matchList[0][1], 'Reply with only the english translation of the NPC name', True) + response = translateGPT(matchList[0][1], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', True) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] speaker = response[0].strip('.') @@ -660,7 +673,7 @@ def searchCodes(page, pbar): elif '\\nw' in finalJAString or '\\NW' in finalJAString: matchList = re.findall(r'([\\]+[nN][wW]\[(.+?)\]+)(.+)', finalJAString) if len(matchList) != 0: - response = translateGPT(matchList[0][1], 'Reply with only the english translation of the NPC name', True) + response = translateGPT(matchList[0][1], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', True) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] speaker = response[0].strip('.') @@ -670,24 +683,24 @@ def searchCodes(page, pbar): finalJAString = finalJAString.replace(matchList[0][0], '') # Set next item as dialogue - if (codeList[j + 1]['c'] == 401 and len(codeList[j + 1]['p']) > 0) or (codeList[j + 1]['c'] == 0 and len(codeList[j + 1]['p']) > 0): - # Set name var to top of list - codeList[j]['p'][0] = nametag - codeList[j]['c'] = code + # if (codeList[j + 1]['c'] == 401 and len(codeList[j + 1]['p']) > 0) or (codeList[j + 1]['c'] == 0 and len(codeList[j + 1]['p']) > 0): + # # Set name var to top of list + # codeList[j]['p'][0] = nametag + # codeList[j]['c'] = code - j += 1 - codeList[j]['p'][0] = finalJAString - codeList[j]['c'] = code - nametag = '' - else: - # Set nametag in string - codeList[j]['p'][0] = nametag + finalJAString - codeList[j]['c'] = code + # j += 1 + # codeList[j]['p'][0] = finalJAString + # codeList[j]['c'] = code + # nametag = '' + # else: + # Set nametag in string + codeList[j]['p'][0] = nametag + finalJAString + codeList[j]['c'] = code ### Only for Specific games where name is surrounded by brackets. # elif '【' in finalJAString: # matchList = re.findall(r'(.+?【(.+?)】.+?)(「.+)', finalJAString) # if len(matchList) != 0: - # response = translateGPT(matchList[0][1], 'Reply with only the english translation of the NPC name', True) + # response = translateGPT(matchList[0][1], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', True) # else: # print('wtf') # totalTokens[0] += response[1][0] @@ -728,6 +741,9 @@ def searchCodes(page, pbar): # Remove Extra Stuff finalJAString = finalJAString.replace('゙', '') finalJAString = finalJAString.replace('。', '.') + finalJAString = finalJAString.replace('?', '?') + finalJAString = finalJAString.replace('!', '!') + finalJAString = finalJAString.replace(':', ':') finalJAString = finalJAString.replace('・', '.') finalJAString = finalJAString.replace('‶', '') finalJAString = finalJAString.replace('”', '') @@ -767,26 +783,26 @@ def searchCodes(page, pbar): totalTokens[1] += response[1][1] translatedText = response[0] - # Remove added speaker - translatedText = re.sub(r'^.+?:\s?', '', translatedText) + # Change added speaker + translatedText = re.sub(r'(^.+?)\s?[|:]\s?', '\g<1>: ', translatedText) # Sub Vars varResponse = subVars(translatedText) subbedT = varResponse[0] textHistory.append('\"' + varResponse[0] + '\"') elif finalJAString != '': - response = translateGPT(speaker + ': ' + finalJAString, textHistory, True) + response = translateGPT(speaker + ' | ' + finalJAString, textHistory, True) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] translatedText = response[0] # Remove added speaker - translatedText = re.sub(r'^.+?:\s?', '', translatedText) + translatedText = re.sub(r'(^.+?)\s?[|:]\s?', '', translatedText) # Sub Vars varResponse = subVars(translatedText) subbedT = varResponse[0] - textHistory.append('\"' + speaker + ': ' + varResponse[0] + '\"') + textHistory.append('\"' + speaker + ' | ' + varResponse[0] + '\"') speaker = '' else: translatedText = finalJAString @@ -807,9 +823,9 @@ def searchCodes(page, pbar): # Set Data translatedText = translatedText.replace('\"', '') - codeList[i]['p'][0] = '' - codeList[i]['c'] = 0 - codeList[j]['p'][0] = translatedText + codeList[i]['p'] = [] + codeList[i]['c'] = -1 + codeList[j]['p'] = [translatedText] codeList[j]['c'] = code speaker = '' match = [] @@ -824,7 +840,7 @@ def searchCodes(page, pbar): if codeList[i]['c'] == 122 and CODE122 == True: # This is going to be the var being set. (IMPORTANT) varNum = codeList[i]['p'][0] - if varNum != 319: + if varNum not in [1178]: continue jaString = codeList[i]['p'][4] @@ -845,7 +861,7 @@ def searchCodes(page, pbar): for match in matchList: # Remove Textwrap match = match.replace('\\n', ' ') - response = translateGPT(match, 'Reply with the English translation.', True) + response = translateGPT(match, 'Reply with the '+ LANGUAGE +' translation.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -859,7 +875,7 @@ def searchCodes(page, pbar): translatedText = translatedText.replace(char, '') # Textwrap - translatedText = textwrap.fill(translatedText, width=70) + translatedText = textwrap.fill(translatedText, width=LISTWIDTH) translatedText = translatedText.replace('\n', '\\n') # translatedText = translatedText.replace('\'', '\\\'') translatedText = '\"' + translatedText + '\"' @@ -999,7 +1015,7 @@ def searchCodes(page, pbar): else: endString = endString.group() # Translate - response = translateGPT(jaString, 'Reply with only the english translation of the NPC name.', False) + response = translateGPT(jaString, 'Reply with only the '+ LANGUAGE +' translation of the NPC name.', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] translatedText = response[0] @@ -1042,7 +1058,7 @@ def searchCodes(page, pbar): if not re.search(r'[一-龠]+|[ぁ-ゔ]+|[ァ-ヴー]+', matchList[0]): continue - response = translateGPT(matchList[0], 'Reply with the English translation Stat Title. Keep it brief.', True) + response = translateGPT(matchList[0], 'Reply with the '+ LANGUAGE +' translation Stat Title. Keep it brief.', True) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] translatedText = response[0] @@ -1115,7 +1131,7 @@ def searchCodes(page, pbar): # Translate if len(matchList) > 0: - response = translateGPT(matchList[0], 'Reply with the English translation of the Location Title', True) + response = translateGPT(matchList[0], 'Reply with the '+ LANGUAGE +' translation of the Location Title', True) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] translatedText = response[0] @@ -1127,7 +1143,6 @@ def searchCodes(page, pbar): translatedText = translatedText.replace('"', '\"') translatedText = translatedText.replace(' ', '_') translatedText = jaString.replace(matchList[0], translatedText) - translatedText = translatedText.replace('"', '\"') # Set Data codeList[i]['p'][0] = translatedText @@ -1142,7 +1157,7 @@ def searchCodes(page, pbar): matchList = re.findall(r'Tachie showName (.+)', jaString) if len(matchList) > 0: # Translate - response = translateGPT(matchList[0], 'Reply with the English translation of the NPC name.', True) + response = translateGPT(matchList[0], 'Reply with the '+ LANGUAGE +' translation of the NPC name.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1200,7 +1215,7 @@ def searchCodes(page, pbar): currentGroup = [] # Translate - response = translateGPT(finalJAString, 'Reply with the English Translation.', True) + response = translateGPT(finalJAString, 'Reply with the '+ LANGUAGE +' Translation.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1269,7 +1284,7 @@ def searchCodes(page, pbar): jaString = re.sub(r'\n', '_', jaString) # Translate - response = translateGPT(finalJAString, 'Reply with the English Translation.', True) + response = translateGPT(finalJAString, 'Reply with the '+ LANGUAGE +' Translation.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1332,7 +1347,7 @@ def searchCodes(page, pbar): jaString = re.sub(r'\n', '_', jaString) # Translate - response = translateGPT(finalJAString, 'Reply with the English Translation.', True) + response = translateGPT(finalJAString, 'Reply with the '+ LANGUAGE +' Translation.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1437,7 +1452,7 @@ def searchCodes(page, pbar): if not re.search(r'[一-龠]+|[ぁ-ゔ]+|[ァ-ヴー]+', jaString): continue - response = translateGPT(jaString, 'Reply with the English translation of the NPC name.', True) + response = translateGPT(jaString, 'Reply with the '+ LANGUAGE +' translation of the NPC name.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1450,6 +1465,13 @@ def searchCodes(page, pbar): # Set Data codeList[i]['p'][1] = translatedText + # Delete all -1 codes + codeListFinal = [] + for i in range(len(codeList)): + if codeList[i]['c'] != -1: + codeListFinal.append(codeList[i]) + page['list'] = codeListFinal + except IndexError as e: # This is part of the logic so we just pass it traceback.print_exc() @@ -1494,10 +1516,10 @@ def searchSS(state, pbar): totalTokens = [0, 0] # Name - nameResponse = translateGPT(state['name'], 'Reply with only the english translation of the RPG Skill name.', True) if 'name' in state else '' + nameResponse = translateGPT(state['name'], 'Reply with only the '+ LANGUAGE +' translation of the RPG Skill name.', True) if 'name' in state else '' # Description - descriptionResponse = translateGPT(state['description'], 'Reply with only the english translation of the description.', True) if 'description' in state else '' + descriptionResponse = translateGPT(state['description'], 'Reply with only the '+ LANGUAGE +' translation of the description.', True) if 'description' in state else '' # Messages message1Response = '' @@ -1507,27 +1529,27 @@ def searchSS(state, pbar): if 'message1' in state: if len(state['message1']) > 0 and state['message1'][0] in ['は', 'を', 'の', 'に', 'が']: - message1Response = translateGPT('Taro' + state['message1'], 'reply with only the gender neutral english translation of the action. Always start the sentence with Taro.', True) + message1Response = translateGPT('Taro' + state['message1'], 'reply with only the gender neutral '+ LANGUAGE +' translation of the action. Always start the sentence with Taro.', True) else: - message1Response = translateGPT(state['message1'], 'reply with only the gender neutral english translation', True) + message1Response = translateGPT(state['message1'], 'reply with only the gender neutral '+ LANGUAGE +' translation', True) if 'message2' in state: if len(state['message2']) > 0 and state['message2'][0] in ['は', 'を', 'の', 'に', 'が']: - message2Response = translateGPT('Taro' + state['message2'], 'reply with only the gender neutral english translation of the action. Always start the sentence with Taro.', True) + message2Response = translateGPT('Taro' + state['message2'], 'reply with only the gender neutral '+ LANGUAGE +' translation of the action. Always start the sentence with Taro.', True) else: - message2Response = translateGPT(state['message2'], 'reply with only the gender neutral english translation', True) + message2Response = translateGPT(state['message2'], 'reply with only the gender neutral '+ LANGUAGE +' translation', True) if 'message3' in state: if len(state['message3']) > 0 and state['message3'][0] in ['は', 'を', 'の', 'に', 'が']: - message3Response = translateGPT('Taro' + state['message3'], 'reply with only the gender neutral english translation of the action. Always start the sentence with Taro.', True) + message3Response = translateGPT('Taro' + state['message3'], 'reply with only the gender neutral '+ LANGUAGE +' translation of the action. Always start the sentence with Taro.', True) else: - message3Response = translateGPT(state['message3'], 'reply with only the gender neutral english translation', True) + message3Response = translateGPT(state['message3'], 'reply with only the gender neutral '+ LANGUAGE +' translation', True) if 'message4' in state: if len(state['message4']) > 0 and state['message4'][0] in ['は', 'を', 'の', 'に', 'が']: - message4Response = translateGPT('Taro' + state['message4'], 'reply with only the gender neutral english translation of the action. Always start the sentence with Taro.', True) + message4Response = translateGPT('Taro' + state['message4'], 'reply with only the gender neutral '+ LANGUAGE +' translation of the action. Always start the sentence with Taro.', True) else: - message4Response = translateGPT(state['message4'], 'reply with only the gender neutral english translation', True) + message4Response = translateGPT(state['message4'], 'reply with only the gender neutral '+ LANGUAGE +' translation', True) # if 'note' in state: if 'help' in state['note']: @@ -1582,10 +1604,10 @@ def searchSystem(data, pbar): "魔力防御" == "M. Defense\ "%1 の%2を獲得!" == "Gained %1 %2"\ "お金を %1\\G 手に入れた!" == ""\ - Reply with only the english translation of the UI textbox."' + Reply with only the '+ LANGUAGE +' translation of the UI textbox."' # Title - response = translateGPT(data['gameTitle'], ' Reply with the English translation of the game title name', False) + response = translateGPT(data['gameTitle'], ' Reply with the '+ LANGUAGE +' translation of the game title name', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] # data['gameTitle'] = response[0].strip('.') @@ -1605,7 +1627,7 @@ def searchSystem(data, pbar): # Armor Types for i in range(len(data['armor_types'])): - response = translateGPT(data['armorTypes'][i], 'Reply with only the english translation of the armor type', False) + response = translateGPT(data['armorTypes'][i], 'Reply with only the '+ LANGUAGE +' translation of the armor type', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['armorTypes'][i] = response[0].replace('\"', '').strip() @@ -1613,7 +1635,7 @@ def searchSystem(data, pbar): # Skill Types for i in range(len(data['skill_types'])): - response = translateGPT(data['skillTypes'][i], 'Reply with only the english translation', False) + response = translateGPT(data['skillTypes'][i], 'Reply with only the '+ LANGUAGE +' translation', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['skillTypes'][i] = response[0].replace('\"', '').strip() @@ -1621,7 +1643,7 @@ def searchSystem(data, pbar): # Equip Types for i in range(len(data['equip_types'])): - response = translateGPT(data['equipTypes'][i], 'Reply with only the english translation of the equipment type. No disclaimers.', False) + response = translateGPT(data['equipTypes'][i], 'Reply with only the '+ LANGUAGE +' translation of the equipment type. No disclaimers.', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['equipTypes'][i] = response[0].replace('\"', '').strip() @@ -1629,7 +1651,7 @@ def searchSystem(data, pbar): # Variables (Optional ususally) # for i in range(len(data['variables'])): - # response = translateGPT(data['variables'][i], 'Reply with only the english translation of the title', False) + # response = translateGPT(data['variables'][i], 'Reply with only the '+ LANGUAGE +' translation of the title', False) # totalTokens[0] += response[1][0] # totalTokens[1] += response[1][1] # data['variables'][i] = response[0].replace('\"', '').strip() @@ -1638,7 +1660,7 @@ def searchSystem(data, pbar): # Messages messages = (data['terms']['messages']) for key, value in messages.items(): - response = translateGPT(value, 'Reply with only the english translation of the battle text.\nTranslate "常時ダッシュ" as "Always Dash"\nTranslate "次の%1まで" as Next %1.', False) + response = translateGPT(value, 'Reply with only the '+ LANGUAGE +' translation of the battle text.\nTranslate "常時ダッシュ" as "Always Dash"\nTranslate "次の%1まで" as Next %1.', False) translatedText = response[0] # Remove characters that may break scripts @@ -1656,13 +1678,22 @@ def searchSystem(data, pbar): def subVars(jaString): jaString = jaString.replace('\u3000', ' ') + # Nested + count = 0 + nestedList = re.findall(r'[\\]+[\w]+\[[\\]+[\w]+\[[0-9]+\]\]', jaString) + nestedList = set(nestedList) + if len(nestedList) != 0: + for icon in nestedList: + jaString = jaString.replace(icon, '{Nested_' + str(count) + '}') + count += 1 + # Icons count = 0 - iconList = re.findall(r'[\\]+[iIkKwW]+\[[0-9]+\]', jaString) + iconList = re.findall(r'[\\]+[iIkKwWaA]+\[[0-9]+\]', jaString) iconList = set(iconList) if len(iconList) != 0: for icon in iconList: - jaString = jaString.replace(icon, '[Ascii_' + str(count) + ']') + jaString = jaString.replace(icon, '{Ascii_' + str(count) + '}') count += 1 # Colors @@ -1671,7 +1702,7 @@ def subVars(jaString): colorList = set(colorList) if len(colorList) != 0: for color in colorList: - jaString = jaString.replace(color, '[Color_' + str(count) + ']') + jaString = jaString.replace(color, '{Color_' + str(count) + '}') count += 1 # Names @@ -1680,7 +1711,7 @@ def subVars(jaString): nameList = set(nameList) if len(nameList) != 0: for name in nameList: - jaString = jaString.replace(name, '[N_' + str(count) + ']') + jaString = jaString.replace(name, '{N_' + str(count) + '}') count += 1 # Variables @@ -1689,7 +1720,7 @@ def subVars(jaString): varList = set(varList) if len(varList) != 0: for var in varList: - jaString = jaString.replace(var, '[Var_' + str(count) + ']') + jaString = jaString.replace(var, '{Var_' + str(count) + '}') count += 1 # Formatting @@ -1700,11 +1731,11 @@ def subVars(jaString): formatList = set(formatList) if len(formatList) != 0: for var in formatList: - jaString = jaString.replace(var, '[FCode_' + str(count) + ']') + jaString = jaString.replace(var, '{FCode_' + str(count) + '}') count += 1 # Put all lists in list and return - allList = [iconList, colorList, nameList, varList, formatList] + allList = [nestedList, iconList, colorList, nameList, varList, formatList] return [jaString, allList] def resubVars(translatedText, allList): @@ -1715,39 +1746,46 @@ def resubVars(translatedText, allList): text = match.strip() translatedText = translatedText.replace(match, text) - # Icons + # Nested count = 0 if len(allList[0]) != 0: for var in allList[0]: - translatedText = translatedText.replace('[Ascii_' + str(count) + ']', var) + translatedText = translatedText.replace('{Nested_' + str(count) + '}', var) + count += 1 + + # Icons + count = 0 + if len(allList[1]) != 0: + for var in allList[1]: + translatedText = translatedText.replace('{Ascii_' + str(count) + '}', var) count += 1 # Colors count = 0 - if len(allList[1]) != 0: - for var in allList[1]: - translatedText = translatedText.replace('[Color_' + str(count) + ']', var) + if len(allList[2]) != 0: + for var in allList[2]: + translatedText = translatedText.replace('{Color_' + str(count) + '}', var) count += 1 # Names count = 0 - if len(allList[2]) != 0: - for var in allList[2]: - translatedText = translatedText.replace('[N_' + str(count) + ']', var) + if len(allList[3]) != 0: + for var in allList[3]: + translatedText = translatedText.replace('{N_' + str(count) + '}', var) count += 1 # Vars count = 0 - if len(allList[3]) != 0: - for var in allList[3]: - translatedText = translatedText.replace('[Var_' + str(count) + ']', var) + if len(allList[4]) != 0: + for var in allList[4]: + translatedText = translatedText.replace('{Var_' + str(count) + '}', var) count += 1 # Formatting count = 0 - if len(allList[4]) != 0: - for var in allList[4]: - translatedText = translatedText.replace('[FCode_' + str(count) + ']', var) + if len(allList[5]) != 0: + for var in allList[5]: + translatedText = translatedText.replace('{FCode_' + str(count) + '}', var) count += 1 # Remove Color Variables Spaces @@ -1782,21 +1820,22 @@ def translateGPT(t, history, fullPromptFlag): return(t, [0,0]) # Characters - context = '```\ - Game Characters:\ - Character: 池ノ上 拓海 == Ikenoue Takumi - Gender: Male\ - Character: 福永 こはる == Fukunaga Koharu - Gender: Female\ - Character: 神泉 理央 == Kamiizumi Rio - Gender: Female\ - Character: 吉祥寺 アリサ == Kisshouji Arisa - Gender: Female\ - Character: 久我 友里子 == Kuga Yuriko - Gender: Female\ - ```' + context = 'Game Characters:\ + Character: 莉音 == Rio - Gender: Female\ + Character: 結衣 == Yui - Gender: Female\ + Character: 美雪 == Miyuki - Gender: Female\ + Character: あかり == Akari - Gender: Female\ + Character: カガミ == Kagami - Gender: Female\ + Character: ミズキ == Mizuki - Gender: Female\ + Character: スズカ == Suzuka - Gender: Female\ + Character: シズク == Shizuku - Gender: Female' # Prompt if fullPromptFlag: system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -1811,7 +1850,7 @@ def translateGPT(t, history, fullPromptFlag): msg.append({"role": "user", "content": user}) response = openai.ChatCompletion.create( - temperature=0.1, + temperature=0, frequency_penalty=0.2, presence_penalty=0.2, model=MODEL, @@ -1827,17 +1866,16 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '') translatedText = translatedText.replace('Translate =', '') - translatedText = re.sub(r'Note:.*', '', translatedText) translatedText = translatedText.replace('っ', '') # Return Translation diff --git a/modules/rpgmakermvmz.py b/modules/rpgmakermvmz.py index deac15e..ac324a0 100644 --- a/modules/rpgmakermvmz.py +++ b/modules/rpgmakermvmz.py @@ -23,6 +23,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() INPUTAPICOST = .002 # Depends on the model https://openai.com/pricing OUTPUTAPICOST = .002 @@ -43,10 +44,10 @@ POSITION=0 LEAVE=False # Flags -CODE401 = True +CODE401 = False CODE405 = False -CODE102 = True -CODE122 = False +CODE102 = False +CODE122 = True CODE101 = False CODE355655 = False CODE357 = False @@ -59,7 +60,7 @@ CODE408 = False CODE108 = False NAMES = False # Output a list of all the character names found BRFLAG = False # If the game uses
instead -FIXTEXTWRAP = False +FIXTEXTWRAP = True IGNORETLTEXT = True def handleMVMZ(filename, estimate): @@ -195,7 +196,7 @@ def parseMap(data, filename): # Translate displayName for Map files if 'Map' in filename: - response = translateGPT(data['displayName'], 'Reply with only the english translation of the RPG location name', False) + response = translateGPT(data['displayName'], 'Reply with only the '+ LANGUAGE +' translation of the RPG location name', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['displayName'] = response[0].replace('\"', '') @@ -213,7 +214,7 @@ def parseMap(data, filename): for event in events: if event is not None: # This translates ID of events. (May break the game) - # response = translateGPT(event['name'], 'Reply with the English translation of the Title.', True) + # response = translateGPT(event['name'], 'Reply with the '+ LANGUAGE +' translation of the Title.', True) # event['name'] = response[0].replace('\"', '') # totalTokens[0] += response[1][0] # totalTokens[1] += response[1][1] @@ -239,7 +240,7 @@ def translateNote(event, regex): jaString = re.sub(r'\n', ' ', oldJAString) # Translate - response = translateGPT(jaString, 'Reply with the English translation of the note.', True) + response = translateGPT(jaString, 'Reply with the '+ LANGUAGE +' translation of the note.', True) translatedText = response[0] # Textwrap @@ -415,10 +416,10 @@ def searchThings(name, pbar): return totalTokens # Name - nameResponse = translateGPT(name['name'], 'Reply with only the english translation of the RPG item name.', False) if 'name' in name else '' + nameResponse = translateGPT(name['name'], 'Reply with only the '+ LANGUAGE +' translation of the RPG item name.', False) if 'name' in name else '' # Description - descriptionResponse = translateGPT(name['description'], 'Reply with only the english translation of the description.', False) if 'description' in name else '' + descriptionResponse = translateGPT(name['description'], 'Reply with only the '+ LANGUAGE +' translation of the description.', False) if 'description' in name else '' # Note if ' 0: + jaString = codeList[i]['parameters'][0] + firstJAString = jaString + else: + codeList[i]['code'] = -1 + continue # If there isn't any Japanese in the text just skip if IGNORETLTEXT == True: @@ -578,12 +583,14 @@ def searchCodes(page, pbar): if len(codeList) > i+1: while (codeList[i+1]['code'] == 401 or codeList[i+1]['code'] == 405): - codeList[i]['parameters'][0] = '' - codeList[i]['code'] = 0 + codeList[i]['parameters'] = [] + codeList[i]['code'] = -1 i += 1 - jaString = codeList[i]['parameters'][0] - currentGroup.append(jaString) + # Only add if not empty + if len(codeList[i]['parameters']) > 0: + jaString = codeList[i]['parameters'][0] + currentGroup.append(jaString) # Make sure not the end of the list. if len(codeList) <= i+1: @@ -597,7 +604,7 @@ def searchCodes(page, pbar): # Color Regex: ^([\\]+[cC]\[[0-9]\]+(.+?)[\\]+[cC]\[[0]\]) matchList = re.findall(r'(.*?([\\]+[nN]<(.+?)>).*)', finalJAString) if len(matchList) > 0: - response = translateGPT(matchList[0][2], 'Reply with only the english translation of the NPC name', False) + response = translateGPT(matchList[0][2], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] speaker = response[0].strip('.') @@ -646,7 +653,7 @@ def searchCodes(page, pbar): matchList = re.findall(r'(\\+nc<(.*?)>)(.+)?', finalJAString) if len(matchList) != 0: # Translate Speaker - response = translateGPT(matchList[0][1], 'Reply with only the english translation of the NPC name', False) + response = translateGPT(matchList[0][1], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] speaker = response[0].strip('.') @@ -662,7 +669,7 @@ def searchCodes(page, pbar): elif '\\nw' in finalJAString or '\\NW' in finalJAString: matchList = re.findall(r'([\\]+[nN][wW]\[(.+?)\]+)(.+)', finalJAString) if len(matchList) != 0: - response = translateGPT(matchList[0][1], 'Reply with only the english translation of the NPC name', False) + response = translateGPT(matchList[0][1], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] speaker = response[0].strip('.') @@ -689,7 +696,7 @@ def searchCodes(page, pbar): # elif '【' in finalJAString: # matchList = re.findall(r'(.+?【(.+?)】.+?)(「.+)', finalJAString) # if len(matchList) != 0: - # response = translateGPT(matchList[0][1], 'Reply with only the english translation of the NPC name', True) + # response = translateGPT(matchList[0][1], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', True) # else: # print('wtf') # totalTokens[0] += response[1][0] @@ -730,6 +737,8 @@ def searchCodes(page, pbar): # Remove Extra Stuff finalJAString = finalJAString.replace('゙', '') finalJAString = finalJAString.replace('。', '.') + finalJAString = finalJAString.replace('?', '?') + finalJAString = finalJAString.replace('!', '!') finalJAString = finalJAString.replace('・', '.') finalJAString = finalJAString.replace('‶', '') finalJAString = finalJAString.replace('”', '') @@ -769,26 +778,26 @@ def searchCodes(page, pbar): totalTokens[1] += response[1][1] translatedText = response[0] - # Remove added speaker - translatedText = re.sub(r'^.+?:\s?', '', translatedText) + # Change added speaker + translatedText = re.sub(r'(^.+?)\s?[|:]\s?', '\g<1>: ', translatedText) # Sub Vars varResponse = subVars(translatedText) subbedT = varResponse[0] textHistory.append('\"' + varResponse[0] + '\"') elif finalJAString != '': - response = translateGPT(speaker + ': ' + finalJAString, textHistory, True) + response = translateGPT(speaker + ' | ' + finalJAString, textHistory, True) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] translatedText = response[0] # Remove added speaker - translatedText = re.sub(r'^.+?:\s?', '', translatedText) + translatedText = re.sub(r'(^.+?)\s?[|:]\s?', '', translatedText) # Sub Vars varResponse = subVars(translatedText) subbedT = varResponse[0] - textHistory.append('\"' + speaker + ': ' + varResponse[0] + '\"') + textHistory.append('\"' + speaker + ' | ' + varResponse[0] + '\"') speaker = '' else: translatedText = finalJAString @@ -809,9 +818,9 @@ def searchCodes(page, pbar): # Set Data translatedText = translatedText.replace('\"', '') - codeList[i]['parameters'][0] = '' - codeList[i]['code'] = 0 - codeList[j]['parameters'][0] = translatedText + codeList[i]['parameters'] = [] + codeList[i]['code'] = -1 + codeList[j]['parameters'] = [translatedText] codeList[j]['code'] = code speaker = '' match = [] @@ -826,7 +835,7 @@ def searchCodes(page, pbar): if codeList[i]['code'] == 122 and CODE122 == True: # This is going to be the var being set. (IMPORTANT) varNum = codeList[i]['parameters'][0] - if varNum not in [906, 907, 908, 909]: + if varNum not in [1178]: continue jaString = codeList[i]['parameters'][4] @@ -847,7 +856,7 @@ def searchCodes(page, pbar): for match in matchList: # Remove Textwrap match = match.replace('\\n', ' ') - response = translateGPT(match, 'Reply with the English translation.', True) + response = translateGPT(match, 'Reply with the '+ LANGUAGE +' translation.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1001,7 +1010,7 @@ def searchCodes(page, pbar): else: endString = endString.group() # Translate - response = translateGPT(jaString, 'Reply with only the english translation of the NPC name.', False) + response = translateGPT(jaString, 'Reply with only the '+ LANGUAGE +' translation of the NPC name.', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] translatedText = response[0] @@ -1044,7 +1053,7 @@ def searchCodes(page, pbar): if not re.search(r'[一-龠]+|[ぁ-ゔ]+|[ァ-ヴー]+', matchList[0]): continue - response = translateGPT(matchList[0], 'Reply with the English translation Stat Title. Keep it brief.', True) + response = translateGPT(matchList[0], 'Reply with the '+ LANGUAGE +' translation Stat Title. Keep it brief.', True) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] translatedText = response[0] @@ -1117,7 +1126,7 @@ def searchCodes(page, pbar): # Translate if len(matchList) > 0: - response = translateGPT(matchList[0], 'Reply with the English translation of the Location Title', True) + response = translateGPT(matchList[0], 'Reply with the '+ LANGUAGE +' translation of the Location Title', True) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] translatedText = response[0] @@ -1143,7 +1152,7 @@ def searchCodes(page, pbar): matchList = re.findall(r'Tachie showName (.+)', jaString) if len(matchList) > 0: # Translate - response = translateGPT(matchList[0], 'Reply with the English translation of the NPC name.', False) + response = translateGPT(matchList[0], 'Reply with the '+ LANGUAGE +' translation of the NPC name.', False) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1201,7 +1210,7 @@ def searchCodes(page, pbar): currentGroup = [] # Translate - response = translateGPT(finalJAString, 'Reply with the English Translation.', True) + response = translateGPT(finalJAString, 'Reply with the '+ LANGUAGE +' Translation.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1270,7 +1279,7 @@ def searchCodes(page, pbar): jaString = re.sub(r'\n', '_', jaString) # Translate - response = translateGPT(finalJAString, 'Reply with the English Translation.', True) + response = translateGPT(finalJAString, 'Reply with the '+ LANGUAGE +' Translation.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1333,7 +1342,7 @@ def searchCodes(page, pbar): jaString = re.sub(r'\n', '_', jaString) # Translate - response = translateGPT(finalJAString, 'Reply with the English Translation.', True) + response = translateGPT(finalJAString, 'Reply with the '+ LANGUAGE +' Translation.', True) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1438,7 +1447,7 @@ def searchCodes(page, pbar): if not re.search(r'[一-龠]+|[ぁ-ゔ]+|[ァ-ヴー]+', jaString): continue - response = translateGPT(jaString, 'Reply with the English translation of the NPC name.', False) + response = translateGPT(jaString, 'Reply with the '+ LANGUAGE +' translation of the NPC name.', False) translatedText = response[0] totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] @@ -1451,6 +1460,13 @@ def searchCodes(page, pbar): # Set Data codeList[i]['parameters'][1] = translatedText + # Delete all -1 codes + codeListFinal = [] + for i in range(len(codeList)): + if codeList[i]['code'] != -1: + codeListFinal.append(codeList[i]) + page['list'] = codeListFinal + except IndexError as e: # This is part of the logic so we just pass it traceback.print_exc() @@ -1495,10 +1511,10 @@ def searchSS(state, pbar): totalTokens = [0, 0] # Name - nameResponse = translateGPT(state['name'], 'Reply with only the english translation of the RPG Skill name.', True) if 'name' in state else '' + nameResponse = translateGPT(state['name'], 'Reply with only the '+ LANGUAGE +' translation of the RPG Skill name.', True) if 'name' in state else '' # Description - descriptionResponse = translateGPT(state['description'], 'Reply with only the english translation of the description.', True) if 'description' in state else '' + descriptionResponse = translateGPT(state['description'], 'Reply with only the '+ LANGUAGE +' translation of the description.', True) if 'description' in state else '' # Messages message1Response = '' @@ -1508,27 +1524,27 @@ def searchSS(state, pbar): if 'message1' in state: if len(state['message1']) > 0 and state['message1'][0] in ['は', 'を', 'の', 'に', 'が']: - message1Response = translateGPT('Taro' + state['message1'], 'reply with only the gender neutral english translation of the action. Always start the sentence with Taro.', True) + message1Response = translateGPT('Taro' + state['message1'], 'reply with only the gender neutral '+ LANGUAGE +' translation of the action. Always start the sentence with Taro.', True) else: - message1Response = translateGPT(state['message1'], 'reply with only the gender neutral english translation', True) + message1Response = translateGPT(state['message1'], 'reply with only the gender neutral '+ LANGUAGE +' translation', True) if 'message2' in state: if len(state['message2']) > 0 and state['message2'][0] in ['は', 'を', 'の', 'に', 'が']: - message2Response = translateGPT('Taro' + state['message2'], 'reply with only the gender neutral english translation of the action. Always start the sentence with Taro.', True) + message2Response = translateGPT('Taro' + state['message2'], 'reply with only the gender neutral '+ LANGUAGE +' translation of the action. Always start the sentence with Taro.', True) else: - message2Response = translateGPT(state['message2'], 'reply with only the gender neutral english translation', True) + message2Response = translateGPT(state['message2'], 'reply with only the gender neutral '+ LANGUAGE +' translation', True) if 'message3' in state: if len(state['message3']) > 0 and state['message3'][0] in ['は', 'を', 'の', 'に', 'が']: - message3Response = translateGPT('Taro' + state['message3'], 'reply with only the gender neutral english translation of the action. Always start the sentence with Taro.', True) + message3Response = translateGPT('Taro' + state['message3'], 'reply with only the gender neutral '+ LANGUAGE +' translation of the action. Always start the sentence with Taro.', True) else: - message3Response = translateGPT(state['message3'], 'reply with only the gender neutral english translation', True) + message3Response = translateGPT(state['message3'], 'reply with only the gender neutral '+ LANGUAGE +' translation', True) if 'message4' in state: if len(state['message4']) > 0 and state['message4'][0] in ['は', 'を', 'の', 'に', 'が']: - message4Response = translateGPT('Taro' + state['message4'], 'reply with only the gender neutral english translation of the action. Always start the sentence with Taro.', True) + message4Response = translateGPT('Taro' + state['message4'], 'reply with only the gender neutral '+ LANGUAGE +' translation of the action. Always start the sentence with Taro.', True) else: - message4Response = translateGPT(state['message4'], 'reply with only the gender neutral english translation', True) + message4Response = translateGPT(state['message4'], 'reply with only the gender neutral '+ LANGUAGE +' translation', True) # if 'note' in state: if 'help' in state['note']: @@ -1583,10 +1599,10 @@ def searchSystem(data, pbar): "魔力防御" == "M. Defense\ "%1 の%2を獲得!" == "Gained %1 %2"\ "お金を %1\\G 手に入れた!" == ""\ - Reply with only the english translation of the UI textbox."' + Reply with only the '+ LANGUAGE +' translation of the UI textbox."' # Title - response = translateGPT(data['gameTitle'], ' Reply with the English translation of the game title name', False) + response = translateGPT(data['gameTitle'], ' Reply with the '+ LANGUAGE +' translation of the game title name', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['gameTitle'] = response[0].strip('.') @@ -1606,7 +1622,7 @@ def searchSystem(data, pbar): # Armor Types for i in range(len(data['armorTypes'])): - response = translateGPT(data['armorTypes'][i], 'Reply with only the english translation of the armor type', False) + response = translateGPT(data['armorTypes'][i], 'Reply with only the '+ LANGUAGE +' translation of the armor type', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['armorTypes'][i] = response[0].replace('\"', '').strip() @@ -1614,7 +1630,7 @@ def searchSystem(data, pbar): # Skill Types for i in range(len(data['skillTypes'])): - response = translateGPT(data['skillTypes'][i], 'Reply with only the english translation', False) + response = translateGPT(data['skillTypes'][i], 'Reply with only the '+ LANGUAGE +' translation', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['skillTypes'][i] = response[0].replace('\"', '').strip() @@ -1622,7 +1638,7 @@ def searchSystem(data, pbar): # Equip Types for i in range(len(data['equipTypes'])): - response = translateGPT(data['equipTypes'][i], 'Reply with only the english translation of the equipment type. No disclaimers.', False) + response = translateGPT(data['equipTypes'][i], 'Reply with only the '+ LANGUAGE +' translation of the equipment type. No disclaimers.', False) totalTokens[0] += response[1][0] totalTokens[1] += response[1][1] data['equipTypes'][i] = response[0].replace('\"', '').strip() @@ -1630,7 +1646,7 @@ def searchSystem(data, pbar): # Variables (Optional ususally) # for i in range(len(data['variables'])): - # response = translateGPT(data['variables'][i], 'Reply with only the english translation of the title', False) + # response = translateGPT(data['variables'][i], 'Reply with only the '+ LANGUAGE +' translation of the title', False) # totalTokens[0] += response[1][0] # totalTokens[1] += response[1][1] # data['variables'][i] = response[0].replace('\"', '').strip() @@ -1639,7 +1655,7 @@ def searchSystem(data, pbar): # Messages messages = (data['terms']['messages']) for key, value in messages.items(): - response = translateGPT(value, 'Reply with only the english translation of the battle text.\nTranslate "常時ダッシュ" as "Always Dash"\nTranslate "次の%1まで" as Next %1.', False) + response = translateGPT(value, 'Reply with only the '+ LANGUAGE +' translation of the battle text.\nTranslate "常時ダッシュ" as "Always Dash"\nTranslate "次の%1まで" as Next %1.', False) translatedText = response[0] # Remove characters that may break scripts @@ -1657,9 +1673,18 @@ def searchSystem(data, pbar): def subVars(jaString): jaString = jaString.replace('\u3000', ' ') + # Nested + count = 0 + nestedList = re.findall(r'[\\]+[\w]+\[[\\]+[\w]+\[[0-9]+\]\]', jaString) + nestedList = set(nestedList) + if len(nestedList) != 0: + for icon in nestedList: + jaString = jaString.replace(icon, '{Nested_' + str(count) + '}') + count += 1 + # Icons count = 0 - iconList = re.findall(r'[\\]+[iIkKwW]+\[[0-9]+\]', jaString) + iconList = re.findall(r'[\\]+[iIkKwWaA]+\[[0-9]+\]', jaString) iconList = set(iconList) if len(iconList) != 0: for icon in iconList: @@ -1705,7 +1730,7 @@ def subVars(jaString): count += 1 # Put all lists in list and return - allList = [iconList, colorList, nameList, varList, formatList] + allList = [nestedList, iconList, colorList, nameList, varList, formatList] return [jaString, allList] def resubVars(translatedText, allList): @@ -1716,38 +1741,45 @@ def resubVars(translatedText, allList): text = match.strip() translatedText = translatedText.replace(match, text) - # Icons + # Nested count = 0 if len(allList[0]) != 0: for var in allList[0]: + translatedText = translatedText.replace('{Nested_' + str(count) + '}', var) + count += 1 + + # Icons + count = 0 + if len(allList[1]) != 0: + for var in allList[1]: translatedText = translatedText.replace('{Ascii_' + str(count) + '}', var) count += 1 # Colors count = 0 - if len(allList[1]) != 0: - for var in allList[1]: + if len(allList[2]) != 0: + for var in allList[2]: translatedText = translatedText.replace('{Color_' + str(count) + '}', var) count += 1 # Names count = 0 - if len(allList[2]) != 0: - for var in allList[2]: + if len(allList[3]) != 0: + for var in allList[3]: translatedText = translatedText.replace('{N_' + str(count) + '}', var) count += 1 # Vars count = 0 - if len(allList[3]) != 0: - for var in allList[3]: + if len(allList[4]) != 0: + for var in allList[4]: translatedText = translatedText.replace('{Var_' + str(count) + '}', var) count += 1 # Formatting count = 0 - if len(allList[4]) != 0: - for var in allList[4]: + if len(allList[5]) != 0: + for var in allList[5]: translatedText = translatedText.replace('{FCode_' + str(count) + '}', var) count += 1 @@ -1798,7 +1830,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -1813,7 +1845,7 @@ def translateGPT(t, history, fullPromptFlag): msg.append({"role": "user", "content": user}) response = openai.ChatCompletion.create( - temperature=0.1, + temperature=0, frequency_penalty=0.2, presence_penalty=0.2, model=MODEL, @@ -1829,17 +1861,16 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '') translatedText = translatedText.replace('Translate =', '') - translatedText = re.sub(r'Note:.*', '', translatedText) translatedText = translatedText.replace('っ', '') # Return Translation diff --git a/modules/txt.py b/modules/txt.py index d42280d..585391a 100644 --- a/modules/txt.py +++ b/modules/txt.py @@ -23,6 +23,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() APICOST = .002 # Depends on the model https://openai.com/pricing PROMPT = Path('prompt.txt').read_text(encoding='utf-8') @@ -335,7 +336,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -366,12 +367,12 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '') diff --git a/modules/tyrano.py b/modules/tyrano.py index 954451f..12dc59e 100644 --- a/modules/tyrano.py +++ b/modules/tyrano.py @@ -21,6 +21,7 @@ openai.organization = os.getenv('org') openai.api_key = os.getenv('key') MODEL = os.getenv('model') TIMEOUT = int(os.getenv('timeout')) +LANGUAGE=os.getenv('language').capitalize() APICOST = .002 # Depends on the model https://openai.com/pricing PROMPT = Path('prompt.txt').read_text(encoding='utf-8') @@ -130,7 +131,7 @@ def translateTyrano(data, pbar): if '#' in data[i]: matchList = re.findall(r'#(.+)', data[i]) if len(matchList) != 0: - response = translateGPT(matchList[0], 'Reply with only the english translation of the NPC name', True) + response = translateGPT(matchList[0], 'Reply with only the '+ LANGUAGE +' translation of the NPC name', True) speaker = response[0] tokens += response[1] data[i] = '#' + speaker + '\n' @@ -502,7 +503,7 @@ def translateGPT(t, history, fullPromptFlag): system = PROMPT user = 'Line to Translate = ' + subbedT else: - system = 'Output ONLY the english translation in the following format: `Translation: `' + system = 'Output ONLY the '+ LANGUAGE +' translation in the following format: `Translation: <'+ LANGUAGE.upper() +'_TRANSLATION>`' user = 'Line to Translate = ' + subbedT # Create Message List @@ -533,12 +534,12 @@ def translateGPT(t, history, fullPromptFlag): translatedText = resubVars(translatedText, varResponse[1]) # Remove Placeholder Text - translatedText = translatedText.replace('English Translation: ', '') + translatedText = translatedText.replace(LANGUAGE +' Translation: ', '') translatedText = translatedText.replace('Translation: ', '') translatedText = translatedText.replace('Line to Translate = ', '') translatedText = translatedText.replace('Translation = ', '') translatedText = translatedText.replace('Translate = ', '') - translatedText = translatedText.replace('English Translation:', '') + translatedText = translatedText.replace(LANGUAGE +' Translation:', '') translatedText = translatedText.replace('Translation:', '') translatedText = translatedText.replace('Line to Translate =', '') translatedText = translatedText.replace('Translation =', '')