diff --git a/packages/template-retail-react-app/CHANGELOG.md b/packages/template-retail-react-app/CHANGELOG.md
index b6c73222d2..3965e4c2e3 100644
--- a/packages/template-retail-react-app/CHANGELOG.md
+++ b/packages/template-retail-react-app/CHANGELOG.md
@@ -4,6 +4,7 @@
- [Bugfix] Fix error toast for no applicable shipping methods in one-click checkout [#3673](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3673)
- [Feature] Subscribe to marketing communications. Email capture component updated in footer section to use Shopper Consents API. [#3674](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3674)
- [Bugfix] Fix for custom billing address as returning shoppers in 1CC [#3693](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3693)
+- [Feature] Add translations for text in 1CC [#3703](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3703)
## v9.0.0 (Feb 12, 2026)
- [Feature] One Click Checkout (in Developer Preview) [#3552](https://github.com/SalesforceCommerceCloud/pwa-kit/pull/3552)
diff --git a/packages/template-retail-react-app/app/components/order-summary/index.jsx b/packages/template-retail-react-app/app/components/order-summary/index.jsx
index 604105a364..9c4f6bf023 100644
--- a/packages/template-retail-react-app/app/components/order-summary/index.jsx
+++ b/packages/template-retail-react-app/app/components/order-summary/index.jsx
@@ -259,7 +259,10 @@ const OrderSummary = ({
) : (
- TBD
+
)}
diff --git a/packages/template-retail-react-app/app/pages/account/partials/account-payment-form.jsx b/packages/template-retail-react-app/app/pages/account/partials/account-payment-form.jsx
index 55f4d76b06..9a3deb49dc 100644
--- a/packages/template-retail-react-app/app/pages/account/partials/account-payment-form.jsx
+++ b/packages/template-retail-react-app/app/pages/account/partials/account-payment-form.jsx
@@ -7,6 +7,7 @@
import React from 'react'
import PropTypes from 'prop-types'
+import {FormattedMessage} from 'react-intl'
import {Box, Stack} from '@salesforce/retail-react-app/app/components/shared/ui'
import CreditCardFields from '@salesforce/retail-react-app/app/components/forms/credit-card-fields'
import Field from '@salesforce/retail-react-app/app/components/field'
@@ -25,7 +26,12 @@ const AccountPaymentForm = ({form, onSubmit, children}) => {
+ }
type="checkbox"
defaultValue={false}
control={form.control}
diff --git a/packages/template-retail-react-app/app/pages/account/payments.jsx b/packages/template-retail-react-app/app/pages/account/payments.jsx
index a820fac6a4..aec0f3e68b 100644
--- a/packages/template-retail-react-app/app/pages/account/payments.jsx
+++ b/packages/template-retail-react-app/app/pages/account/payments.jsx
@@ -443,8 +443,14 @@ const AccountPayments = () => {
{payment.paymentCard?.holder}
- Expires {payment.paymentCard?.expirationMonth}/
- {payment.paymentCard?.expirationYear}
+
diff --git a/packages/template-retail-react-app/app/pages/checkout-one-click/partials/one-click-contact-info.jsx b/packages/template-retail-react-app/app/pages/checkout-one-click/partials/one-click-contact-info.jsx
index c059af760a..7de0080199 100644
--- a/packages/template-retail-react-app/app/pages/checkout-one-click/partials/one-click-contact-info.jsx
+++ b/packages/template-retail-react-app/app/pages/checkout-one-click/partials/one-click-contact-info.jsx
@@ -169,12 +169,22 @@ const ContactInfo = ({isSocialEnabled = false, idps = [], onRegisteredUserChoseG
// Validate email format
if (!email) {
- setEmailError('Please enter your email address.')
+ setEmailError(
+ formatMessage({
+ defaultMessage: 'Please enter your email address.',
+ id: 'use_login_fields.error.required_email'
+ })
+ )
return
}
if (!isValidEmail(email)) {
- setEmailError('Please enter a valid email address.')
+ setEmailError(
+ formatMessage({
+ defaultMessage: 'Please enter a valid email address.',
+ id: 'use_login_fields.error.invalid_email'
+ })
+ )
return
}
@@ -424,13 +434,23 @@ const ContactInfo = ({isSocialEnabled = false, idps = [], onRegisteredUserChoseG
// Validate email before proceeding
if (!formData.email) {
- setError('Please enter your email address.')
+ setError(
+ formatMessage({
+ defaultMessage: 'Please enter your email address.',
+ id: 'use_login_fields.error.required_email'
+ })
+ )
setIsSubmitting(false) // Reset submitting state on validation error
return
}
if (!isValidEmail(formData.email)) {
- setError('Please enter a valid email address.')
+ setError(
+ formatMessage({
+ defaultMessage: 'Please enter a valid email address.',
+ id: 'use_login_fields.error.invalid_email'
+ })
+ )
setIsSubmitting(false) // Reset submitting state on validation error
return
}
@@ -502,7 +522,12 @@ const ContactInfo = ({isSocialEnabled = false, idps = [], onRegisteredUserChoseG
return
} catch (error) {
- setError('An error occurred. Please try again.')
+ setError(
+ formatMessage({
+ defaultMessage: 'An error occurred. Please try again.',
+ id: 'contact_info.error.generic_try_again'
+ })
+ )
// Show continue button again if there's an error
setShowContinueButton(true)
setIsSubmitting(false)
@@ -511,7 +536,12 @@ const ContactInfo = ({isSocialEnabled = false, idps = [], onRegisteredUserChoseG
}
// If user is registered, OTP modal should be open, don't proceed to next step
} catch (error) {
- setError('An error occurred. Please try again.')
+ setError(
+ formatMessage({
+ defaultMessage: 'An error occurred. Please try again.',
+ id: 'contact_info.error.generic_try_again'
+ })
+ )
} finally {
// Only reset submitting state for registered users (when OTP modal is open)
// Guest users will have already returned above
diff --git a/packages/template-retail-react-app/app/static/translations/compiled/en-GB.json b/packages/template-retail-react-app/app/static/translations/compiled/en-GB.json
index 946c3c66ef..395573fa04 100644
--- a/packages/template-retail-react-app/app/static/translations/compiled/en-GB.json
+++ b/packages/template-retail-react-app/app/static/translations/compiled/en-GB.json
@@ -32,7 +32,7 @@
"account.payments.checkbox.make_default": [
{
"type": 0,
- "value": "Make default"
+ "value": "Set as default"
}
],
"account.payments.error.payment_method_remove_failed": [
@@ -77,6 +77,24 @@
"value": "New payment method was saved."
}
],
+ "account.payments.label.expires": [
+ {
+ "type": 0,
+ "value": "Expires "
+ },
+ {
+ "type": 1,
+ "value": "month"
+ },
+ {
+ "type": 0,
+ "value": "/"
+ },
+ {
+ "type": 1,
+ "value": "year"
+ }
+ ],
"account.payments.message.error": [
{
"type": 0,
@@ -1571,6 +1589,12 @@
"value": "Secure Link"
}
],
+ "contact_info.error.generic_try_again": [
+ {
+ "type": 0,
+ "value": "An error occurred. Please try again."
+ }
+ ],
"contact_info.error.incorrect_username_or_password": [
{
"type": 0,
@@ -3119,6 +3143,12 @@
"value": "Tax"
}
],
+ "order_summary.label.tax_tbd": [
+ {
+ "type": 0,
+ "value": "TBD"
+ }
+ ],
"otp.button.cancel_guest_registration": [
{
"type": 0,
@@ -5021,6 +5051,12 @@
"value": "Security Code"
}
],
+ "use_login_fields.error.invalid_email": [
+ {
+ "type": 0,
+ "value": "Please enter a valid email address."
+ }
+ ],
"use_login_fields.error.required_email": [
{
"type": 0,
diff --git a/packages/template-retail-react-app/app/static/translations/compiled/en-US.json b/packages/template-retail-react-app/app/static/translations/compiled/en-US.json
index 946c3c66ef..395573fa04 100644
--- a/packages/template-retail-react-app/app/static/translations/compiled/en-US.json
+++ b/packages/template-retail-react-app/app/static/translations/compiled/en-US.json
@@ -32,7 +32,7 @@
"account.payments.checkbox.make_default": [
{
"type": 0,
- "value": "Make default"
+ "value": "Set as default"
}
],
"account.payments.error.payment_method_remove_failed": [
@@ -77,6 +77,24 @@
"value": "New payment method was saved."
}
],
+ "account.payments.label.expires": [
+ {
+ "type": 0,
+ "value": "Expires "
+ },
+ {
+ "type": 1,
+ "value": "month"
+ },
+ {
+ "type": 0,
+ "value": "/"
+ },
+ {
+ "type": 1,
+ "value": "year"
+ }
+ ],
"account.payments.message.error": [
{
"type": 0,
@@ -1571,6 +1589,12 @@
"value": "Secure Link"
}
],
+ "contact_info.error.generic_try_again": [
+ {
+ "type": 0,
+ "value": "An error occurred. Please try again."
+ }
+ ],
"contact_info.error.incorrect_username_or_password": [
{
"type": 0,
@@ -3119,6 +3143,12 @@
"value": "Tax"
}
],
+ "order_summary.label.tax_tbd": [
+ {
+ "type": 0,
+ "value": "TBD"
+ }
+ ],
"otp.button.cancel_guest_registration": [
{
"type": 0,
@@ -5021,6 +5051,12 @@
"value": "Security Code"
}
],
+ "use_login_fields.error.invalid_email": [
+ {
+ "type": 0,
+ "value": "Please enter a valid email address."
+ }
+ ],
"use_login_fields.error.required_email": [
{
"type": 0,
diff --git a/packages/template-retail-react-app/app/static/translations/compiled/en-XA.json b/packages/template-retail-react-app/app/static/translations/compiled/en-XA.json
index 9f176df0ab..434f3b6966 100644
--- a/packages/template-retail-react-app/app/static/translations/compiled/en-XA.json
+++ b/packages/template-retail-react-app/app/static/translations/compiled/en-XA.json
@@ -76,7 +76,7 @@
},
{
"type": 0,
- "value": "Ḿȧȧķḗḗ ḓḗḗƒȧȧŭŭŀŧ"
+ "value": "Şḗḗŧ ȧȧş ḓḗḗƒȧȧŭŭŀŧ"
},
{
"type": 0,
@@ -181,6 +181,32 @@
"value": "]"
}
],
+ "account.payments.label.expires": [
+ {
+ "type": 0,
+ "value": "["
+ },
+ {
+ "type": 0,
+ "value": "Ḗẋƥīřḗḗş "
+ },
+ {
+ "type": 1,
+ "value": "month"
+ },
+ {
+ "type": 0,
+ "value": "/"
+ },
+ {
+ "type": 1,
+ "value": "year"
+ },
+ {
+ "type": 0,
+ "value": "]"
+ }
+ ],
"account.payments.message.error": [
{
"type": 0,
@@ -3203,6 +3229,20 @@
"value": "]"
}
],
+ "contact_info.error.generic_try_again": [
+ {
+ "type": 0,
+ "value": "["
+ },
+ {
+ "type": 0,
+ "value": "Ȧƞ ḗḗřřǿǿř ǿǿƈƈŭŭřřḗḗḓ. Ƥŀḗḗȧȧşḗḗ ŧřẏ ȧȧɠȧȧīƞ."
+ },
+ {
+ "type": 0,
+ "value": "]"
+ }
+ ],
"contact_info.error.incorrect_username_or_password": [
{
"type": 0,
@@ -6567,6 +6607,20 @@
"value": "]"
}
],
+ "order_summary.label.tax_tbd": [
+ {
+ "type": 0,
+ "value": "["
+ },
+ {
+ "type": 0,
+ "value": "ŦƁḒ"
+ },
+ {
+ "type": 0,
+ "value": "]"
+ }
+ ],
"otp.button.cancel_guest_registration": [
{
"type": 0,
@@ -10597,6 +10651,20 @@
"value": "]"
}
],
+ "use_login_fields.error.invalid_email": [
+ {
+ "type": 0,
+ "value": "["
+ },
+ {
+ "type": 0,
+ "value": "Ƥŀḗḗȧȧşḗḗ ḗḗƞŧḗḗř ȧȧ ṽȧȧŀīḓ ḗḗḿȧȧīŀ ȧȧḓḓřḗḗşş."
+ },
+ {
+ "type": 0,
+ "value": "]"
+ }
+ ],
"use_login_fields.error.required_email": [
{
"type": 0,
diff --git a/packages/template-retail-react-app/translations/en-GB.json b/packages/template-retail-react-app/translations/en-GB.json
index aa9ea688b8..b6d7a94ecf 100644
--- a/packages/template-retail-react-app/translations/en-GB.json
+++ b/packages/template-retail-react-app/translations/en-GB.json
@@ -15,7 +15,7 @@
"defaultMessage": "Default"
},
"account.payments.checkbox.make_default": {
- "defaultMessage": "Make default"
+ "defaultMessage": "Set as default"
},
"account.payments.error.payment_method_remove_failed": {
"defaultMessage": "We couldn't remove the payment method. Try again."
@@ -38,6 +38,9 @@
"account.payments.info.payment_method_saved": {
"defaultMessage": "New payment method was saved."
},
+ "account.payments.label.expires": {
+ "defaultMessage": "Expires {month}/{year}"
+ },
"account.payments.message.error": {
"defaultMessage": "We couldn't load the payment methods. Try again."
},
@@ -613,6 +616,9 @@
"contact_info.button.secure_link": {
"defaultMessage": "Secure Link"
},
+ "contact_info.error.generic_try_again": {
+ "defaultMessage": "An error occurred. Please try again."
+ },
"contact_info.error.incorrect_username_or_password": {
"defaultMessage": "Incorrect username or password, please try again."
},
@@ -1300,6 +1306,9 @@
"order_summary.label.tax": {
"defaultMessage": "Tax"
},
+ "order_summary.label.tax_tbd": {
+ "defaultMessage": "TBD"
+ },
"otp.button.cancel_guest_registration": {
"defaultMessage": "Cancel"
},
@@ -2107,6 +2116,9 @@
"use_credit_card_fields.label.security_code": {
"defaultMessage": "Security Code"
},
+ "use_login_fields.error.invalid_email": {
+ "defaultMessage": "Please enter a valid email address."
+ },
"use_login_fields.error.required_email": {
"defaultMessage": "Please enter your email address."
},
diff --git a/packages/template-retail-react-app/translations/en-US.json b/packages/template-retail-react-app/translations/en-US.json
index aa9ea688b8..b6d7a94ecf 100644
--- a/packages/template-retail-react-app/translations/en-US.json
+++ b/packages/template-retail-react-app/translations/en-US.json
@@ -15,7 +15,7 @@
"defaultMessage": "Default"
},
"account.payments.checkbox.make_default": {
- "defaultMessage": "Make default"
+ "defaultMessage": "Set as default"
},
"account.payments.error.payment_method_remove_failed": {
"defaultMessage": "We couldn't remove the payment method. Try again."
@@ -38,6 +38,9 @@
"account.payments.info.payment_method_saved": {
"defaultMessage": "New payment method was saved."
},
+ "account.payments.label.expires": {
+ "defaultMessage": "Expires {month}/{year}"
+ },
"account.payments.message.error": {
"defaultMessage": "We couldn't load the payment methods. Try again."
},
@@ -613,6 +616,9 @@
"contact_info.button.secure_link": {
"defaultMessage": "Secure Link"
},
+ "contact_info.error.generic_try_again": {
+ "defaultMessage": "An error occurred. Please try again."
+ },
"contact_info.error.incorrect_username_or_password": {
"defaultMessage": "Incorrect username or password, please try again."
},
@@ -1300,6 +1306,9 @@
"order_summary.label.tax": {
"defaultMessage": "Tax"
},
+ "order_summary.label.tax_tbd": {
+ "defaultMessage": "TBD"
+ },
"otp.button.cancel_guest_registration": {
"defaultMessage": "Cancel"
},
@@ -2107,6 +2116,9 @@
"use_credit_card_fields.label.security_code": {
"defaultMessage": "Security Code"
},
+ "use_login_fields.error.invalid_email": {
+ "defaultMessage": "Please enter a valid email address."
+ },
"use_login_fields.error.required_email": {
"defaultMessage": "Please enter your email address."
},