84 lines
2.8 KiB
JavaScript
84 lines
2.8 KiB
JavaScript
/**
|
|
* AKSRT Frontend Translate — 前端即时翻译
|
|
*
|
|
* 渐进增强,默认关。通过 Settings 启用后,
|
|
* 在语言切换 Widget 中添加"翻译本页"按钮,
|
|
* 使用浏览器原生翻译或自定义翻译 API。
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
(function () {
|
|
'use strict';
|
|
|
|
var config = (window.aksrtData && window.aksrtData.translate) || {};
|
|
if (!config.enabled) return;
|
|
|
|
/**
|
|
* 触发浏览器原生翻译(Chrome/Edge 内置)
|
|
*/
|
|
function triggerBrowserTranslate(targetLang) {
|
|
// Chrome/Edge 有内置翻译功能
|
|
if (document.querySelector('.goog-te-banner-frame') || document.querySelector('#goog-gt-tt')) {
|
|
return; // 已经在翻译中
|
|
}
|
|
|
|
// 尝试使用 Google Translate Element
|
|
if (window.google && window.google.translate) {
|
|
new google.translate.TranslateElement({
|
|
pageLanguage: config.sourceLang || 'zh-CN',
|
|
includedLanguages: targetLang || '',
|
|
layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
|
|
autoDisplay: false,
|
|
}, 'aksrt-translate-container');
|
|
return;
|
|
}
|
|
|
|
// 动态加载 Google Translate
|
|
var script = document.createElement('script');
|
|
script.src = '//translate.google.com/translate_a/element.js?cb=aksrtTranslateInit';
|
|
document.head.appendChild(script);
|
|
|
|
window.aksrtTranslateInit = function () {
|
|
if (!window.google || !window.google.translate) return;
|
|
new google.translate.TranslateElement({
|
|
pageLanguage: config.sourceLang || 'zh-CN',
|
|
includedLanguages: targetLang || config.targetLang || 'en',
|
|
layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
|
|
autoDisplay: false,
|
|
}, 'aksrt-translate-container');
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 创建翻译容器和按钮
|
|
*/
|
|
function init() {
|
|
// 检查是否有语言切换 Widget
|
|
var langWidget = document.querySelector('.aksrt-lang-switch, [data-aksrt-lang-switch]');
|
|
if (!langWidget && !config.showButton) return;
|
|
|
|
// 创建隐藏的翻译容器
|
|
var container = document.createElement('div');
|
|
container.id = 'aksrt-translate-container';
|
|
container.style.cssText = 'position:fixed;top:-9999px;left:-9999px;visibility:hidden;';
|
|
document.body.appendChild(container);
|
|
|
|
// 如果配置了显示按钮,在语言切换 Widget 旁添加
|
|
if (config.showButton && langWidget) {
|
|
var btn = document.createElement('button');
|
|
btn.type = 'button';
|
|
btn.className = 'aksrt-translate-btn';
|
|
btn.innerHTML = '<i class="fas fa-language"></i> 翻译本页';
|
|
btn.addEventListener('click', function () {
|
|
triggerBrowserTranslate(config.targetLang || 'en');
|
|
btn.textContent = '翻译中...';
|
|
btn.disabled = true;
|
|
});
|
|
langWidget.appendChild(btn);
|
|
}
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', init);
|
|
})();
|