# Translate catalog content Translate a product while retaining its identity, variants, prices, and inventory. Use this workflow for supported native content fields rather than creating another product for each language. ## Before you begin Use an existing product and an Admin connection with locale and translation permissions. Read the product's translatable fields and existing translations to confirm the key you want to change. The example uses the product `name` key and Danish locale `da-DK`. Do not assume the same keys exist on every resource type. ## 1. Configure the locale Admin API ```graphql mutation CreateDanishLocale($input: LocaleCreateInput!) { localeCreate(input: $input) { locale { code status } errors { __typename ... on UserError { message } } } } ``` Variables ```json { "input": { "code": "da-DK", "status": "ACTIVE", "isDefault": false } } ``` Skip creation if the locale already exists and is active. Do not change the project's default language merely to test one translation. ## 2. Write the translated field Admin API ```graphql mutation TranslateLamp($input: TranslationsUpsertBulkInput!) { translationsUpsertBulk(input: $input) { translations { key localeCode value } errors { __typename ... on UserError { message } } } } ``` Variables ```json { "input": { "translations": [ { "entityId": "", "translations": [ { "key": "name", "localeCode": "da-DK", "value": "K\u00f8benhavnerlampe" } ] } ] } } ``` The outer list contains entities; each entity has its own translation entries. Inspect typed errors before treating the batch as complete. An unsupported key or inactive locale needs corrected input, not an unchanged retry. ## 3. Verify resolution Storefront API ```graphql query TranslatedLamp($id: ID!, $locale: String!) { product(id: $id, locale: $locale) { id name slug } } ``` Variables ```json { "id": "", "locale": "da-DK" } ``` Confirm the product ID is unchanged and the name is translated. Repeat with the default locale and a field that has no translation to verify the fallback your storefront needs. Do not delete production translations as a test. Use a test product when exercising missing-value behavior. For large translation files, use [Bulk operations and jobs](/guides/integrations/bulk-and-jobs). See [Locales and translations](/concepts/localization/translations) for the language-versus-market distinction.