Make the merger not suck
This commit is contained in:
92
Translation merger/Merger.py
Normal file
92
Translation merger/Merger.py
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
from os import listdir
|
||||||
|
import re
|
||||||
|
|
||||||
|
def is_menu_string(s):
|
||||||
|
# Matches strings that look like "translate * strings:" for the menus
|
||||||
|
pattern = r'translate\s+\w+\s+strings:'
|
||||||
|
return re.match(pattern, s)
|
||||||
|
|
||||||
|
|
||||||
|
def parse(lines,cont):
|
||||||
|
menu_line = False
|
||||||
|
temp_cont = []
|
||||||
|
for line in lines:
|
||||||
|
if menu_line or is_menu_string(line):
|
||||||
|
menu_line = True
|
||||||
|
if len(temp_cont) != 0:
|
||||||
|
cont.append(temp_cont)
|
||||||
|
temp_cont = []
|
||||||
|
# We reached the menu, everything below this point doesn't need change
|
||||||
|
menu_block.append(line)
|
||||||
|
elif line.startswith("translate") and not is_menu_string(line):
|
||||||
|
# We've reached a new dialogue block so we "save" the old one
|
||||||
|
if len(temp_cont) != 0:
|
||||||
|
cont.append(temp_cont)
|
||||||
|
temp_cont = []
|
||||||
|
temp_cont.append(line)
|
||||||
|
else:
|
||||||
|
temp_cont.append(line)
|
||||||
|
|
||||||
|
|
||||||
|
for file in listdir(f"files_old"):
|
||||||
|
|
||||||
|
dialogue_blocks_old = []
|
||||||
|
dialogue_blocks_new = []
|
||||||
|
menu_block = []
|
||||||
|
out_lines = []
|
||||||
|
linesNew = []
|
||||||
|
linesOld = []
|
||||||
|
|
||||||
|
if file.endswith(".rpy"):
|
||||||
|
with open(f"files_old/{file}",'r', encoding="utf8") as f:
|
||||||
|
linesOld = f.readlines()
|
||||||
|
with open(f"files_new/{file}",'r', encoding="utf8") as f2:
|
||||||
|
linesNew = f2.readlines()
|
||||||
|
|
||||||
|
parse(linesNew,dialogue_blocks_new)
|
||||||
|
parse(linesOld,dialogue_blocks_old)
|
||||||
|
print(menu_block)
|
||||||
|
|
||||||
|
if len(dialogue_blocks_old) != len(dialogue_blocks_new):
|
||||||
|
print(f"ERROR processing {file}.\nThere's a mismatch in the dialogue blocks.\nCopy paste the missing dialogue blocks into your old translation file to properly merge them\n{len(dialogue_blocks_new)}/{len(dialogue_blocks_old)}")
|
||||||
|
else:
|
||||||
|
for num1,block in enumerate(dialogue_blocks_old):
|
||||||
|
for num2,line in enumerate(block):
|
||||||
|
if num2 == 0:
|
||||||
|
out_lines.append(dialogue_blocks_new[num1][0])
|
||||||
|
else:
|
||||||
|
out_lines.append(line)
|
||||||
|
|
||||||
|
out_lines = out_lines + menu_block
|
||||||
|
|
||||||
|
with open(f"files_out/{file}",'w', encoding="utf8") as fo:
|
||||||
|
for line in out_lines:
|
||||||
|
fo.write(line)
|
||||||
|
|
||||||
|
|
||||||
|
##############################
|
||||||
|
"""
|
||||||
|
|
||||||
|
Translation blocks follow this structure
|
||||||
|
|
||||||
|
#comment
|
||||||
|
translate lang id:
|
||||||
|
#comment
|
||||||
|
"Dialogue"
|
||||||
|
|
||||||
|
But we cannot use comments or line numbers to determine what a block is as a translator
|
||||||
|
may add internal translation notes using comments, not to mention that a translation block
|
||||||
|
can have more than one dialogue line.
|
||||||
|
|
||||||
|
Menus or interpolated strings (Such as screens) on the other hand look like this
|
||||||
|
|
||||||
|
translate lang strings:
|
||||||
|
|
||||||
|
# comment
|
||||||
|
old "Untranslated text"
|
||||||
|
new "Translated text"
|
||||||
|
|
||||||
|
Since these don't use IDs we don't care to "update" them and just pass on the old menus instead
|
||||||
|
|
||||||
|
"""
|
||||||
|
##############################
|
@@ -1,42 +0,0 @@
|
|||||||
############################################################################################################################
|
|
||||||
# This script simply places the strings from files_old into files_new. This is useful if for some reason the labels in the #
|
|
||||||
# script changed and you needed to regenerate the translations, or if you already translated the game without using the #
|
|
||||||
# built-in translation system. #
|
|
||||||
# #
|
|
||||||
# Make sure that both files have the same ammount of lines. Then, simply place the old files into files_old #
|
|
||||||
# And the new files into files_new. #
|
|
||||||
############################################################################################################################
|
|
||||||
|
|
||||||
####
|
|
||||||
# This shit sucks. But it works (As long as you didn't add any extra lines to the translation file)
|
|
||||||
####
|
|
||||||
|
|
||||||
from os import listdir
|
|
||||||
|
|
||||||
nextOne = False
|
|
||||||
|
|
||||||
for file in listdir(f"files_old"):
|
|
||||||
if file.endswith(".rpy"):
|
|
||||||
with open(f"files_old/{file}",'r', encoding="utf8") as f:
|
|
||||||
linesOne = f.readlines()
|
|
||||||
with open(f"files_new/{file}",'r', encoding="utf8") as f2:
|
|
||||||
linesTwo = f2.readlines()
|
|
||||||
|
|
||||||
if len(linesOne) == len(linesTwo):
|
|
||||||
with open(f"files_out/{file}",'w', encoding="utf8") as fp:
|
|
||||||
for number,line in enumerate(linesOne):
|
|
||||||
if nextOne:
|
|
||||||
fp.write(linesOne[number])
|
|
||||||
nextOne = False
|
|
||||||
elif line.strip().startswith("old"):
|
|
||||||
nextOne = True
|
|
||||||
fp.write(linesTwo[number])
|
|
||||||
print("nuevo",number)
|
|
||||||
elif number % 6 == 0:
|
|
||||||
fp.write(linesOne[number])
|
|
||||||
else:
|
|
||||||
fp.write(linesTwo[number])
|
|
||||||
print("novo",number,linesTwo[number])
|
|
||||||
else:
|
|
||||||
print(f"ERROR processing {file}. There's a discrepancy in the lines. old: {len(linesOne)} - new: {len(linesTwo)}\n\n")
|
|
||||||
continue
|
|
0
Translation merger/files_new/new files go here
Normal file
0
Translation merger/files_new/new files go here
Normal file
0
Translation merger/files_old/old files go here
Normal file
0
Translation merger/files_old/old files go here
Normal file
0
Translation merger/files_out/output files go here
Normal file
0
Translation merger/files_out/output files go here
Normal file
Reference in New Issue
Block a user