英语不咋地的我,总是离不开翻译网站。
经常碰见单词不知道怎么读,自己发音不好在别人面前念,着实有点难受。
通过抓取谷歌翻译的网页,发现原来音频地址是没多少加密的,而且也不需要账户验证,既然如此,何不利用谷歌的网页翻译来获得对应的单词发音呢?
/* eslint-disable eqeqeq */
/* eslint-disable no-sequences */
/* eslint-disable no-unused-expressions */
/* eslint-disable-next-line eqeqeq */
function TK (a) {
var b = 406644
var b1 = 3293161072
var jd = '.'
var $b = '+-a^+6'
var Zb = '+-3^+b+-f'
for (var e = [], f = 0, g = 0; g < a.length; g++) {
var m = a.charCodeAt(g)
m < 128 ? e[f++] = m : (m < 2048 ? e[f++] = m >> 6 | 192 : ((m & 64512) == 55296 && g + 1 < a.length && (a.charCodeAt(g + 1) & 64512) == 56320 ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023),
e[f++] = m >> 18 | 240,
e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
e[f++] = m >> 6 & 63 | 128),
e[f++] = m & 63 | 128)
}
a = b
for (f = 0; f < e.length; f++) {
a += e[f],
a = RL(a, $b)
}
a = RL(a, Zb)
a ^= b1 || 0
a < 0 && (a = (a & 2147483647) + 2147483648)
a %= 1E6
return a.toString() + jd + (a ^ b)
};
function RL (a, b) {
var t = 'a'
var Yb = '+'
for (var c = 0; c < b.length - 2; c += 3) {
var d = b.charAt(c + 2)
d = d >= t ? d.charCodeAt(0) - 87 : Number(d)
d = b.charAt(c + 1) == Yb ? a >>> d : a << d
a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
}
return a
}
/**
* @参数1:传入要发音的 单词
* @参数2(非必填):传入配置对象:{sourceLanguage: 'auto', targetLanguage: 'en' } ---> sourceLanguage【源语言国家】:默认自动检测auto;targetLanguage【翻译成哪国语言】:默认en(因为我个人中国翻译英语比较多);可选国家值:'zh-CN'、'en'、'ja'等
* @返回值:返回 结果对象:{audioCn: 'https中式发音音频',audioCn: 'https美式发音音频',audioJa: 'https日式发音音频',audioConfig: 'https自定义式发音音频',textCn: 'https翻译为中文地址',textEn: 'https翻译为英文地址',textJa: 'https翻译为日文地址',textConfig: 'https翻译为自定义国家语言地址'}
* 描述:audio属性:谷歌发音音频 地址;textCn属性:翻译参数一为中文语言文字地址;textEn属性:翻译参数一为英文语言文字地址;
*/
function translateGoogle (word, model = { sourceLanguage: 'auto', targetLanguage: 'en' }) {
const resultObj = {}
resultObj.audioCn = 'https://translate.google.cn/translate_tts?&q=' + word + '&tl=zh-CN&tk=' + TK(word) + '&client=webapp'
resultObj.audioEn = 'https://translate.google.cn/translate_tts?&q=' + word + '&tl=en&tk=' + TK(word) + '&client=webapp'
resultObj.audioJa = 'https://translate.google.cn/translate_tts?&q=' + word + '&tl=ja&tk=' + TK(word) + '&client=webapp'
resultObj.audioConfig = 'https://translate.google.cn/translate_tts?&q=' + word + '&tl=' + model.targetLanguage + '&tk=' + TK(word) + '&client=webapp'
resultObj.textCn = 'https://translate.google.cn/translate_a/single?client=webapp&sl=' + model.sourceLanguage + '&tl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=6&tsel=3&kc=1&tk=' + TK(word) + '&q=' + word
resultObj.textEn = 'https://translate.google.cn/translate_a/single?client=webapp&sl=' + model.sourceLanguage + '&tl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=6&tsel=3&kc=1&tk=' + TK(word) + '&q=' + word
resultObj.textJa = 'https://translate.google.cn/translate_a/single?client=webapp&sl=' + model.sourceLanguage + '&tl=ja&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=6&tsel=3&kc=1&tk=' + TK(word) + '&q=' + word
resultObj.textConfig = 'https://translate.google.cn/translate_a/single?client=webapp&sl=' + model.sourceLanguage + '&tl=' + model.targetLanguage + '&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=6&tsel=3&kc=1&tk=' + TK(word) + '&q=' + word
return resultObj
}
调用方法:
var 翻译对象 = translateGoogle ('promise')
console.log(翻译对象)
/*
{
audioCn: 'https://translate.google.cn/translate_tts?&q=promise&tl=zh-CN&tk=215087.359515&client=webapp',// 中式发音音频地址
audioEn: 'https://translate.google.cn/translate_tts?&q=promise&tl=en&tk=215087.359515&client=webapp',// 美式发音音频地址
audioJa: 'https://translate.google.cn/translate_tts?&q=promise&tl=ja&tk=215087.359515&client=webapp',// 日式发音音频地址
audioConfig: 'https://translate.google.cn/translate_tts?&q=promise&tl=en&tk=215087.359515&client=webapp',// 自定义式发音音频地址
textCn: 'https://translate.google.cn/translate_a/single?client=webapp&sl=auto&tl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=6&tsel=3&kc=1&tk=215087.359515&q=promise',// 翻译为中文结果地址
textEn: 'https://translate.google.cn/translate_a/single?client=webapp&sl=auto&tl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=6&tsel=3&kc=1&tk=215087.359515&q=promise',// 翻译为英文结果地址
textJa: 'https://translate.google.cn/translate_a/single?client=webapp&sl=auto&tl=ja&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=6&tsel=3&kc=1&tk=215087.359515&q=promise',// 翻译为日文结果地址
textConfig: 'https://translate.google.cn/translate_a/single?client=webapp&sl=auto&tl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&otf=1&ssel=6&tsel=3&kc=1&tk=215087.359515&q=promise'// 翻译为自定义语言结果地址
}
*/
我们来看看结果:
<audio controls="controls">
<source :src="translateGoogle ('promise').audioEn" />
<p>您的浏览器,不支持 播放声音.</p>
</audio>
详细国家代号:
// 国家 --> 缩写代号
'afrikaans': 'af',
'arabic': 'ar',
'belarusian': 'be',
'bulgarian': 'bg',
'catalan': 'ca',
'czech': 'cs',
'welsh': 'cy',
'danish': 'da',
'german': 'de',
'greek': 'el',
'english': 'en',
'esperanto': 'eo',
'spanish': 'es',
'estonian': 'et',
'persian': 'fa',
'finnish': 'fi',
'french': 'fr',
'irish': 'ga',
'galician': 'gl',
'hindi': 'hi',
'croatian': 'hr',
'hungarian': 'hu',
'indonesian': 'id',
'icelandic': 'is',
'italian': 'it',
'hebrew': 'iw',
'japanese': 'ja',
'korean': 'ko',
'latin': 'la',
'lithuanian': 'lt',
'latvian': 'lv',
'macedonian': 'mk',
'malay': 'ms',
'maltese': 'mt',
'dutch': 'nl',
'norwegian': 'no',
'polish': 'pl',
'portuguese': 'pt',
'romanian': 'ro',
'russian': 'ru',
'slovak': 'sk',
'slovenian': 'sl',
'albanian': 'sq',
'serbian': 'sr',
'swedish': 'sv',
'swahili': 'sw',
'thai': 'th',
'filipino': 'tl',
'turkish': 'tr',
'ukrainian': 'uk',
'vietnamese': 'vi',
'yiddish': 'yi',
'chinese_simplified': 'zh-CN',
'chinese_traditional': 'zh-TW',
'auto': 'auto'
封装一个自定义的翻译组件:
- 点击自动
toast
翻译结果 - 双击自动发声(英文朗读而已啦)
参考:
在组件基础上做到封装出来的自定义标签,自己网站上能正常解析和运作,发布其他平台不认识的能只显示单词,避免出现多余代码,还得手动修改。
参考: