命令行翻译工具translate-shell劫持同名函数trans脚本,自动判断参数进行中翻英或英翻中,并自动朗读语音

注:以下脚本逻辑依赖于开源软件translate-shell,请先按照官方说明安装trans到本地目录,并修改以下脚本中的路径为trans的实际的绝对路径。

官方软件包:

https://github.com/soimort/translate-shell

warpper包装器完整代码,劫持 trans 命令

请将以下脚本代码加入个人配置文件(~/.bash_profile或~/.bashrc或其他任意一个自动加载的配置文件),即可在交互式命令行中调用;

trans() {
	#劫持trans同名命令,缺省详细参数时自动判断需要中翻英还是英翻中
	#执行脚本:/v/bin/trans
	# Github:https://github.com/soimort/translate-shell
	# Tips: clip1|trans 或 cat /dev/clipboard|trans  (从剪贴板读取文本并翻译)
	local header=$(cat<<EOF
# trans 同名劫持函数
# 执行脚本:/v/bin/trans
# Github:https://github.com/soimort/translate-shell
# 小技巧:支持从管道符导入需要翻译的内容:
# eg:cat text.txt|trans
#     clip1|trans 或 cat /dev/clipboard|trans  (从剪贴板读取文本并翻译)
-----------
# 你可以使用以下别名翻译为不同目标语言:
`alias|grep 'alias trans-'`
EOF
)
	[ $# -eq 0 ] && [ -t 0 ] && echo "$header" && /v/bin/trans --shell && return
	OLD_IFS=$IFS
	IFS=$(echo -e "\n")
	local audioFile=""
	local pointLang=0 #参数中是否指定了特定的翻译语言,1为已指定,0为未指定
	local originOptions=( $@ )
	local inputTmpFile="/tmp/text-to-translate-tmp.txt"
	local inputFileOptions=( )
	while [ $# -gt 0 ];
	do
		if [[ "${1,,}" == "-download-audio-as" ]];then
			audioFile="$2"
		elif [[ "${1,,}" =~ ^: ]];then
			pointLang=1
		fi
		shift
	done
	if [ ! -t 0 ];then
		#cat >"$inputTmpFile"
		cat|dos2unix -q|tr '\n' ' ' >"$inputTmpFile" # <-- 干掉换行
		inputFileOptions=("-i" "$inputTmpFile")
	fi
	set -- ${inputFileOptions[@]} ${originOptions[@]}
	#判断参数起始字符是否是中文字符,从而决定中翻英还是英翻中
	if [ $pointLang -eq 0 ] && [[ "${1,,}" =~ ^[^0-9a-z\-] ]];then
		/v/bin/trans :en $@
	else
		/v/bin/trans $@
	fi
	IFS=$OLD_IFS
	#是否自动播放语音文件(依赖于/v/bin/playaudio,实际调用程序cmdmp3)
	#命令行播放音频第三方程序:cmdmp3(https://lawlessguy.wordpress.com/2015/06/27/update-to-a-command-line-mp3-player-for-windows/)
	if [[ "$*" =~ "-download-audio-as" ]] && [ -f "$audioFile" ];then
		print_color "播放语音文件..."  #注意:翻译文本过长可能导致生成的语音文件无效,具体限制未知,尽量缩短文本,控制在40s以内;(可能是脚本处理过程错误,并非官方限制)
		playaudio $audioFile
		#cygstart $audioFile
		[ -f "$audioFile" ] && rm -vf $audioFile
	fi
}
alias trans0=trans
alias fy2=trans # <--- fy已指定其他程序(/usr/local/bin/fy.exe)
alias fy=trans

trans1() {
	#翻译的同时自动下载语音文件到本地临时文件进行播放
	#alias trans1='trans -download-audio-as /tmp/textaudio.mp3' # <--- alias由于传参顺序不对,暂时弃用...
	local transTarget="" #<--翻译的目标语言
	#如果参数$1指定了翻译的目标语种,则调换参数顺序,以便为trans1创建多语种别名,同时保证trans函数良好执行
	#eg: trans1 邵氏影院 :fr
	#	  等效于
	#	  trans1 :fr 邵氏影院   (指定翻译目标语种为法语)
	#支持管道调用翻译并朗读语音;
	# eg:  clip1|trans1 :en 或者 clip1|trans-en (翻译为英文并朗读)
	#-------------------
	# 别名调用示例(翻译为法语并朗读):trans-fa 邵氏影院
	if [[ "$1" =~ ^\: ]];then  
		#echo "需要调换参数顺序..."
		transTarget="$1" && shift
	fi
	set -- "$@" "$transTarget" # <--- 注意 $@ 加双引号,否则英文句子会被分成多个参数传递
	#set -x
	OLD_IFS=$IFS
	IFS=$(echo -e "\n")
	if [ ! -t 0 ];then
		#echo "有管道内容"
		trans $@ -download-audio-as /tmp/textaudio.mp3 <<<$(cat)
	else
		#echo "无管道内容"
		trans $@ -download-audio-as /tmp/textaudio.mp3 </dev/null
	fi
	IFS=$OLD_IFS
	#set +x
}
alias fy3=trans1
alias cfy='clip1|trans1' #翻译剪贴板中的内容
#翻译支持的语言:https://github.com/soimort/translate-shell/wiki/Languages
alias trans-fa='trans1 :fr' #翻译为法语
alias trans-de='trans1 :de' #翻译为德语
alias trans-en='trans1 :en' #翻译为英语
alias trans-es='trans1 :es' #翻译为西班牙语
alias trans-spa=trans-es
alias trans-it='trans1 :it' #翻译为意大利语
alias trans-yi=trans-it
alias trans-ja='trans1 :ja' #翻译为日语
alias trans-ri=trans-ja
alias trans-ko='trans1 :ko' #翻译为韩语
alias trans-han=trans-ko
alias trans-ms='trans1 :ms' #翻译为马来语
alias trans-malai=trans-ms
alias trans-my='trans1 :my' #翻译为缅甸语
alias trans-mian=trans-my
alias trans-vi='trans1 :vi' #翻译为越南语
alias trans-yn=trans-vi
alias trans-th='trans1 :th' #翻译为泰语
alias trans-tai=trans-th
alias trans-tl='trans1 :tl' #翻译为菲律宾语
alias trans-fei=trans-tl
alias trans-zh='trans1 :zh-CN' #翻译为简体中文
alias trans-cn=trans-zh
alias trans-zhft='trans1 :zh-TW' #翻译为繁体中文
alias trans-yue='trans1 :yue' #翻译为粤语

函数一:trans (英翻中、中翻英自动识别)

1、无需指定冗长的命令行参数,直接调用 trans xxxxx,脚本即可自动根据你传递的参数判断是需要中翻英,还是英翻中,如果需要翻译其他语种,请指定详尽的命令行参数(具体参数参考translate-shell官方文档);
比如:
trans 中国人讲中国话 # <--- 会自动翻译为英文
trans "many childrens" # <--- 会自动翻译为中文
2、当传递多个命令行参数时,脚本不对输入做任何处理,直接按原样传递参数给trans实体文件(即translate-shell项目本身);
注:由于英文带空格,需要加双引号包裹,如果语句不带空格(比如中文),可省略双引号。

妙用:

从管道符导入待翻译的文本内容:

cat 1.txt|trans #读取1.txt文件的内容并翻译
cat /dev/clipboard|trans #翻译剪贴板中的内容

函数二:trans1(中英互翻自动识别,并自动朗读语音)

功能同trans函数,但在翻译的同时会下载目标语言的语音文件到本地临时文件夹,并调用本地命令行声音播放程序来朗读语音。
此处测试使用的播放音频的程序为cmdmp3( https://lawlessguy.wordpress.com/2015/06/27/update-to-a-command-line-mp3-player-for-windows/ ),
你也可以视具体情况替换为其他程序!
从管道符导入待翻译的文本内容:

cat 1.txt|trans1 #读取1.txt文件的内容并翻译和朗读
cat /dev/clipboard|trans1 #翻译剪贴板中的内容并朗读


一些快捷翻译到特定语言的别名命令:

alias trans-fa='trans1 :fr' #翻译为法语
alias trans-de='trans1 :de' #翻译为德语
alias trans-en='trans1 :en' #翻译为英语
alias trans-es='trans1 :es' #翻译为西班牙语
alias trans-spa=trans-es
alias trans-it='trans1 :it' #翻译为意大利语
alias trans-yi=trans-it
alias trans-ja='trans1 :ja' #翻译为日语
alias trans-ri=trans-ja
alias trans-ko='trans1 :ko' #翻译为韩语
alias trans-han=trans-ko
alias trans-ms='trans1 :ms' #翻译为马来语
alias trans-malai=trans-ms
alias trans-my='trans1 :my' #翻译为缅甸语
alias trans-mian=trans-my
alias trans-vi='trans1 :vi' #翻译为越南语
alias trans-yn=trans-vi
alias trans-th='trans1 :th' #翻译为泰语
alias trans-tai=trans-th
alias trans-tl='trans1 :tl' #翻译为菲律宾语
alias trans-fei=trans-tl
alias trans-zh='trans1 :zh-CN' #翻译为简体中文
alias trans-zhft='trans1 :zh-TW' #翻译为繁体中文
alias trans-yue='trans1 :yue' #翻译为粤语

Gitee代码共享:

请访问
https://gitee.com/hexiyou/shell-scripts/blob/master/trans-wraper.sh

写在最后

最后不得不感叹一下,强大的awk简直无所不能,凭借awk脚本就能写出如此实用的翻译程序,官方的程序代码本体我已拷贝至此,大家可以去观摩学习!
https://files-cdn.cnblogs.com/files/cnhack/trans.sh

posted @ 2022-08-17 04:27  晴云孤魂  阅读(399)  评论(0编辑  收藏  举报