GraphQL API - Text Update von Localize

Topic summary

Problemstellung:
Ein Nutzer möchte Produktübersetzungen in Shopify’s “Localize / Translate & Adapt” per PHP und GraphQL API aktualisieren. Während das Abfragen englischer Titel und Beschreibungen funktioniert, war unklar, wie Updates durchgeführt werden.

Lösung:
Die translationsRegister Mutation ermöglicht das Aktualisieren von Nicht-Standardsprachen. Entscheidend sind zwei Schritte:

  1. Digest-Wert abfragen: Zunächst muss der translatableContentDigest über die translatableResource Query mit der Produkt-ID abgefragt werden.

  2. Update durchführen: Mit der translationsRegister Mutation werden dann Titel und Beschreibung aktualisiert, wobei folgende Parameter erforderlich sind:

    • resourceId (Produkt-ID)
    • locale (z.B. “en”)
    • key (“title” oder “body_html”)
    • value (neuer Text)
    • translatableContentDigest (aus Schritt 1)

Ergebnis:
Die Methode funktioniert erfolgreich. Der Thread enthält vollständige PHP-Code-Beispiele für beide Schritte sowie Screenshots der API-Responses.

Summarized with AI on November 20. AI used: claude-sonnet-4-5-20250929.

Hallo,

Anwendungsfall:
Ich möchte mit PHP die Produkt Übersetzungen mit GraphQL Updaten. Die Übersetzungen sind in Shopify “Localize / Translate & Adapt”. Mit dem Code unten kann ich die Englischen Titel und Beschriebungen Abfragen.

Frage:
Wie lautet die query wenn ich Titel und/oder Beschreibungen Updaten möchte?

Bild von “Translate & Adapt”:

GraphQL Query zum Abfrage der Englischen Titel/Beschreibung von “Localize”:

# QUERY/PHP

$query = 'query {
    product(id: "gid://shopify/Product/123456789") {
        id
        en: translations(locale:"en"){ key locale value}
    }
}';
$data_string =  json_encode(array("query" => $query));

# CURL
$curl = curl_init("https://xxxxxx.myshopify.com/admin/api/2023-04/graphql.json");
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 90);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Authorization: Basic '     . base64_encode("xxx:xxx"),
    'Content-Length: '          . strlen($data_string),
    'X-GraphQL-Cost-Include-Fields: true'
));

# RESULT
$curl_response = curl_exec($curl);
if ($curl_response === false) curl_close($curl);
$responseArr = json_decode($curl_response, true);
print_r($responseArr);

Hey @Philipp_S

Danke für die Angaben. Hast du die versch. Leitfaden zum Thema GraphQL mutation to update translations hier schon gesehen?

Es scheint Shopify hat keine eingebaute GraphQL Mutation, um Übersetzungen zu aktualisieren. Vielleicht die Produktinformationen direkt zu aktualisieren, indem man die entsprechenden Mutationen verwenden? PHP Beispiel:

# GraphQL Mutation
$mutation = '
mutation {
 productUpdate(
   input: {
     id: "gid://shopify/Product/123456789",
     title: "Neuer Produkt-Titel",
     descriptionHtml: "Neue Produkt-Beschreibung"
   }
 ) {
   product {
     id
     title
     descriptionHtml
   }
   userErrors {
     field
     message
   }
 }
}';

$data_string =  json_encode(array("query" => $mutation));

# Die restliche Logik bleibt gleich

Oder möchtest du die translationsRegister Mutation verwenden? Beachte jedoch, dass dies den Titel und die Beschreibung auf der Standardsprache aktualisiert. Oder es haben die API-Endpunkte und Methoden sich seit dem letzten Update geändert, kann ich derzeit nicht sagen ¯_(ツ)_/¯.

Hallo Gabe,

danke für deine schnelle Rückmeldung.
Deine query ändert den Titel und die Beschreibung der Standart Sprache (de) des Shops, jedoch nicht die (en) Texte. Werde aus der Dokumentation leider auch nicht schlauer :slightly_smiling_face:

Hast du ggf. ne Idee wie die mutation aussehen könnte für en?

Die Hauptidee hinter der Mutation translationsRegister besteht darin, eine Übersetzung für eine Nicht-Standardsprache im Shop zu registrieren. Um das zu tun, einfach die Nicht-Standardsprache angeben (in deinem Fall “en”).

So könnte dann eine Mutationsanfrage aussehen:

$mutation = '
mutation translationsRegister($resourceId: ID!, $translations: [TranslationInput!]!) {
  translationsRegister(resourceId: $resourceId, translations: $translations) {
    userErrors {
      message
      code
      field
    }
    translations {
      key
      value
    }
  }
}';

$variables = array(
    "resourceId" => "gid://shopify/Product/123456789",
    "translations" => [
        [
            "locale" => "en",
            "key" => "title",
            "value" => "New product title",
            "translatableContentDigest" => "digestfrompreviousquery"
        ],
        [
            "locale" => "en",
            "key" => "description",
            "value" => "New product description",
            "translatableContentDigest" => "digestfrompreviousquery"
        ]
    ]
);

$data_string = json_encode(array(
    "query" => $mutation,
    "variables" => $variables
));

// Der Rest der CURL Logik bleibt gleich...

Beachte, dass die translatableContentDigest Werte in den translations korrekt sein müssen. Man sollten die Werte verwenden, die man in der vorherigen Abfrage von translatableResource erhalten hat. Auch der “resourceId” Wert muss korrekt sein, sprich, die eindeutige ID des Produkts.

In manchen Fällen möglicherweise andere Schlüssel verwenden, sprich, die du in der vorherigen Abfrage von translatableResource erhalten hast.

Bei weiteren Fragen kann ich gerne einen Experten empfehlen!

Vielen Dank für die Info. Habe die Query oben schon versucht zu erstellen, mir waren jedoch die ‘translatableContentDigest’ Werte und die resourceId unbekannt. Werde diese vorab Abfragen und dann die Query testen bzw. bescheid geben obs geklappt hat.

@Philipp_S

Ich hoffe das klappt! Ich bin am Montag wieder da und wir können das ganze Thema dann etwas weiter ausreizen!

Schönes W-Ende! :wink:

Hallo Gabe,

vielen Dank, das Updaten der Englischen Titel und Beschreibungen klappt nun! Der Trick ist wie oben erwähnt die vorherige Abfrage für den “translatableContentDigest” Wert. Hier zur Zusammenfassung meiner funktionierenten Abfragen.

1. Abfrage des “digest” Wertes mit der Produkt ID

  • mit dieser Query erhält man den “digest” Wert für den DE Titel und Beschreibung für den nächsten EN Update Call.
$query = 'query {
  translatableResource(resourceId: "gid://shopify/Product/' . $id . '") {
    resourceId
    translatableContent {
      key
      value
      digest
      locale
    }
    translations(locale: "en") {
      key
      value
      locale
    }
  }
}';

# 1.
$queryString = json_encode(array(
    "query" => $query
));

Response:

1. Update des englischen Titels, Beschreibung

$mutation = '
mutation translationsRegister($resourceId: ID!, $translations: [TranslationInput!]!) {
  translationsRegister(resourceId: $resourceId, translations: $translations) {
    userErrors {
      message
      code
      field
    }
    translations {
      key
      value
    }
  }
}';

$variables = array(
    "resourceId" => "gid://shopify/Product/8398574092630",
    "translations" => [
        [
            "locale" => "en",
            "key"    => "title",
            "value"  => "new englisch titel",
            "translatableContentDigest" => "4c2aa73351777fb789c8d0c43fd79433ddbf5578b9d046c433ea516fbb497e12"
        ],
        [
            "locale" => "en",
            "key"    => "body_html",
            "value"  => "new englisch desc",
            "translatableContentDigest" => "6cf690b31996ba260afafd6fa6da70bc1c4df6489ba68531774a2e7b1b5fbb95"
        ]
    ]
);
$queryString = json_encode(array(
    "query"     => $mutation,
    "variables" => $variables
));

Response:

Shopify:

  • die Werte wurde erfolgreich geupdatet

Hey @Philipp_S

Wow klasse Arbeit und danke fürs updaten!

Das wird auch andere hier helfen können! :wink:

VG,