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.

📘

Platform

  • Shopify Checkout Integration
  • Migrated Shopify Checkout Integration

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 — English
  • es — Spanish
  • fr — 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

KeyDefault value
frequency_one_timeOne time only
general_frequencyFrequency
general_incrementIncrement
general_decrementDecrement
general_quantityQty: {quantity}
general_bundle_contentsContents
general_remove_product_oneRemove {count} product
general_remove_product_otherRemove {count} products
general_add_to_cart_priceAdd to cart:
general_add_to_cartAdd to cart

Selection status

KeyDefault value
status_chooseChoose {count}
status_choose_at_leastChoose at least {count}
status_add_rangeChoose {min} - {max}

Product & collection selection

KeyDefault value
box_content_addAdd
box_content_collection_status_chooseChoose {count}
box_content_collection_choose_rangeChoose {min} - {max}
box_content_collection_choose_up_toChoose up to {count}
box_content_collection_choose_at_leastChoose at least {count}

Bundle summary

KeyDefault value
bundle_summary_selected_one{count} item selected
bundle_summary_selected_other{count} items selected
bundle_summary_remove_productRemove {title}
bundle_summary_product_slotProduct slot
bundle_summary_labelBundle summary

Pricing

KeyDefault value
general_price_one{ price }
general_price_other<s>{ compareAtPrice }</s> { price }
general_price_originalOriginal price {price}
general_price_actualActual price {price}

Learn more modal (accessibility)

KeyDefault value
learn_more_modal_image_title{title}, image {index} of {total}
learn_more_modal_previous_image_button_labelPrevious image, {index} of {total}
learn_more_modal_next_image_button_labelNext image, {index} of {total}
learn_more_modal_image_thumbnails_label{title} thumbnails
learn_more_modal_image_thumbnail_labelView image {index} of {total}
learn_more_modal_image_thumbnail_image_alt{title}, image {index}

Availability & ARIA labels

KeyDefault value
general_sold_outSold out
product_variant_sold_out{title} (Sold out)
product_grid_aria_labelProducts in {title}
product_grid_item_aria_labelProduct {index} of {total}: {title}

Units & delivery frequency

KeyDefault value
general_unit_day_oneday
general_unit_day_otherdays
general_unit_week_oneweek
general_unit_week_otherweeks
general_unit_month_onemonth
general_unit_month_othermonths
general_bundle_frequency_everyYou’ll get this bundle every { interval } { unit }.
general_bundle_frequency_one_timeYou’ll get this bundle only once.
general_delivery_every_oneEvery { unit }
general_delivery_every_otherEvery { interval } { unit }
general_delivery_every_discount_oneEvery { unit }: save { discount }
general_delivery_every_discount_otherEvery { interval } { unit }: save { discount }

Panel titles & errors

KeyDefault value
frequency_panel_titleHow often would you like to receive Bundle name?
product_variant_panel_titleWhich option would you like for {title}?
splash_screen_titleWe couldn’t load your bundle
splash_screen_descriptionTry refreshing the page, or come back later.

Tiered discounts

KeyDefault value
tiered_discount_labelSave {discount}
tiered_discount_descriptionAdd {count} more to save {discount}!
tiered_discount_description_lastYou're saving {discount}!

Cross-sells

KeyDefault value
cross_sells_titleTreat yourself: add some extras to your bundle
cross_sells_collection_titleOne-time extras
cross_sells_collection_descriptionGet 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_titleAlready in your cart:
cross_sells_summary_add_to_cart_priceAdd extras to cart: <price/>
cross_sells_summary_continueContinue

Selection validation errors

KeyDefault value
selection_validation_add_error_oneChoose at least {count} item to continue:
selection_validation_add_error_otherChoose at least {count} items to continue:
selection_validation_remove_error_oneRemove {count} item to continue:
selection_validation_remove_error_otherRemove {count} items to continue:
selection_validation_collection_add_error_oneChoose at least {count} item from {collection_title}
selection_validation_collection_add_error_otherChoose at least {count}items from {collection_title}
selection_validation_collection_remove_error_oneRemove at least {count} item from {collection_title}
selection_validation_collection_remove_error_otherRemove at least {count} items from {collection_title}

Filters

KeyDefault value
filters_button_labelFilter
filters_titleFilter products
filters_clear_allClear all
filters_applyApply

Important tips

  • Add customTranslations before 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:

  1. Identify the exact text you want to update.
  2. Document the corresponding translation keys and your new values.
  3. Share the finalized key/value changes with your developer or agency.
  4. Implement the updates in a staging or unpublished theme first.
  5. Review the widget in your storefront and confirm all text appears as expected.
  6. 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.