تحويل النص إلى كلام مع TranslatePress: ما الذي يعمل فعلاً

2 دقيقة قراءة 21 دقيقة استماع
تحويل النص إلى كلام مع TranslatePress: ما الذي يعمل فعلاً

يترجم TranslatePress HTML المُصيَّر للصفحة عند الطلب ويخزّن كل ترجمة في جداول قاعدة البيانات المحلية. يوجد معرّف منشور واحد لكل مقال، وتتم عمليات التبديل بين اللغات عبر trp_translate() لا عبر منشورات مكررة. هذه الحقيقة وحدها تغيّر طريقة عمل تحويل النص إلى كلام على مواقع TranslatePress.

هذا هو المقال الخامس والأخير في سلسلتنا حول TTS متعدد اللغات. تناولنا سابقاً كلاً من WPML وPolylang وWeglot وGTranslate. يقع TranslatePress تقنياً بينها جميعاً، وإعداد الصوت يعكس ذلك.

الفرق بين TranslatePress وكلٍّ من WPML وPolylang وWeglot

ينشئ WPML وPolylang منشوراً منفصلاً لكل لغة. لكل ترجمة معرّفها الخاص ومحتواها post_content وعنوانها الدائم. توليد الصوت هنا بسيط لأن كل لغة كيان WordPress مستقل.

يسلك Weglot الطريق المعاكس. الترجمات تعيش على خوادم Weglot وتُحقن في الصفحة عبر وكيل أو نطاق فرعي. قاعدة بيانات WordPress الأصلية لا ترى النص المترجم قط، وهذا ما يجعل TTS من جهة الخادم على Weglot أمراً صعباً دون استخدام خطافات JavaScript.

TranslatePress هو الحل الوسط. منشور واحد لكل مقال، لذا يحتوي post_content على اللغة الافتراضية فقط. لكن كل ترجمة تُخزَّن محلياً في قاعدة بيانات WordPress ضمن جداول wp_trp_. يمكنك قراءتها والاستعلام عنها وتمريرها إلى محرك TTS. هذا يغيّر طريقة التعامل مع الصوت مقارنةً بأي من الإضافات الأربع الأخرى.

أين تُخزَّن الترجمات فعلاً

يخزّن TranslatePress الترجمات في جداول مخصصة تبدأ بالبادئة wp_trp_. كل زوج لغوي يحصل على جدول قاموس خاص به، يُسمَّى على النحو wp_trp_dictionary_<source>_<target>. ثمة أيضاً wp_trp_original_strings للنصوص الأصلية وجداول gettext لترجمات القوالب والإضافات.

التخزين اتجاهي. الترجمة الألمانية لموقع إنجليزي تعيش في قاموس الإنجليزية إلى الألمانية. قراءتها تتطلب الاتجاه ذاته. الدالة العامة التي تحتاجها هي trp_translate()، التي تأخذ سلسلة نصية ورمز لغة وتعيد النسخة المترجمة.

if ( function_exists( 'trp_translate' ) ) {
    $translated = trp_translate( $post->post_content, 'de_DE' );
    // Pass $translated to the TTS engine, not $post->post_content.
}

في أي تكامل مع TTS، هذه الدالة هي مصدر الحقيقة. قراءة post_content مباشرةً ستعطيك اللغة الافتراضية في كل مرة، بصرف النظر عن عنوان URL الذي يزوره الزائر. راجع وثائق تكامل TranslatePress لمعرفة كيفية تعامل TTSWP مع هذا الجانب.

مخطط يوضح تحويل trp_translate() لمحتوى post_content واحد إلى ثلاثة مخرجات صوتية بلغات مختلفة
معرّف منشور واحد، محتوى واحد، مخرجات صوتية مترجمة متعددة عبر trp_translate().

فخ رموز اللغة

يستخدم TranslatePress رموز اللغة الكاملة، لا المختصرات. الألمانية هي de_DE لا de. الفرنسية fr_FR. البرتغالية البرازيلية pt_BR. أي تكامل يفترض رموز Polylang المكوّنة من حرفين سيفشل بصمت على TranslatePress.

وثائق المطوّرين في TranslatePress صريحة في هذا. رمز اللغة الممرَّر إلى trp_translate() هو اللغة المحلية من الإعدادات، وقد لا يطابق بالضرورة مختصر اللغة في عنوان URL. مختصر مثل de لن يطابق أي قاموس، فتعود الدالة إلى النص الأصلي دون أي تحذير. إذا كتبت كوداً مخصصاً، وحّد رموز اللغة قبل استدعاء trp_translate()، وخزّن الصيغة الكاملة للغة المحلية بجانب ملفاتك الصوتية حتى تتمكن من مطابقتها لاحقاً.

هيكل عناوين URL والتخزين المؤقت

يستخدم TranslatePress مجلداً فرعياً لكل لغة بشكل افتراضي. صفحتك الإنجليزية تعيش على site.com/blog/post والنسخة الألمانية على site.com/de/blog/post. ثمة خيار أيضاً لاستخدام مجلد فرعي للغة الافتراضية، مما يجعل كل اللغات متماثلة في البنية.

هذا هو الحالة المثلى للتخزين المؤقت. عناوين URL المتميزة تعني مفاتيح تخزين مؤقت متميزة لكل لغة. WP Rocket وLiteSpeed وذواكر CDN الطرفية تعامل /de/blog/post كمورد مستقل عن /blog/post، لذا يُقدَّم ملفك الصوتي الألماني مع الصفحة الألمانية والملف الإنجليزي مع الصفحة الإنجليزية. وثائق تكامل التخزين المؤقت لدينا تغطي قواعد الاستثناء إن احتجتها.

الخطر الوحيد هو إضافة الكشف التلقائي عن لغة المستخدم المدفوعة. تعيد هذه الإضافة توجيه الزوار بناءً على لغة المتصفح، مما قد يتعارض مع ذاكرة التخزين المؤقت وتقديم التوجيه الخاطئ للمستخدم الخاطئ. تناولنا النمط ذاته في مقال Polylang. مواقع TranslatePress الأقل تستخدم الكشف لأنه إضافة مدفوعة، لكن إن استخدمته، استثنِ منطق التوجيه من الذاكرة المؤقتة.

مشكلة ترجمة واجهة مشغّل الصوت

هذه المشكلة فريدة في TranslatePress. تكتشف الإضافة النصوص التي تُدرجها JavaScript وتترجمها، وهو أمر غير معتاد. معظم أدوات الترجمة تتجاهل المحتوى المُصيَّر بـ JS. يلتقط TranslatePress هذا المحتوى من DOM بعد التصيير ويعرض ترجمته.

النتيجة الجانبية أن تسميات مشغّل الصوت مثل «تشغيل» و«إيقاف مؤقت» و«استمع إلى هذا المقال» تظهر في محرر TranslatePress كنصوص قابلة للترجمة. إذا تُرجمت هذه النصوص آلياً دون مراجعة، قد ينتهي المشغّل بنصوص أزرار غريبة أو خاطئة، والأسوأ، تسميات إمكانية وصول مترجمة ترجمةً خاطئة تُربك قارئات الشاشة.

داخل TranslatePress يوجد حلان. أضف السمة data-no-translation إلى أي عنصر تريد استثناءه. أو استخدم محددات الاستثناء في الإعدادات المتقدمة لتخطي حاويات كاملة بمحدد CSS. كلاهما موثّق في إعدادات TranslatePress. لمشغّل TTSWP تحديداً، استثنِ الحاوية الرئيسية للمشغّل بالكلاس، ودع تسميات المشغّل المترجمة تأتي من ملفات اللغة الخاصة بإضافتنا.

ما الذي تستثنيه

  • العنصر الحاوي لمشغّل الصوت
  • تسميات ARIA لأزرار التشغيل والإيقاف المؤقت وشريط التقدم
  • عروض الوقت وعدادات المدة
  • أي تسميات لاسم الصوت أو اللغة يُصيّرها TTSWP

إن أردت تخصيص مظهر المشغّل بعد استثنائه، وثائق CSS المخصص لدينا تغطي المحددات اللازمة.

مشكلة عدم التزامن بعد تحرير المحتوى

يربط TranslatePress كل ترجمة بالنص الأصلي المطابق تماماً. عدّل الأصل، وسينشئ TranslatePress نصاً أصلياً جديداً ويفصل الترجمة الموجودة. تقترح ذاكرة الترجمة الترجمة القديمة، لكن حتى يؤكدها إنسان، تعود اللغة الهدف إلى النص الأصلي.

بالنسبة لتحويل النص إلى كلام، هذا يعني أن الصوت قد ينفصل عن النص المترجم بعد أي تعديل. فاصلة أُضيفت في الإنجليزية تفصل ترجمة كل لغة لتلك الجملة. ملفك الصوتي الألماني لا يزال يقول الجملة القديمة، لكن النص الألماني المرئي يقول الجديدة.

قائمة تحقق عملية بعد تحرير المحتوى:

  1. أكّد النص الأصلي الجديد في محرر TranslatePress لكل لغة نشطة.
  2. أعِد توليد الصوت على منشور اللغة الافتراضية أولاً.
  3. أعِد توليد الصوت لكل لغة، ثم شغّل الصوت على كل عنوان URL محلّي للتأكد من تطابق الملف الجديد مع النص المرئي.
  4. امسح ذاكرة التخزين المؤقت لكل عنوان URL محلّي، لا الافتراضي وحده.

إعداد TTSWP على موقع TranslatePress

إليك سير العمل الحالي. وثائق التكامل تصف دائماً آخر إصدار.

  1. ثبّت TTSWP - تحويل النص إلى كلام من دليل إضافات WordPress.org. دليل التثبيت يرشدك خطوةً بخطوة.
  2. اربط الإضافة بحساب TTSWP. الخطط المجانية تتضمن رصيداً ترحيبياً لاختبار سير العمل كاملاً قبل الدفع. راجع ربط موقعك.
  3. تأكد من تفعيل TranslatePress وأن لغةً هدف واحدةً على الأقل مضبوطة برمز لغة كامل.
  4. عيّن صوتاً لكل لغة باستخدام ربط اللغة بالصوت. خصّص صوتاً ألمانياً لـ de_DE وصوتاً فرنسياً لـ fr_FR وهكذا. راجع اختيار الصوت لكتالوج الأصوات.
  5. انشر منشوراً أو حدّثه. يُولَّد الصوت للغة الافتراضية أولاً.
  6. شغّل الصوت على كل عنوان URL مترجم. التوليد يحدث عند الطلب. في المرة الأولى التي يشغّل فيها زائر الصوت بلغة ثانوية، يُخبر TranslatePress الإضافة TTSWP بأي لغة نشطة، فتولّد TTSWP الملف وتخزّنه مؤقتاً. كل تشغيل لاحق يستخدم الملف المخزّن.
  7. استثنِ المشغّل من TranslatePress باستخدام data-no-translation أو محدد في الإعدادات المتقدمة حتى تبقى تسميات المشغّل تحت سيطرة ترجمات TTSWP الخاصة.

تخزّن TTSWP ملفاً صوتياً واحداً لكل منشور ولغة، ويتبع المشغّل لغة عنوان URL الذي يزوره الزائر. على /de/blog/post يحمّل المشغّل الملف الألماني، وعلى العنوان الافتراضي يحمّل ملف اللغة الافتراضية. مع تفعيل الترجمة التلقائية، تقرأ TTSWP النص المترجم مباشرةً من TranslatePress قبل إرساله إلى ElevenLabs، فيطابق الصوت ما يراه الزائر على الصفحة.

TranslatePress المجاني مقابل المدفوع لـ TTS

يدعم TranslatePress المجاني لغةً إضافيةً واحدة، ويتضمن 2000 كلمة مترجمة بالذكاء الاصطناعي عبر TranslatePress AI، ويتيح استخدام Google Translate بمفتاح API خاص بك. هذا كافٍ لتشغيل مدوّنة ثنائية اللغة بصوت مطابق في اللغتين.

يضيف TranslatePress المدفوع لغات إضافية غير محدودة، وحزمة SEO للمقاطع المترجمة والبيانات الوصفية والتحكم في hreflang، ودعم DeepL، وحسابات مترجمين، وإضافة الكشف التلقائي عن لغة المستخدم، ونطاقاً مختلفاً لكل لغة. للمواقع التي تحتاج أكثر من لغتين، أو وسوم hreflang لمحركات البحث، أو ترجمات بجودة DeepL قبل توليد الصوت، النسخة المدفوعة هي الخيار العملي. جودة الصوت نفسها لا تعتمد على الباقة المختارة.

SEO وAEO مع صوت لكل لغة

تتيح لك حزمة SEO ضبط وسوم hreflang لكل لغة، مع خيارات للغة المحلية المرتبطة ببلد محدد، أو اللغة المستقلة عن المنطقة، أو كليهما. بالنسبة لمحركات البحث ومحركات الإجابات بالذكاء الاصطناعي، هذا ما يشير إلى أي صوت يطابق أي منطقة.

أضف مدخل مخطط AudioObject لكل عنوان URL بلغته، مع قيمة inLanguage الصحيحة المطابقة لـ hreflang. تلتقط Google وBing هذا الإقران اللغوي، وفي اختباراتنا الخاصة، تستشهد محركات الذكاء الاصطناعي مثل Perplexity وChatGPT Search بالمقالات المعززة بالصوت بشكل أكثر تكراراً عندما يكون المخطط واضحاً وعنوان URL الصوتي يحل بشكل صحيح. كتبنا المزيد حول هذا في مقال AEO والصوت.

المشاكل الشائعة وحلولها

المشكلةالسببالحل
الصوت يُشغَّل بلغة خاطئةالنص مسحوب من post_content بدلاً من trp_translate()مرّر النص عبر trp_translate( $content, $locale ) مع رمز اللغة الكامل
أزرار المشغّل مترجمة ترجمةً خاطئةTranslatePress التقط تسميات المشغّل المُدرَجة بـ JSأضف data-no-translation إلى حاوية المشغّل أو استثنها بمحدد في الإعدادات المتقدمة
الصوت مفقود بعد تحرير المحتوىتحرير النص الأصلي يفصل الترجمات وبالتالي الملفات الصوتية لكل لغةأكّد الترجمات في محرر TranslatePress، ثم أعِد توليد الصوت لكل لغة
عدم تطابق رمز اللغةالتكامل يمرّر de بدلاً من de_DEوحّد رمز اللغة إلى الصيغة الكاملة قبل استدعاء trp_translate()
تخطيط RTL معطوب للعربية أو العبريةCSS المشغّل لا يدعم RTLاستخدم CSS مخصصاً لعكس عناصر التحكم في المشغّل للغات RTL
التوجيه المخزّن مؤقتاً يذهب للغة الخاطئةإضافة الكشف التلقائي عن اللغة تتعارض مع ذاكرة التخزين المؤقتاستثنِ منطق التوجيه من الذاكرة المؤقتة أو أوقف الكشف

ملاحظة حول إمكانية الوصول

تدعم السرد الصوتي عدة معايير نجاح WCAG عندما يكون المشغّل قابلاً للتشغيل بلوحة المفاتيح ومصنّفاً بشكل صحيح. إذا استثنيت المشغّل من TranslatePress، احرص على بقاء تسميات ARIA سليمةً في ترجمات TTSWP الخاصة. دليل WCAG للصوت لدينا يغطي المعايير بالتفصيل، ودرس الإعداد الرئيسي نقطة بداية جيدة.

الأسئلة الشائعة

هل يعمل TranslatePress مع تحويل النص إلى كلام؟

نعم. يخزّن TranslatePress الترجمات محلياً في جداول قاعدة البيانات wp_trp_، وتعيد دالة trp_translate() المحتوى المترجم من جهة الخادم. يمكن لتكامل TTS قراءة النص المترجم وتوليد صوت لكل لغة، شريطة ربط الملفات الصوتية بمعرّف المنشور مع رمز اللغة الكامل مثل de_DE لا المختصر.

هل أحتاج النسخة المدفوعة من TranslatePress للصوت؟

لا. تدعم النسخة المجانية لغةً إضافيةً واحدة وتتضمن الترجمة عبر TranslatePress AI أو Google Translate بمفتاحك الخاص أو التحرير اليدوي. هذا كافٍ لموقع ثنائي اللغة بصوت مطابق. النسخة المدفوعة تضيف لغات غير محدودة وحزمة SEO ودعم DeepL وإضافات الكشف، وهي مفيدة إن احتجت أكثر من لغتين أو التحكم في hreflang.

لماذا تُترجَم أزرار مشغّلي ترجمةً خاطئة؟

يكتشف TranslatePress النصوص المُدرَجة بـ JS، لذا تظهر تسميات مشغّل الصوت في محرره وقد تُترجَم آلياً. الحل بإضافة data-no-translation إلى حاوية المشغّل، أو باستثناء حاوية المشغّل في الإعدادات المتقدمة بمحدد CSS. ستأتي تسميات المشغّل حينئذٍ من ملفات لغة TTSWP الخاصة.

لماذا توقف صوتي عن مطابقة الترجمة؟

تحرير النص الأصلي في TranslatePress ينشئ نصاً مصدرياً جديداً ويفصل الترجمة الموجودة. تقترح ذاكرة الترجمة الترجمة القديمة، لكن حتى تؤكدها، تعود اللغة الهدف إلى المصدر. أعِد توليد الصوت على المنشور الافتراضي وكل لغة بعد أي تعديل في المحتوى، ثم امسح الذاكرة المؤقتة لكل عنوان URL محلّي.

ما الفرق بين TranslatePress وWeglot في تحويل النص إلى كلام؟

يخزّن Weglot الترجمات على خوادمه الخاصة ويحقنها في الصفحة، فلا يرى WordPress النص المترجم من جهة الخادم. أما TranslatePress فيخزّن كل ترجمة في قاعدة بياناتك المحلية ويتيح trp_translate() للوصول من جهة الخادم. هذا يجعل توليد الصوت لكل لغة أكثر مباشرةً على TranslatePress مقارنةً بـ Weglot.

ما الخطوة التالية

ثبّت TTSWP - تحويل النص إلى كلام من دليل إضافات WordPress.org، اربطه بحسابك، وعيّن صوتاً لكل لغة تستخدمها في TranslatePress. انشر منشوراً، شغّل الصوت على كل عنوان URL مترجم، وتأكد من تطابق الصوت مع النص المرئي. إن حدث أي اختلاف، وثائق تكامل TranslatePress هي أول مكان تبدأ منه.