WPML

تعرّف على كيفية إنشاء حزم السلاسل النصية لإضافاتك وقوالبك لمساعدة المستخدمين على ترجمة المحتوى بسهولة باستخدام WPML.

حزم السلاسل النصية هي مجموعات من السلاسل النصية «المجمعة» معاً في سياق محدد. الغرض منها هو مساعدة المستخدمين النهائيين على ترجمة المحتوى بكفاءة أكبر من خلال التخلص من الحاجة إلى ترجمة كل سلسلة نصية على حدة.

على سبيل المثال، إليك كيفية قيام المستخدمين بترجمة حقول المستخدم المخصصة، مع وبدون حزمة سلاسل نصية:

بدون حزمة سلاسل نصية

الحقول الأربعة كسلاسل نصية منفصلة، في WPML → الترجمات → السلاسل
الحقول الأربعة كسلاسل نصية منفصلة، في WPML → الترجمات → السلاسل

يحتاج المستخدمون إلى ترجمة السلاسل النصية واحدة تلو الأخرى، بدون خيار الترجمة التلقائية.

مع حزمة سلاسل نصية

نفس الحقول الأربعة كحزمة واحدة، في لوحة إدارة الترجمة
نفس الحقول الأربعة كحزمة واحدة، في لوحة إدارة الترجمة

يمكن للمستخدمين ترجمة سلاسل نصية متعددة معاً دفعة واحدة، مع خيار الترجمة التلقائية.

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

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

1. تحديد المحتوى القابل للترجمة

الخطوة الأولى هي تحديد المحتوى الذي سيرغب المستخدمون في ترجمته، مثل العناوين والتسميات والمحتوى الذي ينشئه المستخدم.

2. الإعلان عن نوع الحزمة

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

للمقارنة، يعمل هذا المرشِّح لحزم السلاسل النصية تماماً كما يعمل المرشِّح register_post_types لأنواع المنشورات.

للإعلان عن نوع الحزمة، استخدم المرشِّح wpml_active_string_package_kinds (يفتح في علامة تبويب جديدة):

define( 'FOO_USER_FIELD_PACKAGE_KIND_TITLE', 'OTGS Foo User Fields' );

define( 'FOO_USER_FIELD_PACKAGE_KIND_SLUG', 'otgs-foo-user-fields' );

add_filter( 'wpml_active_string_package_kinds', function( $kinds ) {

   $kinds[ FOO_USER_FIELD_PACKAGE_KIND_SLUG ] = [

            'title'  => FOO_USER_FIELD_PACKAGE_KIND_TITLE,

            'slug'   => FOO_USER_FIELD_PACKAGE_KIND_SLUG,

            'plural' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,

    ];

    return $kinds;

} );
تعريف الوسائط

title – عنوان النوع، يجب أن يكون نفس النوع للحزم.
plural – صيغة الجمع للعنوان.
slug – المعرّف النصي للرابط الخاص بالنوع، يجب أن يكون نفس kind_slug للحزم.

3. إنشاء حزمة وتسجيل السلاسل النصية

بعد ذلك، تحتاج إلى إنشاء حزمة وتسجيل السلاسل النصية التي ستقوم بتجميعها باستخدام الخطّاف wpml_register_string (يفتح في علامة تبويب جديدة):

$userId = 123;

$user   = get_user_by( 'id', $userId );

$package = [

    'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

    'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

    'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

    'title'     => $user->display_name, // The title for the package entity inside the "kind" namespace.

];

$fooUserFields = get_option( 'otgs_foo_user_fields' );

foreach ( $fooUserFields as $fooUserField ) {

$fieldValue = get_user_meta( $userId, $fooUserField, true );

do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );

}
تعريف الوسائط

$kind – تسمية مساحة الاسم للكيان (مثل Gravity Forms).
$kind_slug – المعرّف النصي للرابط لمساحة الاسم للكيان (مثل gravity-form). إذا كان مفقوداً، فسيكون نسخة المعرّف النصي للرابط من «النوع».
$name – المعرّف الفريد للكيان داخل النوع، يمكن أن يكون سلسلة نصية (مثل المعرّف النصي للرابط) أو عدداً صحيحاً (مثل المعرّف ID).
$title – عنوان الكيان داخل النوع. يوصى باستخدام عنوان الكيان الحقيقي.

على الرغم من أنه ليس ضرورياً، يمكنك أيضاً تضمين وسيطتين إضافيتين:
$edit_link – عنوان URL لتعديل الكائن.
$view_link – عنوان URL لعرض الكائن.

4. استرداد الترجمات

أخيراً، لعرض الترجمات في الواجهة الأمامية، تحتاج إلى استخدام الخطّاف wpml_translate_string (يفتح في علامة تبويب جديدة):

$userId = 123;

$user   = get_user_by( 'id', $userId );

$package = [

        'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

        'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

        'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

        'title'     => $user->display_name, // The title for the package entity inside the "kind" namespace.

];

$fooUserFields = get_option( 'otgs_foo_user_fields' );

$translatedFieldValues = [];

foreach ( $fooUserFields as $fooUserField ) {

    $fieldValue              = get_user_meta( $userId, $fooUserField, true );

    $translatedFieldValues[ $fooUserField ] = apply_filters( 'wpml_translate_string', $fieldValue, sanitize_key( $fooUserField ), $package );

}

تحديث وإزالة السلاسل النصية

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

$userId = 123;

$package = [

        'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

        'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

        'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

        // The 'title' key is not not required in the "translate" context.

];

do_action( 'wpml_start_string_package_registration', $package );

$fooUserFields = get_option( 'otgs_foo_user_fields' );

foreach ( $fooUserFields as $fooUserField ) {

    $fieldValue = get_user_meta( $userId, $fooUserField, true );

    do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );

}

do_action( 'wpml_delete_unused_package_strings',$package );

حذف حزم السلاسل النصية

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

لإزالة حزمة سلاسل نصية، اربطها بإجراء مناسب داخل إضافتك أو قالبك واستدعِ الوظيفة wpml_delete_package (يفتح في علامة تبويب جديدة):

$userId = 123;

do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_SLUG );

موارد إضافية

  • ملف تكوين لغة WPML – دليل حول استخدام wpml-config.xml، وهو الملف الذي يشير إلى النصوص التي يجب على WPML ترجمتها في الإضافات والقوالب.
  • Multilingual Tools – أداة لاختبار إعداد التكوين الخاص بك وتأكيد التوافق مع WPML.

بقلمAmir