本教程介绍了如何创建一个翻译工作流,以等待您的输入(人机协同),并将 Firestore 数据库、两个 Cloud Run 函数、Cloud Translation API 以及使用要实时更新的 Firebase SDK 的网页关联起来。
借助 Workflows,您可以支持回调端点(或 webhook),用于等待 HTTP 请求到达该端点,并在稍后继续执行该工作流。在这种情况下,工作流会等待您的输入拒绝或验证某些文本的翻译,但也可以等待外部进程。如需了解详情,请参阅等待使用回调。
架构
本教程会创建一个 Web 应用,以便允许您执行以下操作:
- 在翻译网页上,输入您希望从英语翻译成法语的文本。点击翻译。
- 在网页中调用一个 Cloud Run 函数来启动工作流的执行。要翻译的文本将作为参数传递给函数和工作流。
- 该文本保存在 Cloud Firestore 数据库中。调用 Cloud Translation API。返回的译文存储在数据库中。使用 Firebase 托管部署 Web 应用,并实时更新以显示翻译后的文本。
- 工作流的 create_callback步骤会创建一个回调端点网址,此网址也保存在 Firestore 数据库中。此时,网页会同时显示验证和拒绝按钮。
- 工作流现已暂停,并等待对回调端点网址的显式 HTTP POST 请求。
- 您可以决定是验证还是拒绝翻译。点击一个按钮会调用第二个 Cloud Run 函数,而该 Cloud Run 函数又会调用由工作流创建的回调端点,并传递审批状态。工作流恢复执行,并将审批状态 true或false保存在 Firestore 数据库中。
下图简要展示了此过程:
部署第一个 Cloud Run 函数
此 Cloud Run 函数启动工作流的执行。要翻译的文本将作为参数传递给函数和工作流。
- 创建一个名为 - callback-translation的目录,其中包含名为- invokeTranslationWorkflow、- translationCallbackCall和- public的子目录:- mkdir -p ~/callback-translation/{invokeTranslationWorkflow,translationCallbackCall,public} 
- 切换到 - invokeTranslationWorkflow目录:- cd ~/callback-translation/invokeTranslationWorkflow 
- 创建一个文件名为 - index.js且包含以下 Node.js 代码的文本文件:
- 创建一个文件名为 - package.json且包含以下- npm元数据的文本文件:
- 使用 HTTP 触发器部署函数,并允许未经身份验证的访问: - gcloud functions deploy invokeTranslationWorkflow \ --region=${REGION} \ --runtime nodejs14 \ --entry-point=invokeTranslationWorkflow \ --set-env-vars PROJECT_ID=${GOOGLE_CLOUD_PROJECT},CLOUD_REGION=${REGION},WORKFLOW_NAME=translation_validation \ --trigger-http \ --allow-unauthenticated - 部署该函数可能需要几分钟的时间。或者,您也可以在 Google Cloud 控制台中使用 Cloud Run functions 界面来部署函数。 
- 部署该函数后,您可以确认 - httpsTrigger.url属性:- gcloud functions describe invokeTranslationWorkflow - 记下返回的网址,以便在后续步骤中使用。 
部署第二个 Cloud Run 函数
此 Cloud Run 函数会向工作流创建的回调端点发出 HTTP POST 请求,并传递审批状态以反映翻译已验证还是被拒绝。
- 切换到 - translationCallbackCall目录:- cd ../translationCallbackCall 
- 创建一个文件名为 - index.js且包含以下 Node.js 代码的文本文件:
- 创建一个文件名为 - package.json且包含以下- npm元数据的文本文件:
- 使用 HTTP 触发器部署函数,并允许未经身份验证的访问: - gcloud functions deploy translationCallbackCall \ --region=${REGION} \ --runtime nodejs14 \ --entry-point=translationCallbackCall \ --trigger-http \ --allow-unauthenticated - 部署该函数可能需要几分钟的时间。或者,您也可以在 Google Cloud 控制台中使用 Cloud Run functions 界面来部署函数。 
- 部署该函数后,您可以确认 - httpsTrigger.url属性:- gcloud functions describe translationCallbackCall - 记下返回的网址,以便在后续步骤中使用。 
部署工作流
工作流由一系列使用 Workflows 语法描述的步骤组成,该语法可以采用 YAML 或 JSON 格式编写。这是工作流的定义。创建工作流后,可以进行部署,使其可以执行。
- 切换到 - callback-translation目录:- cd .. 
- 创建一个文件名为 - translation-validation.yaml且包含以下内容的文本文件:
- 创建工作流后,您可以对其进行部署,但不要执行工作流: - gcloud workflows deploy translation_validation --source=translation-validation.yaml 
创建您的 Web 应用
创建一个调用 Cloud Functions 函数的 Web 应用,以启动工作流的执行。网页会实时更新,提供翻译请求的结果。
- 切换到 - public目录:- cd public 
- 创建一个文件名为 - index.html且包含以下 HTML 标记的文本文件。(在稍后的步骤中,您将修改- index.html文件并添加 Firebase SDK 脚本。)
- 创建一个文件名为 - script.js且包含以下 JavaScript 代码的文本文件:
- 修改 - script.js文件,将- UPDATE_ME占位符替换为您之前记下的 Cloud Run 函数网址。- 在 - translateBtn.addEventListener方法中,将- const fnUrl = UPDATE_ME;替换为:- const fnUrl = "https://REGION-PROJECT_ID.cloudfunctions.net/invokeTranslationWorkflow"; 
- 在 - callCallbackUrl函数中,将- const fnUrl = UPDATE_ME;替换为:- const fnUrl = "https://REGION-PROJECT_ID.cloudfunctions.net/translationCallbackCall"; 
 
- 创建一个文件名为 - style.css且包含以下级联样式的文本文件:
将 Firebase 添加到您的网页应用
在本教程中,HTML 页面、JavaScript 脚本和 CSS 样式表使用 Firebase Hosting 部署为静态资源,但它们可以托管在任何位置,并在您自己的机器上本地提供以进行测试。
创建 Firebase 项目
您需要先创建一个要关联到您的应用的 Firebase 项目,然后才能将 Firebase 添加到您的应用。
- 
    在 Firebase 控制台中,点击创建项目,然后从下拉菜单中选择现有的 Google Cloud 项目,以将 Firebase 资源添加到该项目中。 
- 
    点击继续,直到您看到添加 Firebase 的选项。 
- 
    跳过为您的项目设置 Google Analytics 的步骤。 
- 
    点击添加 Firebase。 
Firebase 会自动为您的 Firebase 项目预配资源。完成此过程后,您将进入 Firebase 控制台中您的项目的概览页面。
在 Firebase 中注册您的应用
有了 Firebase 项目后,您就可以将自己的 Web 应用添加到其中了。
- 在项目概览页面的中心,点击 Web 图标 (</>) 以启动设置工作流。 
- 输入您的应用的别名。 - 只有您能在 Firebase 控制台中看到。 
- 暂时跳过设置 Firebase Hosting 的步骤。 
- 点击注册应用并转到该控制台。 
启用 Cloud Firestore
Web 应用使用 Cloud Firestore 接收和保存数据。您需要启用 Cloud Firestore。
- 在 Firebase 控制台的构建部分中,点击 Firestore 数据库。 - (您可能需要先展开左侧导航窗格以查看构建部分。) 
- 在 Cloud Firestore 窗格中,点击创建数据库。 
- 选择以测试模式开始,并使用如下所示的安全规则: - rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write; } } } 
- 在阅读有关安全规则的免责声明后,点击下一步。 
- 设置 Cloud Firestore 数据的存储位置。 您可以接受默认值,也可以选择您附近的区域。 
- 点击启用以预配 Firestore。 
添加 Firebase SDK 并初始化 Firebase
Firebase 为大多数 Firebase 产品提供 JavaScript 库。在使用 Firebase Hosting 之前,您必须将 Firebase SDK 添加到您的 Web 应用。
- 要在您的应用中初始化 Firebase,您需要提供应用的 Firebase 项目配置。
- 在 Firebase 控制台中,转到您的项目设置。
- 在您的应用窗格中,选择您的应用。
- 在 SDK 设置和配置窗格中,如需从 CDN 加载 Firebase SDK 库,请选择 CDN。
- 将代码段复制到 <body>标记底部的index.html文件中,替换XXXX占位符值。
 
- 安装 Firebase JavaScript SDK。 - 如果您还没有 - package.json文件,请从- callback-translation目录中运行以下命令来创建一个:- npm init
- 运行以下命令,安装 - firebasenpm 软件包并将其保存到- package.json文件:- npm install firebase 
 
初始化和部署您的项目
如需将本地项目文件关联到 Firebase 项目,您必须初始化您的项目。然后,您可以部署您的 Web 应用。
- 从 - callback-translation目录运行以下命令:- firebase init
- 选择 - Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys选项。
- 选择使用现有项目并输入您的项目 ID。 
- 接受 - public作为默认公共根目录。
- 选择配置单页应用。 
- 跳过使用 GitHub 设置自动构建和部署的步骤。 
- 在 - File public/index.html already exists. Overwrite?提示符处输入否。
- 切换到 - public目录:- cd public 
- 在 - public目录中,运行以下命令以将您的项目部署到网站:- firebase deploy --only hosting 
在本地测试 Web 应用
借助 Firebase Hosting,您可以在本地查看和测试更改并与模拟后端项目资源交互。使用 firebase serve 时,您的应用会与托管内容和配置的模拟后端进行交互,但与所有其他项目资源的实际后端交互。在本教程中,您可以使用 firebase serve,但在进行范围更广的测试时不建议使用。
- 从 - public目录运行以下命令:- firebase serve
- 使用返回的本地网址(通常为 - http://localhost:5000)打开您的 Web 应用。
- 输入一些英文文本,然后点击翻译。 - 此时应显示法语文本的翻译。 
- 您现在可以点击验证或拒绝。 - 在 Firestore 数据库中,您可以验证内容。它应该类似于以下内容: - approved: true callback: "https://workflowexecutions.googleapis.com/v1/projects/26811016474/locations/us-central1/workflows/translation_validation/executions/68bfce75-5f62-445f-9cd5-eda23e6fa693/callbacks/72851c97-6bb2-45e3-9816-1e3dcc610662_1a16697f-6d90-478d-9736-33190bbe222b" text: "The quick brown fox jumps over the lazy dog." translation: "Le renard brun rapide saute par-dessus le chien paresseux."- approved状态为- true或- false,具体取决于您是验证还是拒绝翻译。
恭喜!您已创建了一个使用 Workflows 回调的人机协同翻译工作流。