what is translatableContentDigest and how can I generate Digest for translatable content

bhargavBiz
Shopify Partner
4 0 0

Hello, I am using GraphQL API for translating content for the product taking reference from.

 

 https://help.shopify.com/en/api/guides/multi-language/translating-content-api

 

But stucked in translatableContentDigest how can I has translatable content?

 

Replies 6 (6)

mscheurich
Shopify Partner
14 1 23

I'd like to know as well.

This page talks about requiring generating a digest value when registering a translation but it doesn't say how: https://shopify.dev/tutorials/translating-content-for-online-store#step-4-write-a-translation

It seems like the example `digest` value is not base64 encoded, nor is it an `md5` hash -- the length of the digest in that example is 64 characters. It might be hashed using SHA-256?

Question to Shopify (or other knowledgable devs) can the digest be anything?

mscheurich
Shopify Partner
14 1 23

Welp, I tried with `sha256` and I got the following error:

"userErrors": [
      {
        "code": "INVALID_TRANSLATABLE_CONTENT",
        "field": [
          "translations",
          "0",
          "translatableContentDigest"
        ],
        "message": "Translatable content hash is invalid"
      }
}

Searching for how one can create the digest comes with no goods! I only see docs that say "you need to provide the digest when registering translations". What's the deal, Shopify?

mscheurich
Shopify Partner
14 1 23

Eureka, I figured it out thanks to the error message.

`translatableContentDigest` is a sha256 hash of the original content being translated.

If I was translating a product title (e.g. "Lemon Hawaiian Shirt") to French ("Chemise Hawaïenne Citron"), I'd have to get the value of the product's title ("Lemon Hawaiian Shirt"), hash that using sha256, then include that as the translatableContentDigest value in the GraphQL request:

 

mutation {
  translationsRegister(
    resourceId: "gid://shopify/Product/1234567890"
    translations: [
      {
        locale: "fr"
        key: "title"
        value: "Chemise Hawaïenne Citron"
        translatableContentDigest: "6aa3b98c0c2b71d6f588616bd4314227d11b1d9e7e031f1c0b0a8785f09eaac0"
      }
    ]
  ) {
    translations {
      key
      locale
      outdated
      value
    }
    userErrors {
      code
      field
      message
    }
  }
}

 

Same goes for all properties listed here: https://shopify.dev/tutorials/manage-app-translations-with-admin-api#graphql-admin-api-translatable-...

kinokritik
Tourist
6 0 12

@mscheurich thanks for finding the hash algorithm 😃

 

For those who don't want to to generate hash themselves though, you can get them from existing content entities

{
  translatableResource(resourceId: "gid://shopify/Product/1") {
    resourceId
    translatableContent {
      key
      value
      digest
      locale
    }
    translations(locale: "ja") {
      key
      value
      locale
    }
  }
}

 

Will get you digest hash

{
  "data": {
    "translatableResource": {
      "resourceId": "gid://shopify/Product/1",
      "translatableContent": [
        {
          "key": "title",
          "value": "my product title",
          "digest": "df1570fdf4972ddb2e7224ee325a30d14794936eb3edec9bd3e78c37ac0b7509",
          "locale": "en"
        },
 
    ...
    ...
    ...


}

 

FactoryAidan
Shopify Partner
10 1 9

Here's how using Javascript

 

const original_product_title = 'A T-Shirt';

import crypto from 'crypto';
const shopify_digest = crypto.createHash('sha256').update(original_product_title).digest('hex');

console.log(original_product_title);
console.log(shopify_digest);
//	A T-Shirt
//	2078e7240af94923f7d129a9c219e3210e4225be01705b1835b110cc56ff9417

 

Keep in mind the digest is of the untranslated value.

 

So my English Product.title gets digested.

And I send that digest to Shopify with my desired translated value.