.NET Maui 中有哪些免费的文本翻译库,如何使用?
个人项目可以先试 GTranslate。它提供 C# 调用接口,支持在翻译时自动检测源语言,接入 .NET MAUI 也比较直接。不过,其中的 GoogleTranslator 使用非官方在线接口,可能遇到接口变化或请求失败。
希望使用官方 API,可以考虑 Azure Translator 的免费额度;愿意自行部署服务,可以选 LibreTranslate。库免费、服务提供免费额度、自行部署不收 API 费用,各自有不同的使用条件。
有哪些方案可选?
| 方案 | 免费条件 | 自动检测语言 | 适合的用途 |
|---|---|---|---|
| GTranslate | 库开源免费;下面的 GoogleTranslator 调用不需要配置 API key,但依赖非官方接口 | 支持 | 个人工具、功能验证 |
| LibreTranslate / LibreTranslate.Net | 可自行部署开源服务,需承担设备和运维成本;托管实例的收费规则另计 | 支持 | 希望自行控制翻译服务 |
| Azure.AI.Translation.Text | SDK 免费,服务提供 F0 免费层,需要 Azure 账号和资源 | 支持 | 希望使用官方 API |
GTranslate 的 NuGet 页面列出了目标框架和基本用法;LibreTranslate 官方文档提供了自动检测语言的请求示例。Azure 的 F0 定价目前列出每月 200 万字符的免费额度,具体适用条件以创建资源时显示的信息为准。
这些方案都需要调用翻译服务。仅安装 NuGet 包,并不会在手机上获得可离线运行的翻译模型。
在 .NET MAUI 中使用 GTranslate
1. 安装 NuGet 包
在 MAUI 项目目录执行:
dotnet add package GTranslate
以下示例使用 GoogleTranslator,参数顺序为:
TranslateAsync(text, toLanguage, fromLanguage)
省略第三个参数即可自动检测源语言,具体实现可查看项目源码。
2. 添加输入框和翻译按钮
将页面内容替换为以下示例,并把 TranslationDemo 改成项目实际使用的命名空间。
MainPage.xaml:
<ContentPage
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="TranslationDemo.MainPage">
<VerticalStackLayout Padding="24" Spacing="16">
<Editor
x:Name="SourceEditor"
Placeholder="输入需要翻译的文本"
HeightRequest="140" />
<Button
x:Name="TranslateButton"
Text="翻译成简体中文"
Clicked="OnTranslateClicked" />
<Label x:Name="DetectedLanguageLabel" />
<Label x:Name="TranslationLabel" />
</VerticalStackLayout>
</ContentPage>
MainPage.xaml.cs:
using System;
using GTranslate.Translators;
using Microsoft.Maui.Controls;
namespace TranslationDemo;
public partial class MainPage : ContentPage
{
private readonly GoogleTranslator _translator = new();
public MainPage()
{
InitializeComponent();
}
private async void OnTranslateClicked(object sender, EventArgs e)
{
var text = SourceEditor.Text;
if (string.IsNullOrWhiteSpace(text))
{
TranslationLabel.Text = "请先输入需要翻译的文本。";
return;
}
TranslateButton.IsEnabled = false;
try
{
// 省略源语言参数,自动检测;目标语言为简体中文。
var result = await _translator.TranslateAsync(text, "zh-CN");
TranslationLabel.Text = result.Translation;
DetectedLanguageLabel.Text =
$"检测到的源语言:{result.SourceLanguage}";
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex);
TranslationLabel.Text = "翻译失败,请稍后重试。";
DetectedLanguageLabel.Text = string.Empty;
}
finally
{
TranslateButton.IsEnabled = true;
}
}
}
这里的 async void 用于按钮事件处理器。如果把翻译逻辑移到服务类中,方法应返回 Task 或 Task<T>。
已知原文是英文时,可以显式指定源语言:
var result = await _translator.TranslateAsync(
text,
toLanguage: "zh-CN",
fromLanguage: "en");
显式指定源语言可以避免短文本被误判。要翻译成英文,将目标语言改成 "en" 即可。
3. 确认设备能够访问服务
上述 GTranslate 调用需要联网。Android 项目需要具备 android.permission.INTERNET 权限,也要在实际目标设备上确认服务能够访问。
非官方接口不承诺长期可用,请求可能受到限流,响应格式也可能变化。不需要密钥并不代表可以无限调用。
希望自行部署时,使用 LibreTranslate
LibreTranslate 是独立的翻译服务,底层使用 Argos Translate。自行部署并安装所需模型后,服务端可以在离线环境中完成翻译,MAUI 应用仍需连接这个服务。详见项目说明。
C# 封装库 LibreTranslate.Net 提供了调用接口,其 README 将自动检测选项 LanguageCode.AutoDetect 标为实验性。如果只需要文本翻译,也可以直接通过 HttpClient 调用 REST API。
服务部署完成且实例未要求 API key 时,可以在现有页面类中加入:
private static readonly System.Net.Http.HttpClient LibreHttpClient = new();
private static async System.Threading.Tasks.Task<string>
TranslateWithLibreAsync(Uri serviceBaseUri, string text)
{
var payload = new
{
q = text,
source = "auto",
target = "en",
format = "text"
};
using var response =
await System.Net.Http.Json.HttpClientJsonExtensions.PostAsJsonAsync(
LibreHttpClient,
new Uri(serviceBaseUri, "translate"),
payload);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
using var document = System.Text.Json.JsonDocument.Parse(json);
return document.RootElement
.GetProperty("translatedText")
.GetString() ?? string.Empty;
}
在异步事件处理器中调用:
var translated = await TranslateWithLibreAsync(
new Uri("https://translate.example.com/"),
"Bonjour tout le monde");
TranslationLabel.Text = translated;
示例中的地址是占位地址,需替换为实际服务地址,并保留结尾的 /。source = "auto" 表示自动检测源语言,target = "en" 表示翻译成英文。自动检测时,响应还可以包含 detectedLanguage,详见 API 用法。
使用前还要确认以下事项:
- 实例安装的语言模型支持所需语言对,可通过
/languages查询。 - 如果实例启用了密钥验证,请按要求加入
api_key。 - 官方托管实例与自行部署的实例使用条件不同,不能默认公开地址可以免费调用。
- 真机中的
localhost指向手机自身。访问电脑上部署的服务时,应使用设备可达的地址。
希望使用官方 API 时,考虑 Azure Translator
Azure 提供官方 .NET SDK:
dotnet add package Azure.AI.Translation.Text
先创建 Translator 资源,选择适用的 F0 免费层,再按所安装 SDK 版本的官方示例配置客户端。
使用 Translator REST API v3 时,省略 from 参数即可自动检测源语言,无须先单独调用检测接口。详见 Translate API 文档。
发布 MAUI 应用时,建议让应用调用自己的后端,由后端持有 Azure 密钥并访问翻译服务。把共享服务密钥写进移动应用,无法可靠地防止密钥被提取和滥用。
使用时还需要注意什么?
单词、缩写、人名和中英混合文本容易让自动语言检测产生歧义。界面上最好允许用户手动选择源语言,不要把检测结果当作确定事实。
在线服务会接收待翻译文本,因此应根据文本内容选择服务。连续输入时可以做防抖,并缓存重复翻译的结果,减少等待和请求次数。在界面线程中使用 await,避免用 .Result 或 .Wait() 阻塞页面。
如果质量要求不高,希望免费且能自动识别语言,GTranslate 最容易上手。是否继续使用,主要取决于项目能否接受非官方接口的可用性限制。
备注:内容仅供参考。
