kone
sub_icon

소미소프트

파일 구글 번역기) kr_tr_7.pyw

2026-04-22 20:36:11
유틸
조회 12175 · 좋아요 9
양식
<div>
    <table><tbody><tr><th colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></th></tr><tr><td colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td></tr><tr><td><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td><td><p style="margin: 0.5rem 0px;">=</p></td></tr><tr><td><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td><td><p style="margin: 0.5rem 0px;">=</p></td></tr><tr><td><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td><td><p style="margin: 0.5rem 0px;">=</p></td></tr><tr><th colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></th></tr><tr><td colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td></tr><tr><th colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></th></tr><tr><td colspan="2"><p style="margin: 0.5rem 0px; display: flex; justify-content: center; align-items: center;">=</p></td></tr></tbody></table>
</div>

kr_tr_7.pyw

링크

aHR0cHM6Ly90cmFuc2Zlci5pdC90L2REQmhxZjVYa1JBSg==

단일로도 어느정도 쓸 수 있을텐데,
게임 번역하려면 추출한 다음 사용하는게 안정적이고 빠름

파이썬 설치되어 있어야 함
그록이 자꾸 바쁘다고 팅겨서 제미니에게 부탁함

AI 번역 돌릴줄 모르거나
컴 사양이 안되는 경우 쓸만할듯

코드
import os
import re
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext, ttk
import threading
import urllib.parse
import requests
import time

def google_translate(text, src='ja', dest='ko'):
    if not text.strip(): return text
    if not re.search(r'[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]', text):
        return text

    try:
        url = f"https://translate.googleapis.com/translate_a/single?client=gtx&sl={src}&tl={dest}&dt=t&q={urllib.parse.quote(text)}"
        headers = {'User-Agent': 'Mozilla/5.0'}
        res = requests.get(url, headers=headers, timeout=5)
        res.raise_for_status()
        
        parts = res.json()[0]
        result = "".join([p[0] for p in parts if p and p[0]]).strip()
        
        # 마침표 보정 로직
        if not text.strip().endswith('.') and result.endswith('.'):
            result = result[:-1].strip()
            
        return result if result else text
    except Exception:
        return text

class AdvancedTranslator:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("하위 폴더 통합 번역기 v8.0 (큰따옴표 지원)")
        self.root.geometry("800x650")

        config_frame = tk.Frame(self.root)
        config_frame.pack(fill="x", padx=10, pady=5)

        # 구분자를 세미콜론(;)으로 사용하고 기본값에 큰따옴표(") 추가
        tk.Label(config_frame, text="번역 제외 문자 (';'로 구분):").grid(row=0, column=0, sticky="w")
        self.exclude_entry = tk.Entry(config_frame, width=50)
        self.exclude_entry.insert(0, '「; 」; <; >; "; ---; \\n; \\i; ,; [; ]; (; ); :; …; !; \\; :; (; ); ,') 
        self.exclude_entry.grid(row=0, column=1, padx=5, sticky="w")

        self.btn = tk.Button(self.root, text="폴더 선택 (하위 폴더 포함 번역 시작)", command=self.start_thread, 
                             height=2, bg="#4CAF50", fg="white", font=("맑은 고딕", 10, "bold"))
        self.btn.pack(fill="x", padx=10, pady=5)

        self.notebook = ttk.Notebook(self.root)
        self.notebook.pack(fill="both", expand=True, padx=10, pady=10)

        self.log_area = scrolledtext.ScrolledText(self.notebook, bg="#1e1e1e", fg="#ffffff", font=("맑은 고딕", 12))
        self.monitor_area = scrolledtext.ScrolledText(self.notebook, bg="#2d2d2d", fg="#a6e22e", font=("맑은 고딕", 12))
        
        self.notebook.add(self.log_area, text=" 전체 진행 로그 ")
        self.notebook.add(self.monitor_area, text=" 실시간 번역 비교 ")

        self.jp_pattern = re.compile(r'[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]')

    def start_thread(self):
        path = filedialog.askdirectory()
        if not path: return
        self.btn.config(state='disabled')
        threading.Thread(target=self.process, args=(path,), daemon=True).start()

    def split_and_translate(self, text, exclude_chars):
        if not exclude_chars:
            return google_translate(text)

        # 특수 문자 및 큰따옴표를 안전하게 정규식 패턴으로 변환
        pattern = '|'.join(re.escape(char) for char in exclude_chars)
        tokens = re.split(f'({pattern})', text)
        
        translated_tokens = []
        for token in tokens:
            if not token: continue # 빈 문자열 건너뜀
            
            if token in exclude_chars:
                translated_tokens.append(token)
            elif self.jp_pattern.search(token):
                # 실제 번역 수행 (일본어 -> 한국어)
                translated_tokens.append(google_translate(token, src='ja', dest='ko'))
                time.sleep(0.15) 
            else:
                translated_tokens.append(token)
        
        return "".join(translated_tokens)

    def process(self, root_path):
        raw_excludes = self.exclude_entry.get().split(";")
        exclude_chars = [x.strip() for x in raw_excludes if x.strip()]
        
        all_files = []
        for root, dirs, files in os.walk(root_path):
            for file in files:
                if file.lower().endswith(('.txt', '.json', '.ini', '.csv')):
                    all_files.append(os.path.join(root, file))

        parent_dir = os.path.dirname(root_path)
        folder_name = os.path.basename(root_path)
        out_root_dir = os.path.join(parent_dir, f"{folder_name}_Translated")
        
        self.log_insert(f"🚀 총 {len(all_files)}개의 파일을 찾았습니다.\n")
        self.log_insert(f"🏠 저장 위치: {out_root_dir}\n{'-'*50}\n")

        for i, file_path in enumerate(all_files):
            rel_path = os.path.relpath(file_path, root_path)
            save_path = os.path.join(out_root_dir, rel_path)
            os.makedirs(os.path.dirname(save_path), exist_ok=True)
            
            self.log_insert(f"📄 [{i+1}/{len(all_files)}] {rel_path} 번역 중...\n")
            
            content_lines = []
            for enc in ['shift_jis', 'utf-8-sig', 'cp932', 'utf-8', 'euc-kr']:
                try:
                    with open(file_path, 'r', encoding=enc) as f:
                        content_lines = f.readlines()
                    break
                except: continue

            translated_lines = []
            for line in content_lines:
                if self.jp_pattern.search(line):
                    origin = line.rstrip('\n\r')
                    translated = self.split_and_translate(origin, exclude_chars)
                    self.monitor_insert(f"파일: {rel_path}\n원문: {origin}\n번역: {translated}\n{'-'*20}\n")
                    translated_lines.append(translated + '\n')
                else:
                    translated_lines.append(line)

            with open(save_path, 'w', encoding='utf-8-sig') as f:
                f.writelines(translated_lines)

        self.btn.config(state='normal')
        messagebox.showinfo("완료", "큰따옴표를 포함한 모든 파일 번역이 완료되었습니다.")

    def log_insert(self, msg):
        self.log_area.insert(tk.END, msg)
        self.log_area.see(tk.END)

    def monitor_insert(self, msg):
        self.monitor_area.insert(tk.END, msg)
        self.monitor_area.see(tk.END)

if __name__ == "__main__":
    app = AdvancedTranslator()
    app.root.mainloop()
9
댓글 8개
댓글 쓰기
04.22
번역 라이브러리는 googletrans==3.1.0a0 이거 인가…?
04.23
제미니에게 뭐라고 했더니 라이브러리 안 쓰는거 같음
ja 대신 en 하면 영어도 될라나
04.23
그건 대부분 영어로 이루어져있기 때문에 제외 단어 엄청 등록하는거 아니면 불가능할걸 게임 터짐
04.23
추출 상태로 돌리면 가능은 할거임 통으로 돌리면 터진다는 뜻
0 / 500
ai, 농농절 특선) 레니에게 야한 속옷을 입히고 섹스 했다
야짤
kjh9304
05.05 17893 119
iwao)セセリア
동인
qew123
05.05 10184 35
파이즈리 위원장 머시기 1달
영상
EPanDS
05.05 28927 195
(임보출)아이 만들기 온천 발매일 결정(최최최종)
정보
카라코람
05.05 7831 23
[구매보급] 【한국어 자막판】무자각 마조가 서큐버스에게 납치당해 침으로 농락당하는 자위 서포트
소리
rocoa
05.05 11607 84
AI) 어린이날 기념 프린세스 메이커2
야짤
miso5
05.05 13290 56
[AI] 제자랑 섹스하던 걸 들켜서 금태양한테 질싸 임신 당하는 수영부 선생님
창작
스이세이
05.05 12947 52
[알림] 모두의 유방육성 아카데미 3차수정 재업
번역
argoklarke
05.04 31577 147
[미번] 리호 NTR ~남편의 명령으로 직장 동료에게 범해지다~
동인
미식이네
05.04 7579 15
아리아드네 MZ 이식 92일 차 (스탠딩 그림 개선 및 추가)
창작
Code_Max
05.04 8276 48
[구매보급][요청복구]【한국어 자막판】사정 참기 게임과 문질문질 금지 게임 계속 귀를 괴롭힘당하는 게임형 자위 서포트
소리
vhskorea
05.04 23017 114
[어린이날 기념 복구][요청 복구]【한국어 자막판】나를 익애하는 갸루 마마가 [순애] 네토라세 플레이에 어울려주는 음성♡
소리
protoy
05.04 15920 85
[번역] [Space Crayon (Hisany) 청아포함/NTR/아저씨/추남] 샬레네토리최면 (블루아카이브)
동인
kukbap
05.04 22108 86
[미번보급] 聖女リナリアの落葉~寝取淫紋解呪譚~
미번
karoru
05.04 11678 50
90일) 1. RJ193419 SEQUEL blight 손번개조. 개선 26.05.05.7z
복구
ㅇㅇ
05.04 20875 95
MZ 암호화 engine.bin 추가 분석 내용
정보
moomin
05.04 4107 30
(이미지 번역) [RJ01369348] 특공위원회 오우카 RPG-ZERO 이미지 번역
번역
joyed47106
05.04 35918 212
[구매보급] [자막] 【짐승 소리 조교】 로○ 마법 소녀의 7일간의 조교 일기
소리
puella
05.04 13910 91
[구매보급]멋을 막 배운 메스가키가 목구멍 깊은 곳에서 짜낸 끊임없는 오호소리~
소리
이름뭐하지
05.04 9188 46
(한글자막) 모녀덮밥 밀크 카페에 오신 것을 환영합니다
영상
꽃사슴
05.04 22931 153
90일) RJ424502 건방진 JK를 치트노트로 참교육.7z
복구
ㅇㅇ
05.04 29184 99
직번/후타) [Messy] 후타나리 누나 정액 목욕 출산 섹스
동인
스타더스트
05.04 23032 72
[AI 번역, 일부 검수, TS물, 여체화] 백룡의 무녀와 신이 깃든 재앙의 섬 RJ01586474
번역
ask
05.04 49914 216
갈색 폭유 비서의 극음란 자지 아양 성처리~엘리트 사장 비서의 숨겨진 얼굴~
소리
테탑시
05.04 10850 75
농농절 2일차 기념 마조 오나사포복구
소리
summer4552
05.04 17702 55
육변기 오나홀 조교일지~진지한 척 하면서 자위 방송하는 에로 교사 & 철벽 마조 JK~【KU100】
소리
테탑시
05.04 8994 56
스압주의) [toraisi666] 홀록사미도리 마법소녀 최면 시리즈 일러스트 모음
동인
ㅁㄴㅇㄹ
05.04 19052 65
육덕 사촌누나와 임신놀이~임신하고 싶어하는 늦둥이 시골 암캐×2의 정액 아양 배덕 생역레이프~【KU100】
소리
테탑시
05.04 9665 74
【하메촬영 영상 추가 찬스?!】자지 담당으로 임명합니다! 【5시간 반】【입학 축하 세트】
소리
테탑시
05.04 11769 101
[보이스 코믹]0505 선물
소리
ghkdw
05.04 14651 82