部署基本的“Google 翻译”。App Engine、Cloud Functions 和 Cloud Run 上的 Express.js 应用

1. 概览

这一系列的 Codelab(自定进度的动手教程)旨在帮助开发者了解部署应用时可用的各种选项。您将学习如何在简单的 Web 应用中使用 Google Cloud Translation API。此应用可以在本地运行,也可以部署到 Cloud 无服务器计算平台(App Engine、Cloud Functions 或 Cloud Run)。

您将使用 Express.js Web 框架通过 Node.js 完成本 JavaScript 教程。您还将了解如何从无服务器平台访问 Google Cloud API。此应用的所有版本均来自 “模糊无服务器”开源代码库,其中包含此应用的 Python 版本和独立的 Codelab。该代码库还托管了类似的应用,可向开发者展示如何从无服务器平台访问非 Cloud Google API。

此 Codelab 重点介绍如何将此应用部署到上述加粗的平台。

您将了解如何

所需条件

  • 具有有效的 Cloud Billing 账号的 Google Cloud 项目
  • 已安装用于在本地运行的网络框架(对于学习 Python 教程的用户,为 Flask;对于学习 JavaScript/Node.js 教程的用户,为 Express)
  • 至少有一个无服务器计算平台已启用,可用于 Google Cloud 部署
  • 具备基本的编程技能(Python 或 JavaScript/Node.js)
  • 基本操作系统命令的实践知识

调查问卷

您打算如何使用本教程?

阅读并完成练习 仅阅读

您如何评价自己使用 Python 或 Node.js 进行开发的经验?

新手水平 中等水平 熟练水平

您如何评价自己在使用 Google Cloud 服务方面的经验水平?

新手水平 中等水平 熟练水平

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。

96a9c957bc475304.pngb9a10ebdf5b5a448.pnga1e3c01a38fa61c2.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。
  • 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档。
  1. 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

3. 启用 Translation API

在本部分中,您将了解如何启用 Google API。对于我们的示例应用,您将启用 Cloud Translation API。您还需要启用 App Engine、Cloud Functions 和/或 Cloud Run(以及 Cloud Artifact Registry),具体取决于您希望将示例应用部署到哪个平台。

启用 Google API

简介

无论您要在应用中使用哪个 Google API,都必须先启用相应 API。您可以通过命令行或 Cloud 控制台启用 API。启用 API 的流程是相同的,因此启用一个 API 后,您就可以以相同的方式启用另一个 API。

选项 1: gcloud 命令行界面(Cloud Shell 或本地环境)

虽然通过 Cloud 控制台启用 API 更为常见,但有些开发者更喜欢通过命令行完成所有操作。为此,您需要查找 API 的“服务名称”。它看起来像一个网址:SERVICE_NAME.googleapis.com。您可以在支持的产品图表中找到这些信息,也可以通过 Google Discovery API 以编程方式查询这些信息。

掌握这些信息后,您可以使用 Cloud Shell(或安装了 gcloud 命令行工具的本地开发环境)启用 API,如下所示:

gcloud services enable SERVICE_NAME.googleapis.com

示例 1:启用 Cloud Vision API

gcloud services enable vision.googleapis.com

示例 2:启用 Google App Engine

gcloud services enable appengine.googleapis.com

示例 3:通过一个请求启用多个 API。例如,如果本 Codelab 的观看者使用 Cloud Translation API 将应用部署到 App Engine、Cloud Functions 和 Cloud Run,则命令行将如下所示:

gcloud services enable appengine.googleapis.com cloudfunctions.googleapis.com artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

此命令可启用 App Engine、Cloud Functions、Cloud Run 和 Cloud Translation API。此外,它还会启用 Cloud Artifact Registry,因为 Cloud Build 系统必须在该注册表中注册容器映像,才能部署到 Cloud Run。

选项 2:Cloud 控制台

您还可以在 API 管理器中启用 Google API。在 Cloud 控制台中,前往 API 管理器,然后选择库。

fb0f1d315f122d4a.png

开始在搜索栏中输入 API 的名称,即可看到匹配的结果:

2275786a24f8f204.png

选择您要启用的 API,然后点击启用按钮:

7960a6752a1da767.png

无论您想使用哪个 Google API,启用所有 API 的过程都类似。

费用

许多 Google API 可免费使用,但使用大多数 Google Cloud 产品和 API 会产生费用。启用 Cloud API 时,系统可能会要求您提供有效的结算账号。不过,部分 Google Cloud 产品提供“始终免费”层级,只有超出此层级才会产生结算费用。

GCP 新用户符合参与免费试用计划的条件,目前该计划提供 300 美元赠金,有效期为前 90 天。Codelab 通常不会产生任何费用,因此我们建议您在真正准备好试用时再开始免费试用,尤其因为这是一次性优惠。免费层级配额不会过期,无论您是否使用免费试用,都适用。

用户应在启用任何 API 之前参考其定价信息(例如:Cloud Vision API 定价 页面),尤其要注意该 API 是否有免费层级,如果有,免费层级是什么。只要您保持在指定的每日或每月总限额内,就不会产生任何费用。Google 产品组 API 的价格和免费层级各不相同。示例:

不同的 Google 产品采用不同的结算方式,因此请务必参阅相应文档了解相关信息。

确保所需服务已启用

按照上述说明,确保已在 API 管理器中启用 Cloud Translation API。如果您未从命令行启用无服务器平台,可以在 Cloud 控制台中从每个平台各自的控制面板中启用:App Engine、Cloud Functions、Cloud Run。

虽然通过 Cloud 控制台启用 API 在直观性方面具有优势,但使用 gcloud 工具更快,只需几秒钟即可启用所有服务:

$ gcloud services enable appengine.googleapis.com \
cloudfunctions.googleapis.com artifactregistry.googleapis.com \
run.googleapis.com translate.googleapis.com
Operation "operations/acf.p2-xxxxxx035451-704918f2-5470-4436-9bdd-c3b204yyyyyy" finished successfully.

更多费用信息

上文中有关费用的部分适用于所有 Google API。下面我们来详细介绍一下本教程。虽然其每月配额未列在“始终免费”层级的总体摘要页面中,但Translation API 的价格页面指出,所有用户每月都会获得固定数量的翻译字符。如果您未超出该阈值,则不会因使用该 API 而产生任何费用。如需详细了解使用 Google Cloud 无服务器平台的费用,请参阅代码库的“费用”部分。本 Codelab 末尾的“清理”部分将讨论如何在完成本 Codelab 后停止产生结算费用。

4. 获取示例应用代码

下载 ZIP 文件或克隆代码库

  • 下载 ZIP 文件或使用 git clone https://github.com/googlecodelabs/cloud-nebulous-serverless.git 克隆 代码库
  • 如果您没有本地开发环境,但希望在 Cloud Shell 中完成本教程,则可以在其中使用相同的 git clone 命令克隆代码库。
  • 您还可以通过其绿色的 Code 按钮访问 ZIP 文件,如以下屏幕截图所示:

5cd6110c4414cf65.png

现在,您已准备好一切,请创建该文件夹的完整副本以完成本教程,因为本教程可能涉及删除或更改文件。如果您想进行其他部署,可以复制原始部署,这样就无需再次克隆或下载。

5. 确认 Node.js 环境

如需设置 Node.js 环境,请执行以下操作:

  1. 确保您已安装最新版本的 Node(>=10)和 NPM(>=6)
  2. 前往您克隆代码库(或解压缩 ZIP 文件)的位置,然后前往 cloud/nodejs 文件夹
  3. 确认 package.json 是否存在,然后运行 npm install

对于上述第 1 点,您可以在命令行中验证您拥有的版本:

$ node -v
v17.0.1
$ npm -v
8.1.0

6. 示例应用概览

该示例应用是 Google 翻译的简单衍生应用,可提示用户输入英文文本,并接收该文本的等效西班牙语翻译。

package.json 配置文件用于指明应用所需的第三方软件包(请注意,软件包版本可能会更新,超出此处列出的范围):

{
  "name": "cloud-nebulous-serverless-nodejs",
  "version": "0.0.1",
  "description": "Nebulous Serverless sample app",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "mocha test/test_neb.js"
  },
  "author": "Google LLC",
  "license": "Apache-2.0",
  "dependencies": {
    "@google-cloud/translate": "^6.3.1",
    "express": "^4.17.1",
    "nunjucks": "^3.2.3"
  },
  "devDependencies": {
    "mocha": "^9.1.3",
    "supertest": "^6.1.6"
  }
}

现在,打开 index.js 文件,以便了解其运作方式。省略有关许可的注释行后,顶部和底部如下所示:

const express = require('express');
const nunjucks = require('nunjucks');
const {TranslationServiceClient} = require('@google-cloud/translate');

const app = express();
app.use(express.urlencoded({extended: true}));
nunjucks.configure('templates', {autoescape: true, express: app});
const TRANSLATE = new TranslationServiceClient();

const PORT = process.env.PORT || 8080;
const SOURCE = ['en', 'English'];
const TARGET = ['es', 'Spanish'];
let parent;
TRANSLATE.getProjectId().then(result => {
    parent = `projects/${result}`;
});


if (!process.env.FUNCTION_TARGET) {
    app.listen(PORT, () =>
        console.log(`Listening on port ${PORT}`)
    );
}

# . . . [translate() function definition] . . .

app.all('/', translate);
module.exports = {
    app
};
  1. require引入了框架和模板功能,以及 Cloud Translation API 客户端库。
  2. 全局变量表示 Web 应用、云项目 ID、Translation API 客户端、Translation API 调用的父“位置路径”以及 SOURCE 和 TARGET 语言。在本例中,这些值是英语 (en) 和西班牙语 (es),但您可以随意将这些值更改为 Cloud Translation API 支持的其他语言代码。
  3. 每对元素(SOURCE 和 TARGET)的第一个元素是语言代码,第二个元素是语言名称(仅用于显示目的,与 API 无关)。
  4. 底部的几行代码用于将所有 HTTP 请求发送到 translate(),然后导出 app 应用对象。

最后,index.js 的中间部分是应用的核心,即 translate() 函数:

async function translate(req, rsp) {
    let text = null;
    let translated = null;
    if (req.method === 'POST') {
        text = req.body.text.trim();
        if (text) {
            const data = {
                contents: [text],
                parent: parent,
                targetLanguageCode: TARGET[0]
            };
            const [response] = await TRANSLATE.translateText(data);
            translated = response.translations[0].translatedText;
        }
    }
    const context = {
        orig:  {text: text, lc: SOURCE},
        trans: {text: translated, lc: TARGET}
    };
    rsp.render('index.html', context);
}

主要函数负责获取用户输入,并调用 Translation API 来完成繁重的工作。我们来详细了解一下:

  1. 重置表单的基本变量。这主要适用于 GET 请求,因为 POST 请求将包含替换这些数据的其他数据。
  2. 如果是 POST,则获取要翻译的文本,如果文本不为空,则创建表示 API 元数据要求的 JSON 结构。然后调用相应服务的 API。
  3. 我们没有将 SOURCE[0] 传递给 API 以指定英语来源。如果您省略了源语言,则表示您请求 API 自动检测源语言(请参阅文档中的 sourceLanguageCode)。
  4. 无论如何,将实际结果 (POST) 或无数据 (GET) 格式化为模板上下文并进行渲染。

应用的视觉部分位于模板 index.html 文件中。它会显示之前翻译的所有结果(否则为空白),然后显示一个表单,要求用户提供要翻译的内容:

<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<style>
body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #DDDDDD;
}
</style>
<h2>My Google Translate (1990s edition)</h2>

{% if trans['text'] %}
    <h4>Previous translation</h4>
    <li><b>Original</b>:   {{ orig['text'] }}  (<i>{{ orig['lc'][0] }}</i>)</li>
    <li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}

<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>

在本教程的其余部分,您可以选择任意或全部四种部署和运行此应用的方式。所有部署方式都是可选的,也就是说,您可以选择执行任意一种或全部四种方式。

  1. 在本地运行服务
  2. 部署到 App Engine(标准环境)
  3. 部署到 Cloud Functions
  4. 部署到 Cloud Run

7. 选项 1:在本地运行服务

Codelab 的这一部分仅适用于在本地运行。如果您仅部署到云端,请继续下一部分。

如需在本地运行示例应用,必须执行以下三个不同的步骤:

  1. 创建服务账号
  2. 创建服务账号公钥/私钥对
  3. 下载凭据文件并将其与应用代码捆绑在一起
  4. 启动服务

了解服务账号

服务账号是一种安全机制,用于在访问不属于人类用户的数据时,为基于云的应用提供 Google API 访问权限。在部署到云端时,为了缩短用户加入云端的准备时间,所有 Google Cloud 计算平台(无服务器和其他)都提供默认服务账号。

默认服务账号附带广泛的权限,可“简化流程”,但在准备发布生产服务时,我们强烈建议用户遵循“最低权限”的最佳实践,即创建仅具有足够权限让应用正常运行的用户管理的服务账号。无论如何,本地部署没有默认服务账号,因此您必须创建一个服务账号以及一个服务账号密钥(实际上是一个公钥/私钥对),并使应用代码能够使用这些凭据。

创建服务账号密钥对并下载凭据文件

按照此页面上的说明创建服务账号和公钥/私钥对,以便在本地运行。创建服务账号密钥时,系统会提示您提供所需的权限。请务必选择 roles/cloudtranslate.user,以便成功访问 API。

成功创建密钥对后,系统会提示您下载服务账号密钥文件。将其命名为 credentials.json,然后将其移到应用顶级文件夹中。现在,您必须告知 Cloud SDK 使用这些凭据:设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量以指向该文件。如需详细了解此流程,请参阅此页面,其中介绍了服务账号的使用。

启动服务

准备好继续操作后,请使用以下命令在本地启动 Express 服务器:

$ npm start

> cloud-nebulous-serverless-nodejs@0.0.1 start
> node index.js

Listening on port 8080

前往网络浏览器,通过 localhost:8080 与其连接,您应该会看到类似以下内容:

adc6665b7ae13c40.png

翻译一些内容,看看效果如何!

fc154326080bf14f.png

如果您对结果感到满意,请按 ^C (control-C) 退出服务器并退出。恭喜您成功运行本地部署。好消息是,部署到云端要容易得多。

问题排查

您在请求翻译时是否遇到过类似这样的错误?

node:fs:2486
      handleErrorFromBinding(ctx);
      ^

Error: The file at credentials.json does not exist, or it is not a file. ENOENT: no such file or directory, lstat '/tmp/nodejs/credentials.json'
    . . .

解决方案:此错误表示您未完成创建服务账号并下载公钥/私钥对文件 credentials.json 的操作。请返回“选项 1:在本地运行服务”,完成此流程并在主文件夹中安装凭据,然后再继续。

8. 选项 2:部署到 App Engine(标准环境)

此 Codelab 部分仅适用于部署到 Node App Engine。如果您不感兴趣,请继续下一部分。

此部署使用 app.yaml 配置文件,该文件通过一行代码告知 App Engine 要使用哪个运行时:

runtime: nodejs16

Cloud Functions 和 Cloud Run 均不使用 app.yaml 文件。如果您不打算使用 App Engine,则可以放心地删除此文件。准备好部署到 App Engine 后,请运行以下命令:

$ gcloud app deploy

选择区域后,gcloud app deploy 输出的详细程度会大大降低,应如下所示:

Services to deploy:

descriptor:                  [/private/tmp/nodejs/app.yaml]
source:                      [/private/tmp/nodejs]
target project:              [PROJECT_ID]
target service:              [default]
target version:              [2021...]
target url:                  [https://PROJECT_ID.REG_ABBR.appspot.com]
target service account:      [App Engine default service account]


Do you want to continue (Y/n)?

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 2 files to Google Cloud Storage                          ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...⠏WARNING: *** Improve build performance by generating and committing package-lock.json.

Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://PROJECT_ID.REG_ABBR.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

To take a quick anonymous survey, run:
  $ gcloud survey

现在,您的应用已在全球范围内发布,您应该能够通过包含项目 ID 的网址访问该应用,并且应该会看到类似于本地 Express 版本的输出,但请注意,该应用是在云端运行的,并且可在全球范围内访问:

da28f951c33a2c3d.png

如果您提交请求,会发现它与所有其他部署一样正常运行。

9. 选项 3:部署到 Cloud Functions

本部分 Codelab 仅适用于部署到 Node Cloud Functions。如果您不感兴趣,请继续下一部分。

Cloud Functions 没有配置文件,因此当您准备好部署到 Cloud Functions 时,请运行以下命令:

$ gcloud functions deploy translate \
  --runtime nodejs16 \
  --entry-point app \
  --trigger-http \
  --region REGION \
  --allow-unauthenticated

您的 GCP 项目可能具有默认的 REGION,但您可以使用 --region 标志将函数部署到特定区域。Cloud Functions 不会像其他 Cloud 产品那样提示您。无论您选择哪个区域,gcloud functions deploy 输出都应如下所示:

Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=REGION/15ac7fc1-731d-4f3b-bc15-8f2614xxxxxx?project=062269xxxxxx
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: aaf7e0cd-fbbd-4624-abeb-3e7437xxxxxx
buildName: projects/062269xxxxxx/locations/REGION/builds/aaf7e0cd-fbbd-4624-abeb-3e7437xxxxxx
entryPoint: app
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://REGION-PROJECT_ID.cloudfunctions.net/translate
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/REGION/functions/translate
runtime: nodejs16
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-REGION-01de94c2-6eb4-4c49-aaff-09276cdb7ae9/a1db9f2d-3511-414b-aeeb-de6042xxxxxx.zip
status: ACTIVE
timeout: 60s
updateTime: '2021...'
versionId: '...'

现在,您的应用已在全球范围内提供,您应该可以通过包含项目 ID 的网址(如部署输出中“httpsTrigger/url”下所示)访问该应用。该网址应类似于:https://REGION-PROJECT_ID.cloudfunctions.net/translate,具体取决于您选择的区域以及您的云项目 ID。

518f1c3165f2096d.png

10. 选项 4:部署到 Cloud Run

本部分 Codelab 仅适用于部署到 Cloud Run。如果您不感兴趣,请继续下一部分。

Cloud Run 没有配置文件,因此当您准备好部署到 Cloud Run 时,请按照以下说明操作。

现在,您可以运行以下命令,将翻译服务部署到 Cloud Run:

$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed

输出应如下所示,并提供一些后续步骤的提示:

Please specify a region:
 [1] asia-east1
 [2] asia-east2
. . . (other regions) . . .
 [28] us-west4
 [29] cancel
Please enter your numeric choice:  REGION_CHOICE

To make this the default region, run `gcloud config set run/region REGION`.

Deploying from source requires an Artifact Registry repository to
store build artifacts. A repository named [cloud-run-source-deploy] in
 region [REGION] will be created.

Do you want to continue (Y/n)?

This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]"

Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION]
✓ Building and deploying... Done.
  ✓ Creating Container Repository...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b
  9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

Cloud Buildpacks 会将您的应用部署到 Cloud Run,就像您在本地运行应用一样。对于 Node.js 用户,它会运行 npm install 和 npm start。对于 Python,它会运行 pip install -r requirements.txt 并根据 Procfile 中的说明启动应用。(这同样适用于 Cloud Buildpacks 支持的所有其他语言。)构建流程完成后,您的应用即可投入使用。

然后,您的应用将(在区域级部署,但)在全球范围内提供,并且可以通过包含项目 ID 的网址访问,如部署输出中所示(在“Service URL:”下)。

169f6edf5f7d2068.png

翻译一些内容,看看效果如何!

31554e71cb80f1b4.png

11. 总结

恭喜!您已了解如何启用和使用 Cloud Translation API、获取必要的凭据,以及将简单的 Web 应用部署到本地 Express、App Engine、Cloud Functions 和/或 Cloud Run。请查看 repo 文件夹,详细了解或访问此应用的其他版本以及其他 Codelab。

清理

借助 Cloud Translation API,您每月可免费翻译一定数量的字符。App Engine 也有免费配额,Cloud Functions 和 Cloud Run 也是如此。如果超出任一限制,您都需要付费。如果您打算继续学习下一个 Codelab,则无需关闭应用。

不过,如果您尚未准备好学习下一个教程,或者担心互联网会发现您刚刚部署的应用,请停用 App Engine 应用、删除 Cloud Function 或停用 Cloud Run 服务,以免产生费用。准备好继续学习下一个 Codelab 后,您可以重新启用该功能。另一方面,如果您不打算继续使用此应用或其他 Codelab,并希望彻底删除所有内容,可以关停项目。

此外,部署到 Google Cloud 无服务器计算平台会产生少量构建和存储费用。Cloud Build 和 Cloud Storage 都有各自的免费配额。为了提高透明度,Cloud Build 会构建您的应用映像,然后将其存储在 Cloud Container Registry 或其后继产品 Artifact Registry 中。存储该映像会占用部分配额,将该映像传输到服务时产生的网络出站流量也会占用部分配额。不过,您可能居住在没有此类免费层级的区域,因此请注意存储空间用量,以尽可能减少潜在费用。

12. 其他资源

在以下部分中,您可以找到其他读物以及推荐的练习,以巩固您通过完成本教程获得的知识。

其他研究

现在,您已经积累了一些 Translation API 使用经验,接下来让我们做一些额外的练习,进一步提升您的技能。如需继续学习路线,请修改我们的示例应用,以实现以下功能:

  1. 完成此 Codelab 的所有其他版本,以便在本地运行或部署到 Google Cloud 无服务器计算平台(请参阅代码库 README)。
  2. 使用其他编程语言完成本教程。
  3. 更改此应用以支持不同的源语言或目标语言。
  4. 升级此应用,以便能够将文本翻译成多种语言;更改模板文件,使其包含支持的目标语言下拉菜单。

了解详情

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks、Container Registry、Artifact Registry

Google Cloud Translation 和 Google 机器学习套件

其他 Google Cloud 产品/网页

许可

本教程已获得 Creative Commons Attribution 2.0 通用许可授权,而相应代码库中的源代码已获得 Apache 2 许可授权。