diff --git a/_docs/_partners/data_and_infrastructure_agility/customer_data_platform/tealium/tealium_for_currents.md b/_docs/_partners/data_and_infrastructure_agility/customer_data_platform/tealium/tealium_for_currents.md index af3c99aa515..e0c3cbd0c8c 100644 --- a/_docs/_partners/data_and_infrastructure_agility/customer_data_platform/tealium/tealium_for_currents.md +++ b/_docs/_partners/data_and_infrastructure_agility/customer_data_platform/tealium/tealium_for_currents.md @@ -43,4 +43,4 @@ It's important to keep your Tealium URL up to date. If your connector's URL is i ## Integration details -Braze supports exporting all data listed in the [Currents event glossaries]({{site.baseurl}}/user_guide/data_and_analytics/braze_currents/#nav_top_dataandanalytics_brazec urrents_eventglossary) (including all properties in both [message engagement]({{site.baseurl}}/user_guide/data_and_analytics/braze_currents/event_glossary/message_engagement_events/) and [customer behavior]({{site.baseurl}}/user_guide/data_and_analytics/braze_currents/event_glossary/customer_behavior_events/) events) to Tealium. +Braze supports exporting all data listed in the [Currents event glossaries]({{site.baseurl}}/user_guide/data_and_analytics/braze_currents) (including all properties in both [message engagement]({{site.baseurl}}/user_guide/data_and_analytics/braze_currents/event_glossary/message_engagement_events/) and [customer behavior]({{site.baseurl}}/user_guide/data_and_analytics/braze_currents/event_glossary/customer_behavior_events/) events) to Tealium. diff --git a/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies.md b/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies.md index 61127fa68be..7c603d2815c 100644 --- a/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies.md +++ b/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies.md @@ -27,11 +27,8 @@ guide_menu_list: - name: Best Practices link: /docs/user_guide/engagement_tools/campaigns/ideas_and_strategies/best_practices/ fa_icon: fas fa-bullseye - - name: Localizing A Campaign + - name: Localization link: /docs/user_guide/engagement_tools/campaigns/ideas_and_strategies/localizing_a_campaign/ - fa_icon: fas fa-street-view - - name: Campaigns in Multiple Languages - link: /docs/user_guide/engagement_tools/campaigns/ideas_and_strategies/campaigns_in_multiple_languages/ fa_icon: fas fa-globe - name: Install Attribution Campaign link: /docs/user_guide/engagement_tools/campaigns/ideas_and_strategies/install_attribution/ diff --git a/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies/campaigns_in_multiple_languages.md b/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies/campaigns_in_multiple_languages.md deleted file mode 100644 index d835bad8540..00000000000 --- a/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies/campaigns_in_multiple_languages.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -nav_title: Campaigns in Multiple Languages -article_title: Campaigns in Multiple Languages -page_order: 4 -page_type: tutorial -description: "This how-to article will walk you through how to send messages in different languages within campaigns." -tool: Campaigns - ---- - -# Campaigns in multiple languages - -> This how-to article will go over how to send messages in different languages within campaigns. ->
->
-> Being able to deliver messages in multiple languages allows users to interact and reach their customers in a truly personalized way. - -Braze allows you to send messages in different languages from our dashboard. When composing a campaign, our language templating feature enables you to easily create one message that appears in different languages depending on the user's phone settings. - -Here's how you can set up a message in multiple languages: - -## Step 1: Feature opt-in - -When composing your campaign, click **Add Languages**. - -![][1]{: style="max-width:60%;" } - -## Step 2: Select languages {#select-language} - -Select the languages that your message will be in. The selections offered in the dropdown menu will be all of the languages that your users currently have. Braze automatically tracks the language in users' device settings and includes this information in each user's profile. - -After you select your languages, the snippet textbox will alter to feature a template that you can copy and paste into the content of your message. This template uses [conditional logic][3] to handle multiple languages in a single campaign. - -![][2] - -## Step 3: Select fields - -Select the fields that you want to appear in different languages. These fields will differ depending on the message channel: - -- Email: Subject and body -- Android push: Message, Title, Summary Text, Sound, and Custom URL -- iOS push: Message, Sound, and Custom URL -- In-app message: Message (HTML editor only) - -A warning will display if you have already entered content in any of the selected fields. You can choose to replace existing content with the templated text or insert the templated text after the existing text. - -![][4] - -## Step 4: Insert fields - -Using the buttons at the bottom of the dialogue, choose how you wish to insert the templated text into the message composer, or copy and paste the template into the desired location. - -## Step 5: Add language variations - -After inserting your templated text into the desired fields, type in different variations for each language. For each field where there is templating, you should enter the variations after the bracketed segment of templating. The variation should correspond to the language code referenced in the brackets before it. For instance, in the message's body, this might look like: - -{% raw %} - -```liquid -{% if ${language} == 'en' %} -Hello! -{% elsif ${language} == 'fr' %} -Bonjour! -{% else %} -Hello! -{% endif %} -``` - -For the title of an Android push, this might look like: - -```liquid -{% if ${language} == 'en' %}Hello!{% elsif ${language} == 'fr' %}Bonjour!{% else %}Hello!{% endif %} -``` - -The text you enter after `{% else %}` will display to users who: - -- Have a language that was not selected in [Step 2](#select-language). -- Have a language that is not supported by Braze. Braze supports the languages represented by ISO 639-1 two-letter codes, as well as a few additional ones not included in that set. For a complete list, check out our [iOS Localization page][8]. -- Have a device where the language is undetectable. (This is highly unlikely). - -We recommend entering text here that you think your users are most likely to understand. To ensure smooth delivery, you should always enter content after `{% else %}`. - -{% endraw %} - -Anything entered outside of the template block will behave like normal content and display for all users. - -![][6] - -## Step 6: Preview message - -Click the **Personalized Preview** button and enter a user's ID or email to see how the message would appear to that individual, depending on their language. You'll also be able to see how your entire message looks as a whole and decide whether to add languages to more fields than the ones you had previously chosen. - -![][7] - -## Step 7: Finish campaign - -Complete the remaining steps for [creating your campaign][9]. - -[1]: {% image_buster /assets/img_archive/languages_1.png %} -[2]: {% image_buster /assets/img_archive/languages_2.png %} -[3]: {{site.baseurl}}/user_guide/personalization_and_dynamic_content/liquid/conditional_logic/ -[4]: {% image_buster /assets/img_archive/languages_3.png %} -[6]: {% image_buster /assets/img_archive/languages_5.png %} -[7]: {% image_buster /assets/img_archive/languages_6.png %} -[8]: {{site.baseurl}}/developer_guide/platform_integration_guides/ios/advanced_use_cases/localization/ -[9]: {{site.baseurl}}/user_guide/engagement_tools/campaigns/building_campaigns/creating_campaign/ diff --git a/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies/localizing_a_campaign.md b/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies/localizing_a_campaign.md index 046342adc6e..6bd3bb00cd0 100644 --- a/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies/localizing_a_campaign.md +++ b/_docs/_user_guide/engagement_tools/campaigns/ideas_and_strategies/localizing_a_campaign.md @@ -1,40 +1,327 @@ --- -nav_title: Localizing a Campaign -article_title: Localizing a Campaign +nav_title: Localization page_order: 3 page_type: reference -description: "This reference article goes over how user locale is retrieved and accessed by the Braze platform." +description: "The article outlines the benefits of different orchestration approaches across campaigns and Canvases and lists different ways users can handle personalization in their messaging." tool: - Campaigns + - Canvas --- -# Localizing a campaign -> This reference article briefly goes over the information Braze collects from SDK integration and how it is used to classify locale and customize a user's experience. +# Localization -The Braze SDK automatically collects relevant data to help you localize campaigns. Our customers send localized content on a daily basis to their audience to keep content relevant and accessible. +Braze automatically collects locale information from user devices after integrating the SDK. The locale contains the language and a region identifier. This information is available in the Braze segmentation tool under **Country** and **Language**. Visit the following [iOS](https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html) and [Android/FireOS](http://developer.android.com/reference/java/util/Locale.html) resources for technical details on how locale is receive based on your platform. -## Technical details +For companies with customers in many countries, handling localization early in your Braze journey can save your companies time and resources. The following article lists the benefits of different orchestration approaches across campaigns and Canvases and also lists different ways users can handle personalization in their messaging. -Braze automatically collects locale information from user devices after the SDK has been integrated. The locale contains a language and region identifier. +- **Orchestration options** + - [Campaign](#campaign) (one template for all vs. one template per country) + - [Canvas](#canvas) (one journey for all vs. one journey per country)

+- **Personalization options** + - [Manual entry](#option-1-manual-entry) + - [Content Blocks](#option-2-content-blocks) + - [Catalogs](#option-3-catalogs) + - [Localization partners](#option-4-localization-partners) + - [Translations in a public Google Sheet](#option-5-translations-in-a-public-google-sheet) + - [Google spreadsheet into a JSON API via Sheetdb](#option-6-google-spreadsheet-into-a-json-api-via-sheetdb) -For example, a user who has set their device to English (US) will have a language `EN`. The user's country is collected from their device IP address. These filters will be available in Braze's segmentation tool under **Country and Language**. +## Orchestration -![A list of user attributes: Age, Country, Email Available, Gender, Language, Location Available, and Push Enabled.][7] +### Campaign -Check out the following resources for more technical details on how locale is retrieved based on your platform: +{% tabs local %} +{% tab One template for all %} -- [iOS][1] -- [Android][2] +In the "one template for all" approach, localization is applied to a single template in Braze using [Liquid]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/liquid). -## Internationalize campaigns +Once sent, the dashboard provides aggregated campaign analytics. User-level engagement can be measured using custom segment funnels, for example, by combining **Country** and **Received Campaign** filters. -You can take advantage of this language identifier and our personalization capabilities to internationalize campaigns. For more information on internationalization, see [Campaigns in multiple languages][12] +| Advantages | Considerations | +| --- | --- | +| - Centralized approach
- Reduced email build time, no need to build out an email multiple times | - Manual report building
- Campaign report shows aggregated metrics rather than metrics per country
- Need to thoroughly test Liquid to ensure it populates as expected
- Depending on how you pull in the country value or how many counties you have set up, it could be tricky to test each country
- Harder to schedule sends for specific times across time zones
- Harder to use if you want to send separate content per country. | +| --- | --- | --- | +{: .reset-td-br-1 .reset-td-br-2} -Braze automatically collects the most recent location of users' devices (if location permission is granted to your app). You can use this information to run a localized campaign that is targeted at users within a specific geographic area. For more information, see [Location targeting][13]. +{% endtab %} +{% tab One template per country %} + +The "one template per country" approach separates templating into different sending locals. + +Once sent, the dashboard reports sending analytics based on each country separately, and any downstream user-level [Currents]({{site.baseurl}}/user_guide/data_and_analytics/braze_currents#access-currents) events will also be tied to a specific campaign. + +- Templates benefit from implementing [Braze Tags]({{site.baseurl}}/user_guide/administrative/app_settings/manage_app_group/tags#tags) for maintenance and tracking purposes. +- Campaigns can inherit the configurations from the same [Braze Template]({{site.baseurl}}/user_guide/engagement_tools/templates_and_media#about-templates-and-media) and [Content Blocks]({{site.baseurl}}/user_guide/engagement_tools/templates_and_media/content_blocks#content-blocks) (i.e., [Email templates]({{site.baseurl}}/user_guide/message_building_by_channel/email/templates/email_template?redirected=true#creating-an-email-template) built with the use of Liquid). +- Pre-existing campaigns and templates can be [duplicated]({{site.baseurl}}/user_guide/engagement_tools/campaigns/managing_campaigns/duplicating_segments_and_campaigns/) to allow a faster time time-to-value. + +| Advantages | Considerations | +| --- | --- | +| - Scalable to multiple locations
- Reporting on revenue per country within Braze (i.e., per campaign)
- Flexibility if there is drastically different content per country | - Requires strategic structuring
- More build effort required (i.e., separate campaigns for each country) | +{: .reset-td-br-1 .reset-td-br-2} + +{% endtab %} +{% endtabs %} + +### Canvas + +{% tabs local %} +{% tab One journey for all %} + +In the "one journey for all" approach, localization is handled within [Canvas Journeys]({{site.baseurl}}/user_guide/engagement_tools/canvas/get_started/the_basics/#building-the-customer-journey) and Liquid to define messaging for each user. + +Once sent, the dashboard provides aggregated [Canvas Analytics]({{site.baseurl}}/user_guide/engagement_tools/canvas/testing_canvases/measuring_and_testing_with_canvas_analytics/), whereas the user level engagement can be measured via custom [Segment Funnels]({{site.baseurl}}/user_guide/engagement_tools/segments/segment_funnels/), i.e., combining [**Country**]({{site.baseurl}}/user_guide/engagement_tools/segments/segmentation_filters#country) and [**Received Canvas Step**]({{site.baseurl}}/user_guide/engagement_tools/segments/segmentation_filters#received-canvas-step) filters. + +| Advantages | Considerations | +| --- | --- | +| - Centralized approach
- Reduced email build time - no need to build out an email multiple times. | - Manual report building
- Canvas report shows aggregated metrics rather than metrics per country
- Need to thoroughly test Liquid to ensure it populates as expected
- Depending on how you pull in the country value or how many counties you have set up, it could be tricky to test each country
- Harder to schedule sends for specific times across time zones
- Harder to use if you want to send separate content per country. | +{: .reset-td-br-1 .reset-td-br-2} + +{% endtab %} +{% tab One journey per country %} + +In the "one journey per country" approach, the [Canvas]({{site.baseurl}}/user_guide/engagement_tools/canvas/create_a_canvas/create_a_canvas/) journey builder provides the flexibility of creating user journeys via multiple [Canvas Components]({{site.baseurl}}/user_guide/engagement_tools/canvas/canvas_components). These componenets can be [duplicated]({{site.baseurl}}/user_guide/engagement_tools/campaigns/managing_campaigns/duplicating_segments_and_campaigns/#duplicating-canvases) at the component and overall journey level. + +Localization can be achieved through the following methods: +- Separate Canvases per country, this ensures the complex user journeys are defined at the top of the funnel using audience filters +- Bespoke user journeys per country, the implementation of [Audience Paths]({{site.baseurl}}/user_guide/engagement_tools/canvas/canvas_components/audience_paths/) to intuitively segment users on a large scale for each journey by creating separate message threads for each country in a single Canvas + +Once sent, the dashboard provides dynamic analytics per country and within user-level [Currents]({{site.baseurl}}/user_guide/data_and_analytics/braze_currents#access-currents) events based on the customer’s current location. + +| Advantages | Considerations | +| --- | --- | +| - Reporting on revenue per country within Braze (i.e., per Canvas, variant, or step)
- Flexibility if there is drastically different content per country
- Can add other channels as part of the journey in the future | - Requires strategic structuring
- More build effort required (i.e., separate message steps for each country)
- Canvas can become large and difficult to read if you have custom, complex journeys for each country in a single Canvas. | +{: .reset-td-br-1 .reset-td-br-2} + +{% endtab %} +{% endtabs %} + +## Personalization + +### Option 1: Manual entry + +Manual entry requires you manually paste your content into the body of your message and use [Liquid]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/) to [conditionally]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/liquid/conditional_logic/#conditional-logic) display the correct language to the recipient. + +{% raw %} +```liquid +{% if ${language} == 'en' %} +This is a message in English from Braze! +{% elsif ${language} == 'es' %} +Este es un mensaje en español de Braze ! +{% elsif ${language} == 'zh' %} +这是一条来自Braze的中文消息。 +{% else %} +This is a message from Braze! This will go to anyone who does not match the other specified languages! +{% endif %} +``` +{% endraw %} + +This can be done by using the above format or through the Braze dashboard: +1. When composing your message, select the **Language** button to generate Liquid conditional logic for each language you select. +2. After inserting your templated text into your message, type in different variations for each language. For each field with templating, you should enter the variations after the bracketed segment of templating. The variation should correspond to the language code referenced in the brackets before it. +3. Test your message before sending it by entering a user's ID or email to check how a message would appear to an individual depending on their language. + +{% alert tip %} +We always recommend including a {% raw %}`{% else %}`{% endraw %} statement in your messaging. While most users will see messaging for their specific language, the text will be visible to those that: +- Do not have a language selected +- Have a language that Braze does not support +- Have a device where the language is undetectable +{% endalert %} + +### Option 2: Content Blocks + +Braze [Content Blocks]({{site.baseurl}}/user_guide/engagement_tools/templates_and_media/content_blocks/#content-blocks) are reusable blocks of content. When a block is changed, everywhere that references that block changes. For example, an email header or footer used in all emails or to house translations. These blocks can also be [created]({{site.baseurl}}/api/endpoints/templates/content_blocks_templates/post_create_email_content_block/#create-content-block) and [updated]({{site.baseurl}}/api/endpoints/templates/content_blocks_templates/post_update_content_block/) using the REST API, and users can programmatically upload translations. + +When building a campaign in the dashboard, Content Blocks can be referenced using tag {% raw %}`{{content_blocks.${name_of_content_block}}}`{% endraw %}. These blocks could contain all translations housed within conditional logic for each language, as shown in option 1, or a separate block for each language can be utilized. + +Content Blocks can also be utilized as a translation management process where content that requires translation is housed within a Content Block, fetched, translated, and then updated: +1. Manually create a Content Block in the dashboard with the tag "Needs Translation". +2. Your service performs a nightly fetch of all Content Blocks using the [`/content_blocks/list`]({{site.baseurl}}/api/endpoints/templates/content_blocks_templates/get_list_email_content_blocks/) endpoint. +3. Your service fetches details on each Content Block through the [`/content_blocks/info`]({{site.baseurl}}/api/endpoints/templates/content_blocks_templates/get_see_email_content_blocks_information/) endpoint to see which blocks are tagged for translation. +4. Your translation service translates the body of all "Needs Translation" Content Blocks. +5. Your service hits the [`/content_block/update`]({{site.baseurl}}/api/endpoints/templates/content_blocks_templates/post_update_content_block/) endpoint to update translated content and update the tag to "Translation Complete". + +### Option 3: Catalogs + +[Catalogs]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/catalogs/) allow you to access data from imported JSON objects via API and CSV files to enrich your messages, similar to custom attributes or custom event properties through Liquid. For example: + +{% tabs local %} +{% tab API %} + +Create a catalog via the following API call: +```json +curl --location --request POST 'https://your_api_endpoint/catalogs' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: Bearer YOUR-REST-API-KEY' \ +--data-raw '{ + "catalogs": [ + { + "name": "translations", + "description": "My localization samples", + "fields": [ + { + "name": "id", + "type": "string" + }, + { + "name": "context", + "type": "string" + }, + { + "name": "language", + "type": "string" + }, + { + "name": "body", + "type": "string" + } + ] + } + ] +}' +``` +Add items via the following API call: +```json +curl --location --request POST 'https://your_api_endpoint/catalogs/translations/items' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: Bearer YOUR-REST-API-KEY' \ +--data-raw '{ + "items": [ + { + "id": "1", + "context": "1", + "language": "en", + "body": "Hey" + }, + { + "id": "2", + "context": "1", + "language": "es", + "body": "Hola" + }, + { + "id": "3", + "context": "1", + "language": "pt", + "body": "Oi" + }, + { + "id": "4", + "context": "1", + "language": "de", + "body": "Hallo" + } + ] +}' +``` +{% endtab%} +{% tab CSV %} +Create a CSV in the following format: + +| id | context | language | body | +| --- | --- | --- | +| 1 | 1 | en | Hey | +| 2 | 1 | es | Hola | +| 3 | 1 | pt | Oi | +| 4 | 1 | de | Hallo | +| 5 | 2 | en | Hey | +| 6 | 2 | es | Hola | +| 7 | 2 | pt | Oi | +| 8 | 2 | de | Hallo | +| 9 | 3 | en | Hey | +| 10 | 3 | es | Hola | +| 11 | 3 | pt | Oi | +| 12 | 3 | de | Hallo | + +{% endtab %} +{% endtabs %} + +These catalog items can them be referenced using [personalization]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/catalogs/catalog/#using-catalogs-in-a-message), shown below, or [selections]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/catalogs/selections) that allow you to create groups of data. + +{% raw %} +```liquid +{% catalog_items %} translations 1 +{{items[0].body}} + +//returns “Hey” +``` +{% endraw %} + +### Option 4: Localization partners + +Many Braze partners offer localization solutions, including [Transifex]({{site.baseurl}}/partners/message_personalization/localization/transifex/#about-transifex) and [Crowdin](https://crowdin.com/). Typically users use the platform alongside an internal team and translation agency. These translations are then uploaded there and are then accessible via REST API. These services also often leverage [Connected Content]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/connected_content/), allowing users to fetch the translations via API. + +For example, the following Connected Content calls call Transifex and Crowdin to fetch a translation, leveraging {% raw %}`{{${language}}}`{% endraw %} to identify the correct translation for a given user. This translation is then saved in the JSON block "strings" and referenced. + +{% tabs local %} +{% tab Transifex example %} +{% raw %} +```liquid +{% connected_content https://www.transifex.com/api/2/project/example/resource/example/translation/{{${language}}}/strings :basic_auth semc :save strings %} +{{strings[0].translation}} +``` +{% endraw %} +{% endtab %} +{% tab Crowdin example %} +{% raw %} +```liquid +{% connected_content https://api.crowdin.com/api/project/braze-test/export-file?key=you_api_key&language={{${language}}}&file=test.json&export_translated_only=1 :save response %} +{{response.value_1}} +``` +{% endraw %} +{% endtab %} +{% endtabs %} + +### Option 5: Translations in a public Google Sheet + +Another translation option includes housing translations in Google Sheets; often, this may be handled in partnership with a translation agency. Translations housed here can be queried using Connected Content. Relevant translation for a user based on their language will then be pulled into the campaign body at the time of sending. + +{% alert note %} +The Google Sheets API has a limit of 500 requests per 100 seconds per project. Connected Content calls can be cached, but this solution is not scalable for a high-traffic campaign. +{% endalert %} + +### Option 6: Google spreadsheet into a JSON API via Sheetdb + +This option provides an alternative method of transforming Google Sheets into JSON objects queried via Connected Content. By turning a spreadsheet into a JSON API via Sheetdb, you can choose from [multiple subscription tiers](https://sheetdb.io/pricing) depending on the cadence of the API calls. + +The spreadsheet structure follows the steps in option 4, but Sheetdb also provides [additional filters](https://docs.sheetdb.io/#sheetdb-api) to query the objects. + +Some users may prefer to implement Sheetdb with fewer Liquid and Connected Block dependencies by implementing Sheetdb’s [search method](https://docs.sheetdb.io/#get-search-in-document) in GET request calls to filter the JSON objects based on {% raw %}`{{${language}}}`{% endraw %} Liquid tag to automatically return the results for a single language rather than building large conditional blocks. + +#### Step 1: Format the Google sheet + +First, build out the Google sheet so that the languages are different objects: + +| language | title1 | body1 | title2 | body2 | +| en | Hey | 1 | Hey2 | 5 | +| es | Hola | 2 | Hola2 | 6 | +| pt | Oi | 3 | Oi2 | 7 | +| de | Hallo | 4 | Hallo2 | 8 | + +#### Step 2: Use the language Liquid tag in a Connected Content call + +Next, implement the {% raw %}{{${language}}}{% endraw %} Liquid tag within a Connected Content call. Note that Sheetdb will auto-generate the `sheet_id` upon creating the spreadsheet. + +{% raw %} +```liquid +{% connected_content https://sheetdb.io/api/v1/[sheet_id]/search?language={{${language}}} :save result%} +``` +{% endraw %} + +#### Step 3: Template your messages + +Lastly, use Liquid for templating your messages: + +{% raw %} +```liquid +{{result[0].title1}} //returns “Hey” +{{result[0].title2}} //returns “Hey2” +``` +{% endraw %} + +##### Considerations + +- The {% raw %}`{{${language}}}`{% endraw %} field has to be defined for all users; otherwise, a Liquid conditional block has to be featured as a fallback handler for users without a language. +- Data modeling within Google Sheets has to follow a different language-driven vertical as opposed to having message objects. +- Sheetdb offers a limited freemium account and multiple paying options that should be considered based on your campaign Strategy. +- Connected Content calls can be cached. Braze recommends measuring the projected cadence of the API calls and investigating an alternative approach of calling the main Sheetdb endpoint instead of using the search method. -[1]: https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html -[2]: http://developer.android.com/reference/java/util/Locale.html -[7]: {% image_buster /assets/img_archive/language-filter-select.png %} -[12]: {{site.baseurl}}/user_guide/engagement_tools/campaigns/ideas_and_strategies/campaigns_in_multiple_languages/#campaigns-in-multiple-languages -[13]: {{site.baseurl}}/user_guide/engagement_tools/segments/location_targeting/#location-targeting diff --git a/_docs/_user_guide/engagement_tools/canvas/ideas_and_strategies.md b/_docs/_user_guide/engagement_tools/canvas/ideas_and_strategies.md index 38d5f8f27d2..cff4e94a01d 100644 --- a/_docs/_user_guide/engagement_tools/canvas/ideas_and_strategies.md +++ b/_docs/_user_guide/engagement_tools/canvas/ideas_and_strategies.md @@ -21,6 +21,9 @@ guide_featured_list: - name: Launching with Canvas Flow link: /docs/user_guide/engagement_tools/canvas/ideas_and_strategies/launching_canvas_flow/ fa_icon: fas fa-code-branch + - name: Localization + link: /docs/user_guide/engagement_tools/canvas/ideas_and_strategies/localization/ + fa_icon: fas fa-globe - name: Sending Test Canvases link: /docs/user_guide/engagement_tools/canvas/testing_canvases/sending_test_canvases/ fa_icon: fas fa-user-check diff --git a/_docs/_user_guide/engagement_tools/canvas/ideas_and_strategies/localization.md b/_docs/_user_guide/engagement_tools/canvas/ideas_and_strategies/localization.md new file mode 100644 index 00000000000..90141744f29 --- /dev/null +++ b/_docs/_user_guide/engagement_tools/canvas/ideas_and_strategies/localization.md @@ -0,0 +1,5 @@ +--- +nav_title: Localization +layout: redirect +redirect_to: /docs/user_guide/engagement_tools/campaigns/ideas_and_strategies/localizing_a_campaign/#internationalize-campaigns +--- diff --git a/assets/js/broken_redirect_list.js b/assets/js/broken_redirect_list.js index a129208b347..9b2a7019c99 100644 --- a/assets/js/broken_redirect_list.js +++ b/assets/js/broken_redirect_list.js @@ -696,5 +696,5 @@ validurls['/docs/most_engaged_channel/'] = '/docs/user_guide/intelligence/intell validurls['/docs/partners/channel_extensions/deep_linking/vizbee_for_tv_deep_linking/'] = '/docs/partners/message_orchestration/attribution/vizbee_for_tv_deeplinking/'; validurls['/docs/user_guide/onboarding_with_braze/email_setup/ssl/ssl_clicktracking/'] = '/docs/user_guide/onboarding_with_braze/email_setup/ssl/'; - +validurls['/docs/user_guide/engagement_tools/campaigns/ideas_and_strategies/campaigns_in_multiple_languages/'] = '/docs/user_guide/engagement_tools/campaigns/ideas_and_strategies/localizing_a_campaign/'; validurls['/docs/user_guide/engagement_tools/canvas/create_a_canvas/branching/'] = '/docs/user_guide/engagement_tools/canvas/create_a_canvas/create_a_canvas/';