با Google Translate از چندین زبان پشتیبانی کنید

با زبان‌های محلی Business Messages و ترجمه خودکار و هوشمند Google Translate، می‌توانید با برقراری ارتباط با کاربران به زبان دلخواه، دسترسی نماینده خود را افزایش دهید. این آموزش شما را از طریق یکپارچه سازی Proof of Concept Google Translate با یک وب هوک Business Messages راهنمایی می کند.

آنچه شما نیاز دارید

برای شروع، به چند چیز زیر نیاز دارید:

کد را دریافت کنید

این آموزش شما را با نمونه کد وب هوک که با Google Translate ادغام می شود، راهنمایی می کند. برای دریافت کد، مخزن را از 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

با استفاده از دستگاه تلفن همراه خود، چند پیام به نماینده ارسال کنید. سعی کنید پیام های خود را به زبان های مختلف ارسال کنید و ببینید چه اتفاقی می افتد.

Translate API را تنظیم کنید

کد نمونه همراه با بسته Node برای Translate API از قبل نصب شده است. اگر به نحوه نصب بسته Node یا نحوه نصب Translate API در یک زبان برنامه نویسی دیگر علاقه مند هستید، به اسناد Cloud Translate API مراجعه کنید.

برای استفاده از 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 ردیابی می شود.

تشخیص زبان ورودی

کد نمونه تشخیص می‌دهد که آیا زبان ورودی تغییر کرده است یا خیر، و در این صورت، از کاربر می‌خواهد زبانی را که می‌خواهد در مکالمه استفاده کند انتخاب کند. با تایپ کردن پیامی برای نماینده به زبانی غیر از انگلیسی، این ویژگی را در دستگاه تلفن همراه خود امتحان کنید. اگر هیچ زبان دیگری نمی دانید، سعی کنید "Hola" را تایپ کنید (که به معنای "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);
      });
  });
}

این روش از روش تشخیص در مشتری ترجمه استفاده می کند. از آنجایی که Translate API ممکن است چندین زبان را با سطوح مختلف اطمینان شناسایی کند (و همچنین به دلیل اینکه چندین ورودی را پشتیبانی می کند)، این روش آرایه ای از نتایج را برمی گرداند. نمونه اولین نتیجه را می گیرد که نتیجه با بالاترین اطمینان است.

استفاده از محلی حل شده

گاهی اوقات Translate API نمی تواند زبان پیام را با اطمینان بالا تعیین کند. برای مثال، اگر گربه‌تان روی صفحه‌کلید شما اجرا شود و یک رشته بی‌معنی وارد کند، Translate API همچنان تلاش می‌کند زبان را تشخیص دهد، اما زبان شناسایی‌شده احتمالاً نادرست است. (بالاخره، Google Translate از زبان های گربه ای پشتیبانی نمی کند – هنوز!) Translate API این را با تنظیم یک مقدار اطمینان پایین در نتیجه translate.detect نشان می دهد.

در این سناریو، کد نمونه به زبان موجود در منطقه حل‌شده Business Messages برمی‌گردد، که بهترین حدس API Business Messages در زبان بر اساس زمینه پیام است. از آنجا که محلی حل شده در قالب 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، که نشان می‌دهد مکالمه باید به زبانی در کد زبان بلافاصله بعد تغییر کند. پس از تجزیه این کد زبان، سرور پیامی برای اطلاع کاربر از تغییر زبان ارسال می کند.

ترجمه پیام ورودی

با تغییر زبان، می توانید درخواستی را به آن زبان در دستگاه تلفن همراه خود به نماینده ارسال کنید. سعی کنید کلمه "کمک" را به زبان جدید ارسال کنید. اگر زبان را به اسپانیایی تغییر دادید، "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.";
}

این طرح فقط از زبان انگلیسی در سرور پشتیبانی می کند، به این معنی که سرور باید تمام پیام های ورودی و خروجی را ترجمه کند. یک سیستم پیچیده‌تر ممکن است از چندین زبان پشتیبانی کند و به درخواست‌های زبان‌های دیگر به صورت بومی پاسخ دهد. به عنوان مثال، اگر نماینده شما از اسپانیایی پشتیبانی می کند، ممکن است از قبل کلیدی برای "ayuda" در نقشه پاسخ داشته باشد. سیستم‌های پیچیده‌تر نیز ممکن است به روش‌های دیگری برای انتخاب پاسخ مناسب مانند ML یا الگوریتم‌های امتیازدهی متکی باشند. یکی از راه‌های ایجاد پاسخ‌های هوشمندتر با پیام‌های تجاری، ادغام با Dialogflow است.

اکنون به کدی نگاه کنید که پیام انتخاب شده را برای کاربر ارسال می کند.

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

کد نمونه از روش translateText مجدد برای ترجمه پاسخ انتخابی به زبان مکالمه فعلی استفاده می کند. سپس متد sendResponse از ایجاد شیء پیام جدید و ارسال آن به کاربر مراقبت می کند.

خلاصه

در این آموزش، یاد گرفته‌اید که چگونه یک ادغام ساده با Cloud Translate API ایجاد کنید و از ویژگی‌های محلی Business Messages برای دسترسی به کاربران بیشتر استفاده کنید. اگر دوست دارید، می توانید از کد نمونه در این آموزش به عنوان نقطه شروع برای ادغام خود استفاده کنید، یا می توانید چیز جدیدی را امتحان کنید! در اینجا چند ایده وجود دارد:

  • پیام‌های دوزبانه ارسال کنید که هم محتوای اصلی پیام و هم محتوای ترجمه شده به‌طور خودکار را شامل می‌شود.
  • هنگامی که کاربر مکالمه را شروع می کند، منوی کاملی از زبان های پشتیبانی شده را به او ارائه دهید.
  • از ویژگی های پیشرفته Translate API مانند واژه نامه ها برای ترجمه قابل اعتماد کلمات خاص کسب و کار خود استفاده کنید.

با ادغام با Translate API، می‌توانید از ترجمه ماشینی با کیفیت بالا برای برقراری ارتباط با کاربران بیشتری به راحت‌ترین زبانشان استفاده کنید. نماینده شما می تواند مکالمات سازنده و کارآمدتری داشته باشد، رضایت مشتری و تکمیل کار را افزایش دهد.