SharePoint 中的机器翻译服务
了解机器翻译服务,这是 SharePoint 中新引入的服务应用,可自动机器翻译文件和网站。
机器翻译服务概述
注意
- 2018 年 9 月,我们已宣布在 SharePoint for Microsoft 365 中弃用机器翻译服务,但仍将对其提供支持。 到 2022 年 7 月底,此服务将不可用且完全不受支持。
- 机器翻译服务 API 标记为已弃用,并且将无法通过 SharePoint CSOM 使用。
- 在 2022 年 7 月底之前,机器翻译服务器 API 实例的所有现有实例将不再在 Microsoft 365 环境中显示多语言功能。
- 本文将于 2022 年 12 月停用。
- 如果在 SharePoint 中使用新式通信网站,建议使用 新式多语言网站和页面功能 ,而不是变体机器翻译服务功能。
机器翻译服务是 SharePoint 中新引入的服务应用,可自动机器翻译文件和网站。 当机器翻译服务应用程序处理翻译请求时,它会将请求转发到 Microsoft Translator 云托管的机器翻译服务,在那里执行实际翻译工作。 这项云服务还为 Microsoft Office、Lync、Yammer 和必应翻译功能提供技术支持。
机器翻译服务应用程序将异步和同步处理翻译请求。 在执行翻译计时器作业时,将处理异步翻译请求。 翻译计时器作业的默认间隔为 15 分钟;您可以在管理中心中或使用 Windows PowerShell 管理该设置。 您还可以使用以下命令将计时器设置为立即执行:
$tj = get-sptimerjob "SharePoint Translation Services"
$tj.Runnow()
同步翻译请求一旦提交就会立即得到处理。
使用 Word Automation Services 共享组件
机器翻译服务体系结构从 Microsoft Word Automation Services 体系结构共享多个组件。 有关 Word Automation Services 体系结构的详细信息,请参阅 Word Automation Services 体系结构。
在为 Word Automation Services 对象模型建模后,为机器翻译服务对象模型建模,因此,如果您熟悉 Word Automation Services 编程,则将与对机器翻译服务对象模型进行的编程的相似处。
使用机器翻译服务服务器对象模型
使用服务器对象模型的应用必须直接在运行 SharePoint 的服务器上运行。 有关创建可远程托管的应用程序的信息,请参阅本主题后面的 使用机器翻译服务客户端对象模型 。 机器翻译服务服务器对象模型驻留在 Microsoft.Office.TranslationServices.dll 中的 Microsoft.Office.TranslationServices 命名空间内。
通过使用服务器对象模型,您可以同步或异步方式提交对机器翻译服务应用程序的请求(针对即时翻译)。 机器翻译服务应用程序具有两个用于存储翻译请求的工作队列:异步队列和同步队列。 同步队列中的请求将被视为具有更高的优先级,将先翻译该请求,然后再翻译异步队列中的请求。 根据您使用的类,将请求传送到这些队列之一。
有关演示如何从控制台应用程序使用服务器对象模型的示例代码,请参阅 SharePoint:使用服务器对象模型访问机器翻译服务。
使用服务器对象模型的异步翻译
TranslationJob 类定义了一组要翻译的项目。 它可以是单个文件或文件夹/文档库中的每个文件。 以此方式提交的翻译作业将存储在翻译数据库中。 每次运行翻译计时器作业时,它会从翻译数据库中提取一些作业并将其添加到要翻译的异步队列中。 翻译计时器作业的默认间隔为 15 分钟。
以下代码演示如何异步翻译单个文件。
SPServiceContext sc = SPServiceContext.GetContext(new SPSite(site));
TranslationJob job = new TranslationJob(sc, CultureInfo.GetCultureInfo(culture));
job.AddFile(input, output);
job.Start();
以下代码演示如何异步翻译文件夹中的每个文件。
SPServiceContext sc = SPServiceContext.GetContext(new SPSite(site));
TranslationJob job = new TranslationJob(sc, CultureInfo.GetCultureInfo(culture));
using (SPSite siteIn = new SPSite(inputFolder))
{
using (SPWeb webIn = siteIn.OpenWeb())
{
using (SPWeb webOut = siteOut.OpenWeb())
{
SPFolder folderIn = webIn.GetFolder(inputFolder);
SPFolder folderOut = webOut.GetFolder(outputFolder);
job.AddFolder(folderIn, folderOut, true);
job.Start();
}
}
}
以下代码演示如何异步翻译文档库中的每个文件。
SPServiceContext sc = SPServiceContext.GetContext(new SPSite(site));
TranslationJob job = new TranslationJob(sc, CultureInfo.GetCultureInfo(culture));
using (SPSite siteIn = new SPSite(inputList))
{
using (SPWeb webIn = siteIn.OpenWeb())
{
using (SPSite siteOut = new SPSite(outputList))
{
using (SPWeb webOut = siteOut.OpenWeb())
{
SPDocumentLibrary listIn = (SPDocumentLibrary)webIn.GetList(inputList);
SPDocumentLibrary listOut = (SPDocumentLibrary)webOut.GetList(outputList);
job.AddLibrary(listIn, listOut);
job.Start();
}
}
}
}
使用服务器对象模型的同步翻译
使用 SyncTranslator 类可请求文件和流的即时翻译。 使用此类发起的翻译请求的传送方式与使用 TranslationJob 类发起的请求的传送方式不同。 它们将立即添加到要处理的同步队列中。 TranslationItemInfo 类包含由机器翻译服务翻译的单个项目的详细信息。 SyncTranslator.Translate 方法在同步翻译作业中返回此类的实例。
以下代码演示如何同步翻译单个文件。
SPServiceContext sc = SPServiceContext.GetContext(new SPSite(site));
SyncTranslator job = new SyncTranslator(sc, CultureInfo.GetCultureInfo(jobCulture));
TranslationItemInfo itemInfo = job.Translate(input, output);
以下代码演示如何同步翻译流。
SPServiceContext sc = SPServiceContext.GetContext(new SPSite(site));
SyncTranslator job = new SyncTranslator(sc, CultureInfo.GetCultureInfo(jobCulture));
FileStream inputStream = new FileStream(input, FileMode.Open);
FileStream outputStream = new FileStream(output, FileMode.Create);
TranslationItemInfo itemInfo = job.Translate(inputStream, outputStream, fileFormat);
inputStream.Close();
outputStream.Flush();
outputStream.Close();
以下代码演示如何同步翻译一系列字节。
SPServiceContext sc = SPServiceContext.GetContext(new SPSite(site));
SyncTranslator job = new SyncTranslator(sc, CultureInfo.GetCultureInfo(jobCulture));
Byte[] inputByte;
Byte[] outputByte;
inputByte = File.ReadAllBytes(input);
outputByte = null;
TranslationItemInfo itemInfo = job.Translate(inputByte, out outputByte, fileFormat);
FileStream outputStream = File.Open(output, FileMode.Create);
MemoryStream memoryStream = new MemoryStream(outputByte);
memoryStream.WriteTo(outputStream);
outputStream.Flush();
outputStream.Close();
权限
如果为其运行翻译请求的用户可以访问要翻译的文件以及文件的输出位置,则该用户可跳过安全检查,并且文件将被翻译。
使用机器翻译服务客户端对象模型
机器翻译服务还包括一个客户端对象模型 (CSOM),可通过该模型访问机器翻译服务 API 以进行联机、本地和移动开发。 客户端应用程序可使用 CSOM 访问服务器内容和功能。 CSOM 将实现服务器的大多数翻译功能,但 CSOM 和服务器端对象模型没有一对一奇偶校验。 支持对单个文件和文档库或文件夹中的文件进行异步翻译。 支持文件的同步翻译,但不支持文件流的同步翻译。
机器翻译服务 CSOM 包括 .NET 托管客户端对象模型以及 Microsoft Silverlight 和 JavaScript 对象模型。 它是在 SharePoint CSOM 基础之上构建而成。 因此,客户端代码先访问 SharePoint CSOM,再访问机器翻译服务 CSOM。
有关 SharePoint CSOM 的详细信息,请参阅 托管客户端对象模型。 有关 ClientContext 对象(CSOM 的入口点)的详细信息,请参阅 作为中心对象的客户端上下文。
表 1 显示了 CSOM API 为机器翻译服务服务器对象提供的等效对象。
表 1. 服务器对象模型 API 及其 CSOM 等效项
服务器 | .NET 托管和 Silverlight | JavaScript |
---|---|---|
Microsoft.Office.TranslationServices.TranslationJob |
Microsoft.Office.TranslationServices.Client.TranslationJob |
SP.Translation.TranslationJob |
Microsoft.Office.TranslationServices.TranslationJobInfo |
Microsoft.Office.TranslationServices.Client.TranslationJobInfo |
SP.Translation.TranslationJobInfo |
Microsoft.Office.TranslationServices.TranslationItemInfo |
Microsoft.Office.TranslationServices.Client.TranslationItemInfo |
SP.Translation.TranslationItemInfo |
Microsoft.Office.TranslationServices.TranslationJobStatus |
Microsoft.Office.TranslationServices.Client.TranslationJobStatus |
SP.Translation.TranslationJobStatus |
Microsoft.Office.TranslationServices.SyncTranslator |
Microsoft.Office.TranslationServices.Client.SyncTranslator |
SP.Translation.SyncTranslator |
机器翻译服务 .NET 托管 CSOM 和 Silverlight CSOM
对于 .NET 托管 CSOM,获取 ClientContext 实例(位于 Microsoft.SharePoint.Client.dll 中的 Microsoft.SharePoint.Client 命名空间中)。 然后使用 Microsoft.Office.TranslationServices.Client.dll 中的 Microsoft.Office.TranslationServices.Client 命名空间中的对象模型。
有关演示如何使用 .NET 托管 CSOM 的示例代码,请参阅 SharePoint:使用客户端对象模型访问机器翻译服务。
对于 Silverlight CSOM,获取 ClientContext 实例(位于 Microsoft.SharePoint.Client.Silverlight.dll 中的 Microsoft.SharePoint.Client 命名空间中)。 然后使用 Microsoft.Office.TranslationServices.Silverlight.dll 中的 Microsoft.Office.TranslationServices.Client 命名空间中的对象模型。
有关演示如何使用 Silverlight CSOM 的示例代码,请参阅 SharePoint:从 Silverlight 应用程序访问机器翻译服务。
异步翻译一个文件的具体代码:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
string culture = "cultureID";
string name = "translationJobName";
string inputFile = "http://serverName/path/inputFileName";
string outputFile = "http://serverName/path/outputFileName";
TranslationJob job = new TranslationJob(clientContext , culture);
job.AddFile(inputFile , outputFile);
job.Name = name;
job.Start();
clientContext.Load(job);
clientContext.ExecuteQuery();
//To retrieve the translation job ID.
string jobID = job.JobId;
异步翻译文件夹:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
string culture = "cultureID";
string name = "translationJobName";
string inputFolder = clientContext.Web.GetFolderByServerRelativeUrl("inFolderPath");
string outputFolder = clientContext.Web.GetFolderByServerRelativeUrl("outFolderPath");
TranslationJob job = new TranslationJob(clientContext , culture);
job.AddFolder(inputFolder, outputFolder, true);
job.Name = name;
job.Start();
clientContext.Load(job);
clientContext.ExecuteQuery();
//To retrieve the translation job ID.
string jobID = job.JobId;
异步翻译库:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
string culture = "cultureID";
string name = "translationJobName";
string inputLibrary = clientContext.Web.Lists.GetByTitle("inputLibraryName");
string outputLibrary = clientContext.Web.Lists.GetByTitle("outputLibraryName");
TranslationJob job = new TranslationJob(clientContext , culture);
job.AddFolder(inputLibrary , outputLibrary , true);
job.Name = name;
job.Start();
clientContext.Load(job);
clientContext.ExecuteQuery();
//To retrieve the translation job ID.
string jobID = job.JobId;
同步翻译单个文件:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
string culture = "cultureID"
string inputFile = "http://serverName/path/inputFileName";
string outputFile = "http://serverName/path/outputFileName";
SyncTranslator job = new SyncTranslator(clientContext , culture);
job.OutputSaveBehavior = SaveBehavior.AlwaysOverwrite;
ClientResult<TranslationItemInfo> cr = job.Translate(inputFile, outputFile );
clientContext.ExecuteQuery();
//To retrieve additional information about the translation job.
string errorCode = clientContext.Value.ErrorCode;
string errorMessage = clientContext.Value.ErrorMessage;
string translateID = clientContext.Value.TranslationId;
string succeedResult = clientContext.Value.Succeeded;
string failResult = clientContext.Value.Failed;
string cancelStatus = clientContext.Value.Canceled;
string inProgressStatus = clientContext.Value.InProgress;
string notStartedStatus = clientContext.Value.NotStarted;
检索机器翻译服务支持的所有语言:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
IEnumerable<string> supportedLanguages = TranslationJob.EnumerateSupportedLanguages(clientContext);
clientContext.ExecuteQuery();
foreach (string item in supportedLanguages)
{
Console.Write(item + ", ");
}
检查是否支持某种特定语言:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
clientResult<bool> isSupported;
isSupported = TranslationJob.IsLanguageSupported(clientContext, "language");
clientContext.ExecuteQuery();
检索机器翻译服务支持的所有文件扩展名:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
IEnumerable<string> fileExt = TranslationJob.EnumerateSupportedFileExtensions(clientContext);
clientContext.ExecuteQuery();
foreach (string item in fileExt)
{
Console.Write(item + ", ");
}
检查是否支持某个特定的文件扩展名:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
clientResult<bool> isSupported;
isSupported = TranslationJob.IsFileExtensionSupported(clientContext, "fileExtension");
clientContext.ExecuteQuery();
检查特定文件扩展名的文件大小限制:
ClientContext clientContext = new ClientContext("http://serverName/sites/siteCollectionPath");
clientResult<int> maxSize;
maxSize = TranslationJob.GetMaximumFileSize(clientContext, "fileExtension");
clientContext.ExecuteQuery();
机器翻译服务 JavaScript CSOM
对于 JavaScript CSOM,获取 SP.ClientContext 实例,然后使用 SP.Translation.js 文件中的对象模型。
有关演示如何使用 JavaScript CSOM 的示例代码,请参阅 SharePoint:使用 JavaScript 访问机器翻译服务。
异步翻译一个文件的具体代码:
var asyncJob;
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
asyncJob = SP.Translation.TranslationJob.newObject(clientContext, "cultureID");
asyncJob.set_outputSaveBehavior(SP.Translation.SaveBehavior.alwaysOverwrite);
asyncJob.addFile("inputFilePath", "outputFilePath");
asyncJob.set_name("translationJobName");
asyncJob.start();
clientContext.load(asyncJob);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededASync),Function.createDelegate(this, this.onQueryFailed));
异步翻译文件夹:
var asyncJob;
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
asyncJob = SP.Translation.TranslationJob.newObject(clientContext, "cultureID");
asyncJob.set_outputSaveBehavior(SP.Translation.SaveBehavior.alwaysOverwrite);
var inputFolder = clientContext.get_web().getFolderByServerRelativeUrl("inputFilePath");
var outputFolder = clientContext.get_web().getFolderByServerRelativeUrl("outputFilePath");
asyncJob.addFolder(inputFolder, outputFolder, true);
asyncJob.set_name("translationJobName");
asyncJob.start();
clientContext.load(asyncJob);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededASync),Function.createDelegate(this, this.onQueryFailed));
异步翻译库:
var asyncJob;
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
asyncJob = SP.Translation.TranslationJob.newObject(clientContext, "cultureID");
asyncJob.set_outputSaveBehavior(SP.Translation.SaveBehavior.alwaysOverwrite);
var inputLibrary= clientContext.get_web().get_lists().getByTitle("inputFilePath");
var outputLibrary= clientContext.get_web().get_lists().getByTitle("outputFilePath");
asyncJob.addLibrary(inputLibrary, outputLibrary);
asyncJob.set_name("translationJobName");
asyncJob.start();
clientContext.load(asyncJob);
clientContext.executeQueryAsync(Function.createDelegate(this,this.onQuerySucceededASync),Function.createDelegate(this, this.onQueryFailed));
同步翻译单个文件:
var result;
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
var job = SP.Translation.SyncTranslator.newObject(clientContext, "cultureID");
job.set_outputSaveBehavior(SP.Translation.SaveBehavior.alwaysOverwrite);
result = job.translate("inputFilePath", "outputFilePath");
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededSync),
Function.createDelegate(this, this.onQueryFailed));
检索机器翻译服务支持的所有语言:
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
var result= SP.Translation.TranslationJob.enumerateSupportedLanguages(clientContext);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededListAllLang),Function.createDelegate(this, this.onQueryFailed));
检查是否支持某种特定语言:
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
var result= SP.Translation.TranslationJob.isLanguageSupported(clientContext," language");
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededTestLang),Function.createDelegate(this, this.onQueryFailed));
检索机器翻译服务支持的所有文件扩展名:
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
var result= SP.Translation.TranslationJob.enumerateSupportedFileExtensions(clientContext);
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededListAllFileExt),Function.createDelegate(this, this.onQueryFailed));
检查是否支持某个特定的文件扩展名:
var clientContext = new SP.ClientContext("serverRelativeUrl");
var contextSite = clientContext.get_site();
var result= SP.Translation.TranslationJob.isFileExtensionSupported(clientContext," fileExtension");
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceededTestFileExt),Function.createDelegate(this, this.onQueryFailed));
机器翻译服务 REST 服务
SharePoint 包含表述性状态转移 (REST) 服务。这样,可以使用任何支持 REST Web 请求的技术,与机器翻译服务应用进行远程交互。 有关 SharePoint 中 REST 的一般信息,请参阅 在 SharePoint REST 请求中使用 OData 查询操作。
异步翻译 REST API
以下是用于执行异步翻译的 REST API:
http://serverName/_api/TranslationJob('language')
异步翻译单个文件:
http://serverName/_api/TranslationJob('language')/TranslateFile(inputFile='/path/intput file', outputFile='/path/output file')
异步翻译文件夹:
http://serverName/_api/TranslationJob('language')/TranslateFolder(inputFolder='/path/in', outputFolder='/path/out')
异步翻译库:
http://serverName/_api/TranslationJob('language')/TranslateLibrary(inputLibrary='/LibraryName', outputLibrary='/LibraryName'')
同步翻译 REST API
机器翻译服务 REST 服务仅支持文件的同步翻译。 以下是用于执行此操作的 API:
http://serverName/_api/SyncTranslator('language')/Translate(outputFile='/path/output file', inputFile='/path/input file')
附加的 机器翻译服务 REST API
机器翻译服务 REST 服务包括可用于检索有关机器翻译服务应用程序功能和翻译作业状态的信息的附加 API。
检索机器翻译服务支持的所有语言:
http://serverName/_api/TranslationJob.EnumerateSupportedLanguages
检查是否支持某种特定语言:
http://serverName/_api/TranslationJob.IsLanguageSupported('language')
检索机器翻译服务支持的所有文件扩展名:
http://serverName/_api/TranslationJob.EnumerateSupportedFileEXtensions
检查是否支持某个特定的文件扩展名:
http://serverName/_api/TranslationJob.IsFileExtensionSupported('extension')
检查特定文件扩展名的文件大小限制:
http://serverName/_api/TranslationJob.GetMaximumFileSize('extension')
检索所有异步翻译作业的列表:
http://serverName/_api/TranslationJobStatus.GetAllJobs
检索所有活动异步翻译作业的列表:
http://serverName/_api/TranslationJobStatus.GetAllActiveJobs
检索特定异步翻译作业的文档信息:
http://serverName/_api/TranslationJobStatus('jobid')/GetAllItems
取消异步翻译作业的具体代码:
http://serverName/_api/TranslationJob.CancelJob('jobid')
Microsoft Word 文档要求
SharePoint 机器翻译服务在翻译 Microsoft Word 文档时,使用段落语言作为源语言。 例如,如果段落使用西班牙语编写,但该段落的语言设置为英语,则翻译服务不会将其翻译为英语。 这是因为它已被设置为英语。
若要设置段落语言,请执行以下步骤:
选择段落。
单击“审阅功能区”选项卡。
从下拉菜单中单击“语言”,然后选择“设置校对语言”。