디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[일반] ONE. 한패 관련 진행상황

ㅇㅇ(121.128) 2024.04.27 06:01:02
조회 219 추천 13 댓글 5
														

한패 원제작자분.. 르낭님으로부터 연락이 드디어 닿았다!


보내주신 파일을 하나하나 뜯어보는데 경외감만이 들었다. 이걸 하셨다고?ㄷㄷ



무튼 내가 하고자 하는 것은 기존 한패 스크립트를 리메이크 스크립트로 이식하는 것.





omsg방식으로 뽑아낸 리메이크판 스크립트.


24b0d121e09c28a8699fe8b115ef046f5c4d989faf





그리고 이건 오리지널 한패 완역 스크립트.


24b0d121e09c28a8699fe8b115ef046ecb40c2f325






구조가 다르다. 물론 리메이크판 스크립트를 이런 구조로 뽑을 수 있지만, 막상 해보니 선택지 및 live2d관련 스크립트에 문제가 발생하게 되더라.


무튼.. 이걸 하나하나 긁어서 붙이는건 말도 안되는 행위라 판단..




1. 오리지널 한패 스크립트의 전처리.



import os
import sys

def preprocess_file_b(file_b_name):
# 파일 체크
if not os.path.isfile(file_b_name):
print(f"에러: {file_b_name} 를 찾을 수 없습니다.")
return

# 인코딩 확인
with open(file_b_name, 'r', encoding='utf-8') as file_b:
file_b_contents = file_b.readlines()

# 수정된 라인용 어레이
modified_lines = []

i = 0
while i < len(file_b_contents):
line_with_prefix = file_b_contents[i].lstrip('/').split('>>')[-1].strip()

if i + 1 < len(file_b_contents):
translated_line = file_b_contents[i + 1].lstrip('/').split('>>')[-1].strip()
else:
translated_line = ""


if '「' in line_with_prefix:
line_before_quote, line_after_quote = line_with_prefix.split('「', 1)
translated_before_quote, translated_after_quote = translated_line.split('「', 1)
if line_before_quote.strip(): # 괄호 앞 부분이 비었는지 체크 (인물 이름 없는 대사)
modified_lines.append('//' +line_before_quote)
modified_lines.append( translated_before_quote)
modified_lines.append('//「' +line_after_quote)
modified_lines.append('「' + translated_after_quote)
i += 2 # 원문, 번역문 두 줄 다 처리했으므로 한 줄 패스
elif '浩平(' in line_with_prefix:
line_before_quote, line_after_quote = line_with_prefix.split('(', 1)
translated_before_quote, translated_after_quote = translated_line.split('(', 1)
modified_lines.append('//' +line_before_quote)
modified_lines.append( translated_before_quote)
modified_lines.append('//(' +line_after_quote)
modified_lines.append('(' + translated_after_quote)
i += 2 # 원문, 번역문 두 줄 다 처리했으므로 한 줄 패스
else:
modified_lines.append('//' +line_with_prefix)
modified_lines.append(translated_line)
i += 2 # 원문, 번역문 두 줄 다 처리했으므로 한 줄 패스




# _processedB 붙여 저장
base_name, _ = os.path.splitext(file_b_name)
processed_file_b_name = f"{base_name}_processedB.txt"
with open(processed_file_b_name, 'w', encoding='utf-8') as processed_file_b:
processed_file_b.writelines(line + '\n' for line in modified_lines)

return processed_file_b_name

if __name__ == '__main__':
if len(sys.argv) != 2:
print("one 오리지널 번역문 스크립트 전처리기. 사용법: python one_process01.py originalscript.dg")
sys.exit(1)

file_b_name = sys.argv[1]
preprocess_file_b(file_b_name)




24b0d121e09c28a8699fe8b115ef046f5c4c9c96a0


00000>>를 지워줬고,


// 00011>> 浩平「…6時…半か?」

00011>> 코헤이「…6시…반이라고?」


이렇게 한 줄로 된 대사를



//浩平

코헤이

//「…6時…半か?」

「…6시…반이라고?」



이렇게 바꿔줬다. 이래야 이후 작업이 가능해진다.




2. 스크립트 이식



1. 한패 스크립트는 원문도 반각문자로 되어 있는 반면 리메이크 원본 스크립트는 당연히 전각문자를 쓴다. 이 부분 대응 필요.


2. 인물/대사 분리


// 00680>> 浩平「…オレも帰るか」

00680>> 코헤이「…나도 가야지」


이런 일반적인 대사 말고도


// 00693>> 浩平(運動部の連中もさすがに休みか…)

00693>> 코헤이(운동부도 오늘은 쉬는 건가…)



이렇게 괄호 처리된 독백도 있다. 따라서 모든 「 뿐만 아니라 주인공 이름 뒤에 붙는( 이런 괄호도 처리해줘야 한다.


3. 인물 없는 대사 처리


인물 이름 없이 대사만 있는 라인도 있다.


// 00698>> 「…くしゅん」

00698>> 「…엣취」


4. 오리지널 한패 스크립트는 UTF-8, 리메이크 스크립트는 UTF-8-BOM이다. 인코딩 맞춰 불러오고, 맞춰서 저장되어야 함.


5. 리메이크 스크립트는 \@ 이런게 뒤에 붙어있는 경우가 있음.



import os
import sys
import codecs
import threading
import re

class TimeoutException(Exception):
pass

def normalize_line(line):
# 특수문자 처리
line = line.replace('、', ', ').replace('。', '.').replace('?', '?').replace('!', '!').replace('「', '').replace('」', '').replace('『', '').replace('』', '').replace('(', '').replace(')', '').replace(' ', '').replace(',', ', ').replace('.', '. ')
return re.sub(r'\s+', ' ', line.strip())

def transfer_lines(file_a_name, file_b_name, timeout=60):
# 파일 체크. file_a는 리메이크 스크립트, file_b는 전처리된 오리지널 한패 스크립트
if not os.path.isfile(file_a_name):
print(f"에러: {file_a_name} 를 찾을 수 없습니다.")
return
if not os.path.isfile(file_b_name):
print(f"에러: {file_b_name} 를 찾을 수 없습니다.")
return

# 타임아웃
timer = threading.Timer(timeout, raise_timeout)

try:
timer.start()

# 인코딩 적용하여 파일 열기
with codecs.open(file_a_name, 'r', encoding='utf-8-sig') as file_a, codecs.open(file_b_name, 'r', encoding='utf-8') as file_b:
file_a_contents = file_a.readlines()
file_b_contents = file_b.readlines()

# 라인 리스트 생성
modified_lines = []

# 원문-번역문 매핑 리스트 생성
translation_mapping = {}

# 전처리된 오리지널 한패 스크립트 반복처리
i = 0
while i < len(file_b_contents):
if file_b_contents[i].startswith('//'):
original_line = normalize_line(file_b_contents[i][2:].strip())
if i + 1 < len(file_b_contents):
translated_line = file_b_contents[i + 1].strip().replace(' ', '')
translation_mapping[original_line] = translated_line
i += 2
else:
i += 1
else:
i += 1

# 리메이크 스크립트 반복처리
for line_a in file_a_contents:
# 공백제거
leading_whitespace = re.match(r'^(\s*)', line_a).group(1)
# \@로 끝나는 라인 체크
ends_with_at = line_a.strip().endswith('\\@')
# 해당 라인 정규화
line_a_normalized = normalize_line(line_a.strip().rstrip('\\@'))
# 매핑 리스트에 정규화된 라인 있는지 확인
if line_a_normalized in translation_mapping:
translated_line = translation_mapping[line_a_normalized]
# 공백, \@ 및 번역문 적용
if ends_with_at:
modified_lines.append(leading_whitespace + translated_line + '\\@\n')
else:
modified_lines.append(leading_whitespace + translated_line + '\n')
else:
# 번역 매핑 못찾을 경우 원문 그대로 두기
modified_lines.append(line_a)

except TimeoutException:
print("타임아웃. 파일에 문제가 있을 수 있습니다. 전처리가 제대로 되었는지 확인이 필요합니다.")
except Exception as e:
print(f"에러: {e}")
finally:
timer.cancel()

base_name = os.path.splitext(file_a_name)[0]
processed_file_name = f"{base_name}_processed.txt"

with codecs.open(processed_file_name, 'w', encoding='utf-8-sig') as processed_file:
processed_file.writelines(modified_lines)

print(f"오리지널 한패 스크립트 {file_b_name} 내용을 반영, {processed_file_name} 로 저장하였습니다.")

def raise_timeout():
raise TimeoutException("타임아웃.")

if __name__ == '__main__':
if len(sys.argv) != 3:
print("one 오리지널 번역문 스크립트 to one 리메이크 스크립트 변환기. 오리지널 번역문 전처리가 필요합니다.")
print("사용법: python one_process02.py remake_script.txt originalscript_processedB.txt")
sys.exit(1)

file_a_name = sys.argv[1]
file_b_name = sys.argv[2]
transfer_lines(file_a_name, file_b_name)




24b0d121e09c28a8699fe8b115ef046f5c4c9998ac

신난다!


오리지널 스크립트 구조상 선택지까지 번역하기는 어려우므로 저정도는 직접 만지는걸로.


오리지널에서 男子学生였던 이름이 리메이크에서 男子学生A가 되는 등 소소한 차이점이 있어 검수하며 잡아가야 할 것 같다.


이로써 파일로만 118개, 만줄에 육박하는 스크립트 복붙 노가다를 하지 않아도 된다!



아 물론 이렇다고 한패가 막 금방 나오는건 아닙니다. 앞으로 무슨 문제가 생길지 모름

도와주시는 모든 분들께 무한 감사드립니다.


그럼 자러

추천 비추천

13

고정닉 5

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2861 설문 어떤 상황이 닥쳐도 지갑 절대 안 열 것 같은 스타는? 운영자 24/05/20 - -
48 공지 Key 작품별 공식/창작 번역 모음 넬케갤로그로 이동합니다. 23.08.16 1070 2
2896 공지 KEY社 게임 한글패치/번역본 정리글(24.03.24 갱신) [1] 마사마못갤로그로 이동합니다. 24.03.24 276 2
1458 공지 짤 저장소 Key갤러리갤로그로 이동합니다. 23.11.30 161 0
611 공지 KEY 게임 한글패치/번역본 정리글 [5] ㅇㅇ갤로그로 이동합니다. 23.10.01 1261 5
610 공지 KEY게임 DL및 구매 사이트 [1] ㅇㅇ갤로그로 이동합니다. 23.10.01 525 2
56 공지 Key 디시콘 모음 [3] Key갤러리갤로그로 이동합니다. 23.08.16 386 1
61 공지 말머리 설명 Key갤러리갤로그로 이동합니다. 23.08.16 150 0
59 공지 스포탭에는 제목에 작품명을 명시해 주세요 Key갤러리갤로그로 이동합니다. 23.08.16 89 0
3405 갑자기 이상한게 유행하고있다 [3] Latimeria갤로그로 이동합니다. 09:24 62 1
3404 일반 5월 23일 목요일의 끝을 알리는 초록색양서류갤로그로 이동합니다. 05.23 46 3
3403 일반 시로하 성우는 지금보니까 [2] ㅇㅇ(119.207) 05.23 104 0
3402 일반 쿠드로 딸치니까 죄책감이 [8] ㅇㅇ(165.132) 05.23 124 3
3401 일반 5월 22일 수요일의 끝을 알리는 초록색양서류갤로그로 이동합니다. 05.22 76 5
3398 일반 프리마돌 재밋네.. [4] ㅇㅇ(61.255) 05.22 95 0
3397 소식/ 5/22) 스태프 비정기 일지 -Na-Ga- [6] 별난갤로그로 이동합니다. 05.22 116 1
3396 일반 스팀 섬포 RB 올해 나온댔나 [1] ㅇㅇ(211.234) 05.22 85 0
3395 일반 에어 동인지 찾는거 도와줘... [2] ㅇㅇ(218.39) 05.22 133 0
3394 후기/ 약스포?) 토리시로섬 후기 [4] Gao(211.209) 05.22 125 8
3393 일반 동네 오락실에서 노우미 여사 만남 [1] 하나요양병원갤로그로 이동합니다. 05.21 111 3
3392 일반 5월 21일 화요일의 끝을 알리는 초록색양서류갤로그로 이동합니다. 05.21 44 5
3391 ❗스포 엔비) 설마 유리 루트 이게 끝이야? [16] Hatsune갤로그로 이동합니다. 05.21 98 0
3389 ❗스포 리라이트) MOON루트 갑자기 뽕 차오르네ㅋㅋ [7] 별난갤로그로 이동합니다. 05.21 71 0
3387 일반 솔직히 프리마돌도 세컨드비트 될까 겁났는데 [1] ㅅㅎ갤로그로 이동합니다. 05.21 76 0
3386 일반 서울에 키 굿즈 구할곳있나 [4] 합성착상료갤로그로 이동합니다. 05.21 84 0
3385 일반 프돌생방 나카시마 유키 왤케이쁨 [1] Latimeria갤로그로 이동합니다. 05.21 42 0
3384 일반 섬포 애니 마에다 각본파트 있으면 그것도 웃기겠네 ㅇㅇ(118.235) 05.21 60 0
3383 일반 섬포애니 나올때 카모메성우 누가 되려나 [2] 인생갤로그로 이동합니다. 05.21 90 0
3382 일반 “이 사진들은 뭔가요 토모야 군...?” [3] ㅇㅇ갤로그로 이동합니다. 05.21 140 0
3380 일반 섬머포켓 애니 정보 뜨면 댓글로 깨워줘 [1] ㅇㅇ갤로그로 이동합니다. 05.21 103 0
3379 소식/ 금일 저녁 19시부터 프리마 돌 생방송 [4] 별난갤로그로 이동합니다. 05.21 76 0
3378 ❗스포 클라나드) 스포당했는데 이정도면 ㅁㅌㅊ임.. [10] ㅇㅇ(180.81) 05.21 105 0
3377 일반 섬포 애니 언제나오냐고!! [1] 지읒갤로그로 이동합니다. 05.21 72 0
3376 일반 25주년 방송 해주겠지? [1] ㅇㅇ(118.235) 05.21 51 0
3375 ❗스포 오늘은 우리의 주인공 타카하라 하이리의 생일입니다 [5] 인생갤로그로 이동합니다. 05.21 117 5
3374 일반 5월 20일 월요일의 끝을 알리는 초록색양서류갤로그로 이동합니다. 05.20 51 5
3373 일반 설립 25주년 슬슬 얼마 안남앗네 [9] ㅇㅇ갤로그로 이동합니다. 05.20 121 0
3372 ❗스포 리라이트) MOON루트 초반은 뭔가 난해하네 [2] 별난갤로그로 이동합니다. 05.20 69 0
3371 일반 에어 처음 했을 때의 그 기분을 다시 느끼고싶다 [1] ㅇㅇ갤로그로 이동합니다. 05.20 80 0
3370 일반 가족계획 팬디스크까지 하고 간단하게 후기 스포없음 [6] ㅇㅇ(220.86) 05.20 158 2
3369 일반 5월 19일 일요일의 끝을 알리는 초록색양서류갤로그로 이동합니다. 05.19 74 5
3368 일반 내일 오사카 간다 [3] horo갤로그로 이동합니다. 05.19 83 1
3367 일반 나오시마 콘펙트(막과자 가게) 아직 남아있어? [3] Gao(210.170) 05.19 97 0
3366 자료/ 카논 한패 질문 ㅇㅇ(175.223) 05.19 64 0
3365 일반 ㅅㅂ 할머니 같네 ㅇㅇ갤로그로 이동합니다. 05.19 147 2
3363 일반 씨발 스팀판 카논 나온다고?? 에어도 나올 수 있다고? [4] ㅇㅇ갤로그로 이동합니다. 05.19 146 0
3362 일반 열으라고 [2] 지읒갤로그로 이동합니다. 05.19 124 0
3361 일반 오리토 신지 개발일기 올라왓엇네 [1] ㅇㅇ갤로그로 이동합니다. 05.19 136 0
3360 일반 아키바 다녀옴 [2] Gao(106.185) 05.18 119 3
3359 ❗스포 리라이트) 아카네 루트 끝낸 후기 [12] 별난갤로그로 이동합니다. 05.18 100 1
3358 일반 ~~모데마코도 미우 토카 [2] horo갤로그로 이동합니다. 05.18 121 1
3357 일반 안녕하세요 [3] 코토부키츠무기갤로그로 이동합니다. 05.18 130 2
3356 ❗스포 섬포 다끝나고나서 한참지난 이제와서 느낀건데 [5] 이브이브이갤로그로 이동합니다. 05.17 178 1
3355 일반 콜라보카페 시로하와 시키 생일기념 메뉴들 [1] 인생갤로그로 이동합니다. 05.17 113 2
3354 소식/ 프리마 돌 -무명전례- 초반 플레이 영상 [2] 별난갤로그로 이동합니다. 05.17 107 1
3353 소식/ 스팀판 「Kanon」 스토어 페이지 공개 [21] 별난갤로그로 이동합니다. 05.17 392 10
3352 후기/ 잘있어 토리시로섬 [6] Gao(163.49) 05.17 208 6
3351 ❗스포 리토바스 사야말고 다 꺳는데 [5] ㅇㅇ(76.36) 05.17 112 0
3350 일반 진짜 친구나 주변 지인 클라나드 눈크다고 안보는거 넘 짜증나 [8] ㅇㅇ(1.228) 05.17 240 6
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2