Skip to content

Latest commit

 

History

History
167 lines (160 loc) · 7.6 KB

谷歌翻译音频.md

File metadata and controls

167 lines (160 loc) · 7.6 KB

谷歌翻译

英语不咋地的我,总是离不开翻译网站。

经常碰见单词不知道怎么读,自己发音不好在别人面前念,着实有点难受。

通过抓取谷歌翻译的网页,发现原来音频地址是没多少加密的,而且也不需要账户验证,既然如此,何不利用谷歌的网页翻译来获得对应的单词发音呢?

音频地址获取

/* 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翻译结果
  • 双击自动发声(英文朗读而已啦)

参考

自定义标签

在组件基础上做到封装出来的自定义标签,自己网站上能正常解析和运作,发布其他平台不认识的能只显示单词,避免出现多余代码,还得手动修改。

vuepress使用自定义

参考: