المطابقة في الجنس
تصرّف بعض اللغات الأفعال والصفات بحسب جنس الشخص الذي تتحدث عنه الجملة. أما الإنجليزية فلا تفعل ذلك في الغالب، لذا فالعبارة التي تكتبها بصيغة {username} has been invited هي جملة واحدة في الإنجليزية، وجملتان أو ثلاث في الإسبانية أو الفرنسية أو الروسية. يتولى Langsys ذلك أثناء الترجمة — بالطريقة نفسها التي يولّد بها صيغ الجمع — وأنت تمرّر وسيطًا واحدًا فقط.
ما ينتجه خط المعالجة
عندما تتطلب اللغة المستهدفة مطابقة نحوية، يعيد Langsys كتابة نص تلك اللغة إلى الفروع التي يحتاجها — أي ICU select. لا تتغير عبارتك المصدر أبدًا، ولا تكتب الفروع يدويًا أبدًا.
// Your source phrase, unchanged:
"{username} has been invited"
// What the Spanish translation becomes — note invitado / invitada:
"{username_gender, select, male {{username} ha sido invitado} \
female {{username} ha sido invitada} \
other {{username} ha sido invitado/a}}" هناك نتيجتان تستحقان الانتباه. يُسمّى المعامل باسم المتغير الذي يتصرّف معه مع إلحاق _gender به — فالمتغير {username} يمنحك username_gender — وتكون الفروع دائمًا male وfemale وother. كما يظهر فقط في اللغات التي تحتاج إليه: ولا يتضح ذلك إلا عندما يحمّل أحدهم التطبيق بلغة تميّز بين الجنسين.
تمريره
مرّر الوسيط متى عرفته، ليحصل القارئ على جملة مصرَّفة تصريفًا صحيحًا:
// The argument is named after the variable it inflects, + _gender.
// Branches are always male / female / other.
t('{username} has been invited', 'Team', {
username: user.name,
username_gender: user.gender ?? 'other',
}); لا تعرف الجنس؟ مرّر 'other' صراحةً — فهو الفرع المحايد. وما يُعرض عند غياب الوسيط يختلف باختلاف SDK؛ وتوضح كل صفحة SDK ذلك. كما تعرض كل صفحة SDK الاستدعاء بأسلوبها الخاص.
أي العبارات تحتاج إليها؟
لا يمكنك معرفة ذلك من شيفرتك البرمجية، وهذا أمر طبيعي: فالوسيط يُضاف أثناء الترجمة لكل لغة مستهدفة، ولذلك لا يوجد في العبارة المصدر أو في قاعدة شيفرتك ما يدل عليه. وهناك ثلاث طرق لمعرفته.
اقرأ الكتالوج. الترجمات التي يجلبها تطبيقك هي النصوص المُعتمدة، ولذلك فالإجابة موجودة بالفعل لدى العميل. اسحب الكتالوج للغة محلية تدعمها — فكل حزمة SDK توفّره — وابحث عن الإدخالات التي تحتوي على , select,. سيعطيك ذلك العبارات وأسماء المعاملات بدقة، وهو خفيف بما يكفي لتشغيله ضمن CI على كل لغة محلية تصدرها.
// The catalog your app fetches IS the promoted strings — grep it.
const wanting = Object.entries(catalog)
.filter(([, translation]) => translation.includes(', select,'))
.map(([phrase]) => phrase);
// → every phrase (and, from the string, every argument) this locale needs فعّل التصحيح (حزم JavaScript SDK). مرّر debug: true في إعدادات التهيئة وتصفّح التطبيق بلغة محلية تراعي الجنس النحوي: ستسجّل الحزمة تحذير Langsys Warning واحدًا لكل عبارة تتطلب ترجمتها وسيطًا لم تمرّره، مع ذكر اسم الوسيط. يحدث ذلك مرة واحدة لكل عبارة ولكل لغة محلية، ويكون صامتًا في الإنتاج. ملاحظة: داخل مكوّنات كتلة المحتوى والعبارة، يُبلَّغ عن _gender الممرَّر احترازيًا بوصفه معاملًا غير مطابق، لأن الفحص يجري على النص المصدر — حيث لا يظهر select أبدًا.
عند الشك، مرّره. القيمة المرسلة لوسيط لا يوجد في النص تُتجاهل وقت العرض، لذا فإرسال _gender لكل متغير يخص شخصًا أمر آمن، ويغطي اللغات التي لم تطّلع عليها بعد.
متغير واحد لكل عبارة. لا يمكن إلا لمتغير واحد أن يتحكم في المطابقة. أما النص الذي يحتوي على متغيرين، كالعدد والجنس معًا، فيُترك دون تغيير بدلاً من تحويله إلى ICU متداخل، ولذلك يُترجم كجملة مسطحة واحدة.