部署基本的“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。该代码库还托管了类似的应用,向开发者展示了如何从我们的无服务器平台访问非 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.png

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,都必须先启用相应 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。此外,它还会启用 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 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 末尾的“清理”部分将介绍如何在完成本 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 调用的父“位置路径”以及 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. 我们没有将 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 installnpm start。对于 Python,它会运行 pip install -r requirements.txt 并根据 Procfile 中的说明启动应用。(这同样适用于 Cloud Buildpack 支持的所有其他语言。)构建流程完成后,您的应用即可投入使用。

然后,您的应用将(在区域级部署,但)在全球范围内提供,并且可以通过包含项目 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 FunctionsCloud Run 也是如此。如果超出任一限制,您都需要付费。如果您打算继续学习下一个 Codelab,则无需关闭应用。

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

此外,部署到 Google Cloud 无服务器计算平台会产生少量构建和存储费用Cloud BuildCloud 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 产品/网页

许可

本教程已获得知识共享署名 2.0 通用许可授权,而相应代码库中的源代码已获得 Apache 2 许可授权。