تعمل بعض الأمور بشكل مختلف في أي موقع متعدد اللغات عن قصد: دالة WordPress تعتمد على مصطلح باللغة الافتراضية، لاحقة تاريخ لا يستطيع WordPress أقلمتها، معرّف نصي للرابط لا يبتكره محرر الترجمة المتقدم. تطرح استفسارات الدعم هذه الأمور على أنها أخطاء؛ ولكنها ليست كذلك. تشرح هذه الصفحة ما يحدث، ولماذا، وما يجب فعله بدلاً من ذلك.
has_category() وعلامات شرطية أخرى في المقالات المترجمة
لا يقوم WPML بتصفية has_category() في نواة WordPress، عن قصد. في الترجمة، يكون التصنيف هو المصطلح المترجم، والذي يمتلك المعرّف النصي للرابط الخاص به، لذا تكون قيمة has_category('news') خاطئة (false) في المقالة الفرنسية حتى وإن كانت المقالة الفرنسية ضمن التصنيف الفرنسي «news». ينطبق الأمر ذاته على has_term() وin_category() وأي كود يقارن معرّفاً نصياً للرابط أو معرّف مصطلح (term id) باللغة الافتراضية. استدعِ الدالة الشرطية باستخدام المعرّف النصي للرابط المترجم، أو استخرج معرّف المصطلح من خلال المرشِّح wpml_object_id أولاً.
ما تراه
دالة WordPress الأصلية has_category لا تعمل مع المقالات المترجمة.
مثال على ذلك كما يلي:
- لدينا تصنيف بالمعرّف النصي للرابط الإنجليزي «test» وترجمته الفرنسية «test-fr».
- يتم تعيين هذا التصنيف للمقالات.
- عند استدعاء
has_category("test")داخل حلقة في ملف single.php الخاص بقالبك، فإنها تُرجع true للغة الافتراضية ولكنها تُرجع false للترجمة.
ما يجب فعله
عرّف مرشِّحاً جديداً في ملف functions.php الخاص بقالبك:
function wp_has_category ($category) {
$category = get_term_by('name', $category, 'category');
return has_category($category);
}
add_filter('wp_has_category', 'wp_has_category', 10, 1);استبدل دالة has_category بهذا المرشِّح الجديد:
apply_filters( 'wp_has_category', 'test' )
يأخذ هذا المرشِّح التصنيف المترجم بناءً على اسم التصنيف الأصلي ويتحقق مما إذا كان التصنيف المترجم معيناً لمقالة.
المرجع: wpmlcore-3024.
لواحق التاريخ (1st, 2nd, 3rd) غير قابلة للترجمة
يُعد هذا قيداً في نواة WordPress، وليس في WPML: تأتي اللاحقة من تنسيق التاريخ في PHP ولا تمر أبداً عبر دالة ترجمة.
ما تراه
تستخدم بعض القوالب أو الإضافات دوال WordPress مثل wp_date() أو date_i18n() لعرض التواريخ. قد تستخدم هذه التواريخ لاحقة مثل 1st أو 26th، بناءً على المعلمات المحددة.
في الوقت الحالي، لا يمكن ترجمة لواحق التاريخ بسبب قيد معروف منذ فترة طويلة في نواة WordPress.
ما يجب فعله
كحل بديل مؤقت، يمكنك استخدام المرشِّح wp_date للحصول على التاريخ، ثم تعديل اللاحقة قبل عرضها في الصفحة. يُرجى إنشاء نسخة احتياطية كاملة لموقعك قبل المتابعة واتباع الخطوات أدناه:
- أضف مرشِّح
wp_dateصغيراً إلى ملف functions.php الخاص بقالبك والذي يسجل كل لاحقة كسلسلة نصية (icl_register_string) ويُرجع ترجمتها (icl_t) بدلاً من اللاحقة الإنجليزية: - افتح الصفحة التي تُعرض فيها التواريخ. سيؤدي هذا إلى تنفيذ المرشِّح المضاف.
- اذهب إلى WPML → ترجمة النصوص وترجم التواريخ.
- ستحتاج إلى ترجمة كل لاحقة على حدة (مثل 1st، 2nd…) لأنها قد تتغير بناءً على اللغة.
المرجع: compsupp-5773.
محرر الترجمة المتقدم لا يبتكر معرّفاً نصياً للرابط
يترجم المحرر حقل المعرّف النصي للرابط عندما تملأه، ويحتفظ بالمعرّف النصي للرابط الأصلي عندما تتركه فارغاً. ولا يستنبط أبداً معرّفاً نصياً للرابط من العنوان المترجم بمفرده.
ما تراه
إذا ترجمت مقالة باستخدام محرر الترجمة المتقدم الخاص بنا، فلن يُملأ حقل المعرّف النصي للرابط تلقائياً. وإذا قررت بعد ذلك ترك حقل المعرّف النصي للرابط فارغاً، فإنه يحمّل المعرّف النصي للرابط للغة الأصلية في المقالة المترجمة.
المرجع: wpmlsupp-8574.
أكواد أداة بناء الصفحات المختصرة في الوصف القصير لمنتج WooCommerce
الوصف القصير هو مقتطف المقالة، وهو حقل نص عادي بحسب تعريف WordPress، لذا لا يحلل WPML أكواد أداة بناء الصفحات المختصرة فيه كما يفعل في المحتوى. يصادف أن WooCommerce يعرضها، وهذا هو سبب مفاجأة الناس من هذا التباين.
ما تراه
يعتمد الوصف القصير لمنتج WooCommerce على حقل مقتطف المقالة، وهو عادةً حقل نص بسيط لا يعالج الأكواد المختصرة. بناءً على ذلك، ليس من المتوقع أن تعمل أكواد أداة بناء الصفحات المختصرة إذا قمت بلصقها في مقتطف المقالة، وعند ترجمة مقتطفات المقالات، لا يحاول WPML التعامل مع هذه الأكواد المختصرة.
لكن WooCommerce يعالج هذه «المقتطفات» بشكل مختلف قليلاً، وتعمل الأكواد المختصرة بالفعل، لكن WPML لا يزال يتصرف كما لو أنها لا تعمل، وإذا كان الكود المختصر يتضمن سمات تحتاج إلى ترجمة أو روابط داخلية يجب التعامل معها تلقائياً، فلن يكون ذلك ممكناً بسهولة.
ما يجب فعله
لقد أعددنا كوداً يمكن إضافته كإضافة لتوفير هذه الوظيفة. انسخ الكود أدناه والصقه في ملف يمكنك تسميته wpmlpb-excerpts.php واحفظه في دليلك wp-content/plugins/، ثم فعّل الإضافة.
<?php
/**
* Plugin Name: WPML Page Builders - Proces Excerpts
* Description: Parses shortcode strings in exceprts.
* Version: 1.0
*/
namespace WPMLPB686;
( new Excerpts() )->add_hooks();
class Excerpts {
const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
const SEPARATOR_END = '<!--WPML_EXCERPT_END-->';
public function add_hooks() {
add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
}
public function joinWithContent( $content, $id ) {
$post = get_post( $id );
if ( $post && $post->post_excerpt ) {
$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
}
return $content;
}
public function excludeFromJob( $package, $post ) {
if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
$package['contents']['excerpt']['translate'] = 0;
$package['contents']['excerpt']['data'] = '';
}
return $package;
}
public function splitFromContent( $post_id ) {
$post = get_post( $post_id );
if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
$end_pos = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );
if ( false !== $end_pos ) {
$content = substr( $post->post_content, 0, $start_pos );
$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );
if ( $excerpt ) {
wp_update_post(
[
'ID' => $post_id,
'post_content' => $content,
'post_excerpt' => $excerpt,
]
);
}
}
}
}
}
المرجع: wpmlpb-686.
نطاق مختلف لكل لغة على استضافة WordPress.com
يربط WordPress.com نطاقاً واحداً بموقع واحد؛ ويحتاج تنسيق URL «نطاق مختلف لكل لغة» إلى أن يصل كل نطاق لغة إلى نفس موقع WordPress، وهو ما لا توفره هذه الاستضافة.
ما تراه
بسبب القيود المفروضة على كيفية عمل ربط النطاقات مع WordPress.com، لا يمكن اختيار إعداد عناوين URL للغات لاستخدام نطاق مختلف لكل لغة عندما تتم استضافة المواقع لديهم.
ما يجب فعله
يمكن استخدام أي من خيارات عناوين URL الأخرى للغات، مثل لغات مختلفة في أدلة أو اسم اللغة مضاف كمعلمة، بدلاً من نطاق مختلف لكل لغة.
ستكون هناك حاجة إلى استضافة مختلفة إذا كان خيار نطاق مختلف لكل لغة يُعد مطلباً أساسياً.
المرجع: wpmltriage-2045.
الترجمات المستوردة ومحرري الترجمة
تقوم عملية الاستيراد بكتابة ترجمات منتهية؛ ولا تُنشئ مهام ترجمة، بينما يعمل المحررون بناءً على المهام. تكتمل الترجمات في الواجهة الأمامية وتكون ببساطة غير قابلة للتعديل في محرر الترجمة المتقدم أو محرر الترجمة الكلاسيكي.
ما تراه
كلما قمت باستيراد محتوى باستخدام WP All Import وملحق WPML All Import، سترى ترجمات المقالات المستوردة بشكل مثالي في الواجهة الأمامية. ومع ذلك، ستواجه مشاكل إذا حاولت تحديثها باستخدام محرري الترجمة في WPML:
- يعرض محرر الترجمة الكلاسيكي المحتوى باللغة الافتراضية بدلاً من الترجمات المستوردة
- يعرض محرر الترجمة المتقدم ترجمات فارغة
يرجع ذلك إلى أنه عند استيراد محتوى متعدد اللغات، لا يُنشئ WPML مهام ترجمة، وهي ضرورية لتقسيم السلاسل النصية.
ما يجب فعله
لتعديل ترجماتك المستوردة أو تحديثها، يُرجى التبديل إلى محرر WordPress الأصلي واستخدام الترجمة اليدوية.
المرجع: WPMLAI-168.