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

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

المتطلبات

للبدء، ستحتاج إلى إعداد الأشياء القليلة التالية:

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

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

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

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

إعداد Translate API

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

لاستخدام واجهة برمجة التطبيقات Translate 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();

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

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

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

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

التعرّف التلقائي على اللغة الواردة

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

يردّ الوكيل بسؤال يسأل المستخدم عمّا إذا كان يريد التبديل إلى جهاز آخر. اللغات. يتضمّن الطلب ردودًا مقترَحة يمكن للمستخدم النقر عليها. التبديل إلى تلك اللغة.

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

/**
 * 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);
      });
  });
}

تستخدم هذه الطريقة طريقة الاكتشاف على برنامج الترجمة. وذلك لأنّ واجهة برمجة التطبيقات Translate API قد تكتشف لغات متعددة بمستويات مختلفة من الثقة (وأيضًا لأنه يدعم العديد )، تُرجع هذه الطريقة صفيفًا من النتائج. تأخذ العينة الجزء الأول وهي النتيجة بأعلى ثقة.

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

في بعض الأحيان، لا يمكن لواجهة برمجة التطبيقات Translate API تحديد لغة الرسالة باستخدام الثقة. على سبيل المثال، إذا كانت قطتك تجري عبر لوحة المفاتيح وأدخلت لا معنى لها، فإن واجهة برمجة التطبيقات Translate API لا تزال تحاول اكتشاف اللغة، ولكن فمن المحتمل أن تكون اللغة التي تم اكتشافها غير صحيحة. (بعد كل شيء، تساعدك ترجمة Google لا تتوفر لغات تضم القطط حتى الآن) تشير واجهة برمجة التطبيقات Translate API إلى ذلك من خلال جارٍ ضبط قيمة ثقة منخفضة في نتيجة 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"، النقر على "الإسبانية" بوصة الردود المقترَحة.

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

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، الذي يعني أن يجب أن تتغير المحادثة إلى لغة اللغة التالية مباشرة الرمز. بعد تحليل رمز اللغة هذا، يرسل الخادم رسالة لإبلاغ للمستخدم أن اللغة قد تغيرت.

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

بعد تغيير اللغة، يمكنك إرسال طلب إلى موظّف الدعم على جهازك الجوال. جرِّب إرسال كلمة "مساعدة" في الميزات الجديدة . إذا غيّرت اللغة إلى الإسبانية، اكتب "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);
      });
  });
}

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

انظر إلى قسم طريقة معاودة الاتصال الذي يستجيب على الرسائل الواردة في اللغة الحالية:

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.";
}

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

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

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

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

ملخّص

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

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

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