From 4df39032c3ca9b628ca67d915102f51b74545afd Mon Sep 17 00:00:00 2001 From: aribray <45905583+aribray@users.noreply.github.com> Date: Tue, 13 Jul 2021 10:32:22 -0700 Subject: [PATCH] add: Translate Document & Batch Translate Document samples (#694) * translate document sample and test Change-Id: Id0f943163f063e114aaec5703f3160a5b9c71485 * remove comment Change-Id: I13ee4f8692c76416564d05485271a50929ff42cf * lint Change-Id: I3eb785d6a164748484726ad359a8ae7f8156051d * batch translate document Change-Id: Id36d46f363cb061c38ddf099e23836020757b9f2 * batch translate document Change-Id: Ifbf6c3faec2352237f44d714c31360349b950efb * update year Change-Id: Icb80b2a660ee38de5cbbd09e497eeaf4d3532371 * refactor error handling Change-Id: Ic7493f025e1c98b3c4e0dbc6a48919e8a2df309e * refactor error handling Change-Id: Ibe57fa98dbb060039d8b60684238294f3f4746f1 --- ...translate_batch_translate_document.test.js | 81 ++++++++++++++++++ .../translate_translate_document.test.js | 37 +++++++++ .../translate_batch_translate_document.js | 83 +++++++++++++++++++ .../v3beta1/translate_translate_document.js | 67 +++++++++++++++ 4 files changed, 268 insertions(+) create mode 100644 translate/test/v3beta1/translate_batch_translate_document.test.js create mode 100644 translate/test/v3beta1/translate_translate_document.test.js create mode 100644 translate/v3beta1/translate_batch_translate_document.js create mode 100644 translate/v3beta1/translate_translate_document.js diff --git a/translate/test/v3beta1/translate_batch_translate_document.test.js b/translate/test/v3beta1/translate_batch_translate_document.test.js new file mode 100644 index 0000000000..8ef639eb68 --- /dev/null +++ b/translate/test/v3beta1/translate_batch_translate_document.test.js @@ -0,0 +1,81 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it, before, after} = require('mocha'); +const {TranslationServiceClient} = require('@google-cloud/translate').v3beta1; +const {Storage} = require('@google-cloud/storage'); +const cp = require('child_process'); +const uuid = require('uuid'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const REGION_TAG = 'translate_batch_translate_document'; + +describe(REGION_TAG, () => { + const translationClient = new TranslationServiceClient(); + const location = 'us-central1'; + const bucketUuid = uuid.v4(); + const bucketName = `translation-${bucketUuid}/BATCH_OUTPUT/`; + const storage = new Storage(); + + before(async () => { + const projectId = await translationClient.getProjectId(); + + //Create bucket if needed + try { + await storage.createBucket(projectId, { + location: 'US', + storageClass: 'COLDLINE', + }); + } catch (error) { + if (error.code !== 409) { + //if it's not a duplicate bucket error, let the user know + console.error(error); + throw error; + } + } + }); + + it('should batch translate the input documents', async function () { + this.retries(3); + const projectId = await translationClient.getProjectId(); + const inputUri = 'gs://cloud-samples-data/translation/async_invoices/*'; + + const outputUri = `gs://${projectId}/${bucketName}`; + const output = execSync( + `node v3beta1/${REGION_TAG}.js ${projectId} ${location} ${inputUri} ${outputUri}` + ); + assert.match(output, /Total Pages: /); + + this.timeout(500000); + }); + + // Delete the folder from GCS for cleanup + after(async () => { + const projectId = await translationClient.getProjectId(); + const options = { + prefix: `translation-${bucketUuid}`, + }; + + const bucket = await storage.bucket(projectId); + const [files] = await bucket.getFiles(options); + const length = files.length; + if (length > 0) { + await Promise.all(files.map(file => file.delete())); + } + }); +}); diff --git a/translate/test/v3beta1/translate_translate_document.test.js b/translate/test/v3beta1/translate_translate_document.test.js new file mode 100644 index 0000000000..2fc2236396 --- /dev/null +++ b/translate/test/v3beta1/translate_translate_document.test.js @@ -0,0 +1,37 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const {TranslationServiceClient} = require('@google-cloud/translate').v3beta1; +const cp = require('child_process'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const REGION_TAG = 'translate_translate_document'; + +describe(REGION_TAG, () => { + it('should translate the input document', async () => { + const translationClient = new TranslationServiceClient(); + const projectId = await translationClient.getProjectId(); + const location = 'global'; + const inputUri = 'gs://cloud-samples-data/translation/fake_invoice.pdf'; + const output = execSync( + `node v3beta1/${REGION_TAG}.js ${projectId} ${location} ${inputUri}` + ); + assert.match(output, /Response: Mime Type/); + }); +}); diff --git a/translate/v3beta1/translate_batch_translate_document.js b/translate/v3beta1/translate_batch_translate_document.js new file mode 100644 index 0000000000..6d487ea94b --- /dev/null +++ b/translate/v3beta1/translate_batch_translate_document.js @@ -0,0 +1,83 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'us-central1', + inputUri = 'gs://cloud-samples-data/translation/async_invoices/*', + outputUri = 'gs://YOUR_PROJECT_ID/translation/BATCH_DOCUMENT_TRANSLATION_OUTPUT/' +) { + // [START translate_batch_translate_document] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'us-central1'; + // const inputUri = 'path_to_your_files'; + // const outputUri = 'path_to_your_output_bucket'; + + // Imports the Google Cloud Translation library + const {TranslationServiceClient} = require('@google-cloud/translate').v3beta1; + + // Instantiates a client + const translationClient = new TranslationServiceClient(); + + const documentInputConfig = { + gcsSource: { + inputUri: inputUri, + }, + }; + + async function batchTranslateDocument() { + // Construct request + const request = { + parent: translationClient.locationPath(projectId, location), + documentInputConfig: documentInputConfig, + sourceLanguageCode: 'en-US', + targetLanguageCodes: ['sr-Latn'], + inputConfigs: [ + { + gcsSource: { + inputUri: inputUri, + }, + }, + ], + outputConfig: { + gcsDestination: { + outputUriPrefix: outputUri, + }, + }, + }; + + // Batch translate documents using a long-running operation. + // You can wait for now, or get results later. + const [operation] = await translationClient.batchTranslateDocument(request); + + // Wait for operation to complete. + const [response] = await operation.promise(); + + console.log(`Total Pages: ${response.totalPages}`); + } + + batchTranslateDocument(); + // [END translate_batch_translate_document] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2)); diff --git a/translate/v3beta1/translate_translate_document.js b/translate/v3beta1/translate_translate_document.js new file mode 100644 index 0000000000..65de3af613 --- /dev/null +++ b/translate/v3beta1/translate_translate_document.js @@ -0,0 +1,67 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'global', + inputUri = 'path_to_your_file' +) { + // [START translate_translate_document] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'global'; + // const inputUri = 'path_to_your_file'; + + // Imports the Google Cloud Translation library + const {TranslationServiceClient} = require('@google-cloud/translate').v3beta1; + + // Instantiates a client + const translationClient = new TranslationServiceClient(); + + const documentInputConfig = { + gcsSource: { + inputUri: inputUri, + }, + }; + + async function translateDocument() { + // Construct request + const request = { + parent: translationClient.locationPath(projectId, location), + documentInputConfig: documentInputConfig, + sourceLanguageCode: 'en-US', + targetLanguageCode: 'sr-Latn', + }; + + // Run request + const [response] = await translationClient.translateDocument(request); + + console.log( + `Response: Mime Type - ${response.documentTranslation.mimeType}` + ); + } + + translateDocument(); + // [END translate_translate_document] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2));