<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="translate_v3.html">Cloud Translation API</a> . <a href="translate_v3.projects.html">projects</a> . <a href="translate_v3.projects.locations.html">locations</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="translate_v3.projects.locations.glossaries.html">glossaries()</a></code>
</p>
<p class="firstline">Returns the glossaries Resource.</p>

<p class="toc_element">
  <code><a href="translate_v3.projects.locations.operations.html">operations()</a></code>
</p>
<p class="firstline">Returns the operations Resource.</p>

<p class="toc_element">
  <code><a href="#batchTranslateText">batchTranslateText(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Translates a large volume of text in asynchronous batch mode.</p>
<p class="toc_element">
  <code><a href="#detectLanguage">detectLanguage(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Detects the language of text within a request.</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets information about a location.</p>
<p class="toc_element">
  <code><a href="#getSupportedLanguages">getSupportedLanguages(parent, displayLanguageCode=None, model=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns a list of supported languages for translation.</p>
<p class="toc_element">
  <code><a href="#list">list(name, pageSize=None, filter=None, pageToken=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists information about the supported locations for this service.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#translateText">translateText(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Translates input text and returns translated text.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="batchTranslateText">batchTranslateText(parent, body=None, x__xgafv=None)</code>
  <pre>Translates a large volume of text in asynchronous batch mode.
This function provides real-time output as the inputs are being processed.
If caller cancels a request, the partial results (for an input file, it&#x27;s
all or nothing) may still be available on the specified output location.

This call returns immediately and you can
use google.longrunning.Operation.name to poll the status of the call.

Args:
  parent: string, Required. Location to make a call. Must refer to a caller&#x27;s project.

Format: `projects/{project-number-or-id}/locations/{location-id}`.

The `global` location is not supported for batch translation.

Only AutoML Translation models or glossaries within the same region (have
the same location-id) can be used, otherwise an INVALID_ARGUMENT (400)
error is returned. (required)
  body: object, The request body.
    The object takes the form of:

{ # The batch translation request.
    &quot;sourceLanguageCode&quot;: &quot;A String&quot;, # Required. Source language code.
    &quot;labels&quot;: { # Optional. The labels with user-defined metadata for the request.
        # 
        # Label keys and values can be no longer than 63 characters
        # (Unicode codepoints), can only contain lowercase letters, numeric
        # characters, underscores and dashes. International characters are allowed.
        # Label values are optional. Label keys must start with a letter.
        # 
        # See https://cloud.google.com/translate/docs/advanced/labels for more
        # information.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;models&quot;: { # Optional. The models to use for translation. Map&#x27;s key is target language
        # code. Map&#x27;s value is model name. Value can be a built-in general model,
        # or an AutoML Translation model.
        # 
        # The value format depends on model type:
        # 
        # - AutoML Translation models:
        #   `projects/{project-number-or-id}/locations/{location-id}/models/{model-id}`
        # 
        # - General (built-in) models:
        #   `projects/{project-number-or-id}/locations/{location-id}/models/general/nmt`,
        #   `projects/{project-number-or-id}/locations/{location-id}/models/general/base`
        # 
        # 
        # If the map is empty or a specific model is
        # not requested for a language pair, then default google model (nmt) is used.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;glossaries&quot;: { # Optional. Glossaries to be applied for translation.
        # It&#x27;s keyed by target language code.
      &quot;a_key&quot;: { # Configures which glossary should be used for a specific target language,
          # and defines options for applying that glossary.
        &quot;glossary&quot;: &quot;A String&quot;, # Required. The `glossary` to be applied for this translation.
            #
            # The format depends on glossary:
            #
            # - User provided custom glossary:
            #   `projects/{project-number-or-id}/locations/{location-id}/glossaries/{glossary-id}`
        &quot;ignoreCase&quot;: True or False, # Optional. Indicates match is case-insensitive.
            # Default value is false if missing.
      },
    },
    &quot;outputConfig&quot;: { # Output configuration for BatchTranslateText request. # Required. Output configuration.
        # If 2 input configs match to the same file (that is, same input path),
        # we don&#x27;t generate output for duplicate inputs.
      &quot;gcsDestination&quot;: { # The Google Cloud Storage location for the output content. # Google Cloud Storage destination for output content.
          # For every single input file (for example, gs://a/b/c.[extension]), we
          # generate at most 2 * n output files. (n is the # of target_language_codes
          # in the BatchTranslateTextRequest).
          #
          # Output files (tsv) generated are compliant with RFC 4180 except that
          # record delimiters are &#x27;\n&#x27; instead of &#x27;\r\n&#x27;. We don&#x27;t provide any way to
          # change record delimiters.
          #
          # While the input files are being processed, we write/update an index file
          # &#x27;index.csv&#x27;  under &#x27;output_uri_prefix&#x27; (for example,
          # gs://translation-test/index.csv) The index file is generated/updated as
          # new files are being translated. The format is:
          #
          # input_file,target_language_code,translations_file,errors_file,
          # glossary_translations_file,glossary_errors_file
          #
          # input_file is one file we matched using gcs_source.input_uri.
          # target_language_code is provided in the request.
          # translations_file contains the translations. (details provided below)
          # errors_file contains the errors during processing of the file. (details
          # below). Both translations_file and errors_file could be empty
          # strings if we have no content to output.
          # glossary_translations_file and glossary_errors_file are always empty
          # strings if the input_file is tsv. They could also be empty if we have no
          # content to output.
          #
          # Once a row is present in index.csv, the input/output matching never
          # changes. Callers should also expect all the content in input_file are
          # processed and ready to be consumed (that is, no partial output file is
          # written).
          #
          # The format of translations_file (for target language code &#x27;trg&#x27;) is:
          # gs://translation_test/a_b_c_&#x27;trg&#x27;_translations.[extension]
          #
          # If the input file extension is tsv, the output has the following
          # columns:
          # Column 1: ID of the request provided in the input, if it&#x27;s not
          # provided in the input, then the input row number is used (0-based).
          # Column 2: source sentence.
          # Column 3: translation without applying a glossary. Empty string if there
          # is an error.
          # Column 4 (only present if a glossary is provided in the request):
          # translation after applying the glossary. Empty string if there is an
          # error applying the glossary. Could be same string as column 3 if there is
          # no glossary applied.
          #
          # If input file extension is a txt or html, the translation is directly
          # written to the output file. If glossary is requested, a separate
          # glossary_translations_file has format of
          # gs://translation_test/a_b_c_&#x27;trg&#x27;_glossary_translations.[extension]
          #
          # The format of errors file (for target language code &#x27;trg&#x27;) is:
          # gs://translation_test/a_b_c_&#x27;trg&#x27;_errors.[extension]
          #
          # If the input file extension is tsv, errors_file contains the following:
          # Column 1: ID of the request provided in the input, if it&#x27;s not
          # provided in the input, then the input row number is used (0-based).
          # Column 2: source sentence.
          # Column 3: Error detail for the translation. Could be empty.
          # Column 4 (only present if a glossary is provided in the request):
          # Error when applying the glossary.
          #
          # If the input file extension is txt or html, glossary_error_file will be
          # generated that contains error details. glossary_error_file has format of
          # gs://translation_test/a_b_c_&#x27;trg&#x27;_glossary_errors.[extension]
        &quot;outputUriPrefix&quot;: &quot;A String&quot;, # Required. The bucket used in &#x27;output_uri_prefix&#x27; must exist and there must be no
            # files under &#x27;output_uri_prefix&#x27;. &#x27;output_uri_prefix&#x27; must end with &quot;/&quot; and
            # start with &quot;gs://&quot;. One &#x27;output_uri_prefix&#x27; can only be used by one batch
            # translation job at a time. Otherwise an INVALID_ARGUMENT (400) error is
            #  returned.
      },
    },
    &quot;targetLanguageCodes&quot;: [ # Required. Specify up to 10 language codes here.
      &quot;A String&quot;,
    ],
    &quot;inputConfigs&quot;: [ # Required. Input configurations.
        # The total number of files matched should be &lt;= 1000.
        # The total content size should be &lt;= 100M Unicode codepoints.
        # The files must use UTF-8 encoding.
      { # Input configuration for BatchTranslateText request.
        &quot;gcsSource&quot;: { # The Google Cloud Storage location for the input content. # Required. Google Cloud Storage location for the source input.
            # This can be a single file (for example,
            # `gs://translation-test/input.tsv`) or a wildcard (for example,
            # `gs://translation-test/*`). If a file extension is `.tsv`, it can
            # contain either one or two columns. The first column (optional) is the id
            # of the text request. If the first column is missing, we use the row
            # number (0-based) from the input file as the ID in the output file. The
            # second column is the actual text to be
            #  translated. We recommend each row be &lt;= 10K Unicode codepoints,
            # otherwise an error might be returned.
            # Note that the input tsv must be RFC 4180 compliant.
            #
            # You could use https://github.com/Clever/csvlint to check potential
            # formatting errors in your tsv file.
            # csvlint --delimiter=&#x27;\t&#x27; your_input_file.tsv
            #
            # The other supported file extensions are `.txt` or `.html`, which is
            # treated as a single large chunk of text.
          &quot;inputUri&quot;: &quot;A String&quot;, # Required. Source data URI. For example, `gs://my_bucket/my_object`.
        },
        &quot;mimeType&quot;: &quot;A String&quot;, # Optional. Can be &quot;text/plain&quot; or &quot;text/html&quot;.
            # For `.tsv`, &quot;text/html&quot; is used if mime_type is missing.
            # For `.html`, this field must be &quot;text/html&quot; or empty.
            # For `.txt`, this field must be &quot;text/plain&quot; or empty.
      },
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="detectLanguage">detectLanguage(parent, body=None, x__xgafv=None)</code>
  <pre>Detects the language of text within a request.

Args:
  parent: string, Required. Project or location to make a call. Must refer to a caller&#x27;s
project.

Format: `projects/{project-number-or-id}/locations/{location-id}` or
`projects/{project-number-or-id}`.

For global calls, use `projects/{project-number-or-id}/locations/global` or
`projects/{project-number-or-id}`.

Only models within the same region (has same location-id) can be used.
Otherwise an INVALID_ARGUMENT (400) error is returned. (required)
  body: object, The request body.
    The object takes the form of:

{ # The request message for language detection.
    &quot;labels&quot;: { # Optional. The labels with user-defined metadata for the request.
        # 
        # Label keys and values can be no longer than 63 characters
        # (Unicode codepoints), can only contain lowercase letters, numeric
        # characters, underscores and dashes. International characters are allowed.
        # Label values are optional. Label keys must start with a letter.
        # 
        # See https://cloud.google.com/translate/docs/advanced/labels for more
        # information.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;content&quot;: &quot;A String&quot;, # The content of the input stored as a string.
    &quot;mimeType&quot;: &quot;A String&quot;, # Optional. The format of the source text, for example, &quot;text/html&quot;,
        # &quot;text/plain&quot;. If left blank, the MIME type defaults to &quot;text/html&quot;.
    &quot;model&quot;: &quot;A String&quot;, # Optional. The language detection model to be used.
        # 
        # Format:
        # `projects/{project-number-or-id}/locations/{location-id}/models/language-detection/{model-id}`
        # 
        # Only one language detection model is currently supported:
        # `projects/{project-number-or-id}/locations/{location-id}/models/language-detection/default`.
        # 
        # If not specified, the default model is used.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response message for language detection.
    &quot;languages&quot;: [ # A list of detected languages sorted by detection confidence in descending
        # order. The most probable language first.
      { # The response message for language detection.
        &quot;confidence&quot;: 3.14, # The confidence of the detection result for this language.
        &quot;languageCode&quot;: &quot;A String&quot;, # The BCP-47 language code of source content in the request, detected
            # automatically.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Gets information about a location.

Args:
  name: string, Resource name for the location. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A resource that represents Google Cloud Platform location.
    &quot;displayName&quot;: &quot;A String&quot;, # The friendly name for this location, typically a nearby city name.
        # For example, &quot;Tokyo&quot;.
    &quot;labels&quot;: { # Cross-service attributes for the location. For example
        #
        #     {&quot;cloud.googleapis.com/region&quot;: &quot;us-east1&quot;}
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;locationId&quot;: &quot;A String&quot;, # The canonical id for this location. For example: `&quot;us-east1&quot;`.
    &quot;metadata&quot;: { # Service-specific metadata. For example the available capacity at the given
        # location.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # Resource name for the location, which may vary between implementations.
        # For example: `&quot;projects/example-project/locations/us-east1&quot;`
  }</pre>
</div>

<div class="method">
    <code class="details" id="getSupportedLanguages">getSupportedLanguages(parent, displayLanguageCode=None, model=None, x__xgafv=None)</code>
  <pre>Returns a list of supported languages for translation.

Args:
  parent: string, Required. Project or location to make a call. Must refer to a caller&#x27;s
project.

Format: `projects/{project-number-or-id}` or
`projects/{project-number-or-id}/locations/{location-id}`.

For global calls, use `projects/{project-number-or-id}/locations/global` or
`projects/{project-number-or-id}`.

Non-global location is required for AutoML models.

Only models within the same region (have same location-id) can be used,
otherwise an INVALID_ARGUMENT (400) error is returned. (required)
  displayLanguageCode: string, Optional. The language to use to return localized, human readable names
of supported languages. If missing, then display names are not returned
in a response.
  model: string, Optional. Get supported languages of this model.

The format depends on model type:

- AutoML Translation models:
  `projects/{project-number-or-id}/locations/{location-id}/models/{model-id}`

- General (built-in) models:
  `projects/{project-number-or-id}/locations/{location-id}/models/general/nmt`,
  `projects/{project-number-or-id}/locations/{location-id}/models/general/base`


Returns languages supported by the specified model.
If missing, we get supported languages of Google general base (PBMT) model.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response message for discovering supported languages.
    &quot;languages&quot;: [ # A list of supported language responses. This list contains an entry
        # for each language the Translation API supports.
      { # A single supported language response corresponds to information related
          # to one supported language.
        &quot;displayName&quot;: &quot;A String&quot;, # Human readable name of the language localized in the display language
            # specified in the request.
        &quot;languageCode&quot;: &quot;A String&quot;, # Supported language code, generally consisting of its ISO 639-1
            # identifier, for example, &#x27;en&#x27;, &#x27;ja&#x27;. In certain cases, BCP-47 codes
            # including language and region identifiers are returned (for example,
            # &#x27;zh-TW&#x27; and &#x27;zh-CN&#x27;)
        &quot;supportSource&quot;: True or False, # Can be used as source language.
        &quot;supportTarget&quot;: True or False, # Can be used as target language.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(name, pageSize=None, filter=None, pageToken=None, x__xgafv=None)</code>
  <pre>Lists information about the supported locations for this service.

Args:
  name: string, The resource that owns the locations collection, if applicable. (required)
  pageSize: integer, The standard list page size.
  filter: string, The standard list filter.
  pageToken: string, The standard list page token.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response message for Locations.ListLocations.
    &quot;nextPageToken&quot;: &quot;A String&quot;, # The standard List next-page token.
    &quot;locations&quot;: [ # A list of locations that matches the specified filter in the request.
      { # A resource that represents Google Cloud Platform location.
        &quot;displayName&quot;: &quot;A String&quot;, # The friendly name for this location, typically a nearby city name.
            # For example, &quot;Tokyo&quot;.
        &quot;labels&quot;: { # Cross-service attributes for the location. For example
            #
            #     {&quot;cloud.googleapis.com/region&quot;: &quot;us-east1&quot;}
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;locationId&quot;: &quot;A String&quot;, # The canonical id for this location. For example: `&quot;us-east1&quot;`.
        &quot;metadata&quot;: { # Service-specific metadata. For example the available capacity at the given
            # location.
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
        &quot;name&quot;: &quot;A String&quot;, # Resource name for the location, which may vary between implementations.
            # For example: `&quot;projects/example-project/locations/us-east1&quot;`
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call &#x27;execute()&#x27; on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

<div class="method">
    <code class="details" id="translateText">translateText(parent, body=None, x__xgafv=None)</code>
  <pre>Translates input text and returns translated text.

Args:
  parent: string, Required. Project or location to make a call. Must refer to a caller&#x27;s
project.

Format: `projects/{project-number-or-id}` or
`projects/{project-number-or-id}/locations/{location-id}`.

For global calls, use `projects/{project-number-or-id}/locations/global` or
`projects/{project-number-or-id}`.

Non-global location is required for requests using AutoML models or
custom glossaries.

Models and glossaries must be within the same region (have same
location-id), otherwise an INVALID_ARGUMENT (400) error is returned. (required)
  body: object, The request body.
    The object takes the form of:

{ # The request message for synchronous translation.
    &quot;labels&quot;: { # Optional. The labels with user-defined metadata for the request.
        # 
        # Label keys and values can be no longer than 63 characters
        # (Unicode codepoints), can only contain lowercase letters, numeric
        # characters, underscores and dashes. International characters are allowed.
        # Label values are optional. Label keys must start with a letter.
        # 
        # See https://cloud.google.com/translate/docs/advanced/labels for more
        # information.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;sourceLanguageCode&quot;: &quot;A String&quot;, # Optional. The BCP-47 language code of the input text if
        # known, for example, &quot;en-US&quot; or &quot;sr-Latn&quot;. Supported language codes are
        # listed in Language Support. If the source language isn&#x27;t specified, the API
        # attempts to identify the source language automatically and returns the
        # source language within the response.
    &quot;mimeType&quot;: &quot;A String&quot;, # Optional. The format of the source text, for example, &quot;text/html&quot;,
        #  &quot;text/plain&quot;. If left blank, the MIME type defaults to &quot;text/html&quot;.
    &quot;model&quot;: &quot;A String&quot;, # Optional. The `model` type requested for this translation.
        # 
        # The format depends on model type:
        # 
        # - AutoML Translation models:
        #   `projects/{project-number-or-id}/locations/{location-id}/models/{model-id}`
        # 
        # - General (built-in) models:
        #   `projects/{project-number-or-id}/locations/{location-id}/models/general/nmt`,
        #   `projects/{project-number-or-id}/locations/{location-id}/models/general/base`
        # 
        # 
        # For global (non-regionalized) requests, use `location-id` `global`.
        # For example,
        # `projects/{project-number-or-id}/locations/global/models/general/nmt`.
        # 
        # If missing, the system decides which google base model to use.
    &quot;contents&quot;: [ # Required. The content of the input in string format.
        # We recommend the total content be less than 30k codepoints.
        # Use BatchTranslateText for larger text.
      &quot;A String&quot;,
    ],
    &quot;targetLanguageCode&quot;: &quot;A String&quot;, # Required. The BCP-47 language code to use for translation of the input
        # text, set to one of the language codes listed in Language Support.
    &quot;glossaryConfig&quot;: { # Configures which glossary should be used for a specific target language, # Optional. Glossary to be applied. The glossary must be
        # within the same region (have the same location-id) as the model, otherwise
        # an INVALID_ARGUMENT (400) error is returned.
        # and defines options for applying that glossary.
      &quot;glossary&quot;: &quot;A String&quot;, # Required. The `glossary` to be applied for this translation.
          #
          # The format depends on glossary:
          #
          # - User provided custom glossary:
          #   `projects/{project-number-or-id}/locations/{location-id}/glossaries/{glossary-id}`
      &quot;ignoreCase&quot;: True or False, # Optional. Indicates match is case-insensitive.
          # Default value is false if missing.
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    {
    &quot;glossaryTranslations&quot;: [ # Text translation responses if a glossary is provided in the request.
        # This can be the same as
        # `translations` if no terms apply.
        # This field has the same length as
        # `contents`.
      { # A single translation response.
        &quot;glossaryConfig&quot;: { # Configures which glossary should be used for a specific target language, # The `glossary_config` used for this translation.
            # and defines options for applying that glossary.
          &quot;glossary&quot;: &quot;A String&quot;, # Required. The `glossary` to be applied for this translation.
              #
              # The format depends on glossary:
              #
              # - User provided custom glossary:
              #   `projects/{project-number-or-id}/locations/{location-id}/glossaries/{glossary-id}`
          &quot;ignoreCase&quot;: True or False, # Optional. Indicates match is case-insensitive.
              # Default value is false if missing.
        },
        &quot;detectedLanguageCode&quot;: &quot;A String&quot;, # The BCP-47 language code of source text in the initial request, detected
            # automatically, if no source language was passed within the initial
            # request. If the source language was passed, auto-detection of the language
            # does not occur and this field is empty.
        &quot;model&quot;: &quot;A String&quot;, # Only present when `model` is present in the request.
            # `model` here is normalized to have project number.
            #
            # For example:
            # If the `model` requested in TranslationTextRequest is
            # `projects/{project-id}/locations/{location-id}/models/general/nmt` then
            # `model` here would be normalized to
            # `projects/{project-number}/locations/{location-id}/models/general/nmt`.
        &quot;translatedText&quot;: &quot;A String&quot;, # Text translated into the target language.
      },
    ],
    &quot;translations&quot;: [ # Text translation responses with no glossary applied.
        # This field has the same length as
        # `contents`.
      { # A single translation response.
        &quot;glossaryConfig&quot;: { # Configures which glossary should be used for a specific target language, # The `glossary_config` used for this translation.
            # and defines options for applying that glossary.
          &quot;glossary&quot;: &quot;A String&quot;, # Required. The `glossary` to be applied for this translation.
              #
              # The format depends on glossary:
              #
              # - User provided custom glossary:
              #   `projects/{project-number-or-id}/locations/{location-id}/glossaries/{glossary-id}`
          &quot;ignoreCase&quot;: True or False, # Optional. Indicates match is case-insensitive.
              # Default value is false if missing.
        },
        &quot;detectedLanguageCode&quot;: &quot;A String&quot;, # The BCP-47 language code of source text in the initial request, detected
            # automatically, if no source language was passed within the initial
            # request. If the source language was passed, auto-detection of the language
            # does not occur and this field is empty.
        &quot;model&quot;: &quot;A String&quot;, # Only present when `model` is present in the request.
            # `model` here is normalized to have project number.
            #
            # For example:
            # If the `model` requested in TranslationTextRequest is
            # `projects/{project-id}/locations/{location-id}/models/general/nmt` then
            # `model` here would be normalized to
            # `projects/{project-number}/locations/{location-id}/models/general/nmt`.
        &quot;translatedText&quot;: &quot;A String&quot;, # Text translated into the target language.
      },
    ],
  }</pre>
</div>

</body></html>