// ======== Shortcode:
مترجم متعدد المصادر
add_action(‘init’, function(){
add_shortcode(‘mt_widget’, function(){
// سجّل سكربت فارغ لتتمكن من حقن سكربت داخلي آمن
wp_register_script(‘mt-inline’, false, [], MT_RP_VERSION, true);
// حقن السكربت الداخلي (واجهة الترجمة)
$inline_js = <<
const input = el(‘mt-input’);
const target = el(‘mt-target’);
const status = el(‘mt-status’);
const btnTranslate = el(‘mt-translate’);
const btnClear = el(‘mt-clear’);
const outGoogle = el(‘mt-google’);
const outBing = el(‘mt-bing’);
const outYandex = el(‘mt-yandex’);
const outReverso= el(‘mt-reverso’);
const linkReverso = el(‘mt-reverso-link’);
const base = (window.wp && window.wpApiSettings && window.wpApiSettings.root) || ‘/wp-json/’;
const routes = {
google: base + ‘mt/v1/translate/google’,
bing: base + ‘mt/v1/translate/bing’,
yandex: base + ‘mt/v1/translate/yandex’,
reverso: base + ‘mt/v1/translate/reverso’
};
btnClear.addEventListener(‘click’, () => {
input.value = ”;
outGoogle.value = outBing.value = outYandex.value = outReverso.value = ”;
status.textContent = ”;
});
function updateReversoLink(q, to){
const langMap = { ar:’arabic’, en:’english’, fr:’french’, de:’german’, es:’spanish’, ru:’russian’, tr:’turkish’ };
const tgt = langMap[to] || ‘arabic’;
const url = `https://context.reverso.net/translation/english-${tgt}/${encodeURIComponent(q)}`;
if (linkReverso) { linkReverso.href = url; linkReverso.style.display = ‘inline’; }
}
async function postJSON(url, data){
const res = await fetch(url, {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify(data)
});
if(!res.ok){
const t = await res.text();
throw new Error(`HTTP ${res.status}: ${t}`);
}
return res.json();
}
btnTranslate.addEventListener(‘click’, async () => {
const q = input.value.trim();
const to = target.value;
if(!q){ alert(‘فضلاً أدخل نصًا للترجمة’); return; }
status.textContent = ‘جاري الترجمة…’;
outGoogle.value = outBing.value = outYandex.value = outReverso.value = ”;
updateReversoLink(q, to);
const payload = { text: q, to };
try{
const [g, b, y, r] = await Promise.allSettled([
postJSON(routes.google, payload),
postJSON(routes.bing, payload),
postJSON(routes.yandex, payload),
postJSON(routes.reverso,payload)
]);
if(g.status === ‘fulfilled’){ outGoogle.value = g.value.translation || ”; }
else{ outGoogle.value = ‘خطأ: ‘ + g.reason.message; }
if(b.status === ‘fulfilled’){ outBing.value = (b.value.translation || b.value.joined || ”); }
else{ outBing.value = ‘خطأ: ‘ + b.reason.message; }
if(y.status === ‘fulfilled’){ outYandex.value = y.value.translation || ”; }
else{ outYandex.value = ‘خطأ: ‘ + y.reason.message; }
if(r.status === ‘fulfilled’){ outReverso.value = r.value.translation || r.value.message || ”; }
else{
outReverso.value = ‘واجهة Reverso المؤسسية غير مضبوطة أو حدث خطأ.’;
}
status.textContent = ‘تمت المعالجة.’;
}catch(err){
status.textContent = ‘حدث خطأ.’;
console.error(err);
}
});
})();
JS;
wp_add_inline_script(‘mt-inline’, $inline_js);
wp_enqueue_script(‘mt-inline’);
ob_start();
?>
مترجم متعدد المصادر