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:カタログとアイテムを作成する
- データ設定 > カタログに移動し、カタログを作成します(方法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にフォールバックすることで、名前はあるが価格がないロケールでも英語の価格が表示されます。
1
2
3
4
5
6
7
8
9
10
11
12
{% 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]は解決された言語のヘッダーを読み取ります。各フィールドを個別にチェックし、そのフィールドが空白の場合は英語のカラムにフォールバックすることで、ヘッダーはあるが本文がないロケールでも英語の本文が表示されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{% 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>

catalog_itemsに渡すカタログ名が存在しない場合、Brazeはメッセージを中止します。カタログ名を構築する前にサポートされている言語コードを許可リストに登録してください。既存のカタログ内にアイテムIDが存在しない場合は空のアイテム配列が返されます。その場合のみ英語のカタログにフォールバックできます。
一致するカタログを持つ言語コード(ここではen、fr、de)を許可リストに登録し、サポートされていないまたは空白の値はenにデフォルト設定してからアイテムを検索します。そのカタログにアイテムIDが存在しない場合は、英語のカタログにフォールバックします。
1
2
3
4
5
6
7
8
9
10
11
12
{% 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のユーザーに対するフットウェアプロモーション:
1
2
3
4
{% catalog_selection_items PantsLabyrinth_Product_Copy footwear_promos %}
{% for item in items %}
{{ item.name }}
{% endfor %}
ダッシュボードでcategoryカラムに対するフィルターと、必要に応じてユーザー属性を使用してセレクションを定義します。
ステップ4:プレビューとテスト
- 異なる
${language}値を持つユーザープロファイルでユーザーとしてプレビューを使用します。 - 言語が存在しないまたはサポートされていない場合(例:名前はあるが価格がないなどの部分的なロケールを含む)のフォールバックコピーを確認します。
- 方法3の場合、許可リストに登録されたすべての言語に対応するカタログがあること、およびサポートされていない言語コードが送信を中止することなくデフォルトカタログにマッピングされることを確認します。