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

يحتاج المستخدمون إلى ترجمة السلاسل النصية واحدة تلو الأخرى، بدون خيار الترجمة التلقائية.
تعرّف على كيفية إنشاء حزم السلاسل النصية لإضافاتك وقوالبك لمساعدة المستخدمين على ترجمة المحتوى بسهولة باستخدام WPML.
حزم السلاسل النصية هي مجموعات من السلاسل النصية «المجمعة» معاً في سياق محدد. الغرض منها هو مساعدة المستخدمين النهائيين على ترجمة المحتوى بكفاءة أكبر من خلال التخلص من الحاجة إلى ترجمة كل سلسلة نصية على حدة.
على سبيل المثال، إليك كيفية قيام المستخدمين بترجمة حقول المستخدم المخصصة، مع وبدون حزمة سلاسل نصية:
كما ترى، تبسّط حزم السلاسل النصية عملية الترجمة من خلال السماح للمستخدمين بترجمة حقول مستخدم مخصصة متعددة في وقت واحد. لتزويد مستخدميك بأفضل تجربة ترجمة، اتبع الخطوات أدناه لإنشاء حزم السلاسل النصية الخاصة بك.
إذا كنت ترغب في رؤية التنفيذ الكامل لحزمة السلاسل النصية الذي نغطيه في الخطوات أدناه، فتحقق من مستودع GitHub (يفتح في علامة تبويب جديدة) هذا الذي يحتوي على إضافة الاختبار التي استخدمناها.
الخطوة الأولى هي تحديد المحتوى الذي سيرغب المستخدمون في ترجمته، مثل العناوين والتسميات والمحتوى الذي ينشئه المستخدم.
بعد ذلك، تحتاج إلى الإعلان عن نوع الحزمة. تساعد هذه الخطوة 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 للحزم.
بعد ذلك، تحتاج إلى إنشاء حزمة وتسجيل السلاسل النصية التي ستقوم بتجميعها باستخدام الخطّاف 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 لعرض الكائن.
أخيراً، لعرض الترجمات في الواجهة الأمامية، تحتاج إلى استخدام الخطّاف 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 بهذه التغييرات، قم بتغليف كود التسجيل الخاص بك بوظيفتين:
wpml_start_string_package_registration (يفتح في علامة تبويب جديدة)wpml_delete_unused_package_strings (يفتح في علامة تبويب جديدة)
$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 );