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." },