عنوان:

‫استفاده از API ترجمه گوگل


نویسنده: وحید نصیری
تاریخ: ۱۳۸۸/۰۹/۰۶ ۱۵:۲۰:۰۰
آدرس: www.dntips.ir

مطابق Ajax API ترجمه گوگل، برای ترجمه یک متن باید محتویات آدرس زیر را تحلیل کرد:
http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q={0}&langpair={1}|{2}
که در آن پارامتر اول، متن مورد نظر، پارامترهای 1 و 2 زبان‌های مبدا و مقصد می‌باشند. برای دریافت اطلاعات، ذکر ارجاع دهنده الزامی است (referrer)، اما ذکر کلید API گوگل اختیاری می‌باشد (که هر فرد می‌تواند کلید خاص خود را از گوگل دریافت کند).
بنابراین برای استفاده از آن تنها کافی است این URL را تشکیل داده و سپس محتویات خروجی آن‌را آنالیز کرد. فرمت نهایی دریافت شده از نوع JSON است. برای مثال اگر hello world! را به این سرویس ارسال نمائیم،‌ خروجی نهایی JSON‌ دریافت شده به صورت زیر خواهد بود:

//{\"responseData\": {\"translatedText\":\"سلام جهان!\"}, \"responseDetails\": null, \"responseStatus\": 200}

در کتابخانه‌ی System.Web.Extensions.dll دات نت فریم ورک سه و نیم، کلاس JavaScriptSerializer برای این منظور پیش بینی شده است. تنها کافی است به متد Deserialize آن، متن JSON دریافتی را پاس کنیم:

GoogleAjaxResponse result =
new JavaScriptSerializer().Deserialize<GoogleAjaxResponse>(jsonGoogleAjaxResponse);

برای اینکه عملیات نگاشت اطلاعات متنی JSON به کلاس‌های دات نتی ما با موفقیت صورت گیرد، می‌توان خروجی JSON گوگل را به شکل زیر نمایش داد:

//ResponseData.cs file
public class ResponseData
{
public string translatedText { get; set; }
}

//GoogleAjaxResponse.cs file
using System.Net;

/// <summary>
/// کلاسی جهت نگاشت اطلاعات جی سون دریافتی به آن
/// </summary>
public class GoogleAjaxResponse
{
public ResponseData responseData { get; set; }
public object responseDetails { get; set; }
public HttpStatusCode responseStatus { get; set; }
}
با این توضیحات، کلاس نهایی ترجمه گوگل ما به شکل زیر خواهد بود:

using System;
using System.Globalization;
using System.IO;
using System.Net;
using System.Web;
using System.Web.Script.Serialization;

//{\"responseData\": {\"translatedText\":\"سلام جهان!\"}, \"responseDetails\": null, \"responseStatus\": 200}

public class CGoogleTranslator
{
#region Fields (1)

/// <summary>
/// ارجاع دهنده
/// </summary>
private readonly string _referrer;

#endregion Fields

#region Constructors (1)

/// <summary>
/// مطابق مستندات نیاز به یک ارجاع دهنده اجباری می‌باشد
/// </summary>
/// <param name="referrer"></param>
public CGoogleTranslator(string referrer)
{
_referrer = referrer;
}

#endregion Constructors

#region Properties (2)

/// <summary>
/// ترجمه از زبان
/// </summary>
public CultureInfo FromLanguage { get; set; }

/// <summary>
/// ترجمه به زبان
/// </summary>
public CultureInfo ToLanguage { get; set; }

#endregion Properties

#region Methods (2)

// Public Methods (1)

/// <summary>
/// ترجمه متن با استفاده از موتور ترجمه گوگل
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public string TranslateText(string data)
{
//ساخت و انکدینگ آدرس مورد نظر
string url =
string.Format(
"http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q={0}&langpair={1}|{2}",
HttpUtility.UrlEncode(data), //needs a ref. to System.Web.dll
FromLanguage.TwoLetterISOLanguageName,
ToLanguage.TwoLetterISOLanguageName
);

//دریافت اطلاعات جی سون از گوگل
string jsonGoogleAjaxResponse = fetchWebPage(url);

//needs a ref. to System.Web.Extensions.dll
//نگاشت اطلاعات جی سون دریافت شده به کلاس مرتبط
GoogleAjaxResponse result =
new JavaScriptSerializer().Deserialize<GoogleAjaxResponse>(jsonGoogleAjaxResponse);

if (result != null && result.responseData != null && result.responseStatus == HttpStatusCode.OK)
{
return result.responseData.translatedText;
}
return string.Empty;
}
// Private Methods (1)

/// <summary>
/// دریافت محتویات جی سون بازگشتی از گوگل
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
string fetchWebPage(string url)
{
try
{
var uri = new Uri(url);
if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
{
var request = WebRequest.Create(uri) as HttpWebRequest;
if (request != null)
{
request.Method = WebRequestMethods.Http.Get;
request.Referer = _referrer;
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; ; rv:1.8.0.7) Gecko/20060917 Firefox/1.9.0.1";
request.AllowAutoRedirect = true;
request.Timeout = 1000 * 300;
request.KeepAlive = false;
request.ReadWriteTimeout = 1000 * 300;
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

using (var response = request.GetResponse() as HttpWebResponse)
{
if (response != null)
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
return reader.ReadToEnd().Trim();
}
}
}
}
}
return string.Empty;
}
catch (Exception ex)
{
Console.WriteLine(String.Format("fetchWebPage: {0} >> {1}", ex.Message, url), true);
return string.Empty;
}
}

#endregion Methods
}
مثالی در مورد نحوه‌ی استفاده از آن برای ترجمه یک متن از انگلیسی به فارسی:

string res = new CGoogleTranslator("https://www.dntips.ir/")
{
FromLanguage = CultureInfo.GetCultureInfo("en-US"),
ToLanguage = CultureInfo.GetCultureInfo("fa-IR")
}.TranslateText("Hello world!");

نظرات

  • مهمان در ۱۳۸۸/۰۹/۰۷ ۱۶:۰۷:۴۰
    از بخش برنامه نویسی آن که جای تشکر بسیار داره و عالی بود که بگذریم. یک بار هم نشده با این مترجم گوگل کار کنم و ترجمه خوب بگیرم.
  • مهدی پایروند در ۱۳۹۱/۰۷/۱۶ ۱۳:۴۶
    امروز خواستم از این API برای برنامه ای که قبلا بوده استفاده کنم متوجه شدم که پولی شده، متاسفانه
    • وحید نصیری در ۱۳۹۱/۰۷/۱۶ ۱۳:۵۴
      مترجم مایکروسافت زبان فارسی رو هم مدتی است که اضافه کرده:
      http://www.bing.com/translator
      http://msdn.microsoft.com/en-us/library/ff512404.aspx  
      • مهدی پایروند در ۱۳۹۱/۰۷/۲۰ ۹:۱۳
        مترجم مایکروسافت هم روی کلمات فارسی خطا میده و میگه که پارامتر دوم که fa هست رو درست وارد نکردی در حالی که من این پارامتر رو از روی زبانهای در دسترسی که یکی از فانکشنهای خود api برمیگردونه انتخاب میکنم.
        نکته اینجاست که وقتی پارامتر دوم رو مثلا با عربی ar عوض میکنم مثل قرقی کار ترجمه رو انجام میده.
        نکته آخر اینه که برای ترجمه تا دومیلیون کاراکتر برای لایسنس رایگانش در ماه محدودیت داره.
        • وحید نصیری در ۱۳۹۱/۰۷/۲۰ ۱۲:۲۲
          شما برای استفاده از مترجم گوگل یا بینگ حتما نیازی به استفاده از API آن‌ها ندارید. خیلی‌ها از طریق یک HttpWebRequest و سپس آنالیز خروجی مثلا با Regular expressions و یا نمونه بهتر استفاده از html agility pack اقدام می‌کنند. این روش رسمی یا توصیه شده‌ای نیست. اما محدودیتی هم ندارد. اگر می‌خواهید سیستم آن‌ها را مهندسی معکوس کنید می‌شود با برنامه Fiddler این کار رو کرد. تمام رفت و برگشت‌ها را ثبت می‌کند. بعد بر این اساس، اقدام به آنالیز سیستم و تهیه یک برنامه سفارشی کنید.
          برای نمونه این لینک بینگ در آزمایش امروز بود: (^)
          • مهدی پایروند در ۱۳۹۱/۰۷/۲۰ ۲۳:۱۶
            ممنون بابت لینکی که داده بودید.