Switch to using the dep tool and update all the dependencies
This commit is contained in:
+12
@@ -0,0 +1,12 @@
|
||||
translate-nov2016-api.json is a hand-modified version of translate-api.json.
|
||||
It correctly reflects the API as of 2016-11-15.
|
||||
|
||||
Differences:
|
||||
|
||||
- Change to base URL
|
||||
- Addition of OAuth scopes
|
||||
|
||||
To generate:
|
||||
|
||||
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
#!/bin/bash -e
|
||||
|
||||
|
||||
(cd $GOPATH/src/google.golang.org/api; make generator)
|
||||
|
||||
$GOPATH/bin/google-api-go-generator \
|
||||
-api_json_file translate-nov2016-api.json \
|
||||
-api_pkg_base cloud.google.com/go/translate/internal \
|
||||
-output translate-nov2016-gen.nolicense
|
||||
|
||||
cat - translate-nov2016-gen.nolicense > translate-nov2016-gen.go <<EOF
|
||||
// Copyright 2016 Google Inc. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
|
||||
EOF
|
||||
|
||||
|
||||
|
||||
Generated
Vendored
+285
@@ -0,0 +1,285 @@
|
||||
{
|
||||
"kind": "discovery#restDescription",
|
||||
"etag": "\"C5oy1hgQsABtYOYIOXWcR3BgYqU/6s__cFeA5l1i01rONlu3TmUQEHs\"",
|
||||
"discoveryVersion": "v1",
|
||||
"id": "translate:v2",
|
||||
"name": "translate",
|
||||
"version": "v2",
|
||||
"revision": "20161115",
|
||||
"title": "Translate API",
|
||||
"description": "Translates text from one language to another.",
|
||||
"ownerDomain": "google.com",
|
||||
"ownerName": "Google",
|
||||
"icons": {
|
||||
"x16": "https://www.google.com/images/icons/product/translate-16.png",
|
||||
"x32": "https://www.google.com/images/icons/product/translate-32.png"
|
||||
},
|
||||
"documentationLink": "https://developers.google.com/translate/v2/using_rest",
|
||||
"protocol": "rest",
|
||||
"baseUrl": "https://translation.googleapis.com/language/translate/",
|
||||
"basePath": "/language/translate/",
|
||||
"rootUrl": "https://translation.googleapis.com/",
|
||||
"servicePath": "language/translate/",
|
||||
"batchPath": "batch",
|
||||
"parameters": {
|
||||
"alt": {
|
||||
"type": "string",
|
||||
"description": "Data format for the response.",
|
||||
"default": "json",
|
||||
"enum": [
|
||||
"json"
|
||||
],
|
||||
"enumDescriptions": [
|
||||
"Responses with Content-Type of application/json"
|
||||
],
|
||||
"location": "query"
|
||||
},
|
||||
"fields": {
|
||||
"type": "string",
|
||||
"description": "Selector specifying which fields to include in a partial response.",
|
||||
"location": "query"
|
||||
},
|
||||
"key": {
|
||||
"type": "string",
|
||||
"description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
|
||||
"location": "query"
|
||||
},
|
||||
"oauth_token": {
|
||||
"type": "string",
|
||||
"description": "OAuth 2.0 token for the current user.",
|
||||
"location": "query"
|
||||
},
|
||||
"prettyPrint": {
|
||||
"type": "boolean",
|
||||
"description": "Returns response with indentations and line breaks.",
|
||||
"default": "true",
|
||||
"location": "query"
|
||||
},
|
||||
"quotaUser": {
|
||||
"type": "string",
|
||||
"description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
|
||||
"location": "query"
|
||||
},
|
||||
"userIp": {
|
||||
"type": "string",
|
||||
"description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
|
||||
"location": "query"
|
||||
}
|
||||
},
|
||||
"auth": {
|
||||
"oauth2": {
|
||||
"scopes": {
|
||||
"https://www.googleapis.com/auth/cloud-platform": {
|
||||
"description": "View and manage your data across Google Cloud Platform services"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"features": [
|
||||
"dataWrapper"
|
||||
],
|
||||
"schemas": {
|
||||
"DetectionsListResponse": {
|
||||
"id": "DetectionsListResponse",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"detections": {
|
||||
"type": "array",
|
||||
"description": "A detections contains detection results of several text",
|
||||
"items": {
|
||||
"$ref": "DetectionsResource"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"DetectionsResource": {
|
||||
"id": "DetectionsResource",
|
||||
"type": "array",
|
||||
"description": "An array of languages which we detect for the given text The most likely language list first.",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"confidence": {
|
||||
"type": "number",
|
||||
"description": "The confidence of the detection resul of this language.",
|
||||
"format": "float"
|
||||
},
|
||||
"isReliable": {
|
||||
"type": "boolean",
|
||||
"description": "A boolean to indicate is the language detection result reliable."
|
||||
},
|
||||
"language": {
|
||||
"type": "string",
|
||||
"description": "The language we detect"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"LanguagesListResponse": {
|
||||
"id": "LanguagesListResponse",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"languages": {
|
||||
"type": "array",
|
||||
"description": "List of source/target languages supported by the translation API. If target parameter is unspecified, the list is sorted by the ASCII code point order of the language code. If target parameter is specified, the list is sorted by the collation order of the language name in the target language.",
|
||||
"items": {
|
||||
"$ref": "LanguagesResource"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"LanguagesResource": {
|
||||
"id": "LanguagesResource",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"language": {
|
||||
"type": "string",
|
||||
"description": "The language code."
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "The localized name of the language if target parameter is given."
|
||||
}
|
||||
}
|
||||
},
|
||||
"TranslationsListResponse": {
|
||||
"id": "TranslationsListResponse",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"translations": {
|
||||
"type": "array",
|
||||
"description": "Translations contains list of translation results of given text",
|
||||
"items": {
|
||||
"$ref": "TranslationsResource"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"TranslationsResource": {
|
||||
"id": "TranslationsResource",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"detectedSourceLanguage": {
|
||||
"type": "string",
|
||||
"description": "Detected source language if source parameter is unspecified."
|
||||
},
|
||||
"model": {
|
||||
"type": "string",
|
||||
"description": "Model used for translation."
|
||||
},
|
||||
"translatedText": {
|
||||
"type": "string",
|
||||
"description": "The translation."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"resources": {
|
||||
"detections": {
|
||||
"methods": {
|
||||
"list": {
|
||||
"id": "language.detections.list",
|
||||
"path": "v2/detect",
|
||||
"httpMethod": "GET",
|
||||
"description": "Detect the language of text.",
|
||||
"parameters": {
|
||||
"q": {
|
||||
"type": "string",
|
||||
"description": "The text to detect",
|
||||
"required": true,
|
||||
"repeated": true,
|
||||
"location": "query"
|
||||
}
|
||||
},
|
||||
"parameterOrder": [
|
||||
"q"
|
||||
],
|
||||
"response": {
|
||||
"$ref": "DetectionsListResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"methods": {
|
||||
"list": {
|
||||
"id": "language.languages.list",
|
||||
"path": "v2/languages",
|
||||
"httpMethod": "GET",
|
||||
"description": "List the source/target languages supported by the API",
|
||||
"parameters": {
|
||||
"target": {
|
||||
"type": "string",
|
||||
"description": "the language and collation in which the localized results should be returned",
|
||||
"location": "query"
|
||||
}
|
||||
},
|
||||
"response": {
|
||||
"$ref": "LanguagesListResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"translations": {
|
||||
"methods": {
|
||||
"list": {
|
||||
"id": "language.translations.list",
|
||||
"path": "v2",
|
||||
"httpMethod": "GET",
|
||||
"description": "Returns text translations from one language to another.",
|
||||
"parameters": {
|
||||
"cid": {
|
||||
"type": "string",
|
||||
"description": "The customization id for translate",
|
||||
"repeated": true,
|
||||
"location": "query"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "The format of the text",
|
||||
"enum": [
|
||||
"html",
|
||||
"text"
|
||||
],
|
||||
"enumDescriptions": [
|
||||
"Specifies the input is in HTML",
|
||||
"Specifies the input is in plain textual format"
|
||||
],
|
||||
"location": "query"
|
||||
},
|
||||
"model": {
|
||||
"type": "string",
|
||||
"description": "the model to use for translation",
|
||||
"location": "query"
|
||||
},
|
||||
"q": {
|
||||
"type": "string",
|
||||
"description": "The text to translate",
|
||||
"required": true,
|
||||
"repeated": true,
|
||||
"location": "query"
|
||||
},
|
||||
"source": {
|
||||
"type": "string",
|
||||
"description": "The source language of the text",
|
||||
"location": "query"
|
||||
},
|
||||
"target": {
|
||||
"type": "string",
|
||||
"description": "The target language into which the text should be translated",
|
||||
"required": true,
|
||||
"location": "query"
|
||||
}
|
||||
},
|
||||
"parameterOrder": [
|
||||
"q",
|
||||
"target"
|
||||
],
|
||||
"response": {
|
||||
"$ref": "TranslationsListResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
Vendored
+790
@@ -0,0 +1,790 @@
|
||||
// Copyright 2016 Google Inc. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
|
||||
// Package translate provides access to the Translate API.
|
||||
//
|
||||
// See https://developers.google.com/translate/v2/using_rest
|
||||
//
|
||||
// Usage example:
|
||||
//
|
||||
// import "cloud.google.com/go/translate/internal/translate/v2"
|
||||
// ...
|
||||
// translateService, err := translate.New(oauthHttpClient)
|
||||
package translate // import "cloud.google.com/go/translate/internal/translate/v2"
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
context "golang.org/x/net/context"
|
||||
ctxhttp "golang.org/x/net/context/ctxhttp"
|
||||
gensupport "google.golang.org/api/gensupport"
|
||||
googleapi "google.golang.org/api/googleapi"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Always reference these packages, just in case the auto-generated code
|
||||
// below doesn't.
|
||||
var _ = bytes.NewBuffer
|
||||
var _ = strconv.Itoa
|
||||
var _ = fmt.Sprintf
|
||||
var _ = json.NewDecoder
|
||||
var _ = io.Copy
|
||||
var _ = url.Parse
|
||||
var _ = gensupport.MarshalJSON
|
||||
var _ = googleapi.Version
|
||||
var _ = errors.New
|
||||
var _ = strings.Replace
|
||||
var _ = context.Canceled
|
||||
var _ = ctxhttp.Do
|
||||
|
||||
const apiId = "translate:v2"
|
||||
const apiName = "translate"
|
||||
const apiVersion = "v2"
|
||||
const basePath = "https://translation.googleapis.com/language/translate/"
|
||||
|
||||
// OAuth2 scopes used by this API.
|
||||
const (
|
||||
// View and manage your data across Google Cloud Platform services
|
||||
CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform"
|
||||
)
|
||||
|
||||
func New(client *http.Client) (*Service, error) {
|
||||
if client == nil {
|
||||
return nil, errors.New("client is nil")
|
||||
}
|
||||
s := &Service{client: client, BasePath: basePath}
|
||||
s.Detections = NewDetectionsService(s)
|
||||
s.Languages = NewLanguagesService(s)
|
||||
s.Translations = NewTranslationsService(s)
|
||||
return s, nil
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
client *http.Client
|
||||
BasePath string // API endpoint base URL
|
||||
UserAgent string // optional additional User-Agent fragment
|
||||
|
||||
Detections *DetectionsService
|
||||
|
||||
Languages *LanguagesService
|
||||
|
||||
Translations *TranslationsService
|
||||
}
|
||||
|
||||
func (s *Service) userAgent() string {
|
||||
if s.UserAgent == "" {
|
||||
return googleapi.UserAgent
|
||||
}
|
||||
return googleapi.UserAgent + " " + s.UserAgent
|
||||
}
|
||||
|
||||
func NewDetectionsService(s *Service) *DetectionsService {
|
||||
rs := &DetectionsService{s: s}
|
||||
return rs
|
||||
}
|
||||
|
||||
type DetectionsService struct {
|
||||
s *Service
|
||||
}
|
||||
|
||||
func NewLanguagesService(s *Service) *LanguagesService {
|
||||
rs := &LanguagesService{s: s}
|
||||
return rs
|
||||
}
|
||||
|
||||
type LanguagesService struct {
|
||||
s *Service
|
||||
}
|
||||
|
||||
func NewTranslationsService(s *Service) *TranslationsService {
|
||||
rs := &TranslationsService{s: s}
|
||||
return rs
|
||||
}
|
||||
|
||||
type TranslationsService struct {
|
||||
s *Service
|
||||
}
|
||||
|
||||
type DetectionsListResponse struct {
|
||||
// Detections: A detections contains detection results of several text
|
||||
Detections [][]*DetectionsResourceItem `json:"detections,omitempty"`
|
||||
|
||||
// ServerResponse contains the HTTP response code and headers from the
|
||||
// server.
|
||||
googleapi.ServerResponse `json:"-"`
|
||||
|
||||
// ForceSendFields is a list of field names (e.g. "Detections") to
|
||||
// unconditionally include in API requests. By default, fields with
|
||||
// empty values are omitted from API requests. However, any non-pointer,
|
||||
// non-interface field appearing in ForceSendFields will be sent to the
|
||||
// server regardless of whether the field is empty or not. This may be
|
||||
// used to include empty fields in Patch requests.
|
||||
ForceSendFields []string `json:"-"`
|
||||
|
||||
// NullFields is a list of field names (e.g. "Detections") to include in
|
||||
// API requests with the JSON null value. By default, fields with empty
|
||||
// values are omitted from API requests. However, any field with an
|
||||
// empty value appearing in NullFields will be sent to the server as
|
||||
// null. It is an error if a field in this list has a non-empty value.
|
||||
// This may be used to include null fields in Patch requests.
|
||||
NullFields []string `json:"-"`
|
||||
}
|
||||
|
||||
func (s *DetectionsListResponse) MarshalJSON() ([]byte, error) {
|
||||
type noMethod DetectionsListResponse
|
||||
raw := noMethod(*s)
|
||||
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
|
||||
}
|
||||
|
||||
type DetectionsResourceItem struct {
|
||||
// Confidence: The confidence of the detection resul of this language.
|
||||
Confidence float64 `json:"confidence,omitempty"`
|
||||
|
||||
// IsReliable: A boolean to indicate is the language detection result
|
||||
// reliable.
|
||||
IsReliable bool `json:"isReliable,omitempty"`
|
||||
|
||||
// Language: The language we detect
|
||||
Language string `json:"language,omitempty"`
|
||||
|
||||
// ForceSendFields is a list of field names (e.g. "Confidence") to
|
||||
// unconditionally include in API requests. By default, fields with
|
||||
// empty values are omitted from API requests. However, any non-pointer,
|
||||
// non-interface field appearing in ForceSendFields will be sent to the
|
||||
// server regardless of whether the field is empty or not. This may be
|
||||
// used to include empty fields in Patch requests.
|
||||
ForceSendFields []string `json:"-"`
|
||||
|
||||
// NullFields is a list of field names (e.g. "Confidence") to include in
|
||||
// API requests with the JSON null value. By default, fields with empty
|
||||
// values are omitted from API requests. However, any field with an
|
||||
// empty value appearing in NullFields will be sent to the server as
|
||||
// null. It is an error if a field in this list has a non-empty value.
|
||||
// This may be used to include null fields in Patch requests.
|
||||
NullFields []string `json:"-"`
|
||||
}
|
||||
|
||||
func (s *DetectionsResourceItem) MarshalJSON() ([]byte, error) {
|
||||
type noMethod DetectionsResourceItem
|
||||
raw := noMethod(*s)
|
||||
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
|
||||
}
|
||||
|
||||
type LanguagesListResponse struct {
|
||||
// Languages: List of source/target languages supported by the
|
||||
// translation API. If target parameter is unspecified, the list is
|
||||
// sorted by the ASCII code point order of the language code. If target
|
||||
// parameter is specified, the list is sorted by the collation order of
|
||||
// the language name in the target language.
|
||||
Languages []*LanguagesResource `json:"languages,omitempty"`
|
||||
|
||||
// ServerResponse contains the HTTP response code and headers from the
|
||||
// server.
|
||||
googleapi.ServerResponse `json:"-"`
|
||||
|
||||
// ForceSendFields is a list of field names (e.g. "Languages") to
|
||||
// unconditionally include in API requests. By default, fields with
|
||||
// empty values are omitted from API requests. However, any non-pointer,
|
||||
// non-interface field appearing in ForceSendFields will be sent to the
|
||||
// server regardless of whether the field is empty or not. This may be
|
||||
// used to include empty fields in Patch requests.
|
||||
ForceSendFields []string `json:"-"`
|
||||
|
||||
// NullFields is a list of field names (e.g. "Languages") to include in
|
||||
// API requests with the JSON null value. By default, fields with empty
|
||||
// values are omitted from API requests. However, any field with an
|
||||
// empty value appearing in NullFields will be sent to the server as
|
||||
// null. It is an error if a field in this list has a non-empty value.
|
||||
// This may be used to include null fields in Patch requests.
|
||||
NullFields []string `json:"-"`
|
||||
}
|
||||
|
||||
func (s *LanguagesListResponse) MarshalJSON() ([]byte, error) {
|
||||
type noMethod LanguagesListResponse
|
||||
raw := noMethod(*s)
|
||||
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
|
||||
}
|
||||
|
||||
type LanguagesResource struct {
|
||||
// Language: The language code.
|
||||
Language string `json:"language,omitempty"`
|
||||
|
||||
// Name: The localized name of the language if target parameter is
|
||||
// given.
|
||||
Name string `json:"name,omitempty"`
|
||||
|
||||
// ForceSendFields is a list of field names (e.g. "Language") to
|
||||
// unconditionally include in API requests. By default, fields with
|
||||
// empty values are omitted from API requests. However, any non-pointer,
|
||||
// non-interface field appearing in ForceSendFields will be sent to the
|
||||
// server regardless of whether the field is empty or not. This may be
|
||||
// used to include empty fields in Patch requests.
|
||||
ForceSendFields []string `json:"-"`
|
||||
|
||||
// NullFields is a list of field names (e.g. "Language") to include in
|
||||
// API requests with the JSON null value. By default, fields with empty
|
||||
// values are omitted from API requests. However, any field with an
|
||||
// empty value appearing in NullFields will be sent to the server as
|
||||
// null. It is an error if a field in this list has a non-empty value.
|
||||
// This may be used to include null fields in Patch requests.
|
||||
NullFields []string `json:"-"`
|
||||
}
|
||||
|
||||
func (s *LanguagesResource) MarshalJSON() ([]byte, error) {
|
||||
type noMethod LanguagesResource
|
||||
raw := noMethod(*s)
|
||||
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
|
||||
}
|
||||
|
||||
type TranslationsListResponse struct {
|
||||
// Translations: Translations contains list of translation results of
|
||||
// given text
|
||||
Translations []*TranslationsResource `json:"translations,omitempty"`
|
||||
|
||||
// ServerResponse contains the HTTP response code and headers from the
|
||||
// server.
|
||||
googleapi.ServerResponse `json:"-"`
|
||||
|
||||
// ForceSendFields is a list of field names (e.g. "Translations") to
|
||||
// unconditionally include in API requests. By default, fields with
|
||||
// empty values are omitted from API requests. However, any non-pointer,
|
||||
// non-interface field appearing in ForceSendFields will be sent to the
|
||||
// server regardless of whether the field is empty or not. This may be
|
||||
// used to include empty fields in Patch requests.
|
||||
ForceSendFields []string `json:"-"`
|
||||
|
||||
// NullFields is a list of field names (e.g. "Translations") to include
|
||||
// in API requests with the JSON null value. By default, fields with
|
||||
// empty values are omitted from API requests. However, any field with
|
||||
// an empty value appearing in NullFields will be sent to the server as
|
||||
// null. It is an error if a field in this list has a non-empty value.
|
||||
// This may be used to include null fields in Patch requests.
|
||||
NullFields []string `json:"-"`
|
||||
}
|
||||
|
||||
func (s *TranslationsListResponse) MarshalJSON() ([]byte, error) {
|
||||
type noMethod TranslationsListResponse
|
||||
raw := noMethod(*s)
|
||||
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
|
||||
}
|
||||
|
||||
type TranslationsResource struct {
|
||||
// DetectedSourceLanguage: Detected source language if source parameter
|
||||
// is unspecified.
|
||||
DetectedSourceLanguage string `json:"detectedSourceLanguage,omitempty"`
|
||||
|
||||
// Model: Model used for translation.
|
||||
Model string `json:"model,omitempty"`
|
||||
|
||||
// TranslatedText: The translation.
|
||||
TranslatedText string `json:"translatedText,omitempty"`
|
||||
|
||||
// ForceSendFields is a list of field names (e.g.
|
||||
// "DetectedSourceLanguage") to unconditionally include in API requests.
|
||||
// By default, fields with empty values are omitted from API requests.
|
||||
// However, any non-pointer, non-interface field appearing in
|
||||
// ForceSendFields will be sent to the server regardless of whether the
|
||||
// field is empty or not. This may be used to include empty fields in
|
||||
// Patch requests.
|
||||
ForceSendFields []string `json:"-"`
|
||||
|
||||
// NullFields is a list of field names (e.g. "DetectedSourceLanguage")
|
||||
// to include in API requests with the JSON null value. By default,
|
||||
// fields with empty values are omitted from API requests. However, any
|
||||
// field with an empty value appearing in NullFields will be sent to the
|
||||
// server as null. It is an error if a field in this list has a
|
||||
// non-empty value. This may be used to include null fields in Patch
|
||||
// requests.
|
||||
NullFields []string `json:"-"`
|
||||
}
|
||||
|
||||
func (s *TranslationsResource) MarshalJSON() ([]byte, error) {
|
||||
type noMethod TranslationsResource
|
||||
raw := noMethod(*s)
|
||||
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
|
||||
}
|
||||
|
||||
// method id "language.detections.list":
|
||||
|
||||
type DetectionsListCall struct {
|
||||
s *Service
|
||||
urlParams_ gensupport.URLParams
|
||||
ifNoneMatch_ string
|
||||
ctx_ context.Context
|
||||
header_ http.Header
|
||||
}
|
||||
|
||||
// List: Detect the language of text.
|
||||
func (r *DetectionsService) List(q []string) *DetectionsListCall {
|
||||
c := &DetectionsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
|
||||
c.urlParams_.SetMulti("q", append([]string{}, q...))
|
||||
return c
|
||||
}
|
||||
|
||||
// Fields allows partial responses to be retrieved. See
|
||||
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
|
||||
// for more information.
|
||||
func (c *DetectionsListCall) Fields(s ...googleapi.Field) *DetectionsListCall {
|
||||
c.urlParams_.Set("fields", googleapi.CombineFields(s))
|
||||
return c
|
||||
}
|
||||
|
||||
// IfNoneMatch sets the optional parameter which makes the operation
|
||||
// fail if the object's ETag matches the given value. This is useful for
|
||||
// getting updates only after the object has changed since the last
|
||||
// request. Use googleapi.IsNotModified to check whether the response
|
||||
// error from Do is the result of In-None-Match.
|
||||
func (c *DetectionsListCall) IfNoneMatch(entityTag string) *DetectionsListCall {
|
||||
c.ifNoneMatch_ = entityTag
|
||||
return c
|
||||
}
|
||||
|
||||
// Context sets the context to be used in this call's Do method. Any
|
||||
// pending HTTP request will be aborted if the provided context is
|
||||
// canceled.
|
||||
func (c *DetectionsListCall) Context(ctx context.Context) *DetectionsListCall {
|
||||
c.ctx_ = ctx
|
||||
return c
|
||||
}
|
||||
|
||||
// Header returns an http.Header that can be modified by the caller to
|
||||
// add HTTP headers to the request.
|
||||
func (c *DetectionsListCall) Header() http.Header {
|
||||
if c.header_ == nil {
|
||||
c.header_ = make(http.Header)
|
||||
}
|
||||
return c.header_
|
||||
}
|
||||
|
||||
func (c *DetectionsListCall) doRequest(alt string) (*http.Response, error) {
|
||||
reqHeaders := make(http.Header)
|
||||
for k, v := range c.header_ {
|
||||
reqHeaders[k] = v
|
||||
}
|
||||
reqHeaders.Set("User-Agent", c.s.userAgent())
|
||||
if c.ifNoneMatch_ != "" {
|
||||
reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
|
||||
}
|
||||
var body io.Reader = nil
|
||||
c.urlParams_.Set("alt", alt)
|
||||
urls := googleapi.ResolveRelative(c.s.BasePath, "v2/detect")
|
||||
urls += "?" + c.urlParams_.Encode()
|
||||
req, _ := http.NewRequest("GET", urls, body)
|
||||
req.Header = reqHeaders
|
||||
return gensupport.SendRequest(c.ctx_, c.s.client, req)
|
||||
}
|
||||
|
||||
// Do executes the "language.detections.list" call.
|
||||
// Exactly one of *DetectionsListResponse or error will be non-nil. Any
|
||||
// non-2xx status code is an error. Response headers are in either
|
||||
// *DetectionsListResponse.ServerResponse.Header or (if a response was
|
||||
// returned at all) in error.(*googleapi.Error).Header. Use
|
||||
// googleapi.IsNotModified to check whether the returned error was
|
||||
// because http.StatusNotModified was returned.
|
||||
func (c *DetectionsListCall) Do(opts ...googleapi.CallOption) (*DetectionsListResponse, error) {
|
||||
gensupport.SetOptions(c.urlParams_, opts...)
|
||||
res, err := c.doRequest("json")
|
||||
if res != nil && res.StatusCode == http.StatusNotModified {
|
||||
if res.Body != nil {
|
||||
res.Body.Close()
|
||||
}
|
||||
return nil, &googleapi.Error{
|
||||
Code: res.StatusCode,
|
||||
Header: res.Header,
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer googleapi.CloseBody(res)
|
||||
if err := googleapi.CheckResponse(res); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ret := &DetectionsListResponse{
|
||||
ServerResponse: googleapi.ServerResponse{
|
||||
Header: res.Header,
|
||||
HTTPStatusCode: res.StatusCode,
|
||||
},
|
||||
}
|
||||
target := &struct {
|
||||
Data *DetectionsListResponse `json:"data"`
|
||||
}{ret}
|
||||
if err := json.NewDecoder(res.Body).Decode(target); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ret, nil
|
||||
// {
|
||||
// "description": "Detect the language of text.",
|
||||
// "httpMethod": "GET",
|
||||
// "id": "language.detections.list",
|
||||
// "parameterOrder": [
|
||||
// "q"
|
||||
// ],
|
||||
// "parameters": {
|
||||
// "q": {
|
||||
// "description": "The text to detect",
|
||||
// "location": "query",
|
||||
// "repeated": true,
|
||||
// "required": true,
|
||||
// "type": "string"
|
||||
// }
|
||||
// },
|
||||
// "path": "v2/detect",
|
||||
// "response": {
|
||||
// "$ref": "DetectionsListResponse"
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
// method id "language.languages.list":
|
||||
|
||||
type LanguagesListCall struct {
|
||||
s *Service
|
||||
urlParams_ gensupport.URLParams
|
||||
ifNoneMatch_ string
|
||||
ctx_ context.Context
|
||||
header_ http.Header
|
||||
}
|
||||
|
||||
// List: List the source/target languages supported by the API
|
||||
func (r *LanguagesService) List() *LanguagesListCall {
|
||||
c := &LanguagesListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
|
||||
return c
|
||||
}
|
||||
|
||||
// Target sets the optional parameter "target": the language and
|
||||
// collation in which the localized results should be returned
|
||||
func (c *LanguagesListCall) Target(target string) *LanguagesListCall {
|
||||
c.urlParams_.Set("target", target)
|
||||
return c
|
||||
}
|
||||
|
||||
// Fields allows partial responses to be retrieved. See
|
||||
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
|
||||
// for more information.
|
||||
func (c *LanguagesListCall) Fields(s ...googleapi.Field) *LanguagesListCall {
|
||||
c.urlParams_.Set("fields", googleapi.CombineFields(s))
|
||||
return c
|
||||
}
|
||||
|
||||
// IfNoneMatch sets the optional parameter which makes the operation
|
||||
// fail if the object's ETag matches the given value. This is useful for
|
||||
// getting updates only after the object has changed since the last
|
||||
// request. Use googleapi.IsNotModified to check whether the response
|
||||
// error from Do is the result of In-None-Match.
|
||||
func (c *LanguagesListCall) IfNoneMatch(entityTag string) *LanguagesListCall {
|
||||
c.ifNoneMatch_ = entityTag
|
||||
return c
|
||||
}
|
||||
|
||||
// Context sets the context to be used in this call's Do method. Any
|
||||
// pending HTTP request will be aborted if the provided context is
|
||||
// canceled.
|
||||
func (c *LanguagesListCall) Context(ctx context.Context) *LanguagesListCall {
|
||||
c.ctx_ = ctx
|
||||
return c
|
||||
}
|
||||
|
||||
// Header returns an http.Header that can be modified by the caller to
|
||||
// add HTTP headers to the request.
|
||||
func (c *LanguagesListCall) Header() http.Header {
|
||||
if c.header_ == nil {
|
||||
c.header_ = make(http.Header)
|
||||
}
|
||||
return c.header_
|
||||
}
|
||||
|
||||
func (c *LanguagesListCall) doRequest(alt string) (*http.Response, error) {
|
||||
reqHeaders := make(http.Header)
|
||||
for k, v := range c.header_ {
|
||||
reqHeaders[k] = v
|
||||
}
|
||||
reqHeaders.Set("User-Agent", c.s.userAgent())
|
||||
if c.ifNoneMatch_ != "" {
|
||||
reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
|
||||
}
|
||||
var body io.Reader = nil
|
||||
c.urlParams_.Set("alt", alt)
|
||||
urls := googleapi.ResolveRelative(c.s.BasePath, "v2/languages")
|
||||
urls += "?" + c.urlParams_.Encode()
|
||||
req, _ := http.NewRequest("GET", urls, body)
|
||||
req.Header = reqHeaders
|
||||
return gensupport.SendRequest(c.ctx_, c.s.client, req)
|
||||
}
|
||||
|
||||
// Do executes the "language.languages.list" call.
|
||||
// Exactly one of *LanguagesListResponse or error will be non-nil. Any
|
||||
// non-2xx status code is an error. Response headers are in either
|
||||
// *LanguagesListResponse.ServerResponse.Header or (if a response was
|
||||
// returned at all) in error.(*googleapi.Error).Header. Use
|
||||
// googleapi.IsNotModified to check whether the returned error was
|
||||
// because http.StatusNotModified was returned.
|
||||
func (c *LanguagesListCall) Do(opts ...googleapi.CallOption) (*LanguagesListResponse, error) {
|
||||
gensupport.SetOptions(c.urlParams_, opts...)
|
||||
res, err := c.doRequest("json")
|
||||
if res != nil && res.StatusCode == http.StatusNotModified {
|
||||
if res.Body != nil {
|
||||
res.Body.Close()
|
||||
}
|
||||
return nil, &googleapi.Error{
|
||||
Code: res.StatusCode,
|
||||
Header: res.Header,
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer googleapi.CloseBody(res)
|
||||
if err := googleapi.CheckResponse(res); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ret := &LanguagesListResponse{
|
||||
ServerResponse: googleapi.ServerResponse{
|
||||
Header: res.Header,
|
||||
HTTPStatusCode: res.StatusCode,
|
||||
},
|
||||
}
|
||||
target := &struct {
|
||||
Data *LanguagesListResponse `json:"data"`
|
||||
}{ret}
|
||||
if err := json.NewDecoder(res.Body).Decode(target); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ret, nil
|
||||
// {
|
||||
// "description": "List the source/target languages supported by the API",
|
||||
// "httpMethod": "GET",
|
||||
// "id": "language.languages.list",
|
||||
// "parameters": {
|
||||
// "target": {
|
||||
// "description": "the language and collation in which the localized results should be returned",
|
||||
// "location": "query",
|
||||
// "type": "string"
|
||||
// }
|
||||
// },
|
||||
// "path": "v2/languages",
|
||||
// "response": {
|
||||
// "$ref": "LanguagesListResponse"
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
// method id "language.translations.list":
|
||||
|
||||
type TranslationsListCall struct {
|
||||
s *Service
|
||||
urlParams_ gensupport.URLParams
|
||||
ifNoneMatch_ string
|
||||
ctx_ context.Context
|
||||
header_ http.Header
|
||||
}
|
||||
|
||||
// List: Returns text translations from one language to another.
|
||||
func (r *TranslationsService) List(q []string, target string) *TranslationsListCall {
|
||||
c := &TranslationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
|
||||
c.urlParams_.SetMulti("q", append([]string{}, q...))
|
||||
c.urlParams_.Set("target", target)
|
||||
return c
|
||||
}
|
||||
|
||||
// Cid sets the optional parameter "cid": The customization id for
|
||||
// translate
|
||||
func (c *TranslationsListCall) Cid(cid ...string) *TranslationsListCall {
|
||||
c.urlParams_.SetMulti("cid", append([]string{}, cid...))
|
||||
return c
|
||||
}
|
||||
|
||||
// Format sets the optional parameter "format": The format of the text
|
||||
//
|
||||
// Possible values:
|
||||
// "html" - Specifies the input is in HTML
|
||||
// "text" - Specifies the input is in plain textual format
|
||||
func (c *TranslationsListCall) Format(format string) *TranslationsListCall {
|
||||
c.urlParams_.Set("format", format)
|
||||
return c
|
||||
}
|
||||
|
||||
// Model sets the optional parameter "model": the model to use for
|
||||
// translation
|
||||
func (c *TranslationsListCall) Model(model string) *TranslationsListCall {
|
||||
c.urlParams_.Set("model", model)
|
||||
return c
|
||||
}
|
||||
|
||||
// Source sets the optional parameter "source": The source language of
|
||||
// the text
|
||||
func (c *TranslationsListCall) Source(source string) *TranslationsListCall {
|
||||
c.urlParams_.Set("source", source)
|
||||
return c
|
||||
}
|
||||
|
||||
// Fields allows partial responses to be retrieved. See
|
||||
// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
|
||||
// for more information.
|
||||
func (c *TranslationsListCall) Fields(s ...googleapi.Field) *TranslationsListCall {
|
||||
c.urlParams_.Set("fields", googleapi.CombineFields(s))
|
||||
return c
|
||||
}
|
||||
|
||||
// IfNoneMatch sets the optional parameter which makes the operation
|
||||
// fail if the object's ETag matches the given value. This is useful for
|
||||
// getting updates only after the object has changed since the last
|
||||
// request. Use googleapi.IsNotModified to check whether the response
|
||||
// error from Do is the result of In-None-Match.
|
||||
func (c *TranslationsListCall) IfNoneMatch(entityTag string) *TranslationsListCall {
|
||||
c.ifNoneMatch_ = entityTag
|
||||
return c
|
||||
}
|
||||
|
||||
// Context sets the context to be used in this call's Do method. Any
|
||||
// pending HTTP request will be aborted if the provided context is
|
||||
// canceled.
|
||||
func (c *TranslationsListCall) Context(ctx context.Context) *TranslationsListCall {
|
||||
c.ctx_ = ctx
|
||||
return c
|
||||
}
|
||||
|
||||
// Header returns an http.Header that can be modified by the caller to
|
||||
// add HTTP headers to the request.
|
||||
func (c *TranslationsListCall) Header() http.Header {
|
||||
if c.header_ == nil {
|
||||
c.header_ = make(http.Header)
|
||||
}
|
||||
return c.header_
|
||||
}
|
||||
|
||||
func (c *TranslationsListCall) doRequest(alt string) (*http.Response, error) {
|
||||
reqHeaders := make(http.Header)
|
||||
for k, v := range c.header_ {
|
||||
reqHeaders[k] = v
|
||||
}
|
||||
reqHeaders.Set("User-Agent", c.s.userAgent())
|
||||
if c.ifNoneMatch_ != "" {
|
||||
reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
|
||||
}
|
||||
var body io.Reader = nil
|
||||
c.urlParams_.Set("alt", alt)
|
||||
urls := googleapi.ResolveRelative(c.s.BasePath, "v2")
|
||||
urls += "?" + c.urlParams_.Encode()
|
||||
req, _ := http.NewRequest("GET", urls, body)
|
||||
req.Header = reqHeaders
|
||||
return gensupport.SendRequest(c.ctx_, c.s.client, req)
|
||||
}
|
||||
|
||||
// Do executes the "language.translations.list" call.
|
||||
// Exactly one of *TranslationsListResponse or error will be non-nil.
|
||||
// Any non-2xx status code is an error. Response headers are in either
|
||||
// *TranslationsListResponse.ServerResponse.Header or (if a response was
|
||||
// returned at all) in error.(*googleapi.Error).Header. Use
|
||||
// googleapi.IsNotModified to check whether the returned error was
|
||||
// because http.StatusNotModified was returned.
|
||||
func (c *TranslationsListCall) Do(opts ...googleapi.CallOption) (*TranslationsListResponse, error) {
|
||||
gensupport.SetOptions(c.urlParams_, opts...)
|
||||
res, err := c.doRequest("json")
|
||||
if res != nil && res.StatusCode == http.StatusNotModified {
|
||||
if res.Body != nil {
|
||||
res.Body.Close()
|
||||
}
|
||||
return nil, &googleapi.Error{
|
||||
Code: res.StatusCode,
|
||||
Header: res.Header,
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer googleapi.CloseBody(res)
|
||||
if err := googleapi.CheckResponse(res); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ret := &TranslationsListResponse{
|
||||
ServerResponse: googleapi.ServerResponse{
|
||||
Header: res.Header,
|
||||
HTTPStatusCode: res.StatusCode,
|
||||
},
|
||||
}
|
||||
target := &struct {
|
||||
Data *TranslationsListResponse `json:"data"`
|
||||
}{ret}
|
||||
if err := json.NewDecoder(res.Body).Decode(target); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ret, nil
|
||||
// {
|
||||
// "description": "Returns text translations from one language to another.",
|
||||
// "httpMethod": "GET",
|
||||
// "id": "language.translations.list",
|
||||
// "parameterOrder": [
|
||||
// "q",
|
||||
// "target"
|
||||
// ],
|
||||
// "parameters": {
|
||||
// "cid": {
|
||||
// "description": "The customization id for translate",
|
||||
// "location": "query",
|
||||
// "repeated": true,
|
||||
// "type": "string"
|
||||
// },
|
||||
// "format": {
|
||||
// "description": "The format of the text",
|
||||
// "enum": [
|
||||
// "html",
|
||||
// "text"
|
||||
// ],
|
||||
// "enumDescriptions": [
|
||||
// "Specifies the input is in HTML",
|
||||
// "Specifies the input is in plain textual format"
|
||||
// ],
|
||||
// "location": "query",
|
||||
// "type": "string"
|
||||
// },
|
||||
// "model": {
|
||||
// "description": "the model to use for translation",
|
||||
// "location": "query",
|
||||
// "type": "string"
|
||||
// },
|
||||
// "q": {
|
||||
// "description": "The text to translate",
|
||||
// "location": "query",
|
||||
// "repeated": true,
|
||||
// "required": true,
|
||||
// "type": "string"
|
||||
// },
|
||||
// "source": {
|
||||
// "description": "The source language of the text",
|
||||
// "location": "query",
|
||||
// "type": "string"
|
||||
// },
|
||||
// "target": {
|
||||
// "description": "The target language into which the text should be translated",
|
||||
// "location": "query",
|
||||
// "required": true,
|
||||
// "type": "string"
|
||||
// }
|
||||
// },
|
||||
// "path": "v2",
|
||||
// "response": {
|
||||
// "$ref": "TranslationsListResponse"
|
||||
// }
|
||||
// }
|
||||
|
||||
}
|
||||
+230
@@ -0,0 +1,230 @@
|
||||
// Copyright 2016 Google Inc. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
|
||||
// Package translate is a client for the Google Translate API.
|
||||
// See https://cloud.google.com/translate for details.
|
||||
//
|
||||
// This package is experimental and subject to change without notice.
|
||||
package translate
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/api/option"
|
||||
"google.golang.org/api/transport"
|
||||
|
||||
raw "cloud.google.com/go/translate/internal/translate/v2"
|
||||
"golang.org/x/net/context"
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
const userAgent = "gcloud-golang-translate/20161115"
|
||||
|
||||
// Scope is the OAuth2 scope required by the Google Cloud Vision API.
|
||||
const Scope = raw.CloudPlatformScope
|
||||
|
||||
// Client is a client for the translate API.
|
||||
type Client struct {
|
||||
raw *raw.Service
|
||||
}
|
||||
|
||||
const prodAddr = "https://translation.googleapis.com/language/translate/"
|
||||
|
||||
// NewClient constructs a new Client that can perform Translate operations.
|
||||
//
|
||||
// You can find or create API key for your project from the Credentials page of
|
||||
// the Developers Console (console.developers.google.com).
|
||||
func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {
|
||||
o := []option.ClientOption{
|
||||
option.WithEndpoint(prodAddr),
|
||||
option.WithScopes(Scope),
|
||||
option.WithUserAgent(userAgent),
|
||||
}
|
||||
o = append(o, opts...)
|
||||
httpClient, endpoint, err := transport.NewHTTPClient(ctx, o...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("dialing: %v", err)
|
||||
}
|
||||
rawService, err := raw.New(httpClient)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("translate client: %v", err)
|
||||
}
|
||||
rawService.BasePath = endpoint
|
||||
return &Client{raw: rawService}, nil
|
||||
}
|
||||
|
||||
// Close closes any resources held by the client.
|
||||
// Close should be called when the client is no longer needed.
|
||||
// It need not be called at program exit.
|
||||
func (c *Client) Close() error { return nil }
|
||||
|
||||
// Translate one or more strings of text from a source language to a target
|
||||
// language. All inputs must be in the same language.
|
||||
//
|
||||
// The target parameter supplies the language to translate to. The supported
|
||||
// languages are listed at
|
||||
// https://cloud.google.com/translate/v2/translate-reference#supported_languages.
|
||||
// You can also call the SupportedLanguages method.
|
||||
//
|
||||
// The returned Translations appear in the same order as the inputs.
|
||||
func (c *Client) Translate(ctx context.Context, inputs []string, target language.Tag, opts *Options) ([]Translation, error) {
|
||||
call := c.raw.Translations.List(inputs, target.String()).Context(ctx)
|
||||
if opts != nil {
|
||||
if s := opts.Source; s != language.Und {
|
||||
call.Source(s.String())
|
||||
}
|
||||
if f := opts.Format; f != "" {
|
||||
call.Format(string(f))
|
||||
}
|
||||
if m := opts.Model; m != "" {
|
||||
call.Model(m)
|
||||
}
|
||||
}
|
||||
res, err := call.Do()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var ts []Translation
|
||||
for _, t := range res.Translations {
|
||||
var source language.Tag
|
||||
if t.DetectedSourceLanguage != "" {
|
||||
source, err = language.Parse(t.DetectedSourceLanguage)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
ts = append(ts, Translation{
|
||||
Text: t.TranslatedText,
|
||||
Source: source,
|
||||
Model: t.Model,
|
||||
})
|
||||
}
|
||||
return ts, nil
|
||||
}
|
||||
|
||||
// Options contains options for Translate.
|
||||
type Options struct {
|
||||
// Source is the language of the input strings. If empty, the service will
|
||||
// attempt to identify the source language automatically and return it within
|
||||
// the response.
|
||||
Source language.Tag
|
||||
|
||||
// Format describes the format of the input texts. The choices are HTML or
|
||||
// Text. The default is HTML.
|
||||
Format Format
|
||||
|
||||
// The model to use for translation. The choices are "nmt" or "base". The
|
||||
// default is "base".
|
||||
Model string
|
||||
}
|
||||
|
||||
// The format of the input text. Used in Options.Format.
|
||||
type Format string
|
||||
|
||||
// Constants for Options.Format.
|
||||
const (
|
||||
HTML Format = "html"
|
||||
Text Format = "text"
|
||||
)
|
||||
|
||||
// A Translation contains the results of translating a piece of text.
|
||||
type Translation struct {
|
||||
// Text is the input text translated into the target language.
|
||||
Text string
|
||||
|
||||
// Source is the detected language of the input text, if source was
|
||||
// not supplied to Client.Translate. If source was supplied, this field
|
||||
// will be empty.
|
||||
Source language.Tag
|
||||
|
||||
// Model is the model that was used for translation.
|
||||
// It may not match the model provided as an option to Client.Translate.
|
||||
Model string
|
||||
}
|
||||
|
||||
// DetectLanguage attempts to determine the language of the inputs. Each input
|
||||
// string may be in a different language.
|
||||
//
|
||||
// Each slice of Detections in the return value corresponds with one input
|
||||
// string. A slice of Detections holds multiple hypotheses for the language of
|
||||
// a single input string.
|
||||
func (c *Client) DetectLanguage(ctx context.Context, inputs []string) ([][]Detection, error) {
|
||||
call := c.raw.Detections.List(inputs).Context(ctx)
|
||||
res, err := call.Do()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var result [][]Detection
|
||||
for _, raws := range res.Detections {
|
||||
var ds []Detection
|
||||
for _, rd := range raws {
|
||||
tag, err := language.Parse(rd.Language)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ds = append(ds, Detection{
|
||||
Language: tag,
|
||||
Confidence: rd.Confidence,
|
||||
IsReliable: rd.IsReliable,
|
||||
})
|
||||
}
|
||||
result = append(result, ds)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// Detection represents information about a language detected in an input.
|
||||
type Detection struct {
|
||||
// Language is the code of the language detected.
|
||||
Language language.Tag
|
||||
|
||||
// Confidence is a number from 0 to 1, with higher numbers indicating more
|
||||
// confidence in the detection.
|
||||
Confidence float64
|
||||
|
||||
// IsReliable indicates whether the language detection result is reliable.
|
||||
IsReliable bool
|
||||
}
|
||||
|
||||
// SupportedLanguages returns a list of supported languages for translation.
|
||||
// The target parameter is the language to use to return localized, human
|
||||
// readable names of supported languages.
|
||||
func (c *Client) SupportedLanguages(ctx context.Context, target language.Tag) ([]Language, error) {
|
||||
call := c.raw.Languages.List().Context(ctx).Target(target.String())
|
||||
res, err := call.Do()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var ls []Language
|
||||
for _, l := range res.Languages {
|
||||
tag, err := language.Parse(l.Language)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ls = append(ls, Language{
|
||||
Name: l.Name,
|
||||
Tag: tag,
|
||||
})
|
||||
}
|
||||
return ls, nil
|
||||
}
|
||||
|
||||
// A Language describes a language supported for translation.
|
||||
type Language struct {
|
||||
// Name is the human-readable name of the language.
|
||||
Name string
|
||||
|
||||
// Tag is a standard code for the language.
|
||||
Tag language.Tag
|
||||
}
|
||||
+342
@@ -0,0 +1,342 @@
|
||||
// Copyright 2016 Google Inc. All Rights Reserved.
|
||||
//
|
||||
// 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.
|
||||
|
||||
package translate
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"reflect"
|
||||
"strings"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"cloud.google.com/go/internal/testutil"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
"golang.org/x/text/language"
|
||||
"google.golang.org/api/option"
|
||||
)
|
||||
|
||||
var (
|
||||
once sync.Once
|
||||
authOpt option.ClientOption
|
||||
)
|
||||
|
||||
func initTest(ctx context.Context, t *testing.T) *Client {
|
||||
if testing.Short() {
|
||||
t.Skip("integration tests skipped in short mode")
|
||||
}
|
||||
once.Do(func() { authOpt = authOption() })
|
||||
if authOpt == nil {
|
||||
t.Skip("Integration tests skipped. See CONTRIBUTING.md for details")
|
||||
}
|
||||
client, err := NewClient(ctx, authOpt)
|
||||
if err != nil {
|
||||
t.Fatalf("NewClient: %v", err)
|
||||
}
|
||||
return client
|
||||
}
|
||||
|
||||
func authOption() option.ClientOption {
|
||||
ts := testutil.TokenSource(context.Background(), Scope)
|
||||
if ts != nil {
|
||||
log.Println("authenticating via OAuth2")
|
||||
return option.WithTokenSource(ts)
|
||||
}
|
||||
apiKey := os.Getenv("GCLOUD_TESTS_API_KEY")
|
||||
if apiKey != "" {
|
||||
log.Println("authenticating with API key")
|
||||
return option.WithAPIKey(apiKey)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type fakeTransport struct {
|
||||
req *http.Request
|
||||
}
|
||||
|
||||
func (t *fakeTransport) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
t.req = req
|
||||
return &http.Response{
|
||||
Status: fmt.Sprintf("%d OK", http.StatusOK),
|
||||
StatusCode: http.StatusOK,
|
||||
Body: ioutil.NopCloser(strings.NewReader("{}")),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func TestTranslateURL(t *testing.T) {
|
||||
// The translate API has all inputs in the URL.
|
||||
// Make sure we generate the right one.
|
||||
ctx := context.Background()
|
||||
ft := &fakeTransport{}
|
||||
c, err := NewClient(ctx, option.WithHTTPClient(&http.Client{Transport: ft}))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, test := range []struct {
|
||||
target language.Tag
|
||||
inputs []string
|
||||
opts *Options
|
||||
want url.Values
|
||||
}{
|
||||
{language.Spanish, []string{"text"}, nil, url.Values{
|
||||
"q": []string{"text"},
|
||||
"target": []string{"es"},
|
||||
}},
|
||||
{language.English, []string{"text"}, &Options{}, url.Values{
|
||||
"q": []string{"text"},
|
||||
"target": []string{"en"},
|
||||
}},
|
||||
{language.Turkish, []string{"t1", "t2"}, nil, url.Values{
|
||||
"q": []string{"t1", "t2"},
|
||||
"target": []string{"tr"},
|
||||
}},
|
||||
{language.English, []string{"text"}, &Options{Source: language.French},
|
||||
url.Values{
|
||||
"q": []string{"text"},
|
||||
"source": []string{"fr"},
|
||||
"target": []string{"en"},
|
||||
},
|
||||
},
|
||||
{language.English, []string{"text"}, &Options{Source: language.French, Format: HTML}, url.Values{
|
||||
"q": []string{"text"},
|
||||
"source": []string{"fr"},
|
||||
"format": []string{"html"},
|
||||
"target": []string{"en"},
|
||||
}},
|
||||
} {
|
||||
_, err = c.Translate(ctx, test.inputs, test.target, test.opts)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
got := ft.req.URL.Query()
|
||||
test.want.Add("alt", "json")
|
||||
if !reflect.DeepEqual(got, test.want) {
|
||||
t.Errorf("Translate(%s, %v, %+v):\ngot %s\nwant %s",
|
||||
test.target, test.inputs, test.opts, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranslateOneInput(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
c := initTest(ctx, t)
|
||||
defer c.Close()
|
||||
|
||||
translate := func(input string, target language.Tag, opts *Options) Translation {
|
||||
ts, err := c.Translate(ctx, []string{input}, target, opts)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(ts) != 1 {
|
||||
t.Fatalf("wanted one Translation, got %d", len(ts))
|
||||
}
|
||||
return ts[0]
|
||||
}
|
||||
|
||||
for _, test := range []struct {
|
||||
input string
|
||||
source language.Tag
|
||||
output string
|
||||
target language.Tag
|
||||
}{
|
||||
// https://www.youtube.com/watch?v=x1sQkEfAdfY
|
||||
{"Le singe est sur la branche", language.French,
|
||||
"The monkey is on the branch", language.English},
|
||||
// https://www.youtube.com/watch?v=akbflkF_1zY
|
||||
{"I will not buy this record, it is scratched", language.English,
|
||||
"Nem fogok vásárolni ezt a lemezt, azt karcos", language.Hungarian},
|
||||
} {
|
||||
// Provide source and format.
|
||||
tr := translate(test.input, test.target, &Options{Source: test.source, Format: Text})
|
||||
if got, want := tr.Source, language.Und; got != want {
|
||||
t.Errorf("source: got %q, wanted %q", got, want)
|
||||
continue
|
||||
}
|
||||
if got, want := tr.Text, test.output; got != want {
|
||||
t.Errorf("text: got %q, want %q", got, want)
|
||||
}
|
||||
// Omit source; it should be detected.
|
||||
tr = translate(test.input, test.target, &Options{Format: Text})
|
||||
if got, want := tr.Source, test.source; got != want {
|
||||
t.Errorf("source: got %q, wanted %q", got, want)
|
||||
continue
|
||||
}
|
||||
if got, want := tr.Text, test.output; got != want {
|
||||
t.Errorf("text: got %q, want %q", got, want)
|
||||
}
|
||||
|
||||
// Omit format. Defaults to HTML. Still works with plain text.
|
||||
tr = translate(test.input, test.target, nil)
|
||||
if got, want := tr.Source, test.source; got != want {
|
||||
t.Errorf("source: got %q, wanted %q", got, want)
|
||||
continue
|
||||
}
|
||||
if got, want := tr.Text, test.output; got != want {
|
||||
t.Errorf("text: got %q, want %q", got, want)
|
||||
}
|
||||
|
||||
// Add HTML tags to input. They should be in output.
|
||||
htmlify := func(s string) string {
|
||||
return "<b><i>" + s + "</i></b>"
|
||||
}
|
||||
tr = translate(htmlify(test.input), test.target, nil)
|
||||
if got, want := tr.Text, htmlify(test.output); got != want {
|
||||
t.Errorf("html: got %q, want %q", got, want)
|
||||
}
|
||||
// Using the HTML format behaves the same.
|
||||
tr = translate(htmlify(test.input), test.target, &Options{Format: HTML})
|
||||
if got, want := tr.Text, htmlify(test.output); got != want {
|
||||
t.Errorf("html: got %q, want %q", got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This tests the beta "nmt" model.
|
||||
func TestTranslateModel(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
c := initTest(ctx, t)
|
||||
defer c.Close()
|
||||
|
||||
trs, err := c.Translate(ctx, []string{"Hello"}, language.French, &Options{Model: "nmt"})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(trs) != 1 {
|
||||
t.Fatalf("wanted one Translation, got %d", len(trs))
|
||||
}
|
||||
tr := trs[0]
|
||||
if got, want := tr.Text, "Bonjour"; got != want {
|
||||
t.Errorf("text: got %q, want %q", got, want)
|
||||
}
|
||||
if got, want := tr.Model, "nmt"; got != want {
|
||||
t.Errorf("model: got %q, want %q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranslateMultipleInputs(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
c := initTest(ctx, t)
|
||||
defer c.Close()
|
||||
|
||||
inputs := []string{
|
||||
"When you're a Jet, you're a Jet all the way",
|
||||
"From your first cigarette to your last dying day",
|
||||
"When you're a Jet if the spit hits the fan",
|
||||
"You got brothers around, you're a family man",
|
||||
}
|
||||
ts, err := c.Translate(ctx, inputs, language.French, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got, want := len(ts), len(inputs); got != want {
|
||||
t.Fatalf("got %d Translations, wanted %d", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTranslateErrors(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
c := initTest(ctx, t)
|
||||
defer c.Close()
|
||||
|
||||
for _, test := range []struct {
|
||||
ctx context.Context
|
||||
target language.Tag
|
||||
inputs []string
|
||||
opts *Options
|
||||
}{
|
||||
{ctx, language.English, nil, nil},
|
||||
{ctx, language.Und, []string{"input"}, nil},
|
||||
{ctx, language.English, []string{}, nil},
|
||||
{ctx, language.English, []string{"input"}, &Options{Format: "random"}},
|
||||
} {
|
||||
_, err := c.Translate(test.ctx, test.inputs, test.target, test.opts)
|
||||
if err == nil {
|
||||
t.Errorf("%+v: got nil, want error", test)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDetectLanguage(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
c := initTest(ctx, t)
|
||||
defer c.Close()
|
||||
ds, err := c.DetectLanguage(ctx, []string{
|
||||
"Today is Monday",
|
||||
"Aujourd'hui est lundi",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(ds) != 2 {
|
||||
t.Fatalf("got %d detection lists, want 2", len(ds))
|
||||
}
|
||||
checkDetections(t, ds[0], language.English)
|
||||
checkDetections(t, ds[1], language.French)
|
||||
}
|
||||
|
||||
func checkDetections(t *testing.T, ds []Detection, want language.Tag) {
|
||||
for _, d := range ds {
|
||||
if d.Language == want {
|
||||
return
|
||||
}
|
||||
}
|
||||
t.Errorf("%v: missing %s", ds, want)
|
||||
}
|
||||
|
||||
// A small subset of the supported languages.
|
||||
var supportedLangs = []Language{
|
||||
{Name: "Danish", Tag: language.Danish},
|
||||
{Name: "English", Tag: language.English},
|
||||
{Name: "French", Tag: language.French},
|
||||
{Name: "German", Tag: language.German},
|
||||
{Name: "Greek", Tag: language.Greek},
|
||||
{Name: "Hindi", Tag: language.Hindi},
|
||||
{Name: "Hungarian", Tag: language.Hungarian},
|
||||
{Name: "Italian", Tag: language.Italian},
|
||||
{Name: "Russian", Tag: language.Russian},
|
||||
{Name: "Turkish", Tag: language.Turkish},
|
||||
}
|
||||
|
||||
func TestSupportedLanguages(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
c := initTest(ctx, t)
|
||||
defer c.Close()
|
||||
got, err := c.SupportedLanguages(ctx, language.English)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
want := map[language.Tag]Language{}
|
||||
for _, sl := range supportedLangs {
|
||||
want[sl.Tag] = sl
|
||||
}
|
||||
for _, g := range got {
|
||||
w, ok := want[g.Tag]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if g != w {
|
||||
t.Errorf("got %+v, want %+v", g, w)
|
||||
}
|
||||
delete(want, g.Tag)
|
||||
}
|
||||
if len(want) > 0 {
|
||||
t.Errorf("missing: %+v", want)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user