Skip to content

如何在 pyVideoTrans 中新增目标语言代码

在 v4.11 版本之后,优化了新增语言办法,以下针对 v4.11及以上 版本

pyVideoTrans 默认已内置支持 30 多种常用目标语言。如果你需要翻译或配音到其他小众语种,可以按照以下步骤手动添加。


⚠️ 新增前必读提示

在开始添加前,请先确认:你打算使用的翻译渠道和配音渠道,是否支持该语种?

  • 很多配音渠道(如F5-TTS)仅支持常见语种,不支持小语种;
  • 部分翻译渠道(如 DeepL)支持的语言种类也相对有限。
  • 部分语音识别渠道 (如Qwen-ASR)支持的语言也有限

注意:如果渠道本身不支持该语言,即便在软件中添加成功,实际运行时依然会报错。


第一步:查询并获取目标语言的渠道代码

不同的翻译和识别服务对同一门语言的“代号(代码)”要求各不相同。例如【简体中文】:

  • Google翻译渠道为 zh-CN
  • DeepL 翻译渠道为 ZH-HANS
  • Faster-whisper识别渠道为zh
  • 软字幕规范识别为 zho

请按需前往对应渠道查询你的目标语言代码:

  1. Google 翻译点击查询支持的语言代码 (例如中文是 zh-CN

  2. 腾讯翻译点击查询支持的语言代码 (例如中文是 zh

  3. 百度翻译点击查询支持的语言代码 (例如中文是 zh

  4. DeepL / DeepLX点击查询支持的语言代码 (例如中文是 ZH-HANS

  5. 微软翻译 (Microsoft)打开网页 (例如中文是 zh-Hans,一般与 Google 一致,也可按 F12 调试查看)

  6. 阿里机器翻译点击查询支持的语言代码 (例如中文是 zh

  7. 阿里百炼API点击查询支持的语言代码 (例如中文是 Chinese

  8. M2M100点击查询支持的语言代码 (例如中文是 zh,提取下划线 __xx__ 中的 2~3 位字母)

  9. AI 翻译渠道(ChatGPT / Claude 等):直接填写该语言的英文全称(例如中文填写 Simplified Chinese)。

  10. LibreTranslate 渠道点击查询支持的语言代码 (括号内的 2~3 位代码)

  11. 字幕嵌入代码(必填项):当生成内嵌软字幕时,必须使用 ISO 3 位字母代码。在下方列表中找到对应语言 Set2 列的 3 位字母(若区分 T/B,请使用 T 列,例如中文填写 zho):


第二步:组装代码片段

按照以下格式模板,把你查到的真实代码替换进去:

💡 小贴士

  1. 如果某些翻译渠道你不使用,可以直接填 No(区分大小写);
  2. 第 2 行的 字幕嵌入代码必须真实填写,否则将无法正常嵌入软字幕。
json
"google翻译对应的语言代码小写形式": [
    "Google翻译对应的语言代码", 
    "字幕嵌入对应的3位语言代码", 
    "百度翻译对应的语言代码", 
    "DeepL对应的语言代码",  
    "腾讯翻译对应的语言代码",  
    "Libre渠道对应的语言代码", 
    "微软翻译对应的语言代码", 
    "AI对应填写语言的英文名称", 
    "阿里机器翻译对应的语言代码", 
    "阿里百炼API对应的语言代码", 
    "M2M100对应的语言代码"  
]

【参考范例】 简体中文组装后的完整格式如下:

json
"zh-cn": [
    "zh-cn",  
    "zho",  
    "zh",  
    "ZH-HANS", 
    "zh",
    "zh", 
    "zh-Hans",
    "Simplified Chinese",
    "zh", 
    "Chinese",  
    "zh"
]

第三步:写入配置文件 languages.json

  1. 打开软件根目录下videotrans文件夹内的 languages.json 文件(推荐使用记事本或 VSCode 打开)。
  2. 将你刚才组装好的代码,粘贴到大括号 { } 内部。
  3. 关键细节:每组语言之间必须用英文半角逗号 , 隔开,最后一组后面不要加逗号。

【粘贴位置示例】:

json
{
    "ar-st": [
        "es",
        "spa",
        "spa",
        "ES-419",
        "es",
        "es",
        "es",
        "Spanish",
        "es",
        "Spanish",
        "es"
    ],
    "zh-cn": [
        "zh-cn",  
        "zho",  
        "zh",  
        "ZH-HANS", 
        "zh",
        "zh", 
        "zh-Hans",
        "Simplified Chinese",
        "zh", 
        "Chinese",  
        "zh"
    ]
}
  1. 保存文件并重启软件,在目标语言下拉列表中就能看到新增的语言代码了。

第四步(可选):自定义界面的显示名称

添加完成后,软件下拉框默认显示的是语言代码(如 zh-cn)。如果你希望显示为更友好的中文名称(如“简体中文”),请按以下步骤设置:

  1. 打开文件:软件目录/videotrans/language/zh.json
  2. 翻到文件最底部,在最后一个 } 之前查看前一行末尾是否有英文逗号 ,
  3. 如果没有,先在前一行末尾补上英文逗号 ,,然后换行添加下列2行:
    json
    "google对应的语言代码小写形式": "你想在软件中显示的中文名称",
    "你想在软件中显示的中文名称":"google对应的语言代码小写形式",
    例如:"zh-cn": "简体中文"
  4. 保存文件并重启软件生效。

如果你的软件是英文界面,需要修改 软件目录/videotrans/language/en.json,方法一样


❓ 常见报错排查

如果修改后软件启动报错或未报错但添加的语言未生效,99% 是由于 JSON 格式错误造成的,这几个文件都是json文件,需要严格合法的语法,请重点检查:

  1. 中英文符号:所有标点符号(",:{}[])必须为英文半角符号,切勿输入中文逗号或中文引号。
  2. 多余或遗漏逗号:检查两段语言代码之间是否遗漏了逗号 ,,或者在最后一项后面多写了逗号。

其他一些语言获取的底层逻辑

语音识别、字幕翻译、配音每个工作流程都有多个渠道可供选择,每个渠道对应着各自的本地模型或在线API,可惜每个渠道对同一种语言要求使用的语言代码各不相同,例如中文,就有zh/zh-cn/zho/zh-HANS/Simplified Chinese等几个不同写法。

在代码中,依次从以下规则中取得所需语言代码

根据界面中所选的语言名称,例如简体中文/Simplified Chinese


# 根据显示的语言和翻译通道,获取该翻译通道要求的源语言代码和目标语言代码
# translate_type 翻译通道索引
# show_source 显示的原语言名称或 - 或  语言代码
# show_target 显示的目标语言名称 或 - 或语言代码
# 如果是AI渠道则返回语言的自然语言名称
# - No 是兼容早期不规范写法
def get_source_target_code(*, show_source=None, show_target=None, translate_type=None) -> Tuple[str, str]:
    source_list = None
    target_list = None
    if show_source in ['-', 'No']:
        show_source = None
    if show_target in ['-', 'No']:
        show_target = None
    # 先从 LANG_CODE 中获取手动指定的
    if show_source:
        if show_source in LANG_CODE:  # 是语言代码,可能是 cli.py 传入
            source_list = LANG_CODE[show_source]
        elif LANGNAME_DICT_REV.get(show_source):  # 是语言显示名字
            source_list = LANG_CODE.get(LANGNAME_DICT_REV.get(show_source))
        elif show_source == 'zh':  # 特殊兼容zh
            source_list = LANG_CODE['zh-cn']

    if show_target:
        if show_target in LANG_CODE:  # 是语言代码 cli.py
            target_list = LANG_CODE[show_target]
        elif LANGNAME_DICT_REV.get(show_target):  # 语言名字
            target_list = LANG_CODE.get(LANGNAME_DICT_REV.get(show_target))
        elif show_target == 'zh':
            # 特殊兼容zh
            target_list = LANG_CODE['zh-cn']

    # qwenmt 翻译渠道语言代码
    if translate_type == QWENMT_INDEX and params.get('qwenmt_model', 'qwen-mt-turbo').startswith('qwen-mt'):
        return source_list[0] if source_list else (tr(show_source) if show_source else None), target_list[
            0] if target_list else (show_target if show_target else None)

    # AI渠道 包括 qwen-mt中使用的 其他qwen大模型,返回语言的英文名称
    if translate_type in AI_TRANS_CHANNELS or translate_type == QWENMT_INDEX:
        # 如果不在 LANG_CODE 中,则到 EDGE 完整语言列表中寻找到语言代码,再根据代码获取语言的英文名称
        s_text = source_list[7] if source_list else None
        t_text = target_list[7] if target_list else None
        has_source = show_source and not s_text
        has_target = show_target and not t_text
        if has_source or has_target:
            # 反转获取到  {语言代码:语言的英文名称}
            _code_name = {code: name for name, code in EDGET_LANGUAGES_NAME2CODE_EN.items()}
            if has_source and show_source in EDGET_LANGUAGES_NAME2CODE:
                s_text = _code_name.get(EDGET_LANGUAGES_NAME2CODE[show_source])
            elif has_source:
                # 从翻译字典中取出语言代码
                s_text = _code_name.get(show_source) or _code_name.get(tr(show_source))

            if has_target and show_target in EDGET_LANGUAGES_NAME2CODE:
                t_text = _code_name.get(EDGET_LANGUAGES_NAME2CODE[show_target])
            elif has_target:
                # 从翻译字典中取出语言代码
                t_text = _code_name.get(show_target) or _code_name.get(tr(show_target))
        # 仍然无法找到时,保底直接返回显示名称
        return s_text or show_source, t_text or show_target

    # 非AI渠道,需返回语言的代码形式

    if show_source and not source_list:
        show_source = _get_language_code(show_source)

    if show_target and not target_list:
        show_target = _get_language_code(show_target)

    # 未设置渠道则使用 Google
    if not translate_type or translate_type in [GOOGLE_INDEX, TRANSAPI_INDEX, CAMB_INDEX]:
        return source_list[0] if source_list else show_source, target_list[0] if target_list else show_target

    if translate_type == BAIDU_INDEX:
        return source_list[2] if source_list else show_source, target_list[2] if target_list else show_target

    if translate_type in [DEEPLX_INDEX, DEEPL_INDEX]:
        return source_list[3] if source_list else show_source, target_list[3] if target_list else show_target

    if translate_type == TENCENT_INDEX:
        return source_list[4] if source_list else show_source, target_list[4] if target_list else show_target

    if translate_type in [LIBRE_INDEX]:
        return source_list[5] if source_list else show_source, target_list[5] if target_list else show_target
    if translate_type == MICROSOFT_INDEX:
        return source_list[6] if source_list else show_source, target_list[6] if target_list else show_target
    if translate_type == ALI_INDEX:
        return source_list[8] if source_list else show_source, target_list[8] if target_list else show_target
    if translate_type == M2M100_INDEX:
        return source_list[10] if source_list else show_source, target_list[10] if target_list else show_target
    return show_source, show_target


# 根据显示的语言名称获取语言代码,仅获取未定义在 LANG_CODE 中的
# 分别从 EDGET_LANGUAGES_NAME2CODE、判断本身是否是语言代码、从  tr 获取
def _get_language_code(show: str = None):
    _show = EDGET_LANGUAGES_NAME2CODE.get(show) if show != tr('auto') and show.lower() != 'auto' else 'auto'
    if _show:
        return _show

    # 未从 EDGET_LANGUAGES_NAME2CODE 找到

    _show_list = re.split(r'[_-]', show)
    _len = len(_show_list)
    # 可能是用户自定义新增的语言 zh zh_cn pt-br  zh_HANS 等语言代码形式
    if re.fullmatch(r'[a-zA-Z]{2,3}', _show_list[0]) and (
            _len == 1 or (_len == 2 and re.fullmatch(r'[a-zA-Z]{2,5}', _show_list[1]))):
        return show

    # 否则,可能是 语言名称,则从翻译字典中获取
    return tr(show)