如何在Bot Framework Composer V2.1.1中添加Translation Middleware翻译中间件
Bot Framework Composer V2.1.1 翻译中间件配置教程
适用场景:使用Bot Framework Composer V2.1.1版本,新建机器人默认语言为en-us,已添加印尼语作为第二支持语言,因LUIS不支持印尼语需通过翻译中间件实现多语言适配,操作步骤如下:
1. 安装依赖包
通过NuGet包管理器安装以下匹配版本的依赖:
Microsoft.Bot.Builder推荐4.15.x系列稳定版,和Composer V2.1.1版本兼容Azure.AI.Translation.Text最新稳定版,用于调用Azure翻译服务- 提前准备好已创建的Azure翻译服务资源的密钥、服务区域参数
2. 自定义翻译中间件类
在项目根目录新增TranslationMiddleware.cs文件,代码实现如下:
using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; using Azure.AI.Translation.Text; using System.Threading; using System.Threading.Tasks; public class TranslationMiddleware : IMiddleware { private readonly TextTranslationClient _translationClient; private readonly string _defaultSourceLanguage = "en-us"; // 可根据用户上下文动态调整目标语言,此处示例固定为印尼语 private readonly string _userTargetLanguage = "id"; public TranslationMiddleware(TextTranslationClient translationClient) { _translationClient = translationClient; } public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default) { if (turnContext.Activity.Type == ActivityTypes.Message) { // 翻译用户输入为英文,供LUIS识别 var userInput = turnContext.Activity.Text; var translationResponse = await _translationClient.TranslateAsync(new[] { _defaultSourceLanguage }, userInput, cancellationToken: cancellationToken); turnContext.Activity.Text = translationResponse.Value[0].Translations[0].Text; // 拦截回复消息,翻译为用户使用的语言 turnContext.OnSendActivities(async (sendContext, activities, nextSend) => { foreach (var activity in activities) { if (activity.Type == ActivityTypes.Message && !string.IsNullOrEmpty(activity.Text)) { var replyTranslation = await _translationClient.TranslateAsync(new[] { _userTargetLanguage }, activity.Text, cancellationToken: cancellationToken); activity.Text = replyTranslation.Value[0].Translations[0].Text; } } return await nextSend(); }); } await next(cancellationToken); } }
3. 修改Startup.cs注册服务与中间件
V2.1.1版本生成的项目Startup结构和V1差异较大,按照以下步骤修改:
3.1 注册翻译服务与中间件
在ConfigureServices方法中添加以下代码:
// 注册Azure翻译客户端 services.AddSingleton<TextTranslationClient>(sp => { var translationKey = Configuration["Translation:Key"]; var translationRegion = Configuration["Translation:Region"]; return new TextTranslationClient(new Azure.AzureKeyCredential(translationKey), translationRegion); }); // 注册自定义翻译中间件 services.AddSingleton<TranslationMiddleware>();
3.2 注入中间件到Bot适配器
找到ConfigureServices中注册适配器的代码块,添加中间件引用:
services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>((sp) => { var storage = sp.GetService<IStorage>(); var conversationState = sp.GetService<ConversationState>(); var userState = sp.GetService<UserState>(); var telemetryClient = sp.GetService<IBotTelemetryClient>(); var translationMiddleware = sp.GetService<TranslationMiddleware>(); var adapter = new AdapterWithErrorHandler(configuration, customHttpClient, logger, conversationState, userState, telemetryClient); // 将翻译中间件加入适配器处理管道 adapter.Use(translationMiddleware); return adapter; });
如果项目使用Composer默认的AddBotRuntime注入方式,可在runtime配置的ConfigureAdapters委托中添加上述中间件注册逻辑。
4. 添加配置参数
在appsettings.json文件中新增翻译服务配置节点:
"Translation": { "Key": "你的Azure翻译服务密钥", "Region": "你的Azure翻译服务区域,例如eastasia" }
5. 验证效果
启动机器人后,用户发送印尼语消息,中间件会自动翻译成英文传给LUIS做意图识别,LUIS返回的英文回复会被自动翻译成印尼语返回给用户,无需修改原有LUIS应用和对话逻辑。
内容的提问来源于stack exchange,提问作者DevLabs
相关产品推荐
相关产品推荐

