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

使用 Google Translate 自动本地化应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (15投票s)

2012年8月21日

CPOL

4分钟阅读

viewsIcon

57554

downloadIcon

3520

使用 Google Translate 本地化您的应用程序

介绍 

如果您和我一样,本地化您的应用程序是一项繁琐的任务,通常会在可能的情况下被跳过,并在需要时留到最后一刻。一旦我开始进行本地化任务,我会在一个屏幕上打开我的浏览器,然后转到 translate.google.com,然后开始复制粘贴、复制粘贴、再复制粘贴。这不是一项困难的任务,但如果有一种方法可以自动完成这些翻译,那就太好了;这正是这个项目的目的。

代码工作原理

您可能知道,大多数开发语言都使用一个简单的文件来保存应用程序中本地化的各种单词和短语。对于 .NET,这些通常位于 `.resx` 文件中,它只是一个 XML 文件。在 Java 中,这通常是通过 `.properties` 文件完成的。

应用程序工作原理的基础是

您提供

  • 源资源文件
  • 要创建的目标资源文件的名称
  • 源语言和目标语言  

然后应用程序

  • 将源文件复制到新的目标文件
  • 根据文件扩展名确定文件类型是 .NET `.resx` 还是 Java `.properties` 文件(我们需要知道以便确定如何遍历文件)
  • 然后我们遍历每个设置,将其翻译成所需的目标语言,并更新文件中的值。
    • 请注意,对于 .NET .resx 文件,我提供了仅翻译 `name` 属性以 `.Text` 结尾的节点的选项。这有助于避免翻译文件中您可能不想翻译的其他内容,例如控件名称和类型。

虽然这里有很多活动部件,但我最想看的是 `Localizer` 类中的 `translatePhrase` 方法。

private string translatePhrase(string phrase, string sourceLangCode, string destLangCode)
{
    string translatedText = null;

    try
    {
        //create the web client
        WebClient client = new WebClient();

        //Open the page and get the results
        string url = c_GoogleTranslateUrl + sourceLangCode + "|" + destLangCode + "&text=" + phrase;
        string sPage = client.DownloadString(url);

        // Parse as the page as a string
        //  Page can have bad HTML causing problems if you try to parse as xml
        //  Find the span with the title of the original string
        int tagStart = sPage.IndexOf("<span title=\"" + phrase + "\"");
        int tagEnd = sPage.IndexOf("</span>", tagStart);
        string resultsTag = sPage.Substring(tagStart, (tagEnd - tagStart));
        //get rid of the start tag
        resultsTag = resultsTag.Substring(resultsTag.IndexOf(">") + 1);

        //You now have the translated text
        translatedText = resultsTag.Trim();                


        //dispose of the web client
        client.Dispose();
    }
    catch(Exception err)
    {
        throw new Exception("Failed to download results from Google Translator.\r\n" + err.Message);
    }

    return translatedText;
} 

这个方法就是魔法发生的地方。创建一个 Web 客户端对象,并为指定的短语和语言打开到 Google 翻译器的 URL 连接。然后将返回的页面解析为字符串。

我最初只是想将其解析为 XML 文档,但发现在许多情况下,标签可能格式错误(缺少引号等),导致解析错误。将页面解析为字符串肯定不如将其作为 XML 处理那样优雅,但它确实能完成工作。  

使用代码

如果您想尝试该代码,请安装该应用程序或从源代码运行它。我提供了一个 C# 和 Java 示例应用程序供您尝试。下面的步骤向您展示如何翻译包含的 C# 示例应用程序。

  1. 请注意,在提供的 C# 示例应用程序中,我已经为主窗体启用了本地化,并且还提供了第二个资源文件(`ResourceFile.resx`),该文件存储了其他可能需要翻译的消息字符串。您还会在 `Program.cs` 中注意到我明确将应用程序语言设置为西班牙语。
  2. 启动示例应用程序;注意没有字符串被翻译。这是因为没有提供翻译的资源文件。
  3. 选择 `Form1.resx` 作为您的源文件。将输出文件设置为 `Form1.es-ES.resx`(这是 .NET 期望的西班牙语版本资源文件的命名方式)。
  4. 由于此资源文件包含我们不希望翻译的其他字符串(对象名称、类型等),请选择“仅翻译 .resx 文件的 .Text 属性”。
  5. 将源语言设置为英语,将输出语言设置为西班牙语。
  6. 运行翻译后,您会注意到消息“翻译完成”。
  7. Translation complete

  8. 现在将源文件更改为提供的 `ResourceFile.resx`。输出文件应设置为 `ResourceFile.es-ES.resx`。
  9. 因为此文件仅包含我们添加的资源字符串,所以请取消选中“仅翻译 .resx 文件的 .Text 属性”。
  10. 翻译完两个资源文件后,您需要使用“添加现有项”选项将它们添加到项目中。
  11. 重新编译并运行项目。注意所有字符串和消息现在都已翻译成西班牙语。
  12. Translated application

关注点

Google 提供了一个 Web 服务,可以以编程方式翻译字符串,但这需要购买许可证,而此应用程序允许免费使用该网站。 

我多年来一直在使用 Google 翻译和其他类似服务手动翻译资源文件,正如你们中的一些人指出的那样,这确实有其缺点。翻译单个单词和短语会丢失上下文,有时会导致翻译在上下文上不正确。出于这个原因以及其他可能的 UI 调整(例如,调整控件大小以适应翻译的文本),应对翻译的文本进行 QA。此应用程序只是为像我一样的开发人员提供了一种快速生成首次字符串翻译的方法。

历史

  • 08/20/2012:  
    • 代码和文章的初始创建和发布。
  • 08/21/2012: 
    • 代码的次要更新(修改了命名空间,在安装程序中添加了图像)
    • 在“关注点”部分添加了关于翻译上下文的内容
© . All rights reserved.