Menjembatani hambatan bahasa, satu per satu bot

Membangun Chatbot Multibahasa dengan C# dan MS Bot Framework v4

Cara mengglobalkan aplikasi bot Anda

Pada artikel ini, kita akan membuat chatbot dengan Microsoft Bot Framework dan mempelajari cara mengadaptasinya ke berbagai bahasa.

Bab 1: Penyiapan Proyek

Kami akan membuat proyek chatbot sederhana yang awalnya akan menawarkan dua pilihan bahasa untuk pengguna. Jadi mari kita mulai!

Langkah 1: Memulai Proyek

Langkah pertama adalah membuat proyek ASP.NET Core Blank baru di Visual Studio dan menargetkannya ke .NET 6.0. Pastikan untuk menambahkan paket NuGet berikut ke proyek:

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

Langkah 2: Bangun Logika Bot

Otak bot kita akan ditempatkan di file 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);
        }
    }
}

Bot meminta pengguna untuk memilih bahasa: Inggris atau Ukraina. Setelah itu, setiap kali pengguna mengirim pesan, bot akan mengulangi bahasa yang dipilih.

Langkah 3: Buat Adaptor

Untuk menyesuaikan strategi penanganan kesalahan pada chatbot, kami akan menerapkan kelas 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.");
            };
        }
    }
}

Dalam infrastruktur MS Bot Framework, kelas adaptor bertindak sebagai jembatan antara bot dan saluran komunikasi (misalnya Telegram, Teams, Slack, dll.). Untuk penjelasan lebih rinci tentang keseluruhan struktur bot, lihat dokumentasi resmi.

Langkah 4: Konfigurasikan Dependensi

Agar semuanya berfungsi, kita perlu mengkonfigurasi semua dependensi di 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();

Langkah 5: Uji Bot

Sekarang kita sudah menyiapkan bot awal, saatnya mengujinya. Berikut tampilan percakapan awal di Bot Framework Emulator:

Setelah menyelesaikan bagian ini, kami memiliki chatbot yang berfungsi dan siap untuk ditingkatkan dengan dukungan multibahasa pada langkah berikutnya.

Bab 2: Pelokalan dan Dukungan Multibahasa

Di bagian ini, kami akan mengintegrasikan dukungan multibahasa ke dalam chatbot kami. Kami akan menggunakan file sumber daya (.resx) dan antarmuka IStringLocalizer untuk menyediakan pelokalan untuk bahasa Inggris dan Ukraina.

Langkah 1: Tambahkan Sumber Daya (.resx)

Kami akan membuat kelas BotMessages.cs dan dua file sumber daya, BotMessages.en-US.resx untuk bahasa Inggris dan BotMessages.uk-UA.resx untuk bahasa Ukraina. File-file ini akan menyimpan string lokal yang akan digunakan bot kita untuk berkomunikasi. Berikut tampilan file di Visual Studio:

Langkah 2: Ubah Logika Bot

Kami akan memperbarui MainBot.cs untuk menggunakan antarmuka IStringLocalizer. Ini akan memungkinkan bot mengambil dan menampilkan string lokal yang benar berdasarkan bahasa yang dipilih pengguna:

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

Metode OnMessageActivityAsync menangani pesan pengguna sebagai pilihan bahasa, memetakannya ke budaya yang tepat, dan mengembalikan pesan selamat datang yang dilokalkan dalam bahasa yang dipilih menggunakan IStringLocalizer. Perlu diingat, IStringLocalizerbergantung pada budaya yang ditetapkan untuk menemukan file sumber daya yang benar, sehingga perlu menentukan budaya secara manual.

Langkah 3: Tambahkan Ketergantungan Lokalisasi

Di bagian terakhir, kita akan mengubah Program.cs untuk menyiapkan dependensi yang diperlukan. Ini akan memungkinkan kita menggunakan IStringLocalizer untuk pelokalan di bot kita. Yang perlu kita lakukan adalah menambahkan baris berikut:

builder.Services.AddLocalization();

Di akhir bab ini, chatbot multibahasa kami sudah aktif dan berjalan dengan lancar. Namun jangan berhenti di sini — di bab berikutnya, kita akan mencari cara untuk lebih menyempurnakannya.

Bab 3: Pemilihan Bahasa yang Mudah

Pada bagian ini, kita akan mengotomatiskan proses pemilihan bahasa chatbot menggunakan middleware, sehingga kita tidak perlu repot mengatur budaya setiap saat.

Langkah 1: Implementasikan Middleware

Di sini, kita akan membuat kelas LocalizationMiddleware.cs, sebuah komponen otomatis untuk menentukan konteks bahasa untuk respons bot kita.

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

Middleware kami menentukan bahasa untuk interaksi saat ini dengan bot berdasarkan pilihan pengguna. Ini berarti bot akan secara otomatis menggunakan sumber bahasa yang benar saat mengirim pesan, sehingga menghilangkan kebutuhan untuk mengatur budaya secara manual setiap kali kita menggunakan IStringLocalizer interface.

Dalam kasus penggunaan potensial, saluran seperti Telegram, Facebook Messenger, dan lainnya dapat meneruskan lokal pengguna, menjadikan kode di bawah ini sebagai solusi yang layak untuk pengaturan budaya otomatis per interaksi:

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

Langkah 2: Integrasikan Middleware

Agar middleware kami beroperasi penuh, kami akan menjalankan dua tindakan terakhir. Pertama, kita akan mengintegrasikannya ke dalam kelas 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.");
            };
        }
    }
}

Kedua, kami akan memastikan bahwa file tersebut dikonfigurasi dengan benar dalam file 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();

Dengan adanya middleware pelokalan, chatbot kami dapat secara otomatis mengatur preferensi bahasa berdasarkan masukan pengguna.

Langkah 4: Chatbot beraksi

Pada langkah terakhir ini, kita akan berinteraksi dengan chatbot kita. Lihat gambar di bawah untuk melihat cara menangani berbagai bahasa:

Mengakhiri bab ini, kami telah berhasil mengotomatiskan proses penanganan bahasa di chatbot kami.

Bab 4: Jelajahi Chatbot Dunia Nyata

Mari melangkah melampaui dasar-dasarnya! Saya telah membuat chatbot pengingat bilingual yang praktis dan kaya fitur.

Bagi pengguna, ini adalah alat yang berguna dengan kemampuan tingkat lanjut; jangan ragu untuk mengujinya di Telegram.

Sementara itu, para pengembang bisa mendapatkan wawasan lebih dalam tentang implementasi bot yang lebih canggih di GitHub saya. Ini adalah referensi yang bagus untuk melihat metode bot yang rumit dipraktikkan. Menikmati!

Kesimpulan

Melalui tutorial ini, kami telah membangun chatbot yang mampu mendukung berbagai bahasa, meningkatkan interaksi dan aksesibilitas pengguna. Kami juga telah melihat bagaimana middleware dapat mengotomatiskan pemilihan bahasa, menjadikan bot lebih efisien.

Baiklah, itu saja. Terima kasih sudah membaca! Anda dapat menemukan kode sumber proyek yang digunakan dalam artikel di GitHub saya.

Pengodean Naik Level

Terima kasih telah menjadi bagian dari komunitas kami! Sebelum kamu pergi:

🔔 Ikuti kami: Twitter | LinkedIn | Buletin

🚀👉 Bergabunglah dengan kumpulan bakat Level Up dan temukan pekerjaan luar biasa