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

1. 概览

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

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

此 Codelab 将重点介绍如何将该应用部署到上述以粗体显示的平台。

您将了解如何

所需条件

  • 具有有效的 Cloud Billing 账号Google Cloud 项目
  • 安装了一个用于在本地运行的 Web 框架(Flask 适用于执行 Python 教程的用户,Express 适用于执行 JavaScript/Node.js 教程的开发者)
  • 为 Google Cloud 部署至少启用一个无服务器计算平台
  • 基本编程技能(Python 或 JavaScript/Node.js)
  • 具备基本操作系统命令的应用知识

调查问卷

您打算如何使用本教程?

<ph type="x-smartling-placeholder"></ph> 阅读并完成练习 只读

您如何评价使用 Python 或 Node.js 开发应用的经验?

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

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

<ph type="x-smartling-placeholder"></ph> 新手 中级 熟练

2. 设置和要求

自定进度的环境设置

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

96a9c957bc475304

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.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,都必须启用它们。您可以通过命令行或 Cloud 控制台启用 API。API 的启用过程是相同的,因此,启用一种 API 后,就能以相同的方式启用另一种 API。

方法 1gcloud 命令行界面(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

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

7960a6752a1da767

无论您要使用哪种 Google API,启用所有 API 的过程都是类似的。

费用

许多 Google API 可以免费使用,但大多数 Google Cloud 产品和 API 的使用需要付费。启用 Cloud API 时,系统可能会要求您提供有效的结算账号。但是,某些 Google Cloud 产品提供“始终免费”层级,您必须超出此层级才能产生结算费用。

GCP 新用户有资格享受免费试用,目前,前 90 天可获得 300 美元的免费试用赠金。Codelab 通常不会产生太多费用或任何费用,因此我们建议您先等到您真正准备好试用,然后再免费试用,尤其是因为这是一次性优惠。无论您是否使用免费试用,“免费层级”配额不会过期,且适用。

在启用之前,用户应参考任何 API 的价格信息(例如:Cloud Vision API 价格 页面),尤其要注意该 API 是否提供免费层级以及免费层级(如果有)。只要不超过指定的每日或每月限额,您就不会产生任何费用。价格和免费层级因 Google 产品组 API 而异。示例:

不同的 Google 产品的结算方式会有所不同,因此请务必参阅相应信息以了解相关信息。

确保已启用所需的服务

按照上述说明在 API 管理器中安装 Cloud Translation API。如果您未通过命令行启用无服务器平台,可以在 Cloud 控制台的各个信息中心内执行此操作:App EngineCloud FunctionsCloud 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 完成后如何停止产生费用。

4. 获取示例应用代码

下载 ZIP 或克隆代码库

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

5cd6110c4414cf65

现在您已具备所有条件,请创建该文件夹的完整副本以执行此特定教程,因为这可能涉及删除或更改文件。如果您想执行其他部署,可以复制原始部署以重新开始,这样就不必重新克隆或下载它。

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 应用、Cloud 项目 ID、Translation API 客户端和父级“位置路径”适用于 Translation API 调用,以及 SOURCETARGET 语言。在本示例中,语言为英语 (en) 和西班牙语 (es),但您可以随时将这些值更改为 Cloud Translation API 支持的其他语言代码。
  3. 每对(SOURCETARGET)的第一个元素是语言代码,第二个元素是语言名称(仅用于显示目的,因为它与 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. 我们未向 API 传入 SOURCE[0] 并指明特定的英语来源。如果您不指定源语言,则会请求 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,具体取决于您选择的区域以及您的 Cloud 项目 ID。

518f1c3165f2096d

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 Buildpack 将应用打包到 Cloud Run,就像在本地运行应用一样。对于 Node.js 用户,它会运行 npm installnpm start。对于 Python,它会运行 pip install -r requirements.txt 并根据 Procfile 中的说明启动应用。(这同样适用于 Cloud Buildpack 支持的所有其他语言。)构建流程完成后,您的应用即可发布。

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

169f6edf5f7d2068

翻译内容,看看它能否发挥作用!

31554e71cb80f1b4

11. 总结

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

清理

借助 Cloud Translation API,您每月可以免费翻译固定数量的字符。App Engine 还有免费配额Cloud FunctionsCloud Run 也是如此。如果超出上述任一设置,您将需要支付费用。如果您计划继续学习下一个 Codelab,则无需关闭应用。

不过,如果您尚未准备好学习下一个教程,或者担心互联网会发现您刚部署的应用,请停用 App Engine 应用删除 Cloud Functions 函数停用 Cloud Run 服务,以免产生费用。当您准备好继续学习下一个 Codelab 时,可以重新启用它。另一方面,如果您不打算继续学习此应用或其他 Codelab,而是想彻底删除所有内容,则可以关停项目

此外,部署到 Google Cloud 无服务器计算平台会产生少量构建和存储费用Cloud BuildCloud Storage 都有自己的免费配额。为了提高透明度,Cloud Build 会构建您的应用映像,该映像随后会存储在 Cloud Container RegistryArtifact Registry(其后续版本)中。存储该映像会占用部分配额,以及在将该映像传输到服务时的网络出站流量。但是,如果您居住的区域没有这样的免费层级,请留意您的存储空间用量,以最大限度地降低潜在费用。

12. 其他资源

在以下部分中,您可以找到更多阅读材料和推荐的练习,扩充您完成本教程中学到的知识。

其他研究

现在,您已经掌握了 Translation API 的一些使用经验,接下来让我们做一些额外的练习来进一步培养您的技能。要继续您的学习路线,请修改我们的示例应用以执行以下操作:

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

了解详情

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpack、Container Registry、Artifact Registry

Google Cloud Translation 和 Google 机器学习套件

其他 Google Cloud 产品/页面

许可

本教程依据知识共享署名 2.0 通用许可授权,而代码库中的源代码则根据 Apache 2 授权用户使用。