''TranslationServiceClient' object has no attribute 'location_path' on Google Cloud Translate "translate_v3"

I'm using Python 3.6 and google-cloud-translate package.

from google.cloud import translate_v3 as translate
client = translate.TranslationServiceClient(credentials = credentials)
parent = client.location_path("my-location", "global")

Since yesterday, having updated the libraries I get this error:

AttributeError: 'TranslationServiceClient' object has no attribute 'location_path'

Is it that these libraries have changed? What is the right way to channel this inquiry?



Solution 1:[1]

Also encountered this. Not all the documentation has been updated yet, but they have published a migration guide:

https://googleapis.dev/python/translation/latest/UPGRADING.html

You could replace parent with "projects/<PROJECT_ID>/locations/<LOCATION>"

or define

def location_path(project_id, location):
    # might as well use an f-string, the new library supports python >=3.6
    return f"projects/{project_id}/locations/{location}"

and change client.location_path to location_path if this is something you use in many locations.

There are more sweeping changes, too. They now prefer you to pass a dictionary called request to the API methods, although the old way is still accepted. Thus, your code might look like this:

from google.cloud import translate_v3 as translate

client = translate.TranslationServiceClient(credentials=credentials)

response = client.translate_text(
    request={
        "parent": "projects/my-location/locations/global",
        "target_language_code": target_language_code,
        "contents": [text],
    }
)

Now, you might well ask 'how will I know what to put in that request dictionary?'. It looks as though the library comes with type annotations for the dictionaries appropriate for each method: https://googleapis.dev/python/translation/latest/translate_v3/types.html

For example, I read in your comment on another answer that you have had trouble with the detect_language method. The method signature indicates that if you use keyword arguments, content should be a valid one, so I don't know why that fails - maybe it's a bug.

However, if instead you use a request dictionary, that should look like this. You'll see that the keys don't appear to correspond exactly to the method signature keywords (although content is one of them).

This code would work:

response = client.detect_language({
    "parent": "projects/my-location/locations/global",
    "content": "Tá Gaeilge Agam, ach tá mé i mo chonai i Sasana",
})

lang = response.languages[0].language_code

(the return type is somewhat convoluted, as you can see)

Solution 2:[2]

I was having the same issue. I got rid of the 'parent' code all together and added it inside of the translate_text method.

client = translate.TranslationServiceClient()

response = client.translate_text(
              parent = 'projects/{}'.format(project_id),
              contents = [text],
              mime_type = 'text/plain',
              source_language_code = 'en-US',
              target_language_code = 'es')

Documentation: https://googleapis.dev/python/translation/latest/translate_v3/services.html

Solution 3:[3]

There nothing going to work out if python version is 3.6 or 3.8 I have fixed this easily by upgrading to python3.10 then upgrade the other google packages

    google-api-core==2.7.1
    google-auth==2.6.4
    google-auth-oauthlib==0.4.6
    google-cloud-core==2.3.0
    google-cloud-translate==3.7.2
    google-cloud-vision==2.7.2
    google-pasta==0.2.0
    googleapis-common-protos==1.56.0
    grpcio==1.44.0
    grpcio-status==1.44.0

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Paddy Alton
Solution 2
Solution 3 Satnam