Melisa
Melisa

Reputation: 432

Google Cloud "translate.NewClient: dialing: google: could not find default credentials"

I am trying to use Google Translate API on Windows(my own computer). I have an issue with default credentials. Error: **translate.NewClient: dialing: google: could not find default credentials.

I have enough balance in google cloud.

I started Translate API. (API Enabled)

I added $env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"

package main

import (
    "context"
    "fmt"
    "log"

    "cloud.google.com/go/storage"
    "cloud.google.com/go/translate"
    "golang.org/x/text/language"
    "google.golang.org/api/iterator"
    "google.golang.org/api/option"
)

func translateTextWithModel(targetLanguage, text, model string) (string, error) {
    // targetLanguage := "ja"
    // text := "The Go Gopher is cute"
    // model := "nmt"

    ctx := context.Background()

    lang, err := language.Parse(targetLanguage)
    if err != nil {
        return "", fmt.Errorf("language.Parse: %v", err)
    }

    client, err := translate.NewClient(ctx)
    if err != nil {
        return "", fmt.Errorf("translate.NewClient: %v", err)
    }
    defer client.Close()

    resp, err := client.Translate(ctx, []string{text}, lang, &translate.Options{
        Model: model, // Either "nmt" or "base".
    })
    if err != nil {
        return "", fmt.Errorf("Translate: %v", err)
    }
    if len(resp) == 0 {
        return "", nil
    }
    return resp[0].Text, nil
}

func main() {
    Json_path := "C:/Users/Mels/Documents/GoogleTools/cred-9dfos6bb49f.json"
    ProjectID := "cred"
    fmt.Println("RUNNING...")
    explicit(Json_path, ProjectID)
    fmt.Println(translateTextWithModel("ja", "Hello World", "nmt"))
}

// explicit reads credentials from the specified path.
func explicit(jsonPath, projectID string) {
    ctx := context.Background()
    client, err := storage.NewClient(ctx, option.WithCredentialsFile(jsonPath))
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()
    fmt.Println("Buckets:")
    it := client.Buckets(ctx, projectID)
    for {
        battrs, err := it.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(battrs.Name)
    }
}

JSON File

{
  "type": "service_account",
  "project_id": "xxxxxxx",
  "private_key_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----XXXXXXXX-----END PRIVATE KEY-----\n",
  "client_email": "[email protected]",
  "client_id": "11111111111",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "api_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxx%xxxxxxx.iam.gserviceaccount.com"
}

Upvotes: 0

Views: 2997

Answers (2)

Melisa
Melisa

Reputation: 432

I solved the issue. I downloaded "google cloud shell SDK" and I used "gcloud auth application-default login" code. SDK provides a JSON file and I replaced it with new JSON file.

I do not recommend cloud.google.com/translate/docs/setup instructions. Direct use Google cloud SDK.

Upvotes: 2

Jofre
Jofre

Reputation: 3898

If the library can't find the default credentials, then you can try to create a client with the credentials path.

Even if this might not be the best option for you (although I prefer it to the env variable), it'll help you diagnose the issue a little better.

In order to create the client with a path to the credentials file, you need to import google.golang.org/api/option, and create the client with the WithCredentialsFile option. Note in the docs that the client can be created with additional options:

func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error)

A somewhat more complete example on how to create a client with options would be the following (apply the required parts to your current code as needed):

package main

import (
    "cloud.google.com/go/translate"
    "context"
    "google.golang.org/api/option"
)

func main() {
    ctx := context.Background()
    client, err := translate.NewClient(ctx, option.WithCredentialsFile("/path/to/your/file"))
    if err != nil {
        // TODO: handle error.
    }
    // Use the client.

    // Close the client when finished.
    if err := client.Close(); err != nil {
        // TODO: handle error.
    }
}

(This is just a copy of the example in the docs with the additional option included.)

Upvotes: 1

Related Questions