📃

ShopifyAPI経由で商品の翻訳を取得・登録する

2024/01/27に公開

前提

  • ShopifyではRestAPIとGraphQL APIが用意されているが、翻訳についてはGraphSQLでリクエストする(RestAPIではサポートされていない模様)。
  • 筆者はPHPShopify\ShopifySDKを利用してGraphQLリクエストを実施しているため、応答結果はPHPの配列で取得している

取得

GraphQLで商品情報を取得する際にtranslationsを指定する(localeの指定は必須)。

    query {
        product(id: "gid://shopify/Product/xxxxxxxxxx") {
            title
            description
            translations(locale: "en") {
                key
                value
                locale
            }
        }
    }

翻訳情報が存在する場合、translationsキー内に配列として結果が取得される

:
      'translations' => 
      array (
        0 => 
        array (
          'key' => 'body_html',
          'value' => '<p>Test update by API</p>',
          'locale' => 'en',
        ),
      ),
:

登録

登録時には事前に翻訳可能要素のdigestを取得する必要がある。

digest取得

    query {
        translatableResource(resourceId: "gid://shopify/Product/xxxxxxxxxx") {
            resourceId
            translatableContent {
                key
                value
                locale
                digest
            }
        }
    }

商品の場合は次のような結果が戻される。商品の場合、title, body_html, handle, product_typeに設定がきる。

:
  array (
    'translatableResource' => 
    array (
      'resourceId' => 'gid://shopify/Product/xxxxxxxxxx',
      'translatableContent' => 
      array (
        0 => 
        array (
          'key' => 'title',
          'value' => 'test',
          'locale' => 'ja',
          'digest' => '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
        ),
        1 => 
        array (
          'key' => 'body_html',
          'value' => 'test',
          'locale' => 'ja',
          'digest' => '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
        ),
        2 => 
        array (
          'key' => 'handle',
          'value' => 'test',
          'locale' => 'ja',
          'digest' => '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
        ),
        3 => 
        array (
          'key' => 'product_type',
          'value' => '',
          'locale' => 'ja',
          'digest' => '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
        ),
      ),
    ),
  ),
:

設定

GraphQLと設定パラメータ例は以下

GraphQL:
        mutation translationsRegister(\$resourceId: ID!, \$translations: [TranslationInput!]!) {
            translationsRegister(resourceId: \$resourceId, translations: \$translations) {
                userErrors {
                    field
                    message
                }
            }
        }
Parameters:
        $variables = [
            "resourceId" => "gid://shopify/Product/xxxxxxxxxx",
            "translations" => [
                [
                    "key" => "title",
                    "value" => "trans title",
                    "locale" => "en",
                    "translatableContentDigest" => "titleのdigest",
                ],
                [
                    "key" => "body_html",
                    "value" => "trans body html",
                    "locale" => "en",
                    "translatableContentDigest" => "body_htmlのdigest",
                ]
            ]
        ];

上記設定で各要素に翻訳が追加できる。
(PHPShopify\ShopifySDKのGraphQL利用の標準方法で可能)

最後に

VideoコンテンツなどGraphQLでないと処理できないことが多くなっているので、RestAPIで作成しているところもGraphQLに書き直したほうが良いきがしてきている

Discussion