骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买霸主CDKEY 购买战帆CDKEY
查看: 322|回复: 0

[原创] 自制翻译工具

[复制链接]

2

主题

22

回帖

12

积分

随仆

Rank: 1

UID
3635071
第纳尔
2
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2024-3-16
鲜花(0) 鸡蛋(0)
发表于 6 天前 | 显示全部楼层 |阅读模式
为了方便汉化或者模组作者想要翻译成英文,我写了一个小程序来帮助大家由于本人才疏学浅,也不知道有没有大佬做过类似的,如有疏漏请大家指出
使用教程:
1. 将main.py放到原语言文件夹下(英文mod就是languages/en)
2.使用A提取文本然后在extract文件夹下逐一翻译
3.使用B合并
4.在combine文件夹下找到新的csv后放到cns里覆盖
下面是源码:
  1. import pandas as pd
  2. import os
  3. import re
  4. # 需要处理的原始 csv 名字(不带后缀)
  5. csv_list = [
  6.     'dialogs', 'factions', 'game_menus', 'game_strings', 'info_pages',
  7.     'item_kinds', 'item_modifiers', 'parties', 'party_templates', 'quests',
  8.     'quick_strings', 'skills', 'skins', 'troops', 'ui'
  9. ]

  10. def space_for_game(text: str) -> str:
  11.     text = text.replace(' ', '')
  12.     tokens = re.findall(r'[A-Za-z0-9{}_%$@]+|.', text)
  13.     return ' '.join(tokens)

  14. def process_csv(path: str):
  15.     """
  16.     从 ./path.csv 中提取文本,按行分割:
  17.     left|right  ->  id = left, text = right
  18.     并把 text 列保存到 extract/path.csv,供翻译使用。
  19.     """
  20.     csv_path = f'./{path}.csv'
  21.     rows = []

  22.     # 新建 extract 文件夹
  23.     os.makedirs('extract', exist_ok=True)

  24.     # 读取原始 csv,每行只按第一个 | 分割
  25.     with open(csv_path, 'r', encoding='utf-8', errors='ignore') as f:
  26.         for line in f:
  27.             line = line.rstrip('\n')
  28.             left, right = (line.split('|', 1) + [''])[:2]
  29.             rows.append([left, right])

  30.     df = pd.DataFrame(rows, columns=['id', 'text'])

  31.     # 如果你想去掉 text 中所有空格,可以打开下面这一行
  32.     # df['text'] = df['text'].str.replace(' ', '')

  33.     out_path = f'extract/{os.path.basename(path)}.csv'
  34.     df['text'].to_csv(out_path, index=False, header=False, encoding='utf-8')

  35.     print(f'[提取完成] {csv_path} -> {out_path}')


  36. def combine_csv():
  37.     # 新建 combine 文件夹
  38.     os.makedirs('combine', exist_ok=True)

  39.     for name in csv_list:
  40.         original_path = f'./{name}.csv'
  41.         extract_path = f'./extract/{name}.csv'
  42.         out_path = f'./combine/{name}.csv'

  43.         if not os.path.exists(original_path):
  44.             print(f'[跳过] 找不到原始文件:{original_path}')
  45.             continue

  46.         if not os.path.exists(extract_path):
  47.             print(f'[跳过] 找不到翻译文件:{extract_path}')
  48.             continue

  49.         # 1) 读取原始文件,拿到所有 id(左边部分)
  50.         ids = []
  51.         with open(original_path, 'r', encoding='utf-8', errors='ignore') as f:
  52.             for line in f:
  53.                 line = line.rstrip('\n')
  54.                 left, _ = (line.split('|', 1) + [''])[:2]
  55.                 ids.append(left)

  56.         # 2) 读取翻译后的 text(每行一条)
  57.         #    这里假设你只改了内容,没有增加/减少行
  58.         df_trans = pd.read_csv(extract_path, header=None, encoding='utf-8')
  59.         # 防止多列情况,这里取最后一列
  60.         translated_texts = df_trans.iloc[:, -1].astype(str).tolist()

  61.         # 3) 对齐长度(防止不小心少翻 / 多翻了几行)
  62.         n_ids = len(ids)
  63.         n_txt = len(translated_texts)
  64.         n = min(n_ids, n_txt)

  65.         if n_ids != n_txt:
  66.             print(
  67.                 f'[警告] {name}: 原始行数 = {n_ids}, 翻译行数 = {n_txt},'
  68.                 f'将只使用前 {n} 行进行合并'
  69.             )

  70.         # 4) 写出新的 csv:id|translated_text
  71.         with open(out_path, 'w', encoding='utf-8') as f_out:
  72.             for i in range(n):
  73.                 text_spaced = space_for_game(translated_texts[i])
  74.                 new_line = f"{ids[i]}|{text_spaced}"
  75.                 f_out.write(new_line + '\n')

  76.         print(f'[合并完成] {original_path} + {extract_path} -> {out_path}')


  77. def main():
  78.     while True:
  79.         print('请选择想要执行的操作:')
  80.         print('A:从原始 csv 提取 text 到 extract/')
  81.         print('B:用翻译后的 text 替换并生成 combine/ 下的新 csv')
  82.         print('Q:退出程序')
  83.         choice = input('输入 A 或 B 或 Q:').strip().upper()

  84.         if choice == 'A':
  85.             for csv_name in csv_list:
  86.                 process_csv(csv_name)
  87.         elif choice == 'B':
  88.             combine_csv()
  89.         elif choice == 'Q':
  90.             break
  91.         else:
  92.             print('输入错误,请重新运行并输入 A 或 B 或 Q')


  93. if __name__ == '__main__':
  94.     main()
复制代码

当然,我本来想做成一键式翻译的,但是由于没有翻译api就没做了
(还有就是,如果用起来不方便的话,我可以封装成exe)
ps:使用附件里的文件是请将后缀改为py使用

main.txt

3.94 KB, 下载次数: 1

您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2025-11-29 00:41 , Processed in 0.088887 second(s), 17 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表