Translating content with the API
This guide explains how to use the GraphQL Admin API to create and retrieve translated content for Shopify resources. For example, you might add translations of product information and email notification templates so a merchant can send customers email notifications in multiple languages.
Translation access scopes
To use the GraphQL Admin API to create or retrieve translated content, your app needs to request the
write_translations access scopes for a Shopify store. For more information on requesting access scopes when your app is installed, see OAuth.
Translatable resource types
The following resource types and fields are translatable:
|Metafields (buyer facing only)||
|Online store article||
|Online store blog||
|Online store page||
|Online store theme||
Retrieve a list of translatable resource types
TranslatableResourceType contains a list of the resource types that are translatable. You can use the following query to list each of those types:
You can use the translateableResources connection to retrieve a list of translatable resources, their translatable content, and their existing translations in various languages. You can also retrieve all translations for a locale, regardless of resource type.
- Retrieve a list of translatable resource types
- Retrieve a list of translatable resources by their type
- Retrieve translations for a resource type and locale
- Retrieve a single translatable resource by its ID
- Retrieve translations from a resource object
Retrieve a list of translatable resources by their type
The following query retrieves a list of translatable resources that are products. For each product, the query retrieves the content that can be translated in the
The response shows that the White T-Shirt product with the ID
"gid://shopify/Product/1" has content that can be translated, including its title and body HTML.
key field associates translatable content with its translations. The
value field shows the translatable content itself. When you create a translation, the mutation needs to include the
translatableContent field, which needs to match the
value field shown here. For more information, see Creating translations
Retrieve translations for a resource type and locale
Like the example above, this query retrieves a list of products and their translatable content. This query also includes the
translations field for each product, which retrieves any existing translations.
The field takes the argument
locale, which specifies the language of the translations to retrieve. In the following example, the language is Spanish.
Retrieve a single translatable resource by its ID
The following query retrieves a single translatable resource by passing its ID in the
Retrieve translations from a resource object
If your app only needs to read translations, then you can query translations directly from a translatable resource object.
GraphQL uses mutations to create, update, or delete data in a database. Mutations do the equivalent function of the REST data-modifying action verbs, such as POST, PUT, and DELETE.
You can use the translationsRegister mutation to create new translations for a resource. When you create a translation, you need to include the original content in the
translatableContent field. For example, to create a translation for the title of the White T-Shirt product from the queries above, the mutation would need to include
translatableContent: "White T-Shirt". The translated content is provided in the
If the untranslated content doesn't match the original content on the resource, then the mutation fails. In the following example, the mutation sets the value of
"White tee shirt" instead of
"White T-Shirt", so the mutation fails.
The following table shows codes and descriptions for errors that you might see when you create translations:
||A resource with the specified ID doesn't exist.|
||The key provided for the translation is invalid.|
||The value for the translation is invalid.|
||The translatable content doesn't match the original content on the resource.|
||The language code is invalid.|
||The locale code is invalid.|
You can use the translationsRemove mutation to remove translations from a resource. In the following example, the Spanish and Japanese title translations are removed from the product with the ID