コンテンツにスキップ

Brazeカタログでローカライズされたコンテンツを管理する

ローカライズされた文字列やURLをカタログに保存することで、ロケールごとに個別のバリアントを作成することなく、1つのキャンペーンやキャンバスから各ユーザーに適切な言語のコピーを配信できます。

この例について

PantsLabyrinthは架空の衣料品小売店であり、北米とヨーロッパで商品を販売しています。商品名、価格、ヒーロー画像は言語によって異なりますが、マーケティングチームは送信時にパーソナライズされる1つのメールまたはプッシュテンプレートを使用したいと考えています。

この例では、SDKがデバイスのロケールから収集するユーザーの${language} 標準属性項目を読み取る3つのカタログパターンを取り上げます。

  • JSONオブジェクトフィールド:1アイテムにつき1行にすべてのロケールを格納
  • 言語ごとのフラットカラム:header_en、header_fr など
  • 言語ごとに個別のカタログ:pantslabyrinth-promo-en のようなダイナミックなカタログ名

ローカライズされたコンテンツが構造化データ(商品、プロモーション、画像URL)の場合はカタログを使用します。メールやプッシュの自由形式のメッセージコピーについては、チャネルが対応している場合は多言語メッセージをお勧めします。ローカライゼーションパターンをより幅広く比較するには、翻訳管理を参照してください。

注意事項

  • 例はあくまで説明用です。カタログキーやサフィックスの命名前に、ユーザー群における${language}の大文字・小文字と形式を確認してください。
  • 方法1と方法2では、${language}が空白の場合やカタログキーまたはフィールドに一致しない場合、ローカライズされた出力が空になることがあります。各フィールドを個別にチェックし、デフォルト(例:英語)にフォールバックしてください。
  • 方法3では、カタログ名を構築する前にサポートされる言語コードを許可リストに登録してください。カタログが存在しない場合、メッセージは中止されます。
  • カタログ内のJSONオブジェクトは、APIまたはカタログ向けCloud Data Ingestion(CDI)を通じて作成・更新できますが、CSVアップロードでは対応していません。
  • 方法2はCSVでのメンテナンスに対応していますが、言語が増えるにつれて列が増加します。CSVファイルは最大1,000列をサポートしています。
  • 方法3では、catalog_itemsタグに到達するすべての言語コードに対してカタログが必要です。カタログが存在しない場合、Brazeはメッセージを中止します。既存のカタログにアイテムIDが存在しない場合、空のアイテム配列が返されます。
  • カタログのLiquidタグは再帰的に使用できません。
  • カタログセレクションは最大10個のフィルターをサポートし、最大50件のアイテムを返します。カタログスキーマに対してフィルターを検証してください。
  • 大規模なマルチロケール商品フィードを管理する場合は、カタログストレージティアを確認してください。

設定

ステップ1: カタログ構造を選択する

次の表のガイダンスを参考に、カタログ構造を選択してください。

メソッド 最適な用途 トレードオフ
JSONオブジェクトフィールド 中規模カタログ、1アイテムにつき1行、APIまたはCDI経由で更新 言語を追加するとAPIですべてのアイテムを更新する必要がある。JSONフィールドにはCSVが使えない
フラットな言語別フィールド 言語やフィールドが少ない場合、非開発チームがCSVを使用する場合 新しい言語を追加するたびに列が増える。フィールド名の一貫性を保つ必要がある
言語ごとのカタログ ロケールごとの大規模フィードまたはロケール別の管理者がいる場合、言語ごとにCSVを使用 許可リストに登録されたすべての言語コードにカタログが必要。カタログが見つからない場合は送信が中止される

ステップ2: カタログとアイテムを作成する

  1. データ設定 > カタログに移動し、カタログを作成します(メソッド3の場合は複数のカタログ)。
  2. 選択した構造に基づいてフィールドとアイテムを追加します。カタログの作成を参照してください。
  3. (オプション)カタログセレクションを作成してアイテムをフィルタリングします。たとえば、categoryがユーザーのカスタム属性と一致するものなどです。

カタログ PantsLabyrinth_Product_Copy のアイテム例:

アイテム 値
id trail-runner-001
name {"EN":"Trail Runner","FR":"Chaussure de trail","DE":"Trailrunner"}
category footwear
url https://pantslabyrinth.shop/products/trail-runner-001
price {"EN":"$120 USD","FR":"112 EUR","DE":"112 EUR"}

カタログ PantsLabyrinth_Promo_Copy のアイテム例:

アイテム 値
id spring-sale
header_en Spring trail sale
header_fr Soldes de printemps
body_en Save on trail runners this week.
body_fr Économisez sur les chaussures de trail cette semaine.
cta_text_en Shop now
cta_text_fr Acheter
img_src_en https://cdn.pantslabyrinth.shop/en/spring.jpg
img_src_fr https://cdn.pantslabyrinth.shop/fr/spring.jpg

同じフィールドを持つカタログを言語ごとに1つ作成します。たとえば、pantslabyrinth-promo-fr と pantslabyrinth-promo-de で同じ id とフィールドをローカライズされた値で繰り返します。

pantslabyrinth-promo-en のアイテム例:

アイテム 値
id spring-sale
header Spring trail sale
body Save on trail runners this week.
cta_text Shop now
img_src https://cdn.pantslabyrinth.shop/en/spring.jpg

ステップ3: メッセージにLiquidを追加する

ステップ1で選択したカタログ構造に合ったLiquidパターンを選択してください。

すべてのロケールを単一のカタログ行のJSONオブジェクトフィールドに格納し、property_accessorフィルターを使用して${language}(大文字に正規化)に一致するnameとpriceのキーを読み取ります。各フィールドを独立してチェックし、そのフィールドが空の場合はENにフォールバックするため、名前はあるが価格がないロケールでも英語の価格が表示されます。

{% catalog_items PantsLabyrinth_Product_Copy trail-runner-001 %}
{% assign lang = ${language} | upcase %}
{% assign localized_name = items[0].name | property_accessor: lang %}
{% assign localized_price = items[0].price | property_accessor: lang %}
{% if localized_name == blank %}
  {% assign localized_name = items[0].name | property_accessor: 'EN' %}
{% endif %}
{% if localized_price == blank %}
  {% assign localized_price = items[0].price | property_accessor: 'EN' %}
{% endif %}
Product: {{ localized_name }}
Price: {{ localized_price }}

プロパティアクセサフィルターを参照してください。

${language}(小文字に正規化)からダイナミックなフィールド名を構築し、ブラケット参照でアイテムからそのフィールドを読み取ります。たとえば、items[0][header_field]は解決された言語のヘッダーを読み取ります。各フィールドを独立してチェックし、そのフィールドが空の場合は英語の列にフォールバックするため、ヘッダーはあるが本文がないロケールでも英語の本文が表示されます。

{% catalog_items PantsLabyrinth_Promo_Copy spring-sale %}
{% assign lang = ${language} | downcase %}
{% assign header_field = 'header_' | append: lang %}
{% assign body_field = 'body_' | append: lang %}
{% assign cta_field = 'cta_text_' | append: lang %}
{% assign img_field = 'img_src_' | append: lang %}
{% assign header_val = items[0][header_field] %}
{% assign body_val = items[0][body_field] %}
{% assign cta_val = items[0][cta_field] %}
{% assign img_val = items[0][img_field] %}
{% if header_val == blank %}
  {% assign header_val = items[0].header_en %}
{% endif %}
{% if body_val == blank %}
  {% assign body_val = items[0].body_en %}
{% endif %}
{% if cta_val == blank %}
  {% assign cta_val = items[0].cta_text_en %}
{% endif %}
{% if img_val == blank %}
  {% assign img_val = items[0].img_src_en %}
{% endif %}
<img src="{{ img_val }}" alt="" />
<h2>{{ header_val }}</h2>
<p>{{ body_val }}</p>
<a href="#">{{ cta_val }}</a>

対応するカタログがある言語コード(ここではen、fr、de)を許可リストに登録し、サポートされていない値や空の値はデフォルトでenにマッピングし、アイテムを検索します。そのカタログにアイテムIDが見つからない場合は、英語のカタログにフォールバックします。

{% assign lang = ${language} | downcase %}
{% assign supported = 'en,fr,de' | split: ',' %}
{% if supported contains lang %}{% else %}{% assign lang = 'en' %}{% endif %}
{% assign theCatalog = 'pantslabyrinth-promo-' | append: lang %}
{% catalog_items {{ theCatalog }} spring-sale %}
{% if items[0] == blank %}
  {% catalog_items pantslabyrinth-promo-en spring-sale %}
{% endif %}
<img src="{{ items[0].img_src }}" alt="" />
<h2>{{ items[0].header }}</h2>
<p>{{ items[0].body }}</p>
<a href="#">{{ items[0].cta_text }}</a>

カタログ名でのテンプレートの使用およびメッセージの中止を参照してください。

オプション:カテゴリ別のカタログセレクション

パーソナライゼーションの前にアイテムをフィルタリングします。たとえば、preferred_category = footwearのユーザーに対するフットウェアプロモーションの場合:

{% catalog_selection_items PantsLabyrinth_Product_Copy footwear_promos %}
{% for item in items %}
  {{ item.name }}
{% endfor %}

ダッシュボードでcategory列のフィルターと、必要に応じてユーザー属性を使用してセレクションを定義します。

ステップ4: プレビューとテスト

  1. 異なる${language}の値を持つユーザープロファイルでユーザーとしてプレビューを使用します。
  2. 言語が見つからない場合やサポートされていない場合のフォールバックコピーを確認します。部分的なロケール(たとえば名前はあるが価格がない場合)も含めて確認してください。
  3. メソッド3の場合、許可リストに登録されたすべての言語に対応するカタログがあること、およびサポートされていない言語コードが送信を中止せずにデフォルトのカタログにマッピングされることを確認します。
New Stuff!