إتاحة لغات متعددة باستخدام "ترجمة Google"

باستخدام ميزتَي "الرسائل التجارية" و"ترجمة Google" الذكية والمبرمَجة، يمكنك توسيع نطاق وصولك إلى موظّفي الدعم من خلال التواصل مع المستخدمين بلغتهم المفضّلة. يشرح لك هذا البرنامج التعليمي عملية دمج مفهوم "ترجمة Google" مع الردّ التلقائي على الويب لميزة "الرسائل التجارية".

المتطلبات

للبدء، عليك تحضير بعض العناصر التالية:

الحصول على الرمز‏

يرشدك هذا البرنامج التعليمي إلى نموذج رمز الرد التلقائي على الويب الذي يتكامل مع خدمة "ترجمة Google". للحصول على الرمز، يمكنك نسخ المستودع من GitHub:

git clone https://github.com/google-business-communications/bm-nodejs-translation-tutorial

انتقِل إلى الدليل الذي تم نسخه وأدخِل مفتاح حساب الخدمة في دليل الموارد:

cp credentials.json bm-nodejs-translation-sample/resources/bm-agent-service-account-credentials.json

ملاحظة: إذا كنت بحاجة إلى مساعدة بشأن إعداد مفتاح الخدمة أو تنزيله، يمكنك الاطّلاع على دليل Google Cloud لإدارة حسابات الخدمة.

وبعد إجراء ذلك، يمكنك نشر الرمز:

gcloud app deploy

أرسِل بعض الرسائل إلى موظّف الدعم باستخدام جهازك الجوّال. حاول إرسال رسائلك بلغات مختلفة لمعرفة ما يحدث.

إعداد واجهة برمجة تطبيقات "ترجمة Google"

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

لاستخدام واجهة برمجة تطبيقات "ترجمة Google"، عليك استيراد المكتبة وإنشاء عميل API للترجمة. افتح الملف routes/index.js. الأسطر ذات الصلة هي:

// Import the Translate API library.
const { Translate } = require("@google-cloud/translate").v2;
// Create a new Translate API client.
const translate = new Translate();

من الآن فصاعدًا، يمكنك الوصول إلى طرق واجهة برمجة تطبيقات "ترجمة Google" في عنصر الترجمة.

اطّلِع على المتغيّرات التي تم إنشاؤها بالقرب من أعلى الملف:

const SERVER_LANGUAGE = "en";
let currentLanguage = SERVER_LANGUAGE;

يخزّن نموذج الرمز لغة الخادم لأنّها ثابتة نسبيًا. ويمكن أن تتغير اللغة الحالية للمحادثة، لذا يتم تتبّعها في المتغيّر currentLanguage.

اكتشاف اللغة الواردة

يرصد نموذج الرمز ما إذا كانت اللغة الواردة قد تغيّرت، ويطلب من المستخدم اختيار اللغة التي يريد استخدامها في المحادثة إذا كان الأمر كذلك. جرّب هذه الميزة على جهازك الجوّال عن طريق كتابة رسالة إلى موظّف دعم بلغة غير الإنجليزية. إذا لم تكن تعرف أي لغات أخرى، جرِّب كتابة "Hola" (That's Spanish for " Hello"!;).

يردّ موظّف الدعم برسالة تسأله عما إذا كان المستخدم يريد تبديل اللغات. تتضمّن المطالبة الردود المقترحة التي يمكن للمستخدم النقر عليها للتبديل إلى تلك اللغة.

لنلقِ نظرة أولاً على ميزة اكتشاف اللغة.

/**
 * Detects input text language.
 *
 * @param {string} text The text received from the consumer.
 * @param {Context} context The user message request context.
 * @return A Promise with the detected language code.
 */
async function detectLanguage(text, context) {
  return new Promise(function (resolve, reject) {
    translate
      .detect(text)
      .then((result) => {
        if (result && result.length > 0) {
          if (result[0].confidence > CONFIDENCE_THRESHOLD) {
            resolve(result[0].language);
          }
          resolve(bcp47.parse(context.resolvedLocale).language);
        } else {
          reject("No language detected");
        }
      })
      .catch((err) => {
        console.error("ERROR:", err);
        reject(err);
      });
  });
}

تستخدم هذه الطريقة طريقة الاكتشاف على برنامج الترجمة. لأن واجهة برمجة التطبيقات لخدمة "ترجمة Google" قد تكتشف لغات متعددة بمستويات مختلفة من الثقة (وكذلك لأنها تدعم إدخالات متعددة)، تعرض هذه الطريقة مجموعة من النتائج. وحصلت عيّنة البيانات على النتيجة الأولى، وهي تلك التي حصلت على أعلى نسبة ثقة.

استخدام اللغة التي تم حلّها

في بعض الأحيان، لا تتمكن واجهة برمجة تطبيقات "ترجمة Google" من تحديد لغة الرسالة بثقة عالية. على سبيل المثال، إذا كان الهرّ يعمل عبر لوحة المفاتيح وأدخل سلسلة غير مفهومة، ستظل واجهة برمجة تطبيقات "ترجمة Google" تحاول اكتشاف اللغة، ولكن من المحتمل أن تكون اللغة التي تم اكتشافها غير صحيحة. (وعلى الرغم من أنّ تطبيق "ترجمة Google" غير متوافق مع لغات القطط حتى الآن). تشير واجهة برمجة تطبيقات"ترجمة Google"إلى ذلك من خلال ضبط قيمة منخفضة الثقة في نتيجة translate.detect'.

في هذا السيناريو، يعود نموذج الرمز إلى اللغة المتوفّرة في اللغة التي تم تحليلها ضمن ميزة "الرسائل التجارية"، وهي واجهة برمجة التطبيقات الخاصة بخدمة "الرسائل التجارية" والتي تُعد أفضل تخمين في اللغة بناءً على سياق الرسالة. ونظرًا لأن اللغة التي تم حلها بتنسيق BCP-47، يمكنك استخدام حزمة Node.js المقابلة لتحليل رمز اللغة من اللغة.

يمكنك اختبار هذا السلوك من خلال كتابة سلسلة طويلة من هراء إلى الوكيل. في معظم الحالات، من المفترض ألا تظهر لك رسالة تطلب منك تغيير اللغة (ما لم تكن اللغة التي تم حلها مختلفة عن اللغة الحالية). موظّف الدعم هو ببساطة يفهم طلبك.

طلب تغيير اللغة

بعد اكتشاف أنّ اللغة قد تغيّرت، يرسل موظّف الدعم رسالة مطالبة لتغيير اللغة.

if (detectedLanguage != currentLanguage) {
        translateText(
          "Which language would you like to use?",
          SERVER_LANGUAGE,
          currentLanguage
        ).then((normalizedTranslationNotice) => {
          sendResponse(
            normalizedTranslationNotice,
            conversationId,
            [
              ...new Set([detectedLanguage, currentLanguage, SERVER_LANGUAGE]),
            ].map((x) => createSuggestedReply(x))
          );
        });
      }

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

  • اللغة الواردة التي تم رصدها
  • لغة المحادثة الحالية.
  • اللغة المدمَجة في الخادم.

وبما أنّه قد يحدث تداخل بين هذه اللغات الثلاث (على سبيل المثال، إذا كانت اللغة الحالية هي لغة الخادم)، يستخدم الخادم عنصرًا معيّنًا لإزالة النُسخ المكرّرة. بعد ذلك، تنشئ ردًا مقترحًا لكل لغة:

/**
 * Create a suggested reply for a language code.
 * @param {string} languageCode A ISO 6391 language code.
 * @return {Suggestion} The suggestion object for switching to the language.
 */
function createSuggestedReply(languageCode) {
  return {
    reply: {
      text: ISO6391.getNativeName(languageCode),
      postbackData: SWITCH_LANGUAGE_POSTBACK + languageCode,
    },
  };
}

يعرض الرد المُقترَح اسم اللغة بلغتها. على سبيل المثال، تظهر اللغة الإسبانية على النحو التالي: "Español&" للحصول على معلومات حول لغة من رمز اللغة المكوّن من رقمين، يمكنك استخدام مكتبة ISO-639-1 للنطاق Node.js.

لاحظ بيانات الإبلاغ عن الإحالات الناجحة التي يتم إرسالها إلى الخادم عندما ينقر المستخدم على هذا الاقتراح. تخبر بيانات الإبلاغ عن الإحالات الناجحة الخادم بكيفية الاستجابة وتقديم سياق حول الاقتراح.

تُرفق طريقة sendResponse هذه عناصر الاقتراحات بالرد:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

جارٍ تغيير لغة المحادثة

والآن، يُرجى الرجوع إلى جهازك الجوّال ومحاولة النقر على خيار لغة جديد في الإشعار السابق. على سبيل المثال، عند كتابة ""Hola,"جرّب النقر على "Español" في الردود المقترحة.

يردّ موظّف الدعم باللغة الجديدة. وسنتناول كيفية ترجمة الردود الصادرة في خطوة لاحقة. في الوقت الحالي، اطّلِع على الرمز الذي يتلقّى ويعالج الردّ المقترَح الذي نقرت عليه.

if (requestBody.suggestionResponse !== undefined) {
    let postbackData = requestBody.suggestionResponse.postbackData;
    if (postbackData.startsWith(SWITCH_LANGUAGE_POSTBACK)) {
      let languageCode = postbackData.substr(SWITCH_LANGUAGE_POSTBACK.length);
      currentLanguage = languageCode;
      translateText(
        "The language was set to " +
          ISO6391.getName(languageCode) +
          ". Please repeat your request.",
        SERVER_LANGUAGE,
        languageCode
      ).then((translationNotice) => {
        sendResponse(translationNotice, conversationId, []);
      });
    }
  }

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

ترجمة الرسائل الواردة

بعد تغيير اللغة، يمكنك إرسال طلب إلى موظّف الدعم بهذه اللغة على جهازك الجوّال. جرِّب إرسال كلمة لـ &"help" باللغة الجديدة. إذا غيّرت اللغة إلى الإسبانية، اكتب "ayuda" وإرسال الرسالة.

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

يستخدم نموذج الرمز طريقة translateText لترجمة الرسائل الواردة والصادرة. اطّلِع عليه الآن:

/**
 * Translates text to a given target language. No translation if source and
 * target language match.
 *
 * @param {string} text the text to translate
 * @param {string} sourceLanguage The language of the source text.
 * @param {string} targetLanguage The target language.
 * @return A Promise with the translated text.
 */
async function translateText(text, sourceLanguage, targetLanguage) {
  if (sourceLanguage === targetLanguage) {
    return new Promise(function (resolve, reject) {
      resolve(text);
    });
  }
  return new Promise(function (resolve, reject) {
    translate
      .translate(text, targetLanguage)
      .then((result) => {
        if (result && result.length > 0) {
          resolve(result[0]);
        } else {
          reject("Could not translate message");
        }
      })
      .catch((err) => {
        console.error("ERROR:", err);
        reject(err);
      });
  });
}

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

يمكنك الاطّلاع على قسم طريقة معاودة الاتصال الذي يستجيب للرسائل الواردة:

translateText(incomingMessage, currentLanguage, SERVER_LANGUAGE).then(
          (normalizedMessage) => {
            let serverResponse = chooseResponseMessage(normalizedMessage);
            …
          }
        );

يستخدم الخادم الناتج من translateText لاختيار رسالة رد. يتطرّق القسم التالي إلى عملية اختيار رسالة الردّ وترجمتها.

ترجمة الرسائل الصادرة

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

/**
 * Select a topically appropriate response based on the message
 * content that the user sent to the agent.
 *
 * @param {string} incomingMessage The content of the message that the user typed in.
 * @param {string} conversationId The unique id for this user and agent.
 * @return {string} A response message.
 */
function chooseResponseMessage(incomingMessage) {
  let responseMapping = {
    balance: "Your current balance is $500.",
    deposit: "Please enter your deposit amount.",
    transfer:
      "Please enter the account number where you wish to transfer the funds.",
    withdraw: "Please enter the amount you wish to withdraw.",
    help: "Please choose what you'd like to do: balance, deposit, transfer, or withdraw.",
  };

  for (const [key, value] of Object.entries(responseMapping)) {
    if (incomingMessage.toLowerCase().includes(key)) {
      return value;
    }
  }

  return "I didn't understand your request. Please try again.";
}

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

انظر الآن إلى الرمز الذي يُرسل الرسالة التي تم اختيارها إلى المستخدم مرة أخرى.

let serverResponse = chooseResponseMessage(normalizedMessage);
            translateText(
              serverResponse,
              SERVER_LANGUAGE,
              currentLanguage
            ).then((normalizedResponse) => {
              sendResponse(normalizedResponse, conversationId, []);
            });

يُعيد نموذج الرمز استخدام الطريقة translateText لترجمة الإجابة التي تم اختيارها إلى لغة المحادثة الحالية. تتعامل طريقة sendResponse بعد ذلك مع إنشاء كائن الرسالة الجديد وإرساله إلى المستخدم.

ملخّص

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

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

من خلال الدمج مع واجهات برمجة تطبيقات "ترجمة Google"، يمكنك الاستفادة من الترجمة الآلية العالية الجودة للتواصل مع المزيد من المستخدمين بلغتهم الأكثر ملاءمةً. يمكن لموظّف الدعم إجراء محادثات أكثر إنتاجية وكفاءة، ما يزيد من رضا العملاء واكتمال المهام.