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

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

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

هذا هو المقال الرابع في سلسلتنا عن تحويل النص إلى كلام متعدد اللغات. تناولنا سابقاً WPML وWeglot وإصدار GTranslate 3.3.0. يقترب Polylang من WPML في بنيته، لكن له خصائصه المميزة. إليك ما اختبرناه وما يعمل فعلاً على مواقع الإنتاج مع TTSWP - تحويل النص إلى كلام.

لماذا يهم Polylang في تحويل النص إلى كلام

يُشغّل Polylang عدداً من مواقع WordPress متعددة اللغات أكثر من أي إضافة مجانية أخرى. يتجاوز عدد تثبيتاته النشطة 800,000، وهو يمتلك أكبر قاعدة تثبيت مجاني بين إضافات التعدد اللغوي. صدر الإصدار الأول عام 2011، والإضافة لا تزال تُصان بانتظام. لا يوجد حد لعدد اللغات التي يمكن إضافتها، وحزم لغات WordPress تُحمَّل تلقائياً. معظم مواقع Polylang هي مدونات وناشرون صغار ووكالات محدودة الميزانية اختارته لأن النسخة الأساسية مجانية والبنية نظيفة.

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

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

كيف يختلف Polylang عن Weglot وGTranslate

Polylang يُنشئ نسخاً من المنشورات. Weglot وGTranslate يترجمان وقت العرض. هذا الفرق الوحيد يحدد كل شيء في دعم تحويل النص إلى كلام.

على موقع Polylang، الترجمة الألمانية لصفحة «من نحن» هي منشور WordPress مستقل بمعرّف 412 ورمز لغة «de» ومحتوى خاص به في قاعدة البيانات. يراه WordPress، وتراه REST API، وأي إضافة لتحويل النص إلى كلام تربط نفسها بـ save_post أو wp_insert_post تراه. يعمل توليد الصوت مرة واحدة لكل ترجمة، بلغة تلك الترجمة، ويُخزَّن الملف مرتبطاً بمعرّف المنشور.

يعمل Weglot وGTranslate بطريقة مختلفة. النص المترجم لا يوجد إلا حين يطلب المستخدم الصفحة. لا يوجد منشور ثانٍ لإرفاق الصوت به. تناولنا حلول البديل في مقالَي Weglot وGTranslate. WPML يستخدم نموذج التكرار ذاته مثل Polylang، ولهذا فإن دليل WPML ينطبق هنا مع تعديلات بسيطة.

بالنسبة لتحويل النص إلى كلام، هذا خبر جيد. يمنحك Polylang ما تحتاجه بالضبط: معرّف منشور ثابت لكل لغة، ورمز لغة معروف، وعنوان URL لا يتغير وقت العرض.

مخطط يقارن تكرار المنشورات في Polylang مع ترجمة Weglot في وقت العرض
يُنشئ Polylang منشوراً حقيقياً لكل لغة، وهو بالضبط ما يحتاجه توليد الصوت على مستوى المنشور.

أنماط URL الأربعة في Polylang وما تعنيه لتحويل النص إلى كلام

يوفر Polylang أربعة أنماط لعناوين URL. كل منها يغير طريقة رؤية ذاكرة التخزين المؤقت وشبكات CDN وكود كشف اللغة لصفحاتك. اختر النمط الخطأ وسيظهر الملف الصوتي الصحيح خلف عنوان URL خاطئ.

1. اللغة من المحتوى فقط (بدون رمز لغة في URL)

هذه الحالة الأصعب. عنوان URL example.com/about يُقدّم الإنجليزية لزائر والألمانية لآخر، استناداً إلى ملف تعريف الارتباط أو اكتشاف المتصفح. ذاكرة التخزين المؤقت ترى عنوان URL واحداً وتخزّن نسخة واحدة. أي لغة احتجزتها أولاً تفوز.

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

2. مسارات المجلدات (/en/ و/de/)

هذا هو الإعداد الافتراضي والموصى به. كل لغة تعيش في مسارها الخاص. تُعامِل ذاكرة التخزين المؤقت /en/about و/de/about كمفتاحين مستقلين. تُحمَّل الصفحة الصحيحة مع المشغّل الصحيح والملف الصوتي الصحيح. لا حاجة لأي حيل في ملفات تعريف الارتباط.

انتبه لخيار «إخفاء معلومات لغة URL للغة الافتراضية». عند تفعيله، تُحذف البادئة من اللغة الافتراضية. يصبح /about إنجليزياً ويبقى /de/about ألمانياً. عندها يفشل كشف اللغة القائم على URL في الكود الخارجي على مسارات اللغة الافتراضية لأنه لا يرى رمزاً. إذا استخدمت هذا الخيار، اعتمد على pll_current_language() بدلاً من تحليل URL.

3. النطاق الفرعي (en.example.com وde.example.com)

النطاقات الفرعية تمنح كل لغة مضيفها الخاص ومساحة ذاكرة تخزين مؤقت مستقلة. تُحمَّل مشغّلات الصوت بشكل نظيف لكل لغة. الثمن هو إعداد DNS وشهادات SSL لكل نطاق فرعي وتحليلات أكثر تعقيداً بقليل. يعمل بكفاءة على نطاق واسع.

4. نطاقات منفصلة لكل لغة

فصل كامل. example.com للإنجليزية وexample.de للألمانية. لا يزال تحويل النص إلى كلام يربط الصوت بمعرّف المنشور داخل كل تثبيت WordPress، ويعمل المشغّل بنفس الطريقة. هذا النمط شائع للعلامات التجارية التي تمتلك نطاقات ccTLD.

مشكلة إعادة التوجيه عبر ملفات تعريف الارتباط

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

هذا هو تسلسل الفشل الذي أعدنا إنتاجه. يصل زائر فرنسي إلى الصفحة الرئيسية. يكتشف Polylang الفرنسية، يضع ملف تعريف الارتباط pll_language، ويعيد التوجيه إلى /fr/. تخزّن ذاكرة التخزين المؤقت استجابة إعادة التوجيه تلك تحت عنوان URL الصفحة الرئيسية. الزائر التالي، وهو ناطق بالإنجليزية، يطلب الصفحة الرئيسية ويحصل على إعادة التوجيه المخزّنة إلى /fr/. يصل إلى الصفحة الفرنسية، يسمع الصوت الفرنسي، ويغادر.

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

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

إذا كنت تستخدم WP Rocket أو W3 Total Cache أو LiteSpeed، راجع توثيق تكامل التخزين المؤقت لإعداد ملفات تعريف الارتباط. يعمل Polylang جانباً إضافات التخزين المؤقت هذه، لكن التعايش معها لا يعني الوعي باللغة تلقائياً. لا تزال بحاجة لضبط إعدادات ذاكرة التخزين المؤقت بنفسك.

سلوك AJAX في الواجهة الأمامية

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

في اختباراتنا، تعامل Polylang مع هذا بشكل نظيف. لم نرَ تراجعات لغة AJAX التي وثّقناها في مقال WPML. إذا كان تكامل مخصص يحتاج لجلب منشور بلغة غير الحالية، مرّر lang بشكل صريح وتحقق من وجود function_exists('pll_current_language') قبل قراءة النتيجة.

إعداد TTSWP - تحويل النص إلى كلام على موقع Polylang

تفترض هذه الخطوات أن Polylang مثبّت مسبقاً وأن ترجمة واحدة على الأقل موجودة.

  1. ثبّت TTSWP - تحويل النص إلى كلام من صفحة الإضافة على WordPress.org. فعّلها. راجع توثيق التثبيت إذا واجهت خطأ في الصلاحيات.
  2. اربط الإضافة بـ TTSWP باتباع دليل الربط. الخطة المجانية تشمل رصيداً ترحيبياً يمكنك الاختبار به قبل اختيار خطة مدفوعة.
  3. افتح المنشور بلغته الأصلية وولّد الصوت. تأكد من ظهور المشغّل في الواجهة الأمامية.
  4. انتقل إلى النسخة المترجمة عبر محوّل لغة Polylang في محرر المنشور. ولّد الصوت مجدداً. حمّل Polylang معرّف منشور مختلف، لذا يعامله TTSWP كتوليد جديد ويخزّن ملفاً منفصلاً.
  5. اختر الصوت لكل ترجمة. يتم اختيار الصوت على مستوى المنشور. راجع توثيق اختيار الصوت للتجاوز على مستوى المنشور.
  6. تحقق في الواجهة الأمامية. افتح /en/post-slug و/de/post-slug في علامتَي تبويب مختلفتين. شغّل كلاً منهما. يجب أن تتطابق الأصوات واللغات.

حالياً، تغطي خاصية تعيين الصوت الافتراضي لكل لغة في TTSWP WPML وWeglot أولاً. في Polylang، يتم اختيار الصوت على مستوى المنشور ويعمل الافتراضي لكل لغة عبر آلية التقاط لغة المنشور التي نصفها أدناه. لمعظم مواقع Polylang هذا كافٍ، لأن كل ترجمة منشور حقيقي والصوت يُضبط مرة واحدة لكل منشور. راجع توثيق تكامل Polylang للسلوك الحالي.

محرر منشور WordPress يظهر محوّل لغة Polylang ولوحة صوت TTSWP جنباً إلى جنب
كل ترجمة في Polylang منشور مستقل، لذا يتم توليد الصوت واختياره لكل ترجمة على حدة.

كيف يجب أن يقرأ اختيار الصوت لغة المنشور

الواجهة البرمجية الصحيحة لقراءة لغة المنشور في Polylang هي pll_get_post_language(). تحقق دائماً من وجود الدالة قبل استدعائها، كما توصي إرشادات Polylang للمطورين. النمط يبدو هكذا:

if ( function_exists( 'pll_get_post_language' ) ) {
    $lang = pll_get_post_language( $post_id, 'slug' );
    // $lang is now 'en', 'de', 'fr', etc.
}

في سياق الواجهة الأمامية، تُعيد pll_current_language() لغة الطلب الحالية. الدالتان مستقرتان وجزء من الواجهة البرمجية العامة لـ Polylang منذ سنوات. يجب أن تقرأ منطقية تعيين الصوت دائماً من لغة المنشور، لا من الإعدادات الافتراضية للموقع، وإلا ستَرث الترجمات الصوت الخاطئ.

Polylang المجاني مقابل Polylang Pro لتحويل النص إلى كلام

لا شيء في Polylang Pro ضروري للصوت. النسخة المجانية من Polylang تمنح TTSWP كل ما يحتاجه: تكرار المنشورات، ورموز اللغة، والدوال العامة أعلاه.

يضيف Polylang Pro ترجمة آلية عبر DeepL ودعم REST API ورموز URL مترجمة وتصدير XLIFF للترجمة الخارجية. لا شيء من هذا يغير صورة تحويل النص إلى كلام للمدونات والصفحات. Polylang for WooCommerce إضافة مدفوعة منفصلة تدير صفحات المتجر وفئات المنتجات والسمات والرسائل البريدية التجارية. إذا أردت الصوت على أوصاف المنتجات، راجع دليل تحويل النص إلى كلام لـ WooCommerce.

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

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

في اختباراتنا الخاصة، تُستشهد المقالات التي تحتوي على صوت ومخطط AudioObject بكثرة أكبر من قِبل محركات البحث المدعومة بالذكاء الاصطناعي. وثّقنا الطريقة والنتائج في مقال AEO والصوت. الخلاصة: ملف صوتي واحد لكل ترجمة، ومخطط لكل ترجمة، وتأتي فائدة AEO تلقائياً.

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

الأعراضالسبب المحتملالحل
الترجمة تُشغَّل بصوت خاطئالصوت مضبوط عالمياً لا على مستوى المنشورافتح المنشور المترجم، اضبط الصوت عليه، ثم أعد التوليد
لغة واحدة بدون صوتلم يتم توليد الصوت لتلك الترجمة قطافتح المنشور المترجم في المحرر واضغط توليد
الصفحة المخزّنة مؤقتاً تعرض مشغّل لغة خاطئةذاكرة التخزين المؤقت تخزّن إعادة توجيه الاكتشاف أو نسخة لغة واحدةعطّل كشف لغة المتصفح، أو اضبط ذاكرة التخزين المؤقت لتتغير استناداً إلى ملف تعريف الارتباط pll_language
تخطيط مشغّل العربية أو العبرية يبدو خاطئاًلم يُطبَّق CSS للكتابة من اليمين إلى اليسار على المشغّلأضف تجاوزات RTL عبر CSS مخصص
نصوص واجهة المشغّل تبقى باللغة الافتراضيةنصوص الإضافة غير مسجّلة للترجمةسجّل نصوص المشغّل بـ pll_register_string حتى يعرضها Polylang في شاشة ترجمة النصوص
الصوت يُولَّد باللغة الافتراضية لجميع المنشوراتمنطقية تعيين الصوت تقرأ لغة الموقع بدلاً من لغة المنشورتحقق من لغة المنشور عبر pll_get_post_language($post_id, 'slug')
رسم توضيحي لثلاثة مسارات لغوية بمفتاح ذاكرة تخزين مؤقت وملف صوتي مستقل لكل منها، بما فيها تخطيط RTL للعربية
مسارات المجلدات تمنح كل ترجمة مفتاح ذاكرة تخزين مؤقت خاصاً بها، مما يمنع ظهور الصوت الخاطئ على الصفحة الخاطئة.

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

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

أسئلة شائعة

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

نعم. يخزّن Polylang كل ترجمة كمنشور WordPress مستقل بمعرّفه الخاص، وهي نفس البنية التي يستخدمها TTSWP لتوليد الصوت على مستوى المنشور. ولّد الصوت على كل ترجمة وستحصل على ملف واحد لكل لغة بالصوت الذي اخترته. النسخة المجانية من Polylang كافية. لا يلزم أي إعداد خاص إضافة للإعداد القياسي لـ TTSWP.

هل أحتاج Polylang Pro للصوت؟

لا. تُتيح النسخة المجانية من Polylang كل ما يحتاجه TTSWP: تكرار المنشورات لكل لغة، ورموز اللغة، والدوال العامة pll_get_post_language() وpll_current_language(). يضيف Polylang Pro ترجمة آلية عبر DeepL ودعم REST API ورموز URL مترجمة. لا شيء من هذا يغير طريقة عمل توليد الصوت أو تشغيله.

هل يمكن أن تكون لكل لغة صوتها الخاص؟

نعم. بما أن كل ترجمة منشور مستقل، يتم اختيار الصوت على مستوى المنشور. اختر صوتاً ألمانياً للترجمة الألمانية، وصوتاً إسبانياً للترجمة الإسبانية، وهكذا. يحفظ TTSWP الاختيار لكل منشور ويستخدمه في كل مرة تُعيد فيها التوليد. راجع توثيق تعيين اللغة والصوت للسلوك الحالي.

لماذا يُشغَّل الصوت بلغة خاطئة؟

السبب المعتاد هو التخزين المؤقت للصفحات مقترناً بكشف لغة المتصفح في Polylang. تخزّن ذاكرة التخزين المؤقت إعادة توجيه الصفحة الرئيسية أو نسخة لغة واحدة وتقدّمها للجميع. الملف الصوتي نفسه صحيح لمعرّف المنشور. الصفحة التي تحمّله ليست كذلك. عطّل كشف المتصفح على المواقع التي تستخدم التخزين المؤقت، أو أخبر إضافة التخزين المؤقت بأن تتغير استناداً إلى ملف تعريف الارتباط pll_language. مسارات المجلدات (/en/ و/de/) تحصر الضرر في الصفحة الرئيسية لأن كل صفحة أخرى لها مفتاح ذاكرة تخزين مؤقت مميز.

كيف يختلف Polylang عن WPML في تحويل النص إلى كلام؟

كلاهما يُكرّر المنشورات لكل لغة، لذا يعمل الصوت على مستوى المنشور بنفس الطريقة في الحالتين. الفروق في معالجة AJAX وسلوك ملفات تعريف الارتباط وأسماء الواجهة البرمجية للمطورين. يستخدم Polylang دوالاً بادئة pll_ وهو أخف عموماً. WPML يمتلك مزيداً من ميزات WooCommerce المدمجة لكن بحجم إضافة أكبر. مقال WPML يغطي تلك الجوانب.

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

نعم، مع خطوة إضافية واحدة. يُتيح Polylang شاشة ترجمة النصوص للإضافات التي تسجّل نصوص واجهتها بـ pll_register_string(). إذا أردت أن يتغير زر التشغيل ونص مؤشر الوقت وأي نص آخر في المشغّل مع تغيير اللغة، سجّل تلك النصوص في قالبك الفرعي أو إضافة صغيرة خاصة بالموقع. ستظهر بعدها في القائمة: اللغات، ترجمة النصوص.

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

افتح أحد منشوراتك المترجمة في محرر WordPress وانظر إلى لوحة الصوت. إذا كانت تعرض اللغة الصحيحة افتراضياً، فالإعداد مكتمل. إذا لم يكن كذلك، اضبط الصوت على تلك الترجمة وأعد التوليد وتحقق من الواجهة الأمامية. بمجرد أن تعمل ترجمة واحدة، تتبع البقية النمط ذاته.

إذا لم تثبّت TTSWP - تحويل النص إلى كلام بعد، احصل عليه من WordPress.org واربطه بحسابك المجاني في TTSWP. اختبر على ترجمة واحدة، استمع، وقرر ما إذا كنت تريد تعميمه على بقية المحتوى.