如何用Bash结合translate-shell批量替换语言配置文件中等号后的文本
大体积键值对语言配置文件的批量俄译实现方案
原始需求
手头有体量较大的键值对格式语言配置文件,需要将文件中所有=符号与行尾换行符之间的英文内容,替换为对应俄语译文,输入输出示例如下:
# 输入配置片段 screen.LIGHT_COLOR=Lighting Color screen.LIGHT_M=Light (Morning) screen.AMBIENT_M=Ambient (Morning) # 输出配置片段 screen.LIGHT_COLOR=Цвет Освещения screen.LIGHT_M=Свет (Утро) screen.AMBIENT_M=Эмбиент (Утро)
初始实现方式
最初仅能通过逐行提取待译文本、调用翻译工具的方式实现功能,对应shell脚本如下:
while IFS= read -r line do echo $line | cut -d= -f2- | trans -b en:ru done < file.txt
脚本运行后仅能输出逐行的译文结果:
Цвет Освещения Свет (Утро) Эмбиент (Утро)
注:trans是translate-shell命令行工具的简称,运行速度较慢但可满足基础翻译需求,-b参数表示输出简明翻译结果,en:ru指定翻译方向为英语转俄语。
实际踩坑与优化方向
在实际使用中发现translate-shell存在使用限制:固定时间窗口内仅允许发起约110次请求,逐行处理1300条待译内容会发起1300次独立请求,极易触发限流导致脚本中断。
经社区讨论确定的优化逻辑为:将所有待译内容打包为单次请求发送,替代逐行请求,可将整体处理时长从数分钟压缩至数秒,同时规避限流问题。
最终可运行的脚本实现
以下脚本是刚接触相关技术3天时编写的,实现逻辑较为简单直接
# 拆分原文件的键和待译英文值,分别存入两个临时文件 cut -s -d = -f 1 en_US.lang > option_en.txt cut -s -d = -f 2 en_US.lang > value_en.txt # 将所有待译的英文值拼接为单块,用自定义分隔符` :: `连接 sed ':a; N; $!ba; s/\n/ :: /g' value_en.txt > value_en_block.txt # 单次调用翻译工具完成全量内容翻译 trans -b en:ru -i value_en_block.txt -o value_ru_block.txt # 将翻译完成的内容块,按相同分隔符拆回逐行格式 sed 's/ :: /\n/g' value_ru_block.txt > value_ru.txt # 合并原键和对应俄语译文,生成最终的俄语配置文件 paste -d = option_en.txt value_ru.txt > ru_RU.lang # 清理临时文件 rm option_en.txt value_en.txt value_en_block.txt value_ru.txt value_ru_block.txt
方案落地过程中参考了Taylor G.、Armali等社区参与用户的建议。
内容的提问来源于stack exchange,提问作者koal42
相关产品推荐
相关产品推荐

