PAYATHON 2026

.NET Maui 中有哪些免费的文本翻译库,如何使用?

技术老齐

个人项目可以先试 GTranslate。它提供 C# 调用接口,支持在翻译时自动检测源语言,接入 .NET MAUI 也比较直接。不过,其中的 GoogleTranslator 使用非官方在线接口,可能遇到接口变化或请求失败。

希望使用官方 API,可以考虑 Azure Translator 的免费额度;愿意自行部署服务,可以选 LibreTranslate。库免费、服务提供免费额度、自行部署不收 API 费用,各自有不同的使用条件。

有哪些方案可选?

方案免费条件自动检测语言适合的用途
GTranslate库开源免费;下面的 GoogleTranslator 调用不需要配置 API key,但依赖非官方接口支持个人工具、功能验证
LibreTranslate / LibreTranslate.Net可自行部署开源服务,需承担设备和运维成本;托管实例的收费规则另计支持希望自行控制翻译服务
Azure.AI.Translation.TextSDK 免费,服务提供 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 最容易上手。是否继续使用,主要取决于项目能否接受非官方接口的可用性限制。

备注:内容仅供参考。