ShopifyのJSONタイプのメタフィールドと翻訳に関する問題:メモ

Shopify

想定と違う動作になるようなのでメモとして。検証が足りず間違っている可能性もありますが。

前提

  • ShopifyのOS2.0対応のメタフィールドを使用し、タイプはJSONを選ぶ
  • 「設定>言語」で別言語を追加し、CSVのエクスポート/インポートで翻訳を試みる

今後、「設定>言語」を使った多言語化が一般的になる可能性を考慮し、この仕組み内で対応可能な形を意図しています。

発生した問題

  1. JSONタイプのメタフィールドを使用
  2. CSVで翻訳追加してインポート
  3. 翻訳言語で表示した場合、JSONではなくテキストとして出力される

上記は以下のmetafield_tagフィルタなどで確認できます。


{{ product.metafields.instructions.wash | metafield_tag }}

上記のように"metafield_tag"というフィルターをつけるだけで、それぞれのタイプに適した形で出力される。
JSONならばscriptタグで囲まれ、単一行テキストであればspanタグで囲まれる。
なお、"metafield_tag:json"のような記述ではない。

デフォルト言語と翻訳言語のURLで出力内容を見比べると以下のようになります。

  • デフォルト言語では、scriptタグで囲まれたJSONとして出力される
  • 翻訳言語では、span.metafield-single_line_text_fieldのようにspanタグで囲まれたテキストとして出力される

フォーラムでの回答

上記には以下のようなShopifyスタッフの回答が書かれています。

You are correct that translations for Metafields do come back as a string. As you have observed once it becomes a string you are not able to index into it as you would expect. I have created an issue on our side to dig into better alternatives for handling translated values. The only short term work around I can currently offer is to use the deprecated json_string type rather than json. The json_string type exists to support the JSON_STRING value type prior to the introduction of the updated metafield type system.

要約すると、テキストで出力されるのは確認されている処理であり、回避策としてOS2.0以前のJSON_STRINGタイプを使うことが提案されていました。

なお他の方の案として、必要な言語分だけJSONタイプのメタフィールドを作成し、localization.language.iso_codeenjaなどを判定して出し分けるという案も書かれています。

liquidによるJSONの変換

調査中に見つけたのでメモ的に。

結び

メタフィールドのJSONタイプと言語の翻訳に関しては、以下のような方法を検討する必要がありそうです。

  • 古いJSON_STRINGタイプを使う
  • 言語ごとにメタフィールドを用意し出し分ける
  • デフォルト言語と翻訳言語で処理を変える(デフォルト言語はJSONそのままを使う形で構築し、翻訳言語は出力内容に沿った使い方で構築)
  • JSONではなく別のタイプを使う(テキストタイプにしsplitなどを使う)

補記

JSONタイプの場合、デフォルト言語であればそのまま配列と同様にliquidの変数に入れてforを使うことができて便利でした。

もっとも本来はJSで扱うためのタイプに思われるので、直接liquidで扱うこと自体が非推奨かもしれませんが。

0人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄