想定と違う動作になるようなのでメモとして。検証が足りず間違っている可能性もありますが。
前提
- ShopifyのOS2.0対応のメタフィールドを使用し、タイプはJSONを選ぶ
- 「設定>言語」で別言語を追加し、CSVのエクスポート/インポートで翻訳を試みる
今後、「設定>言語」を使った多言語化が一般的になる可能性を考慮し、この仕組み内で対応可能な形を意図しています。
発生した問題
- JSONタイプのメタフィールドを使用
- CSVで翻訳追加してインポート
- 翻訳言語で表示した場合、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_codeでenやjaなどを判定して出し分けるという案も書かれています。
liquidによるJSONの変換
調査中に見つけたのでメモ的に。
結び
メタフィールドのJSONタイプと言語の翻訳に関しては、以下のような方法を検討する必要がありそうです。
- 古いJSON_STRINGタイプを使う
- 言語ごとにメタフィールドを用意し出し分ける
- デフォルト言語と翻訳言語で処理を変える(デフォルト言語はJSONそのままを使う形で構築し、翻訳言語は出力内容に沿った使い方で構築)
- JSONではなく別のタイプを使う(テキストタイプにしsplitなどを使う)
補記
JSONタイプの場合、デフォルト言語であればそのまま配列と同様にliquidの変数に入れてforを使うことができて便利でした。
もっとも本来はJSで扱うためのタイプに思われるので、直接liquidで扱うこと自体が非推奨かもしれませんが。
0人がこの記事を評価
役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。
連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。