2024-02-16 12:48:18 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
2024-02-18 11:44:16 +00:00
|
|
|
import os
|
|
|
|
|
2024-02-16 12:48:18 +00:00
|
|
|
from unidecode import unidecode
|
|
|
|
|
2024-02-18 11:44:16 +00:00
|
|
|
import config
|
|
|
|
import parser
|
2024-02-18 16:11:31 +00:00
|
|
|
import flow
|
2024-02-16 12:48:18 +00:00
|
|
|
|
|
|
|
japanese_ranges = [
|
|
|
|
(0x4E00, 0x9FFF), # Kanji
|
|
|
|
(0x3040, 0x309F), # Hiragana
|
|
|
|
(0x30A0, 0x30FF), # Katakana
|
|
|
|
(0xFF00, 0xFFEF), # Full-width Roman characters and symbols
|
|
|
|
(0x3000, 0x303F), # CJK symbols and punctuation (including 「」)
|
|
|
|
]
|
|
|
|
|
|
|
|
|
2024-02-18 16:11:31 +00:00
|
|
|
def process_sections():
|
2024-02-18 11:44:16 +00:00
|
|
|
output_filepath = os.path.join(config.get('output_path'), 'out.txt')
|
|
|
|
outfile = open(output_filepath, 'w', encoding='shift_jisx0213')
|
2024-02-18 16:11:31 +00:00
|
|
|
origfile = open(config.get('original_path'), 'r', encoding='shift_jisx0213')
|
|
|
|
|
|
|
|
sections = dict()
|
|
|
|
|
|
|
|
for line in origfile:
|
|
|
|
if line.startswith('*'):
|
|
|
|
section_name = line[1:].split(' ', 1)[0].replace('\n','')
|
|
|
|
|
|
|
|
outfile.write(line)
|
|
|
|
|
|
|
|
if section_name in flow.onik:
|
|
|
|
print("entering", section_name)
|
|
|
|
write_translated(
|
|
|
|
outfile,
|
|
|
|
origfile,
|
|
|
|
flow.onik[section_name],
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
outfile.write(line)
|
|
|
|
|
|
|
|
outfile.close()
|
|
|
|
origfile.close()
|
|
|
|
|
|
|
|
|
2024-02-18 19:28:09 +00:00
|
|
|
def get_symbols(line: str) -> list[str]:
|
|
|
|
res = []
|
|
|
|
|
|
|
|
inbetween = 0
|
|
|
|
i = 0
|
|
|
|
while i < len(line):
|
|
|
|
if line[i] in ['@', '/', '¥']:
|
2024-02-18 19:37:04 +00:00
|
|
|
symbol = line[i]
|
2024-02-18 19:28:09 +00:00
|
|
|
elif line[i:i+3] == '!sd':
|
2024-02-18 19:37:04 +00:00
|
|
|
symbol = line[i:i+3]
|
2024-02-18 19:28:09 +00:00
|
|
|
i += 3
|
|
|
|
elif line[i:i+2] in ['!d', '!w', '!s']:
|
|
|
|
x = i
|
|
|
|
i += 2
|
|
|
|
while i < len(line):
|
|
|
|
if line[i].isdigit():
|
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
2024-02-18 19:37:04 +00:00
|
|
|
symbol = line[x:i]
|
2024-02-18 20:03:55 +00:00
|
|
|
|
|
|
|
# The i is going to get incremented
|
|
|
|
# later, gotta have to account that
|
|
|
|
i -= 1
|
2024-02-18 19:28:09 +00:00
|
|
|
break
|
|
|
|
elif line[i] == '!':
|
|
|
|
raise Exception('Unhandled symbol', line)
|
2024-02-18 19:37:04 +00:00
|
|
|
else: # It's not a symbol, it's a regular character
|
2024-02-18 19:28:09 +00:00
|
|
|
inbetween += 1
|
2024-02-18 19:37:04 +00:00
|
|
|
i += 1
|
|
|
|
continue
|
|
|
|
|
2024-02-18 20:03:55 +00:00
|
|
|
# Only reaches this if it's a symbol
|
2024-02-18 19:37:04 +00:00
|
|
|
if inbetween > 0:
|
|
|
|
res.append(symbol)
|
|
|
|
else:
|
|
|
|
res[-1] += symbol
|
|
|
|
inbetween = 0
|
2024-02-18 19:28:09 +00:00
|
|
|
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
2024-02-18 16:11:31 +00:00
|
|
|
# Given a set of translation files, the original file and the output file
|
|
|
|
# replace the japanese lines with the translated ones in a given section.
|
|
|
|
def write_translated(outfile, origfile, translation_file_paths):
|
|
|
|
for transfilepath in translation_file_paths:
|
|
|
|
print(f'- reading "{transfilepath}"')
|
|
|
|
structure = parser.parse_to_structure(transfilepath)
|
2024-02-16 12:48:18 +00:00
|
|
|
|
2024-02-18 16:11:31 +00:00
|
|
|
for i, line in enumerate(origfile):
|
2024-02-18 19:28:09 +00:00
|
|
|
# Check if the current line is a dialogue line or not
|
2024-02-16 12:48:18 +00:00
|
|
|
found = False
|
|
|
|
for start, end in japanese_ranges:
|
|
|
|
if start <= ord(line[0]) <= end:
|
|
|
|
found = True
|
|
|
|
|
2024-02-18 16:11:31 +00:00
|
|
|
if found:
|
|
|
|
# The amount of lines may not coincide because the original
|
|
|
|
# might have one line for what we have multiple lines. Count
|
|
|
|
# the number of appearances of the end-of-command symbols
|
|
|
|
# (@ and ¥) to determine how many of the translated lines is
|
|
|
|
# equivalent to the given original line.
|
|
|
|
amount = line.count("@") + line.count("¥") + line.count('/')
|
2024-02-16 12:48:18 +00:00
|
|
|
|
2024-02-18 19:28:09 +00:00
|
|
|
symbols = get_symbols(line)
|
2024-02-18 20:03:55 +00:00
|
|
|
print("\n-", transfilepath, symbols)
|
2024-02-18 19:28:09 +00:00
|
|
|
|
2024-02-16 12:48:18 +00:00
|
|
|
outfile.write('`')
|
|
|
|
|
2024-02-18 16:11:31 +00:00
|
|
|
_printed_line = ""
|
|
|
|
while True:
|
2024-02-18 18:33:11 +00:00
|
|
|
_printed_line += structure[0].text_jp
|
2024-02-16 12:48:18 +00:00
|
|
|
outfile.write(
|
2024-02-18 20:03:55 +00:00
|
|
|
unidecode(structure.pop(0).text_en)
|
2024-02-18 16:11:31 +00:00
|
|
|
)
|
|
|
|
|
2024-02-18 20:03:55 +00:00
|
|
|
if len(symbols) > 0:
|
|
|
|
_printed_line += symbols[0]
|
|
|
|
outfile.write(symbols.pop(0))
|
|
|
|
|
|
|
|
if len(symbols) <= 0:
|
|
|
|
break
|
2024-02-18 16:11:31 +00:00
|
|
|
|
|
|
|
outfile.write('\n')
|
|
|
|
|
|
|
|
print(">", _printed_line)
|
|
|
|
print("<", line, end='')
|
|
|
|
|
|
|
|
|
|
|
|
# Used up all of the structures, this chapter has ended.
|
|
|
|
# Got to the next one
|
|
|
|
if len(structure) <= 0:
|
|
|
|
break
|
2024-02-16 12:48:18 +00:00
|
|
|
|
|
|
|
else:
|
|
|
|
outfile.write(line)
|
|
|
|
|