65.9K
CodeProject 正在变化。 阅读更多。
Home

Google 翻译

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (134投票s)

2006年1月15日

CPOL

3分钟阅读

viewsIcon

1827502

downloadIcon

40277

一个利用 Google 在线自然语言翻译工具威力的对象。

注意
GoogleTranslator 最初是在屏幕抓取是访问 Google 在线翻译工具的唯一方法时编写的。正如本文的论坛中正确指出的那样,更现代的方法是使用 Google 的 AJAX API。有关更多信息,请参见 链接。应 CP 读者的要求,GoogleTranslator 的这个屏幕抓取版本将继续维护。

此最新版本的 GoogleTranslator 利用 Google Translate 的 AJAX API 来翻译文本,并通过解析返回的 JSON 内容来检索翻译结果。感谢 CPians @Airstriker82@Member 9899010@bgsjust 指示我使用这些 API。该代码的最新版本还包括从演示应用程序朗读翻译结果的功能。由于 Google 将语音限制为少数语言中的常见词语,因此当您尝试朗读翻译后的文本时,如果演示程序变得愚蠢,请不要感到惊讶!

这是什么?

GoogleTranslator in action GoogleTranslator 是一个允许您使用 Google 在线语言工具的力量来翻译文本的对象。该演示应用程序还允许您轻松地执行反向翻译。该应用程序可用作简单短语的简陋资源翻译器,但您最好在确认翻译结果之前先与母语人士确认。

我该如何使用它?

您可以通过构建 GoogleTranslator 并调用其 Translate() 方法来使用它。

 
    using RavSoft.GoogleTranslator;
    
    Translator t = new GoogleTranslator();
    string translation = t.Translate ("Hello, how are you?", "English", "French");
    Console.WriteLine (translation);
    Console.WriteLine ("Translated in " + t.TranslationTime.TotalMilliseconds + " mSec");
    Console.WriteLine ("Translated speech = " + t.TranslationSpeechUrl);

工作原理

GoogleTranslator 的工作原理是直接调用 Google 的翻译 API,该 API 由其 在线翻译表单 调用并解析结果。

 
    // Initialize
    this.Error = null;
    this.TranslationSpeechUrl = null;
    this.TranslationTime = TimeSpan.Zero;
    DateTime tmStart = DateTime.Now;
    string translation = string.Empty;

    try {
        // Download translation
        string url = string.Format ("https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}",
                                    Translator.LanguageEnumToIdentifier (sourceLanguage),
                                    Translator.LanguageEnumToIdentifier (targetLanguage),
                                    HttpUtility.UrlEncode (sourceText));
        string outputFile = Path.GetTempFileName();
        using (WebClient wc = new WebClient ()) {
            wc.Headers.Add ("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 " +
                                          "(KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36");
            wc.DownloadFile(url, outputFile);
        }

        // Get translated text
        if (File.Exists (outputFile)) {

            // Get phrase collection
            string text = File.ReadAllText(outputFile);
            int index = text.IndexOf (string.Format(",,\"{0}\"", Translator.LanguageEnumToIdentifier (sourceLanguage)));
            if (index == -1) {
                // Translation of single word
                int startQuote = text.IndexOf('\"');
                if (startQuote != -1) {
                    int endQuote = text.IndexOf('\"', startQuote + 1);
                    if (endQuote != -1) {
                        translation = text.Substring(startQuote + 1, endQuote - startQuote - 1);
                    }
                }
            }
            else {
                // Translation of phrase
                text = text.Substring(0, index);
                text = text.Replace("],[", ",");
                text = text.Replace("]", string.Empty);
                text = text.Replace("[", string.Empty);
                text = text.Replace("\",\"", "\"");
            }

            // Get translated phrases
            string[] phrases = text.Split (new[] { '\"' }, StringSplitOptions.RemoveEmptyEntries);
            for (int i=0; (i < phrases.Count()); i += 2) {
                string translatedPhrase = phrases[i];
                if (translatedPhrase.StartsWith(",,")) {
                    i--;
                    continue;
                }
                translation += translatedPhrase + "  ";
            }

            // Fix up translation
            translation = translation.Trim();
            translation = translation.Replace(" ?", "?");
            translation = translation.Replace(" !", "!");
            translation = translation.Replace(" ,", ",");
            translation = translation.Replace(" .", ".");
            translation = translation.Replace(" ;", ";");

            // And translation speech URL
            this.TranslationSpeechUrl = string.Format ("https://translate.googleapis.com/translate_tts?ie=UTF-8&q={0}&tl={1}&total=1&idx=0&textlen={2}&client=gtx",
                                                       HttpUtility.UrlEncode (translation),
                                                       Translator.LanguageEnumToIdentifier (targetLanguage),
                                                       translation.Length);
        }
    }
    catch (Exception ex) {
        this.Error = ex;
    }

    // Return result
    this.TranslationTime = DateTime.Now - tmStart;
    return translation;

正如您所看到的,用于解析 JSON 结果的逻辑非常简单!

朗读翻译结果

Translator 对象检索将流式传输翻译语音版本的 URL。演示应用程序通过在隐藏的浏览器控件中导航到此 URL 来朗读此内容。如前言中所述,由于 Google 将语音限制为少数语言中的常见词语,因此当您尝试朗读翻译后的文本时,如果演示程序变得愚蠢,请不要感到惊讶!

修订历史

  • 2016年3月18日
    切换到 Google Translate 插件 API。 由 User-12366202 发现并修复。 谢谢!
  • 2015年8月6日
    更正解析逻辑。 由 Member 11019371 发现并修复。 谢谢!
  • 2015年5月6日
    更正解析逻辑以修复单个单词的翻译。
  • 2015年5月5日
    更正 Google URL。
    删除了所有外部依赖项。
  • 2014年3月9日
    切换到使用 Google 的 JSON 翻译 API。
    添加了 TranslationTimeTranslationSpeakUrl 属性。
    调整了演示应用程序 UI,以协助反向翻译和重置英语源和目标。
  • 2013年1月13日
    增加了对当前完整语言集的支持。
    重新修复了将翻译限制为第一句话的错误。
    修复了一个在存在重音字符时导致反向翻译失败的错误。
  • 2010年3月10日
    增加了对当前完整语言集的支持。
    修复了将翻译限制为第一句话的错误。
  • 2010年2月15日
    更多解析调整。
  • 2009年3月28日
    更多解析调整。
  • 2007年3月20日
    调整了解析逻辑以符合 Google 网站上的更改。
  • 2006年1月15日
    初始版本。
© . All rights reserved.