如何在 pyVideoTrans 中新增目标语言代码
在 v4.11 版本之后,优化了新增语言办法,以下针对 v4.11及以上 版本
pyVideoTrans 默认已内置支持 30 多种常用目标语言。如果你需要翻译或配音到其他小众语种,可以按照以下步骤手动添加。
⚠️ 新增前必读提示
在开始添加前,请先确认:你打算使用的翻译渠道和配音渠道,是否支持该语种?
- 很多配音渠道(如F5-TTS)仅支持常见语种,不支持小语种;
- 部分翻译渠道(如 DeepL)支持的语言种类也相对有限。
- 部分语音识别渠道 (如Qwen-ASR)支持的语言也有限
注意:如果渠道本身不支持该语言,即便在软件中添加成功,实际运行时依然会报错。
第一步:查询并获取目标语言的渠道代码
不同的翻译和识别服务对同一门语言的“代号(代码)”要求各不相同。例如【简体中文】:
- Google翻译渠道为
zh-CN - DeepL 翻译渠道为
ZH-HANS - Faster-whisper识别渠道为
zh - 软字幕规范识别为
zho
请按需前往对应渠道查询你的目标语言代码:
Google 翻译:点击查询支持的语言代码 (例如中文是
zh-CN)
腾讯翻译:点击查询支持的语言代码 (例如中文是
zh)
百度翻译:点击查询支持的语言代码 (例如中文是
zh)
DeepL / DeepLX:点击查询支持的语言代码 (例如中文是
ZH-HANS)
微软翻译 (Microsoft):打开网页 (例如中文是
zh-Hans,一般与 Google 一致,也可按 F12 调试查看)阿里机器翻译:点击查询支持的语言代码 (例如中文是
zh)
阿里百炼API:点击查询支持的语言代码 (例如中文是
Chinese)
M2M100:点击查询支持的语言代码 (例如中文是
zh,提取下划线__xx__中的 2~3 位字母)
AI 翻译渠道(ChatGPT / Claude 等):直接填写该语言的英文全称(例如中文填写
Simplified Chinese)。LibreTranslate 渠道:点击查询支持的语言代码 (括号内的 2~3 位代码)

字幕嵌入代码(必填项):当生成内嵌软字幕时,必须使用 ISO 3 位字母代码。在下方列表中找到对应语言
Set2列的 3 位字母(若区分T/B,请使用T列,例如中文填写zho):
第二步:组装代码片段
按照以下格式模板,把你查到的真实代码替换进去:
💡 小贴士:
- 如果某些翻译渠道你不使用,可以直接填
No(区分大小写);- 第 2 行的
字幕嵌入代码必须真实填写,否则将无法正常嵌入软字幕。
"google翻译对应的语言代码小写形式": [
"Google翻译对应的语言代码",
"字幕嵌入对应的3位语言代码",
"百度翻译对应的语言代码",
"DeepL对应的语言代码",
"腾讯翻译对应的语言代码",
"Libre渠道对应的语言代码",
"微软翻译对应的语言代码",
"AI对应填写语言的英文名称",
"阿里机器翻译对应的语言代码",
"阿里百炼API对应的语言代码",
"M2M100对应的语言代码"
]【参考范例】 简体中文组装后的完整格式如下:
"zh-cn": [
"zh-cn",
"zho",
"zh",
"ZH-HANS",
"zh",
"zh",
"zh-Hans",
"Simplified Chinese",
"zh",
"Chinese",
"zh"
]第三步:写入配置文件 languages.json
- 打开软件根目录下
videotrans文件夹内的languages.json文件(推荐使用记事本或 VSCode 打开)。 - 将你刚才组装好的代码,粘贴到大括号
{ }内部。 - 关键细节:每组语言之间必须用英文半角逗号
,隔开,最后一组后面不要加逗号。
【粘贴位置示例】:
{
"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"
]
}- 保存文件并重启软件,在目标语言下拉列表中就能看到新增的语言代码了。
第四步(可选):自定义界面的显示名称
添加完成后,软件下拉框默认显示的是语言代码(如 zh-cn)。如果你希望显示为更友好的中文名称(如“简体中文”),请按以下步骤设置:
- 打开文件:
软件目录/videotrans/language/zh.json; - 翻到文件最底部,在最后一个
}之前查看前一行末尾是否有英文逗号,; - 如果没有,先在前一行末尾补上英文逗号
,,然后换行添加下列2行:json例如:"google对应的语言代码小写形式": "你想在软件中显示的中文名称", "你想在软件中显示的中文名称":"google对应的语言代码小写形式","zh-cn": "简体中文" - 保存文件并重启软件生效。
如果你的软件是英文界面,需要修改 软件目录/videotrans/language/en.json,方法一样
❓ 常见报错排查
如果修改后软件启动报错或未报错但添加的语言未生效,99% 是由于 JSON 格式错误造成的,这几个文件都是json文件,需要严格合法的语法,请重点检查:
- 中英文符号:所有标点符号(
"、,、:、{}、[])必须为英文半角符号,切勿输入中文逗号或中文引号。 - 多余或遗漏逗号:检查两段语言代码之间是否遗漏了逗号
,,或者在最后一项后面多写了逗号。
其他一些语言获取的底层逻辑
语音识别、字幕翻译、配音每个工作流程都有多个渠道可供选择,每个渠道对应着各自的本地模型或在线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)