C#调用Bing的在线翻译接口Translator

首先要申请Developer账户,申请完毕后在https://datamarket.azure.com/account可以看到账户名和密码。
也可以申请一个应用程序,同样可以当做调用Translator接口的账户和密码。

按MSDN上的示例简单重构了一个静态类:

internal static class Translator
{
	public static string TranslateString(string text, string fromCulture, string toCulture)
	{
		string translateResult = "";

		AdmAccessToken admToken;
		
		//使用应用程序名,密码
		//AdmAuthentication admAuth = new AdmAuthentication("TranslateHelper", "******");
		//使用账户名,密码
		AdmAuthentication admAuth = new AdmAuthentication("955aaf93-127b-45ef-84ba-509cc094e05c", "*******");

		try
		{
			admToken = admAuth.GetAccessToken();

			//string text = "查询条件";
			//string from = "zh-CHS";
			//string to = "en";

			string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" 
				+ System.Web.HttpUtility.UrlEncode(text) 
				+ "&from=" + fromCulture 
				+ "&to=" + toCulture;

			string authToken = "Bearer" + " " + admToken.access_token;

			HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
			httpWebRequest.Headers.Add("Authorization", authToken);

			WebResponse response = null;
			try
			{
				response = httpWebRequest.GetResponse();
				using (Stream stream = response.GetResponseStream())
				{
					System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"));

					translateResult = (string)dcs.ReadObject(stream);
				}
			}
			catch (Exception e)
			{
				MessageBox.Show(e.Message);
			}
		}
		catch (WebException e)
		{
			ProcessWebException(e);
		}
		catch (Exception ex)
		{
			MessageBox.Show(ex.Message);
		}

		return translateResult;
	}

	private static void ProcessWebException(WebException e)
	{
		MessageBox.Show( e.ToString());
		// Obtain detailed error information
		string strResponse = string.Empty;
		using (HttpWebResponse response = (HttpWebResponse)e.Response)
		{
			using (Stream responseStream = response.GetResponseStream())
			{
				using (StreamReader sr = new StreamReader(responseStream, System.Text.Encoding.ASCII))
				{
					strResponse = sr.ReadToEnd();
				}
			}
		}
		MessageBox.Show(string.Format("Http status code={0}, error message={1}", e.Status, strResponse));
	}
}

[DataContract]
public class AdmAccessToken
{
	[DataMember]
	public string access_token { get; set; }
	[DataMember]
	public string token_type { get; set; }
	[DataMember]
	public string expires_in { get; set; }
	[DataMember]
	public string scope { get; set; }
}

public class AdmAuthentication
{
	public static readonly string DatamarketAccessUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
	private string clientId;
	private string cientSecret;
	private string request;

	public AdmAuthentication(string clientId, string clientSecret)
	{
		this.clientId = clientId;
		this.cientSecret = clientSecret;
		//If clientid or client secret has special characters, encode before sending request
		this.request = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));
	}

	public AdmAccessToken GetAccessToken()
	{
		return HttpPost(DatamarketAccessUri, this.request);
	}

	private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
	{
		//Prepare OAuth request 
		WebRequest webRequest = WebRequest.Create(DatamarketAccessUri);
		webRequest.ContentType = "application/x-www-form-urlencoded";
		webRequest.Method = "POST";
		byte[] bytes = Encoding.ASCII.GetBytes(requestDetails);
		webRequest.ContentLength = bytes.Length;
		using (Stream outputStream = webRequest.GetRequestStream())
		{
			outputStream.Write(bytes, 0, bytes.Length);
		}
		using (WebResponse webResponse = webRequest.GetResponse())
		{
			DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
			//Get deserialized object from JSON stream
			AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
			return token;
		}
	}
}



上述调用方法存在不稳定的情况,试了SOAP方式,还是比较稳定的:

要添加一个Service Reference:TranslatorService

private string Translate(string text, string from, string to)
{
	HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
	AdmAuthentication admAuth = new AdmAuthentication("955aaf93-127b-45ef-84ba-509cc094e05c", "***");
	
	AdmAccessToken admToken = admAuth.GetAccessToken();
	string authToken = "Bearer" + " " + admToken.access_token;
	httpRequestProperty.Headers.Add("Authorization", authToken);

	TranslatorService.LanguageServiceClient client = new TranslatorService.LanguageServiceClient();

	using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
	{
		OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;

		return client.Translate("", text, from, to, "text/plain", "");
	}
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
有道离线翻译库是指有道智云提供的离线翻译SDK,它可以实现在C#调用有道离线翻译功能。以下是一个简单的示例代码,演示如何使用有道离线翻译库实现翻译功能: 首先,你需要从有道智云官网上下载并安装有道离线翻译SDK。 然后,你需要在C#项目中引用有道离线翻译库的DLL文件。 ```csharp using System; using Youdao.SDK; using Youdao.SDK.Common; using Youdao.SDK.Configs; class Program { static void Main(string[] args) { string appId = "<Your_App_Id>"; string appKey = "<Your_App_Key>"; string textToTranslate = "Hello, how are you?"; var config = new YoudaoConfig(appId, appKey); var translator = new Translator(config); var result = translator.Translate(textToTranslate, "auto", "zh-CHS"); Console.WriteLine($"Original: {textToTranslate}"); Console.WriteLine($"Translated: {result.Translation}"); } } ``` 在上面的示例代码中,你需要将 `<Your_App_Id>` 和 `<Your_App_Key>` 替换为你在有道智云申请的应用ID和应用密钥。然后,你可以创建一个`YoudaoConfig`对象,并将其传递给`Translator`类的构造函数。接下来,你可以使用`Translate`方法进行翻译,指定要翻译的文本、源语言和目标语言。最后,你可以打印出翻译结果。 请确保你已经获得了有效的应用ID和应用密钥,并且已经将其替换到代码中。同时,也请确保你已经正确安装了有道离线翻译SDK,并在项目中引用了相应的DLL文件。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值