ขจัดอุปสรรคด้านภาษา บอททีละตัว

การสร้าง Chatbot หลายภาษาด้วย C# และ MS Bot Framework v4

วิธีทำให้แอปพลิเคชันบอทของคุณเป็นสากล

ในบทความนี้ เราจะสร้างแชทบอทด้วย Microsoft Bot Framework และเรียนรู้วิธีปรับให้เข้ากับภาษาต่างๆ

บทที่ 1: การตั้งค่าโครงการ

เรากำลังจะสร้างโปรเจ็กต์แชทบอตธรรมดาที่จะเสนอตัวเลือกสองภาษาให้กับผู้ใช้ในตอนแรก มาเริ่มกันเลย!

ขั้นตอนที่ 1: เริ่มต้นโครงการ

ขั้นตอนแรกคือการสร้างโครงการ ASP.NET Core Empty ใหม่ใน Visual Studio และกำหนดเป้าหมายเป็น .NET 6.0 ตรวจสอบให้แน่ใจว่าได้เพิ่มแพ็คเกจ NuGet ต่อไปนี้ให้กับโปรเจ็กต์:

Microsoft.Bot.Builder.Integration.AspNet.Core --version 4.20.0

ขั้นตอนที่ 2: สร้างลอจิกบอท

สมองของบอทของเราจะอยู่ในไฟล์ MainBot.cs:

using Microsoft.Bot.Builder;
using Microsoft.Bot.Schema;

namespace MultilingualChatBot.Bots
{
    public class MainBot : ActivityHandler
    {
        protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            foreach (var member in membersAdded)
            {
                if (member.Id == turnContext.Activity.Recipient.Id)
                    continue;

                var reply = MessageFactory.Text("Please choose your language");
                reply.SuggestedActions = new SuggestedActions
                {
                    Actions = new List<CardAction>
                    {
                        new() { Title = "English", Type = ActionTypes.ImBack, Value = "English" },
                        new() { Title = "Українська", Type = ActionTypes.ImBack, Value = "Українська" }
                    }
                };
                await turnContext.SendActivityAsync(reply, cancellationToken);
            }
        }

        protected override Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var replyText = $"Your language is **{turnContext.Activity.Text}**";
            return turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
        }
    }
}

บอทขอให้ผู้ใช้เลือกภาษา: อังกฤษหรือยูเครน หลังจากนั้นเมื่อใดก็ตามที่ผู้ใช้ส่งข้อความ บอทจะสะท้อนภาษาที่เลือก

ขั้นตอนที่ 3: สร้างอะแดปเตอร์

ในการปรับแต่งกลยุทธ์การจัดการข้อผิดพลาดสำหรับแชทบอท เราจะใช้คลาส AdapterWithErrorHandler.cs:

using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Connector.Authentication;

namespace MultilingualChatBot
{
    public class AdapterWithErrorHandler : CloudAdapter
    {
        public AdapterWithErrorHandler(BotFrameworkAuthentication auth, ILogger<IBotFrameworkHttpAdapter> logger)
            : base(auth, logger)

        {
            OnTurnError = async (turnContext, exception) =>
            {
                // Log any leaked exception from the application.
                logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

                // Send a message to the user
                await turnContext.SendActivityAsync("The bot encountered an error or bug.");
                await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code.");
            };
        }
    }
}

ในโครงสร้างพื้นฐาน MS Bot Framework คลาสอะแดปเตอร์ทำหน้าที่เป็นสะพานเชื่อมระหว่างบอทและช่องทางการสื่อสาร (เช่น Telegram, Teams, Slack ฯลฯ) สำหรับคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับโครงสร้างบอทโดยรวม โปรดดูที่ "เอกสารประกอบ" อย่างเป็นทางการ

ขั้นตอนที่ 4: กำหนดค่าการพึ่งพา

เพื่อให้ทุกอย่างทำงานได้ เราจำเป็นต้องกำหนดค่าการขึ้นต่อกันทั้งหมดใน Program.cs file:

using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Connector.Authentication;
using MultilingualChatBot;
using MultilingualChatBot.Bots;

var builder = WebApplication.CreateBuilder(args);

// Create the Bot Framework Authentication to be used with the Bot Adapter
builder.Services.AddSingleton<BotFrameworkAuthentication, ConfigurationBotFrameworkAuthentication>();

// Create the Bot Adapter with error handling enabled
builder.Services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();

// Add the main bot to the container
builder.Services.AddTransient<IBot, MainBot>();

var app = builder.Build();

app.UseHttpsRedirection();

app.MapPost("api/messages", (IBotFrameworkHttpAdapter adapter, IBot bot, HttpContext context) =>
    adapter.ProcessAsync(context.Request, context.Response, bot));

app.Run();

ขั้นตอนที่ 5: ทดสอบบอท

ตอนนี้เราได้เตรียมการตั้งค่าบอทเบื้องต้นแล้ว ถึงเวลาทดสอบแล้ว ต่อไปนี้คือลักษณะที่การสนทนาเริ่มแรกปรากฏใน Bot Framework Emulator:

หลังจากสรุปส่วนนี้แล้ว เราก็มีแชทบอตที่ใช้งานได้พร้อมที่จะปรับปรุงด้วยการสนับสนุนหลายภาษาในขั้นตอนถัดไป

บทที่ 2: การแปลเป็นภาษาท้องถิ่นและการสนับสนุนหลายภาษา

ในส่วนนี้ เราจะรวมการสนับสนุนหลายภาษาเข้ากับแชทบอทของเรา เราจะใช้ไฟล์ทรัพยากร (.resx) และอินเทอร์เฟซ IStringLocalizer เพื่อจัดเตรียมการแปลภาษาอังกฤษและภาษายูเครน

ขั้นตอนที่ 1: เพิ่มทรัพยากร (.resx)

เราจะสร้างคลาส BotMessages.cs และไฟล์ทรัพยากรสองไฟล์ BotMessages.en-US.resx สำหรับภาษาอังกฤษและ BotMessages.uk-UA.resx สำหรับภาษายูเครน ไฟล์เหล่านี้จะจัดเก็บสตริงที่แปลแล้วซึ่งบอทของเราจะใช้ในการสื่อสาร ไฟล์มีลักษณะดังนี้ใน Visual Studio:

ขั้นตอนที่ 2: แก้ไขตรรกะของบอท

เราจะอัปเดต MainBot.cs เพื่อใช้อินเทอร์เฟซ IStringLocalizer สิ่งนี้จะช่วยให้บอทสามารถดึงข้อมูลและแสดงสตริงที่แปลเป็นภาษาท้องถิ่นที่ถูกต้องตามภาษาที่ผู้ใช้เลือก:

using System.Globalization;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Schema;
using Microsoft.Extensions.Localization;
using MultilingualChatBot.Resources;

namespace MultilingualChatBot.Bots
{
    public class MainBot : ActivityHandler
    {
        private readonly IStringLocalizer<BotMessages> _localizer;

        public MainBot(IStringLocalizer<BotMessages> localizer) =>
            _localizer = localizer;

        protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            foreach (var member in membersAdded)
            {
                if (member.Id == turnContext.Activity.Recipient.Id)
                    continue;

                var reply = MessageFactory.Text("Please choose your language");
                reply.SuggestedActions = new SuggestedActions
                {
                    Actions = new List<CardAction>
                    {
                        new() { Title = "English", Type = ActionTypes.ImBack, Value = "English" },
                        new() { Title = "Українська", Type = ActionTypes.ImBack, Value = "Українська" }
                    }
                };
                await turnContext.SendActivityAsync(reply, cancellationToken);
            }
        }

        protected override Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var language = turnContext.Activity.Text;

            var culture = language switch
            {
                "English" => "en-US",
                "Українська" => "uk-UA",
                _ => "en-US"
            };

            CultureInfo.CurrentCulture = new CultureInfo(culture);
            CultureInfo.CurrentUICulture = new CultureInfo(culture);

            var welcomeMsg = _localizer["WelcomeMessage", language];

            return turnContext.SendActivityAsync(MessageFactory.Text(welcomeMsg, welcomeMsg), cancellationToken);
        }
    }
}

เมธอด OnMessageActivityAsync จัดการข้อความของผู้ใช้เป็นตัวเลือกภาษา แมปข้อความเหล่านั้นกับวัฒนธรรมที่เหมาะสม และส่งกลับข้อความต้อนรับที่แปลเป็นภาษาที่เลือกโดยใช้ IStringLocalizer โปรดทราบว่า IStringLocalizerขึ้นอยู่กับวัฒนธรรมที่ตั้งไว้เพื่อค้นหาไฟล์ทรัพยากรที่ถูกต้อง ทำให้จำเป็นต้องกำหนดวัฒนธรรมด้วยตนเอง

ขั้นตอนที่ 3: เพิ่มการพึ่งพาการแปล

ในส่วนสุดท้าย เราจะปรับแต่ง Program.cs เพื่อตั้งค่าการขึ้นต่อกันที่จำเป็น สิ่งนี้จะทำให้เราใช้ IStringLocalizer สำหรับการแปลในบอทของเรา สิ่งที่เราต้องทำคือเพิ่มบรรทัดต่อไปนี้:

builder.Services.AddLocalization();

ในตอนท้ายของบทนี้ แชทบอทหลายภาษาของเราก็เปิดใช้งานและทำงานได้อย่างราบรื่น แต่อย่าหยุดอยู่แค่นี้ ในบทถัดไป เราจะสำรวจวิธีปรับปรุงให้ดียิ่งขึ้น

บทที่ 3: การเลือกภาษาที่ง่ายดาย

ในส่วนนี้ เราจะดำเนินการขั้นตอนการเลือกภาษาของแชทบอทโดยอัตโนมัติโดยใช้ "มิดเดิลแวร์" ซึ่งช่วยให้เราไม่ต้องยุ่งยากในการกำหนดวัฒนธรรมทุกครั้ง

ขั้นตอนที่ 1: ใช้มิดเดิลแวร์

ที่นี่ เราจะสร้างคลาส LocalizationMiddleware.cs ซึ่งเป็นส่วนประกอบอัตโนมัติเพื่อกำหนดบริบทภาษาสำหรับการตอบสนองของบอทของเรา

using System.Globalization;
using Microsoft.Bot.Builder;
using IMiddleware = Microsoft.Bot.Builder.IMiddleware;

namespace MultilingualChatBot
{
    public class LocalizationMiddleware : IMiddleware
    {
        public Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = new())
        {
            var culture = turnContext.Activity.Text switch
            {
                "English" => "en-US",
                "Українська" => "uk-UA",
                _ => "en-US"
            };

            CultureInfo.CurrentCulture = new CultureInfo(culture);
            CultureInfo.CurrentUICulture = new CultureInfo(culture);
            
            return next(cancellationToken);
        }
    }
}

มิดเดิลแวร์ของเราจะกำหนดภาษาสำหรับการโต้ตอบปัจจุบันกับบอทตามตัวเลือกของผู้ใช้ ซึ่งหมายความว่าบอทจะใช้ทรัพยากรภาษาที่ถูกต้องโดยอัตโนมัติเมื่อส่งข้อความ โดยไม่จำเป็นต้องตั้งค่าวัฒนธรรมด้วยตนเองทุกครั้งที่เราใช้ IStringLocalizer interface

ในกรณีการใช้งานที่เป็นไปได้ ช่องทางต่างๆ เช่น Telegram, Facebook Messenger และอื่นๆ สามารถส่งภาษาของผู้ใช้ได้ ทำให้โค้ดด้านล่างเป็นโซลูชันที่ใช้งานได้สำหรับการตั้งค่าวัฒนธรรมอัตโนมัติต่อการโต้ตอบ:

using System.Globalization;
using Microsoft.Bot.Builder;
using IMiddleware = Microsoft.Bot.Builder.IMiddleware;

namespace MultilingualChatBot
{
    public class LocalizationMiddleware : IMiddleware
    {
        public Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = new())
        {
            // Get the actual user's locale
            var culture = turnContext.Activity.Locale ?? "en-US";

            CultureInfo.CurrentCulture = new CultureInfo(culture);
            CultureInfo.CurrentUICulture = new CultureInfo(culture);

            return next(cancellationToken);
        }
    }
}

ขั้นตอนที่ 2: รวมมิดเดิลแวร์

เพื่อให้มิดเดิลแวร์ของเราทำงานได้อย่างสมบูรณ์ เราจะดำเนินการสองขั้นตอนสุดท้าย ก่อนอื่น เราจะรวมมันเข้ากับคลาส AdapterWithErrorHandler.cs:

using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Connector.Authentication;

namespace MultilingualChatBot
{
    public class AdapterWithErrorHandler : CloudAdapter
    {
        public AdapterWithErrorHandler(
            LocalizationMiddleware localizationMiddleware, 
            BotFrameworkAuthentication auth,
            ILogger<IBotFrameworkHttpAdapter> logger) : base(auth, logger)

        {
            // Add localization middleware
            Use(localizationMiddleware);

            OnTurnError = async (turnContext, exception) =>
            {
                // Log any leaked exception from the application.
                logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

                // Send a message to the user
                await turnContext.SendActivityAsync("The bot encountered an error or bug.");
                await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code.");
            };
        }
    }
}

ประการที่สอง เราจะตรวจสอบให้แน่ใจว่ามีการกำหนดค่าอย่างเหมาะสมภายในไฟล์ Program.cs:

using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Connector.Authentication;
using MultilingualChatBot;
using MultilingualChatBot.Bots;

var builder = WebApplication.CreateBuilder(args);

// Add localization
builder.Services.AddLocalization();
builder.Services.AddSingleton<LocalizationMiddleware>();

// Create the Bot Framework Authentication to be used with the Bot Adapter
builder.Services.AddSingleton<BotFrameworkAuthentication, ConfigurationBotFrameworkAuthentication>();

// Create the Bot Adapter with error handling enabled
builder.Services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();

// Add the main bot to the container
builder.Services.AddTransient<IBot, MainBot>();

var app = builder.Build();

app.UseHttpsRedirection();

app.MapPost("api/messages", (IBotFrameworkHttpAdapter adapter, IBot bot, HttpContext context) =>
    adapter.ProcessAsync(context.Request, context.Response, bot));

app.Run();

ด้วยมิดเดิลแวร์สำหรับการแปลในขณะนี้ แชทบอทของเราสามารถตั้งค่ากำหนดภาษาโดยอัตโนมัติตามการป้อนข้อมูลของผู้ใช้

ขั้นตอนที่ 4: Chatbot ในการใช้งานจริง

ในขั้นตอนสุดท้ายนี้ เราจะโต้ตอบกับแชทบอทของเรา ดูภาพด้านล่างเพื่อดูว่ามันจัดการกับหลายภาษาได้อย่างไร:

เพื่อสรุปบทนี้ เราได้ประสบความสำเร็จในการจัดการภาษาในแชทบอทของเราโดยอัตโนมัติ

บทที่ 4: สำรวจ Chatbot ในโลกแห่งความเป็นจริง

มาก้าวข้ามพื้นฐานกันเถอะ! ฉันได้สร้างแชทบอตเตือนความจำสองภาษาที่ใช้งานได้จริงและมีฟีเจอร์มากมาย

สำหรับผู้ใช้ มันเป็นเครื่องมือที่มีประโยชน์พร้อมความสามารถขั้นสูง อย่าลังเลที่จะทดสอบบน Telegram

ในขณะเดียวกัน นักพัฒนาสามารถรับข้อมูลเชิงลึกเกี่ยวกับการใช้งานบอทที่ซับซ้อนมากขึ้นใน GitHub ของฉัน เป็นข้อมูลอ้างอิงที่ดีในการดูวิธีการใช้บอทที่ซับซ้อนที่นำไปปฏิบัติจริง สนุก!

บทสรุป

ด้วยบทช่วยสอนนี้ เราได้สร้างแชทบอตที่สามารถรองรับได้หลายภาษา ปรับปรุงการโต้ตอบและการเข้าถึงของผู้ใช้ นอกจากนี้เรายังได้เห็นว่ามิดเดิลแวร์สามารถเลือกภาษาอัตโนมัติได้อย่างไร ทำให้บอทมีประสิทธิภาพมากขึ้น

เอาล่ะ แค่นั้นแหละ. ขอบคุณที่อ่าน! คุณสามารถค้นหาซอร์สโค้ดของโครงการที่ใช้ในบทความใน "GitHub" ของฉัน

ยกระดับการเข้ารหัส

ขอบคุณที่เป็นส่วนหนึ่งของชุมชนของเรา! ก่อนที่คุณจะไป:

  • 👏 ปรบมือให้เรื่องและติดตามผู้เขียน 👉
  • 📰 ดูเนื้อหาเพิ่มเติมใน "สิ่งพิมพ์ Level Up Coding"
  • 💰 หลักสูตรสัมภาษณ์การเขียนโค้ดฟรี ⇒ ดูหลักสูตร
  • 🧠 เครื่องมือ AI ⇒ ดูเลย

🔔 ติดตามเรา: Twitter | LinkedIn | จดหมายข่าว

🚀 👉 เข้าร่วมกลุ่มผู้มีความสามารถ Level Up และหางานที่น่าทึ่ง