kone
sub_icon

소미소프트

파일 구글 번역기) kr_tr_7.pyw

2026-04-22 20:36:11
유틸
조회 12137 · 좋아요 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
자체한글 - 뒷계 까발린다! 러브호텔로 와라! ver.체험판
번역
kkkkkk0909
05.17 38738 123
[버전업 알림] RJ432297 크로네의 기분 v1.0.3
번역
qqoro
05.17 30414 79
비월선행록 간단한 팁
후기 및 공략
kimms1104
05.17 21275 15
(번역)(TS)나는 아이의 엄마가 되어버렸다.
동인
멕무
05.17 13621 56
ai) NTR 접대골프3
야짤
ai0098
05.17 14312 133
린네아 (원신)
영상
브레머튼
05.17 12063 70
AI, 셀레스포니아) 아마네와 야구권 게임(가위바위보 게임)
야짤
miso5
05.17 11204 130
[요청복구] RJ01107130 너에게 가르치는야한 일
복구
h-aszzcb
05.17 26212 74
[5/17] 버니스 & 이블린 2
영상
브레머튼
05.17 23186 141
나는 왜 ㅅㅂ 집는것마다 이러냐
야짤
5dk2io1
05.17 13062 53
[구매보급][한국어 자막판]당신을 엄청 좋아하는 초변태 폭유 상사와 후배가 아양 떨며 마구 구애하는 알콩달콩 임신 하렘
소리
이름뭐하지
05.17 15534 130
[구매보급/버전업] RJ01584572 여동생 H –짧은 하루– Ver1.0.2
번역
사과체스
05.17 38705 134
ntl 백합을 즐겨야 할 때는...
소리
gansik
05.17 12808 61
[번역] 재미삼아 폐허에 갔다가 귀신이 붙은 JK
동인
마법우엉
05.17 23819 89
[번역]사고 물건에서 며칠을 보내야 유령을 만날 수 있어!? 일주일 도전 방송
동인
마법우엉
05.17 22453 89
[번역]유령에게 만져지며 방송하는 스트리머
동인
마법우엉
05.17 18512 63
[요청 복구] Succubus Temptation 2.0.0
복구
okviewer
05.17 24668 72
[버전업] [구매보급] RJ01214867 둘만의 생활_ver1.671 (26.05.05)
미번
gkqisq
05.17 10697 52
AI번역, Takurowo) 건방진 갸루를 서큐버스화 시켜서 혼내줬던 건 05
동인
sexe1
05.17 20408 117
U2hhbXVNTUQ 작가 인생명작 가져옴,,!
영상
hannanas
05.17 26459 109
청아 / 블아) 히카리와 전철 안에서
영상
darkunicorn
05.17 35672 98
직번) ※취향주의 [John K. Pe-ta] 도쿄 굉장해
동인
qlalfsla
05.17 25177 41
[구매보급 겸 자막요청]네토라세 카운셀링~노노짱편~(5/25 업링크 갱신)
소리
albanom
05.17 17808 84
이미지로 작가 or 출처 찾는 사이트
정보
darkunicorn
05.17 7526 24
청아 / AI) 금단○리 납작가슴 소녀 100명이랑 학교에서 ㅅㅅ촬영 질내사정 ㅅㅅ (禁断〇リ つるぺた少女100人と学校でハメ撮り中出しSEX)
영상
darkunicorn
05.17 37034 130
[요청복구/테스트] RJ065120 호스피탤러티 ~어느 병원에서의 너무 에로한 입원 성활~ 영상판 포함
복구
ㅇㅇ
05.17 19174 56
[요청복구] 히프노시스 아카데미, 신참 기사 라티, Nano-control Plus
복구
mmmff
05.17 25027 49
Yoshio Ereki, AI번역) 네가 임신할 때까지 한계 돌파 섹스
동인
sexe1
05.17 33376 200
[ VAM ] awakening - Abracadabra [ Zhuang Fangyi ]
영상
s99a99
05.17 17831 70
[요청 복구] RJ292145 던전즈 레기온
복구
시라스 아즈사
05.17 22728 62