Customize bundle widget text using translation overrides
Customize the text displayed in the Bundles Widget 2.0 by adding translation overrides in your storefront theme. This allows you to modify shopper-facing content, such as add-to-cart buttons, section titles, helper messages, validation text, and other interface labels, without editing the widget code.
This guide explains how to customize shopper-facing text in the Bundles Widget 2.0 using translation overrides in your storefront theme.
Before you start
This article applies to the Bundles Widget 2.0. See Customizing legacy Bundles widget layouts if you use the one-page and multi-step bundle layouts.
Requirements
Before proceeding, make sure you have:
- Access to your Shopify storefront theme
- The ability to add JavaScript using a Custom Liquid section
If you haven’t set this up yet, follow:Custom CSS + JS via Custom Liquid section.
How it works
When the widget loads, it uses default translation values.
If you provide your own values using customTranslations, your values replace the defaults for matching keys.
- If you override a key → your text is shown
- If you do not override a key → the default text is shown
You only need to override the keys you want to change.
What you can customize
You can override most shopper-facing text, including:
- Button labels
- Bundle summary labels
- Cross-sell headings
- Validation and helper messages
- Filter labels
- Frequency and delivery messaging
- Accessibility labels (ARIA text)
Required format
Your custom translations must use this structure:
{
[locale]: {
[translation_key]: "custom value"
}
}Example locale codes
en— Englishes— Spanishfr— French
Update Custom Liquid section in your theme files
Add the following code inside your Custom Liquid section, before the widget script initializes:
<script>
window.StorefrontBundlingWidget = window.StorefrontBundlingWidget || {};
window.StorefrontBundlingWidget.customTranslations = {
en: {
general_add_to_cart: 'Add now',
cross_sells_title: 'Treat yourself: add extras',
bundle_summary_label: 'Your bundle summary',
},
es: {
general_add_to_cart: 'Agregar',
},
};
</script>Available translation keys
Below is the full list of supported translation keys and their default values.
General & frequency
| Key | Default value |
|---|---|
frequency_one_time | One time only |
general_frequency | Frequency |
general_increment | Increment |
general_decrement | Decrement |
general_quantity | Qty: {quantity} |
general_bundle_contents | Contents |
general_remove_product_one | Remove {count} product |
general_remove_product_other | Remove {count} products |
general_add_to_cart_price | Add to cart: |
general_add_to_cart | Add to cart |
Selection status
| Key | Default value |
|---|---|
status_choose | Choose {count} |
status_choose_at_least | Choose at least {count} |
status_add_range | Choose {min} - {max} |
Product & collection selection
| Key | Default value |
|---|---|
box_content_add | Add |
box_content_collection_status_choose | Choose {count} |
box_content_collection_choose_range | Choose {min} - {max} |
box_content_collection_choose_up_to | Choose up to {count} |
box_content_collection_choose_at_least | Choose at least {count} |
Bundle summary
| Key | Default value |
|---|---|
bundle_summary_selected_one | {count} item selected |
bundle_summary_selected_other | {count} items selected |
bundle_summary_remove_product | Remove {title} |
bundle_summary_product_slot | Product slot |
bundle_summary_label | Bundle summary |
Pricing
| Key | Default value |
|---|---|
general_price_one | { price } |
general_price_other | <s>{ compareAtPrice }</s> { price } |
general_price_original | Original price {price} |
general_price_actual | Actual price {price} |
Learn more modal (accessibility)
| Key | Default value |
|---|---|
learn_more_modal_image_title | {title}, image {index} of {total} |
learn_more_modal_previous_image_button_label | Previous image, {index} of {total} |
learn_more_modal_next_image_button_label | Next image, {index} of {total} |
learn_more_modal_image_thumbnails_label | {title} thumbnails |
learn_more_modal_image_thumbnail_label | View image {index} of {total} |
learn_more_modal_image_thumbnail_image_alt | {title}, image {index} |
Availability & ARIA labels
| Key | Default value |
|---|---|
general_sold_out | Sold out |
product_variant_sold_out | {title} (Sold out) |
product_grid_aria_label | Products in {title} |
product_grid_item_aria_label | Product {index} of {total}: {title} |
Units & delivery frequency
| Key | Default value |
|---|---|
general_unit_day_one | day |
general_unit_day_other | days |
general_unit_week_one | week |
general_unit_week_other | weeks |
general_unit_month_one | month |
general_unit_month_other | months |
general_bundle_frequency_every | You’ll get this bundle every { interval } { unit }. |
general_bundle_frequency_one_time | You’ll get this bundle only once. |
general_delivery_every_one | Every { unit } |
general_delivery_every_other | Every { interval } { unit } |
general_delivery_every_discount_one | Every { unit }: save { discount } |
general_delivery_every_discount_other | Every { interval } { unit }: save { discount } |
Panel titles & errors
| Key | Default value |
|---|---|
frequency_panel_title | How often would you like to receive Bundle name? |
product_variant_panel_title | Which option would you like for {title}? |
splash_screen_title | We couldn’t load your bundle |
splash_screen_description | Try refreshing the page, or come back later. |
Tiered discounts
| Key | Default value |
|---|---|
tiered_discount_label | Save {discount} |
tiered_discount_description | Add {count} more to save {discount}! |
tiered_discount_description_last | You're saving {discount}! |
Cross-sells
| Key | Default value |
|---|---|
cross_sells_title | Treat yourself: add some extras to your bundle |
cross_sells_collection_title | One-time extras |
cross_sells_collection_description | Get these with your next order. |
cross_sells_summary_title_one | {count} extra selected |
cross_sells_summary_title_other | {count} extras selected |
cross_sells_summary_already_in_cart_title | Already in your cart: |
cross_sells_summary_add_to_cart_price | Add extras to cart: <price/> |
cross_sells_summary_continue | Continue |
Selection validation errors
| Key | Default value |
|---|---|
selection_validation_add_error_one | Choose at least {count} item to continue: |
selection_validation_add_error_other | Choose at least {count} items to continue: |
selection_validation_remove_error_one | Remove {count} item to continue: |
selection_validation_remove_error_other | Remove {count} items to continue: |
selection_validation_collection_add_error_one | Choose at least {count} item from {collection_title} |
selection_validation_collection_add_error_other | Choose at least {count}items from {collection_title} |
selection_validation_collection_remove_error_one | Remove at least {count} item from {collection_title} |
selection_validation_collection_remove_error_other | Remove at least {count} items from {collection_title} |
Filters
| Key | Default value |
|---|---|
filters_button_label | Filter |
filters_title | Filter products |
filters_clear_all | Clear all |
filters_apply | Apply |
Important tips
- Add
customTranslationsbefore the widget loads. - Keep placeholders exactly as written (examples:
{count},{price},{title},<price/>). - Use string values only.
- Start small: override 1–3 keys, test, then add more.
Checklist for rolling out bundle widget text changes
Use this checklist to safely roll out text updates to your storefront:
- Identify the exact text you want to update.
- Document the corresponding translation keys and your new values.
- Share the finalized key/value changes with your developer or agency.
- Implement the updates in a staging or unpublished theme first.
- Review the widget in your storefront and confirm all text appears as expected.
- Publish the updated theme to production once verified.
Troubleshooting
I changed the text, but nothing updated
- Make sure your translation script loads before the widget script.
- Double-check that the key names match exactly (including underscores).
- Confirm you are editing the correct locale (
en,es, etc.).
Some text updated, but some did not
- Check for typos in the translation keys.
- Make sure the keys you’re trying to override are included in your script.
- Confirm all values are wrapped in quotation marks (strings).
The text looks broken or formatted incorrectly
- Make sure placeholders were not changed (for example:
{count},{price},{title},<price/>). - Check for missing quotation marks or extra commas.
- Validate that your script syntax is correct.
Updated about 9 hours ago
