【Unity】百度翻译API接口实时翻译功能

原文:https://www.cnblogs.com/vaevvaev/p/9037076.html

使用到Newtonsoft.Json和UnityEngine(若非Unity,相关接口是原文的HttpUtility.Encode)

using System;
using System.Text;
using System.Net;
using System.Security.Cryptography;
using Newtonsoft.Json;
using UnityEngine.Networking;


public static class BaiDuTranslate
{
    /// <summary>
    /// 中文转英文
    /// </summary>
    /// <param name="text"></param>
    /// <returns></returns>
    public static string TranslateCnToEn(string text, string from, string to)
    {
        var resultStr = "";
        if (text.Length > 1 * 10000)
        {
            //当字符串过长时,需要截断字符串
            int s = text.Length / 10000;
            int y = text.Length % 10000;
            if (y > 1) s = s + 1;
            int i = 0;

            while (i < s)
            {
                var q = "";
                if (i == 0)
                {
                    q = text.Substring(0, 10000);
                }
                else if (i == s - 1)
                {
                    q = text.Substring((i * 10000) + 1);
                }
                else
                {
                    q = text.Substring((i * 10000) + 1, i * 10000);
                }
                resultStr = resultStr + GetTranslationFromBaiduFanyi(q, from, to);
                i = i + 1;
            }
            return resultStr;
        }
        else
        {
            return GetTranslationFromBaiduFanyi(text, from, to);
        }
    }

    #region 测试通过
    /// <summary>
    /// 调用百度翻译API进行翻译
    /// 详情可参考http://api.fanyi.baidu.com/api/trans/product/apidoc
    /// </summary>
    /// <param name="q">待翻译字符</param>
    /// <param name="from">源语言</param>
    /// <param name="to">目标语言</param>
    /// <returns></returns>
    private static string GetTranslationFromBaiduFanyi(string q, string from, string to)
    {
        string resultStr = "";
        try
        {
            q = q.Replace("\"", "&*&*");//把双引符号替换成指定字符,要不然,翻译的过程中容易丢失符号
                                        //到百度翻译API的官网申请APPID
                                        //一定要去申请,不然程序的翻译功能不能使用
            string appId = "百度翻译通用文本翻译APPID";
            string password = "密钥";

            string jsonResult = String.Empty;
            //源语言
            string languageFrom = from.ToLower();
            //目标语言
            string languageTo = to.ToLower();
            //随机数
            string randomNum = System.DateTime.Now.Millisecond.ToString();
            //md5加密
            string md5Sign = GetMD5WithString(appId + q + randomNum + password);
            //url
            string url = String.Format("http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from={1}&to={2}&appid={3}&salt={4}&sign={5}",
                UnityWebRequest.EscapeURL(q, Encoding.UTF8),
                languageFrom,
                languageTo,
                appId,
                randomNum,
                md5Sign
                );
            WebClient wc = new WebClient();
            jsonResult = wc.DownloadString(url);
            //解析json                
            TranslationResult result = JsonConvert.DeserializeObject<TranslationResult>(jsonResult);
            //判断是否出错
            if (result.Error_code == null)
            {
                resultStr = result.Trans_result[0].Dst;
                //文本在翻译的过程中,特殊符号前后有时候会多空格;如&nbsp;可能会翻译为 & nbsp;会导致样式丢失,所以,这个地方处理下
                resultStr = resultStr.Replace(" *", "*");
                resultStr = resultStr.Replace("* ", "*");
                resultStr = resultStr.Replace("& ", "&");
                resultStr = resultStr.Replace("/ ", "/");
                resultStr = resultStr.Replace(" /", "/");
                resultStr = resultStr.Replace(" <", "<");
                resultStr = resultStr.Replace("< ", "<");
                resultStr = resultStr.Replace(" >", ">");
                resultStr = resultStr.Replace("> ", ">");
                resultStr = resultStr.Replace("&#39;", "");
                resultStr = resultStr.Replace(". ", ".");
                resultStr = resultStr.Replace(" .", ".");
                resultStr = resultStr.Replace("&quot;", "");
                resultStr = resultStr.Replace("&*&*", "\"");
            }
            else
            {
                //检查appid和密钥是否正确
                resultStr = "翻译出错,错误码:" + result.Error_code + ",错误信息:" + result.Error_msg;
            }
        }
        catch (Exception ex)
        {
            resultStr = "翻译出错:" + ex.Message;
        }
        return resultStr;
    }
    //对字符串做md5加密
    private static string GetMD5WithString(string input)
    {
        if (input == null)
        {
            return null;
        }
        MD5 md5Hash = MD5.Create();
        //将输入字符串转换为字节数组并计算哈希数据  
        byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
        //创建一个 Stringbuilder 来收集字节并创建字符串  
        StringBuilder sBuilder = new StringBuilder();
        //循环遍历哈希数据的每一个字节并格式化为十六进制字符串  
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }
        //返回十六进制字符串  
        return sBuilder.ToString();
    }

    public class Translation
    {
        public string Src { get; set; }
        public string Dst { get; set; }
    }
    public class TranslationResult
    {
        //错误码,翻译结果无法正常返回
        public string Error_code { get; set; }
        public string Error_msg { get; set; }
        public string From { get; set; }
        public string To { get; set; }
        public string Query { get; set; }
        //翻译正确,返回的结果
        //这里是数组的原因是百度翻译支持多个单词或多段文本的翻译,在发送的字段q中用换行符(\n)分隔
        public Translation[] Trans_result { get; set; }
    }
    #endregion
}

需要注册百度账号,进入开发界面申请通用翻译服务

申请信息下就有APP ID和密钥

它是要付费的,免费可以用一段时间每个月?

中文翻译繁体

string str = BaiDuTranslate.TranslateCnToEn("你好!你很棒!", "zh", "cht");

中文翻译英文

string str = BaiDuTranslate.TranslateCnToEn("你好!你很棒!", "zh", "en");

猜你喜欢

转载自blog.csdn.net/qq_39574690/article/details/129357211