From b024c4e2db274b052dfa20026dde224351f7fe96 Mon Sep 17 00:00:00 2001 From: bc-svc-local <102379007+bc-svc-local@users.noreply.github.com> Date: Wed, 14 May 2025 20:02:52 +0300 Subject: [PATCH 01/86] Update translations (#2301) * feat(other): LOCAL-1444 delivery translation * chore(core): create translations patch --------- Co-authored-by: bc-svc-local --- .changeset/translations-patch-19317e2a.md | 5 +++++ core/messages/da.json | 21 +++++++++++---------- core/messages/de.json | 21 +++++++++++---------- core/messages/es-419.json | 21 +++++++++++---------- core/messages/es-AR.json | 21 +++++++++++---------- core/messages/es-CL.json | 21 +++++++++++---------- core/messages/es-CO.json | 21 +++++++++++---------- core/messages/es-LA.json | 21 +++++++++++---------- core/messages/es-MX.json | 21 +++++++++++---------- core/messages/es-PE.json | 21 +++++++++++---------- core/messages/es.json | 21 +++++++++++---------- core/messages/fr.json | 21 +++++++++++---------- core/messages/it.json | 21 +++++++++++---------- core/messages/ja.json | 21 +++++++++++---------- core/messages/nl.json | 21 +++++++++++---------- core/messages/no.json | 21 +++++++++++---------- core/messages/pl.json | 21 +++++++++++---------- core/messages/pt-BR.json | 21 +++++++++++---------- core/messages/pt.json | 21 +++++++++++---------- core/messages/sv.json | 21 +++++++++++---------- 20 files changed, 214 insertions(+), 190 deletions(-) create mode 100644 .changeset/translations-patch-19317e2a.md diff --git a/.changeset/translations-patch-19317e2a.md b/.changeset/translations-patch-19317e2a.md new file mode 100644 index 0000000000..ad17b2636a --- /dev/null +++ b/.changeset/translations-patch-19317e2a.md @@ -0,0 +1,5 @@ +--- +"@bigcommerce/catalyst-core": patch +--- + +Update translations. diff --git a/core/messages/da.json b/core/messages/da.json index 3eacc910d9..3ac6ea0116 100644 --- a/core/messages/da.json +++ b/core/messages/da.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destination {number, number}/{total, number}", "subtotal": "Subtotal", "shipping": "Forsendelse", - "tax": "Moms" + "tax": "Moms", + "orderSummary": "Ordreoversigt" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Din ønskeliste kunne ikke opdateres. Prøv igen.", "deleteFailed": "Din ønskeliste kunne ikke slettes. Prøv igen.", "removeProductFailed": "Produktet kunne ikke fjernes fra din ønskeliste. Prøv igen.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Du er ikke autoriseret til at udføre denne handling. Log ind, og prøv igen.", + "unexpected": "Der opstod en uventet fejl. Prøv igen." }, "Result": { "createSuccess": "Ønskelisten er oprettet.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Varen er blevet fjernet fra din ønskeliste." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Føj til ny ønskeliste", + "defaultWishlistName": "Min ønskeliste", + "addSuccessMessage": "Produktet er blevet føjet til din ønskeliste", + "removeSuccessMessage": "Produktet er blevet fjernet fra din ønskeliste", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Produktet kunne ikke føjes til din ønskeliste. Prøv igen.", + "removeProductFailed": "Produktet kunne ikke fjernes fra din ønskeliste. Prøv igen." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Vi kunne ikke finde den side.", - "subtitle": "Det ser ud til, at den side, du anmodede om, er flyttet eller ikke længere eksisterer. ", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Udvalgte produkter" }, "Components": { diff --git a/core/messages/de.json b/core/messages/de.json index 3fe08bea85..45df22055b 100644 --- a/core/messages/de.json +++ b/core/messages/de.json @@ -155,7 +155,8 @@ "destinationWithCount": "Zielort {Nummer, Nummer}/{Gesamt, Nummer}", "subtotal": "Zwischensumme", "shipping": "Versand", - "tax": "Steuern" + "tax": "Steuern", + "orderSummary": "Bestellübersicht" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Die Aktualisierung Ihrer Wunschliste ist fehlgeschlagen. Bitte versuchen Sie es erneut.", "deleteFailed": "Das Löschen Ihrer Wunschliste konnte nicht durchgeführt werden. Bitte versuchen Sie es erneut.", "removeProductFailed": "Das Produkt konnte nicht von Ihrer Wunschliste entfernt werden. Bitte versuchen Sie es erneut.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Sie sind nicht berechtigt, diese Aktion auszuführen, bitte melden Sie sich an und versuchen Sie es erneut.", + "unexpected": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut." }, "Result": { "createSuccess": "Die Wunschliste wurde erfolgreich erstellt.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Der Artikel wurde von Ihrer Wunschliste entfernt." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Zu neuer Wunschliste hinzufügen", + "defaultWishlistName": "Meine Wunschliste", + "addSuccessMessage": "Das Produkt wurde Ihrer Wunschliste hinzugefügt.", + "removeSuccessMessage": "Das Produkt wurde von Ihrer Wunschliste entfernt", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Das Produkt konnte nicht zu Ihrer Wunschliste hinzugefügt werden. Bitte versuchen Sie es erneut.", + "removeProductFailed": "Das Produkt konnte nicht von Ihrer Wunschliste entfernt werden, bitte versuchen Sie es erneut." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Wir konnten diese Seite nicht finden!", - "subtitle": "Es sieht so aus, als ob die von Ihnen angeforderte Seite verschoben wurde oder nicht mehr existiert.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Empfohlene Produkte" }, "Components": { diff --git a/core/messages/es-419.json b/core/messages/es-419.json index 15e823cd20..687a9697a9 100644 --- a/core/messages/es-419.json +++ b/core/messages/es-419.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envío", - "tax": "Impuesto" + "tax": "Impuesto", + "orderSummary": "Resumen del pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "No se pudo actualizar tu lista de deseos. Vuelve a intentarlo.", "deleteFailed": "No se pudo eliminar tu lista de deseos. Vuelve a intentarlo.", "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos. Vuelve a intentarlo.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "No tienes autorización para realizar esta acción. Inicia sesión e inténtalo de nuevo.", + "unexpected": "Se produjo un error inesperado, inténtalo de nuevo" }, "Result": { "createSuccess": "La lista de deseos se creó correctamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Se eliminó el artículo de tu lista de deseos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Agregar a una nueva lista de deseos", + "defaultWishlistName": "Mi lista de deseos", + "addSuccessMessage": "El producto se ha agregado a tu lista de deseos.", + "removeSuccessMessage": "El producto se ha eliminado de tu lista de deseos.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "No se pudo agregar el producto de tu lista de deseos, inténtalo de nuevo", + "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos, inténtalo de nuevo" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Lo sentimos, pero parece que la página solicitada cambió de lugar o ya no existe.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-AR.json b/core/messages/es-AR.json index 15e823cd20..687a9697a9 100644 --- a/core/messages/es-AR.json +++ b/core/messages/es-AR.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envío", - "tax": "Impuesto" + "tax": "Impuesto", + "orderSummary": "Resumen del pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "No se pudo actualizar tu lista de deseos. Vuelve a intentarlo.", "deleteFailed": "No se pudo eliminar tu lista de deseos. Vuelve a intentarlo.", "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos. Vuelve a intentarlo.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "No tienes autorización para realizar esta acción. Inicia sesión e inténtalo de nuevo.", + "unexpected": "Se produjo un error inesperado, inténtalo de nuevo" }, "Result": { "createSuccess": "La lista de deseos se creó correctamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Se eliminó el artículo de tu lista de deseos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Agregar a una nueva lista de deseos", + "defaultWishlistName": "Mi lista de deseos", + "addSuccessMessage": "El producto se ha agregado a tu lista de deseos.", + "removeSuccessMessage": "El producto se ha eliminado de tu lista de deseos.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "No se pudo agregar el producto de tu lista de deseos, inténtalo de nuevo", + "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos, inténtalo de nuevo" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Lo sentimos, pero parece que la página solicitada cambió de lugar o ya no existe.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-CL.json b/core/messages/es-CL.json index 15e823cd20..687a9697a9 100644 --- a/core/messages/es-CL.json +++ b/core/messages/es-CL.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envío", - "tax": "Impuesto" + "tax": "Impuesto", + "orderSummary": "Resumen del pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "No se pudo actualizar tu lista de deseos. Vuelve a intentarlo.", "deleteFailed": "No se pudo eliminar tu lista de deseos. Vuelve a intentarlo.", "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos. Vuelve a intentarlo.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "No tienes autorización para realizar esta acción. Inicia sesión e inténtalo de nuevo.", + "unexpected": "Se produjo un error inesperado, inténtalo de nuevo" }, "Result": { "createSuccess": "La lista de deseos se creó correctamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Se eliminó el artículo de tu lista de deseos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Agregar a una nueva lista de deseos", + "defaultWishlistName": "Mi lista de deseos", + "addSuccessMessage": "El producto se ha agregado a tu lista de deseos.", + "removeSuccessMessage": "El producto se ha eliminado de tu lista de deseos.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "No se pudo agregar el producto de tu lista de deseos, inténtalo de nuevo", + "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos, inténtalo de nuevo" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Lo sentimos, pero parece que la página solicitada cambió de lugar o ya no existe.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-CO.json b/core/messages/es-CO.json index 15e823cd20..687a9697a9 100644 --- a/core/messages/es-CO.json +++ b/core/messages/es-CO.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envío", - "tax": "Impuesto" + "tax": "Impuesto", + "orderSummary": "Resumen del pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "No se pudo actualizar tu lista de deseos. Vuelve a intentarlo.", "deleteFailed": "No se pudo eliminar tu lista de deseos. Vuelve a intentarlo.", "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos. Vuelve a intentarlo.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "No tienes autorización para realizar esta acción. Inicia sesión e inténtalo de nuevo.", + "unexpected": "Se produjo un error inesperado, inténtalo de nuevo" }, "Result": { "createSuccess": "La lista de deseos se creó correctamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Se eliminó el artículo de tu lista de deseos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Agregar a una nueva lista de deseos", + "defaultWishlistName": "Mi lista de deseos", + "addSuccessMessage": "El producto se ha agregado a tu lista de deseos.", + "removeSuccessMessage": "El producto se ha eliminado de tu lista de deseos.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "No se pudo agregar el producto de tu lista de deseos, inténtalo de nuevo", + "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos, inténtalo de nuevo" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Lo sentimos, pero parece que la página solicitada cambió de lugar o ya no existe.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-LA.json b/core/messages/es-LA.json index 15e823cd20..687a9697a9 100644 --- a/core/messages/es-LA.json +++ b/core/messages/es-LA.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envío", - "tax": "Impuesto" + "tax": "Impuesto", + "orderSummary": "Resumen del pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "No se pudo actualizar tu lista de deseos. Vuelve a intentarlo.", "deleteFailed": "No se pudo eliminar tu lista de deseos. Vuelve a intentarlo.", "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos. Vuelve a intentarlo.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "No tienes autorización para realizar esta acción. Inicia sesión e inténtalo de nuevo.", + "unexpected": "Se produjo un error inesperado, inténtalo de nuevo" }, "Result": { "createSuccess": "La lista de deseos se creó correctamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Se eliminó el artículo de tu lista de deseos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Agregar a una nueva lista de deseos", + "defaultWishlistName": "Mi lista de deseos", + "addSuccessMessage": "El producto se ha agregado a tu lista de deseos.", + "removeSuccessMessage": "El producto se ha eliminado de tu lista de deseos.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "No se pudo agregar el producto de tu lista de deseos, inténtalo de nuevo", + "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos, inténtalo de nuevo" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Lo sentimos, pero parece que la página solicitada cambió de lugar o ya no existe.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-MX.json b/core/messages/es-MX.json index 15e823cd20..687a9697a9 100644 --- a/core/messages/es-MX.json +++ b/core/messages/es-MX.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envío", - "tax": "Impuesto" + "tax": "Impuesto", + "orderSummary": "Resumen del pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "No se pudo actualizar tu lista de deseos. Vuelve a intentarlo.", "deleteFailed": "No se pudo eliminar tu lista de deseos. Vuelve a intentarlo.", "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos. Vuelve a intentarlo.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "No tienes autorización para realizar esta acción. Inicia sesión e inténtalo de nuevo.", + "unexpected": "Se produjo un error inesperado, inténtalo de nuevo" }, "Result": { "createSuccess": "La lista de deseos se creó correctamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Se eliminó el artículo de tu lista de deseos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Agregar a una nueva lista de deseos", + "defaultWishlistName": "Mi lista de deseos", + "addSuccessMessage": "El producto se ha agregado a tu lista de deseos.", + "removeSuccessMessage": "El producto se ha eliminado de tu lista de deseos.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "No se pudo agregar el producto de tu lista de deseos, inténtalo de nuevo", + "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos, inténtalo de nuevo" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Lo sentimos, pero parece que la página solicitada cambió de lugar o ya no existe.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-PE.json b/core/messages/es-PE.json index 15e823cd20..687a9697a9 100644 --- a/core/messages/es-PE.json +++ b/core/messages/es-PE.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envío", - "tax": "Impuesto" + "tax": "Impuesto", + "orderSummary": "Resumen del pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "No se pudo actualizar tu lista de deseos. Vuelve a intentarlo.", "deleteFailed": "No se pudo eliminar tu lista de deseos. Vuelve a intentarlo.", "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos. Vuelve a intentarlo.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "No tienes autorización para realizar esta acción. Inicia sesión e inténtalo de nuevo.", + "unexpected": "Se produjo un error inesperado, inténtalo de nuevo" }, "Result": { "createSuccess": "La lista de deseos se creó correctamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Se eliminó el artículo de tu lista de deseos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Agregar a una nueva lista de deseos", + "defaultWishlistName": "Mi lista de deseos", + "addSuccessMessage": "El producto se ha agregado a tu lista de deseos.", + "removeSuccessMessage": "El producto se ha eliminado de tu lista de deseos.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "No se pudo agregar el producto de tu lista de deseos, inténtalo de nuevo", + "removeProductFailed": "No se pudo eliminar el producto de tu lista de deseos, inténtalo de nuevo" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Lo sentimos, pero parece que la página solicitada cambió de lugar o ya no existe.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es.json b/core/messages/es.json index 0cb453d4ca..d391cca57f 100644 --- a/core/messages/es.json +++ b/core/messages/es.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envío", - "tax": "Impuesto" + "tax": "Impuesto", + "orderSummary": "Resumen del pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "No se ha podido actualizar tu lista de deseos. Inténtalo de nuevo.", "deleteFailed": "No se ha podido borrar tu lista de deseos. Inténtalo de nuevo.", "removeProductFailed": "No se ha podido eliminar el producto de tu lista de deseos. Inténtalo de nuevo.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "No tienes autorización para realizar esta acción. Inicia sesión e inténtalo de nuevo.", + "unexpected": "Se ha producido un error inesperado. Vuelve a intentarlo." }, "Result": { "createSuccess": "La lista de deseos se ha creado correctamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Se ha eliminado el artículo de tu lista de deseos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Añadir a una nueva lista de deseos", + "defaultWishlistName": "Mi lista de deseos", + "addSuccessMessage": "El producto se ha añadido a tu lista de deseos.", + "removeSuccessMessage": "El producto se ha eliminado de tu lista de deseos.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "No se ha podido añadir el producto de tu lista de deseos. Inténtalo de nuevo.", + "removeProductFailed": "No se ha podido eliminar el producto de tu lista de deseos. Inténtalo de nuevo." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "No hemos podido encontrar esa página.", - "subtitle": "Parece que la página solicitada se ha movido o ya no existe.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/fr.json b/core/messages/fr.json index 498412a134..d4d7aa6edb 100644 --- a/core/messages/fr.json +++ b/core/messages/fr.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destination {number, number}/{total, number}", "subtotal": "Sous-total", "shipping": "Livraison", - "tax": "Taxes" + "tax": "Taxes", + "orderSummary": "Récapitulatif de la commande" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Impossible de mettre à jour votre liste d'envies. Veuillez réessayer.", "deleteFailed": "Échec de la suppression de votre liste d'envies. Veuillez réessayer.", "removeProductFailed": "Impossible de retirer le produit de votre liste d'envies. Veuillez réessayer.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Vous n'êtes pas autorisé à effectuer cette action. Veuillez vous connecter et réessayer.", + "unexpected": "Une erreur inattendue s'est produite. Veuillez réessayer." }, "Result": { "createSuccess": "La liste d'envies a été créée avec succès.", @@ -236,13 +237,13 @@ "removeItemSuccess": "L'article a été supprimé de votre liste d'envies." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Ajouter à une nouvelle liste d'envies", + "defaultWishlistName": "Ma liste d'envies", + "addSuccessMessage": "Le produit a été ajouté à votre liste d'envies.", + "removeSuccessMessage": "Le produit a été retiré de votre liste d'envies.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Impossible d'ajouter le produit de votre liste d'envies. Veuillez réessayer.", + "removeProductFailed": "Impossible de retirer le produit de votre liste d'envies. Veuillez réessayer." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Page introuvable !", - "subtitle": "Il semblerait que la page que vous avez demandée ait été déplacée ou n'existe plus.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Produits en vedette" }, "Components": { diff --git a/core/messages/it.json b/core/messages/it.json index 02bdc91e5f..177201b06e 100644 --- a/core/messages/it.json +++ b/core/messages/it.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destinazione {number, number}/{total, number}", "subtotal": "Subtotale", "shipping": "Spedizioni", - "tax": "Tasse" + "tax": "Tasse", + "orderSummary": "Riepilogo ordine" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Impossibile aggiornare la tua lista dei desideri. Riprova.", "deleteFailed": "Impossibile eliminare la tua lista dei desideri. Riprova.", "removeProductFailed": "Impossibile rimuovere il prodotto dalla tua lista dei desideri. Riprova.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Non hai l'autorizzazione a eseguire questa azione. Accedi e riprova", + "unexpected": "Si è verificato un errore imprevisto, riprova" }, "Result": { "createSuccess": "La lista dei desideri è stata creata correttamente.", @@ -236,13 +237,13 @@ "removeItemSuccess": "L'articolo è stato rimosso dalla tua lista dei desideri." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Aggiungi a nuova lista desideri", + "defaultWishlistName": "La mia lista desideri", + "addSuccessMessage": "Il prodotto è stato aggiunto alla tua lista dei desideri", + "removeSuccessMessage": "Il prodotto è stato rimosso dalla tua lista dei desideri", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Impossibile aggiungere il prodotto dalla tua lista dei desideri. Riprova", + "removeProductFailed": "Impossibile rimuovere il prodotto dalla tua lista dei desideri. Riprova" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Non è stato possibile trovare la pagina.", - "subtitle": "Sembra che la pagina che hai richiesto non esista più o che sia stata spostata.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Prodotti in primo piano" }, "Components": { diff --git a/core/messages/ja.json b/core/messages/ja.json index a3fbcc9591..2d641ce187 100644 --- a/core/messages/ja.json +++ b/core/messages/ja.json @@ -155,7 +155,8 @@ "destinationWithCount": "目的地 {number, number}/{total, number}", "subtotal": "小計", "shipping": "配送", - "tax": "税金" + "tax": "税金", + "orderSummary": "注文概要" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "ウィッシュリストの更新に失敗しました。再度お試しください。", "deleteFailed": "ウィッシュリストを削除できませんでした。再度お試しください。", "removeProductFailed": "ウィッシュリストから商品を削除することができませんでした。再度お試しください。", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "この操作を実行する権限がありません。サインインして、もう一度お試しください", + "unexpected": "予期しないエラーが発生しました。もう一度お試しください" }, "Result": { "createSuccess": "ウィッシュリストが正常に作成されました。", @@ -236,13 +237,13 @@ "removeItemSuccess": "アイテムがウィッシュリストから削除されました。" }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "新しいウィッシュリストに追加", + "defaultWishlistName": "私のウィッシュリスト", + "addSuccessMessage": "商品がウィッシュリストに追加されました", + "removeSuccessMessage": "商品がウィッシュリストから削除されました", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "ウィッシュリストから商品を追加できませんでした。もう一度お試しください。", + "removeProductFailed": "ウィッシュリストから商品を削除できませんでした。再度お試しください" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "そのページは見つかりませんでした!", - "subtitle": "リクエストされたページは移動したか、もう存在しないようです。", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "おすすめ商品" }, "Components": { diff --git a/core/messages/nl.json b/core/messages/nl.json index 55bc50edbe..e85e49b8e7 100644 --- a/core/messages/nl.json +++ b/core/messages/nl.json @@ -155,7 +155,8 @@ "destinationWithCount": "Bestemming {number, number}/{total, number}", "subtotal": "Subtotaal", "shipping": "Verzending", - "tax": "Belasting" + "tax": "Belasting", + "orderSummary": "Besteloverzicht" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Het bijwerken van je verlanglijstje is mislukt. Probeer het opnieuw.", "deleteFailed": "Het verwijderen van je verlanglijstje is mislukt. Probeer het opnieuw.", "removeProductFailed": "Het is niet gelukt om het product van je verlanglijstje te verwijderen. Probeer het opnieuw.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Je bent niet bevoegd om deze handeling uit te voeren. Log in en probeer het opnieuw", + "unexpected": "Er is een onverwachte fout opgetreden. Probeer het opnieuw" }, "Result": { "createSuccess": "Verlanglijstje is succesvol aangemaakt.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Het artikel is verwijderd van je verlanglijstje." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Aan nieuw verlanglijstje toevoegen", + "defaultWishlistName": "Mijn verlanglijstje", + "addSuccessMessage": "Product is toegevoegd aan je verlanglijstje", + "removeSuccessMessage": "Het product is verwijderd van je verlanglijstje", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Het toevoegen van het product van je verlanglijstje is mislukt.Probeer het opnieuw", + "removeProductFailed": "Het is niet gelukt om het product van je verlanglijstje te verwijderen. Probeer het opnieuw" } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "We hebben die pagina niet gevonden!", - "subtitle": "De pagina die je zoekt, is verhuisd of bestaat niet meer.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Uitgelichte producten" }, "Components": { diff --git a/core/messages/no.json b/core/messages/no.json index bcf7dec7d8..a0b8525c42 100644 --- a/core/messages/no.json +++ b/core/messages/no.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destinasjon {number, number}/{total, number}", "subtotal": "Delsum", "shipping": "Frakt", - "tax": "Avgift" + "tax": "Avgift", + "orderSummary": "Bestillingssammendrag" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Kan ikke oppdatere ønskelisten. Prøv igjen.", "deleteFailed": "Kan ikke slette ønskelisten din. Prøv igjen.", "removeProductFailed": "Kan ikke fjerne produktet fra ønskelisten. Prøv igjen.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Du er ikke autorisert til å utføre denne handlingen. Logg på og prøv igjen.", + "unexpected": "En uventet feil oppstod, prøv igjen" }, "Result": { "createSuccess": "Ønskelisten er opprettet.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Varen er fjernet fra ønskelisten din." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Legg til i ny ønskeliste", + "defaultWishlistName": "Min ønskeliste", + "addSuccessMessage": "Produktet er lagt til i ønskelisten din", + "removeSuccessMessage": "Produktet er fjernet fra ønskelisten din", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Kan ikke legge til produktet fra ønskelisten din, prøv igjen.", + "removeProductFailed": "Kan ikke fjerne produktet fra ønskelisten, prøv igjen." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Vi fant ikke den siden!", - "subtitle": "Det ser ut til at siden du ba om har flyttet eller ikke lenger eksisterer.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Utvalgt produkter" }, "Components": { diff --git a/core/messages/pl.json b/core/messages/pl.json index fc7bdd16bf..e78aa0f4ee 100644 --- a/core/messages/pl.json +++ b/core/messages/pl.json @@ -155,7 +155,8 @@ "destinationWithCount": "Miejsce docelowe {number, number}/{total, number}", "subtotal": "Suma cząstkowa", "shipping": "Wysyłka", - "tax": "Podatek" + "tax": "Podatek", + "orderSummary": "Podsumowanie zamówienia" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Nie można zaktualizować listy życzeń. Spróbuj ponownie.", "deleteFailed": "Nie można usunąć listy życzeń. Spróbuj ponownie.", "removeProductFailed": "Nie można usunąć produktu z listy życzeń. Spróbuj ponownie.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Nie masz uprawnień do wykonania tej czynności. Zaloguj się i spróbuj ponownie.", + "unexpected": "Wystąpił nieoczekiwany błąd. Spróbuj ponownie." }, "Result": { "createSuccess": "Lista życzeń została pomyślnie utworzona.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Produkt został usunięty z listy życzeń." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Dodaj do nowej listy życzeń", + "defaultWishlistName": "Moja lista życzeń", + "addSuccessMessage": "Produkt został dodany do Twojej listy życzeń.", + "removeSuccessMessage": "Produkt został usunięty z Twojej listy życzeń", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Nie można dodać produktu z listy życzeń. Spróbuj ponownie.", + "removeProductFailed": "Nie można usunąć produktu z listy życzeń. Spróbuj ponownie." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Nie znaleziono tej strony!", - "subtitle": "Wygląda na to, że żądana strona została przeniesiona lub już nie istnieje.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Polecane produkty" }, "Components": { diff --git a/core/messages/pt-BR.json b/core/messages/pt-BR.json index 08105e86d7..a60d41d29e 100644 --- a/core/messages/pt-BR.json +++ b/core/messages/pt-BR.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envio", - "tax": "Imposto" + "tax": "Imposto", + "orderSummary": "Resumo do pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Não foi possível atualizar a sua lista de desejos. Tente novamente.", "deleteFailed": "Não foi possível excluir a sua lista de desejos. Tente novamente.", "removeProductFailed": "Não foi possível remover o produto da sua lista de desejos. Tente novamente.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Você não tem autorização para executar esta ação. Faça login e tente novamente.", + "unexpected": "Ocorreu um erro inesperado. Tente novamente." }, "Result": { "createSuccess": "A lista de desejos foi criada.", @@ -236,13 +237,13 @@ "removeItemSuccess": "O item foi removido da sua lista de desejos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Adicionar à nova lista de desejos", + "defaultWishlistName": "Minhas listas de desejos", + "addSuccessMessage": "O produto foi adicionado à sua lista de desejos", + "removeSuccessMessage": "O produto foi removido da sua lista de desejos", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Não foi possível adicionar o produto da sua lista de desejos. Tente novamente.", + "removeProductFailed": "Não foi possível remover o produto da sua lista de desejos. Tente novamente." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Não encontramos essa página!", - "subtitle": "Parece que a página que você solicitou foi movida ou não existe mais.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Produtos em destaque" }, "Components": { diff --git a/core/messages/pt.json b/core/messages/pt.json index 08105e86d7..a60d41d29e 100644 --- a/core/messages/pt.json +++ b/core/messages/pt.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destino {número, número}/{total, número}", "subtotal": "Subtotal", "shipping": "Envio", - "tax": "Imposto" + "tax": "Imposto", + "orderSummary": "Resumo do pedido" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Não foi possível atualizar a sua lista de desejos. Tente novamente.", "deleteFailed": "Não foi possível excluir a sua lista de desejos. Tente novamente.", "removeProductFailed": "Não foi possível remover o produto da sua lista de desejos. Tente novamente.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Você não tem autorização para executar esta ação. Faça login e tente novamente.", + "unexpected": "Ocorreu um erro inesperado. Tente novamente." }, "Result": { "createSuccess": "A lista de desejos foi criada.", @@ -236,13 +237,13 @@ "removeItemSuccess": "O item foi removido da sua lista de desejos." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Adicionar à nova lista de desejos", + "defaultWishlistName": "Minhas listas de desejos", + "addSuccessMessage": "O produto foi adicionado à sua lista de desejos", + "removeSuccessMessage": "O produto foi removido da sua lista de desejos", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Não foi possível adicionar o produto da sua lista de desejos. Tente novamente.", + "removeProductFailed": "Não foi possível remover o produto da sua lista de desejos. Tente novamente." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Não encontramos essa página!", - "subtitle": "Parece que a página que você solicitou foi movida ou não existe mais.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Produtos em destaque" }, "Components": { diff --git a/core/messages/sv.json b/core/messages/sv.json index bc6bbe1b10..00a759a477 100644 --- a/core/messages/sv.json +++ b/core/messages/sv.json @@ -155,7 +155,8 @@ "destinationWithCount": "Destination {number, number}/{total, number}", "subtotal": "Delsumma", "shipping": "Frakt", - "tax": "Beskatta" + "tax": "Beskatta", + "orderSummary": "Beställningssammanfattning" } }, "Addresses": { @@ -226,8 +227,8 @@ "updateFailed": "Det gick inte att uppdatera din önskelista. Försök igen.", "deleteFailed": "Det gick inte att radera din önskelista. Försök igen.", "removeProductFailed": "Det gick inte att ta bort produkten från din önskelista. Försök igen.", - "unauthorized": "You are not authorized to perform this action, please sign in and try again", - "unexpected": "An unexpected error occurred, please try again" + "unauthorized": "Du har inte behörighet att utföra den här åtgärden. Logga in och försök igen.", + "unexpected": "Ett oväntat fel inträffade. Försök igen." }, "Result": { "createSuccess": "Önskelistan har skapats.", @@ -236,13 +237,13 @@ "removeItemSuccess": "Objektet har tagits bort från din önskelista." }, "Button": { - "addToNewWishlist": "Add to new wish list", - "defaultWishlistName": "My wish list", - "addSuccessMessage": "Product has been added to your wish list", - "removeSuccessMessage": "Product has been removed from your wish list", + "addToNewWishlist": "Lägg till i en ny önskelista", + "defaultWishlistName": "Min önskelista", + "addSuccessMessage": "Produkten har lagts till i din önskelista.", + "removeSuccessMessage": "Produkten har tagits bort från din önskelista.", "Errors": { - "addProductFailed": "Failed to add the product from your wish list, please try again", - "removeProductFailed": "Failed to remove the product from your wish list, please try again" + "addProductFailed": "Det gick inte att lägga till produkten från din önskelista. Försök igen.", + "removeProductFailed": "Det gick inte att ta bort produkten från din önskelista. Försök igen." } } }, @@ -411,7 +412,7 @@ }, "NotFound": { "title": "Vi kunde inte hitta den sidan!", - "subtitle": "Det verkar som om sidan du begärde har flyttats eller inte längre finns.", + "subtitle": "Try searching for something else or go back to the home page.", "featuredProducts": "Utvalda produkter" }, "Components": { From 4be64957b94581962531e1da02cffabf2e9f24a2 Mon Sep 17 00:00:00 2001 From: Chancellor Clark Date: Wed, 14 May 2025 12:00:08 -0600 Subject: [PATCH 02/86] chore: move client and CLI changests into separate changesets (#2313) * chore(client): move client changes into separate changeset * chore(client): move dependency bumps to separate changeset --- .changeset/five-squids-tie.md | 5 +++++ .changeset/hungry-plums-hug.md | 5 +++++ .changeset/little-hornets-stand.md | 1 - .changeset/mean-geese-retire.md | 1 - 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 .changeset/five-squids-tie.md create mode 100644 .changeset/hungry-plums-hug.md diff --git a/.changeset/five-squids-tie.md b/.changeset/five-squids-tie.md new file mode 100644 index 0000000000..43ba256cad --- /dev/null +++ b/.changeset/five-squids-tie.md @@ -0,0 +1,5 @@ +--- +"@bigcommerce/catalyst-client": minor +--- + +Add an `onError` callback to in order to handle auth and invalid sessions. diff --git a/.changeset/hungry-plums-hug.md b/.changeset/hungry-plums-hug.md new file mode 100644 index 0000000000..8f6ec3720d --- /dev/null +++ b/.changeset/hungry-plums-hug.md @@ -0,0 +1,5 @@ +--- +"@bigcommerce/catalyst-client": patch +--- + +Manual changes on a dependency bumps. diff --git a/.changeset/little-hornets-stand.md b/.changeset/little-hornets-stand.md index ed18a47a66..5bc3acdc32 100644 --- a/.changeset/little-hornets-stand.md +++ b/.changeset/little-hornets-stand.md @@ -1,5 +1,4 @@ --- -"@bigcommerce/catalyst-client": patch "@bigcommerce/catalyst-core": patch --- diff --git a/.changeset/mean-geese-retire.md b/.changeset/mean-geese-retire.md index b942d57fb4..981c1f2926 100644 --- a/.changeset/mean-geese-retire.md +++ b/.changeset/mean-geese-retire.md @@ -1,6 +1,5 @@ --- "@bigcommerce/eslint-config-catalyst": patch -"@bigcommerce/catalyst-client": patch "@bigcommerce/catalyst-core": minor --- From 9d3e666625613871b40afc21b22a51f1e512929d Mon Sep 17 00:00:00 2001 From: Chancellor Clark Date: Wed, 14 May 2025 12:05:05 -0600 Subject: [PATCH 03/86] chore(release): publish create-catalyst CLI & client (#2312) --- .changeset/dry-frogs-pump.md | 7 ------- .changeset/five-squids-tie.md | 5 ----- .changeset/gentle-seals-sing.md | 5 ----- .changeset/hungry-plums-hug.md | 5 ----- .changeset/itchy-ways-do.md | 5 ----- .changeset/pretty-coats-accept.md | 5 ----- .changeset/sweet-lions-kneel.md | 6 ------ .changeset/swift-tips-wave.md | 5 ----- packages/client/CHANGELOG.md | 18 ++++++++++++++++++ packages/client/package.json | 2 +- packages/create-catalyst/CHANGELOG.md | 12 ++++++++++++ packages/create-catalyst/package.json | 2 +- 12 files changed, 32 insertions(+), 45 deletions(-) delete mode 100644 .changeset/dry-frogs-pump.md delete mode 100644 .changeset/five-squids-tie.md delete mode 100644 .changeset/gentle-seals-sing.md delete mode 100644 .changeset/hungry-plums-hug.md delete mode 100644 .changeset/itchy-ways-do.md delete mode 100644 .changeset/pretty-coats-accept.md delete mode 100644 .changeset/sweet-lions-kneel.md delete mode 100644 .changeset/swift-tips-wave.md diff --git a/.changeset/dry-frogs-pump.md b/.changeset/dry-frogs-pump.md deleted file mode 100644 index 791860beb1..0000000000 --- a/.changeset/dry-frogs-pump.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@bigcommerce/catalyst-client": minor ---- - -GQL requests that respond as `200` but have an `errors` field will now be properly handled by the client and throw a proper `BigCommerceGQLError` response with the message reason from the API. This will provide a more detailed description of why the GQL request errored out. - -API errors will still be handled and attribute the errored status as the message with this change as `BigCommerceAPIError`. diff --git a/.changeset/five-squids-tie.md b/.changeset/five-squids-tie.md deleted file mode 100644 index 43ba256cad..0000000000 --- a/.changeset/five-squids-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@bigcommerce/catalyst-client": minor ---- - -Add an `onError` callback to in order to handle auth and invalid sessions. diff --git a/.changeset/gentle-seals-sing.md b/.changeset/gentle-seals-sing.md deleted file mode 100644 index 780f260c50..0000000000 --- a/.changeset/gentle-seals-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@bigcommerce/create-catalyst": patch ---- - -Add es-419 to list of allowed locale for selecting in CLI diff --git a/.changeset/hungry-plums-hug.md b/.changeset/hungry-plums-hug.md deleted file mode 100644 index 8f6ec3720d..0000000000 --- a/.changeset/hungry-plums-hug.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@bigcommerce/catalyst-client": patch ---- - -Manual changes on a dependency bumps. diff --git a/.changeset/itchy-ways-do.md b/.changeset/itchy-ways-do.md deleted file mode 100644 index ecd55fa50f..0000000000 --- a/.changeset/itchy-ways-do.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@bigcommerce/catalyst-client": minor ---- - -Add an `errorPolicy` option for GQL requests. Accepts `none`, `ignore`, `all`. Defaults to `none` which throws an error if there are GQL errors, `ignore` returns the data without error object, and `all` returns both data and errors. diff --git a/.changeset/pretty-coats-accept.md b/.changeset/pretty-coats-accept.md deleted file mode 100644 index 21e8043e68..0000000000 --- a/.changeset/pretty-coats-accept.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@bigcommerce/create-catalyst": minor ---- - -Expands the supported Node.js version of the `create-catalyst` CLI to `^20` and `^22`. The version of Node.js required to run the CLI is not necessarily tied to the version of Node.js required to run Catalyst; the CLI requires at least version 18 to run because it depends on global Fetch API support being enabled by default. More context in [#2296](https://github.com/bigcommerce/catalyst/pull/2296). diff --git a/.changeset/sweet-lions-kneel.md b/.changeset/sweet-lions-kneel.md deleted file mode 100644 index 6682fa724e..0000000000 --- a/.changeset/sweet-lions-kneel.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@bigcommerce/create-catalyst": minor -"@bigcommerce/catalyst": minor ---- - -Support node 22. diff --git a/.changeset/swift-tips-wave.md b/.changeset/swift-tips-wave.md deleted file mode 100644 index 3129696f36..0000000000 --- a/.changeset/swift-tips-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@bigcommerce/catalyst-client": patch ---- - -Add GraphQL operation name and type to GraphQL URL as query parameters to improve server logging of GraphQL operations diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index 0ae11cc3c0..8ddf622e3e 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## 0.15.0 + +### Minor Changes + +- [#1914](https://github.com/bigcommerce/catalyst/pull/1914) [`f039b2c`](https://github.com/bigcommerce/catalyst/commit/f039b2c7235118626d7a727bff5271ac8982f910) Thanks [@jorgemoya](https://github.com/jorgemoya)! - GQL requests that respond as `200` but have an `errors` field will now be properly handled by the client and throw a proper `BigCommerceGQLError` response with the message reason from the API. This will provide a more detailed description of why the GQL request errored out. + + API errors will still be handled and attribute the errored status as the message with this change as `BigCommerceAPIError`. + +- [`0aa23e2`](undefined) - Add an `onError` callback to in order to handle auth and invalid sessions. + +- [#2124](https://github.com/bigcommerce/catalyst/pull/2124) [`4a00a27`](https://github.com/bigcommerce/catalyst/commit/4a00a27acea733b6f3fef221b3d1472b145d25f0) Thanks [@jorgemoya](https://github.com/jorgemoya)! - Add an `errorPolicy` option for GQL requests. Accepts `none`, `ignore`, `all`. Defaults to `none` which throws an error if there are GQL errors, `ignore` returns the data without error object, and `all` returns both data and errors. + +### Patch Changes + +- [`c830100`](undefined) - Manual changes on a dependency bumps. + +- [#2226](https://github.com/bigcommerce/catalyst/pull/2226) [`3b14d66`](https://github.com/bigcommerce/catalyst/commit/3b14d668d32e7ebe37e31b1851b3db8f8be46bec) Thanks [@bookernath](https://github.com/bookernath)! - Add GraphQL operation name and type to GraphQL URL as query parameters to improve server logging of GraphQL operations + ## 0.14.0 ### Minor Changes diff --git a/packages/client/package.json b/packages/client/package.json index fd3430e5d9..3e98c95c4e 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,7 +1,7 @@ { "name": "@bigcommerce/catalyst-client", "description": "BigCommerce API client for Catalyst.", - "version": "0.14.0", + "version": "0.15.0", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { diff --git a/packages/create-catalyst/CHANGELOG.md b/packages/create-catalyst/CHANGELOG.md index ad1e079c64..a444a09319 100644 --- a/packages/create-catalyst/CHANGELOG.md +++ b/packages/create-catalyst/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 0.22.0 + +### Minor Changes + +- [#2296](https://github.com/bigcommerce/catalyst/pull/2296) [`da1f486`](https://github.com/bigcommerce/catalyst/commit/da1f486685544ebe117881caa97d7b0539171531) Thanks [@matthewvolk](https://github.com/matthewvolk)! - Expands the supported Node.js version of the `create-catalyst` CLI to `^20` and `^22`. The version of Node.js required to run the CLI is not necessarily tied to the version of Node.js required to run Catalyst; the CLI requires at least version 18 to run because it depends on global Fetch API support being enabled by default. More context in [#2296](https://github.com/bigcommerce/catalyst/pull/2296). + +- [#2136](https://github.com/bigcommerce/catalyst/pull/2136) [`e5f1ac9`](https://github.com/bigcommerce/catalyst/commit/e5f1ac9879319a66187d410a3dc6b2764b15a789) Thanks [@chanceaclark](https://github.com/chanceaclark)! - Support node 22. + +### Patch Changes + +- [#2017](https://github.com/bigcommerce/catalyst/pull/2017) [`c1519d4`](https://github.com/bigcommerce/catalyst/commit/c1519d4098baa7d21553415e4c794c185b27ec07) Thanks [@RomanKrasinskyi](https://github.com/RomanKrasinskyi)! - Add es-419 to list of allowed locale for selecting in CLI + ## 0.21.0 ### Minor Changes diff --git a/packages/create-catalyst/package.json b/packages/create-catalyst/package.json index 2597dafedb..9d00261ce0 100644 --- a/packages/create-catalyst/package.json +++ b/packages/create-catalyst/package.json @@ -1,6 +1,6 @@ { "name": "@bigcommerce/create-catalyst", - "version": "0.21.0", + "version": "0.22.0", "type": "module", "bin": "bin/index.cjs", "files": [ From 1e005e2e20b46a516797e10a781d1ed78c6b2fec Mon Sep 17 00:00:00 2001 From: Nathan Booker Date: Wed, 14 May 2025 17:23:07 -0500 Subject: [PATCH 04/86] Add deepwiki badge to README (#2314) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6ce5bf2343..029d02b723 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ [![MIT License](https://img.shields.io/github/license/bigcommerce/catalyst)](LICENSE.md) [![Lighthouse Report](https://github.com/bigcommerce/catalyst/actions/workflows/lighthouse.yml/badge.svg)](https://github.com/bigcommerce/catalyst/actions/workflows/lighthouse.yml) [![Lint, Typecheck, gql.tada](https://github.com/bigcommerce/catalyst/actions/workflows/basic.yml/badge.svg)](https://github.com/bigcommerce/catalyst/actions/workflows/basic.yml) +[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/bigcommerce/catalyst) From 309fd7c6342b3ac01ca9676ea2b48e3918b69f66 Mon Sep 17 00:00:00 2001 From: Matthew Volk Date: Fri, 16 May 2025 10:32:28 -0500 Subject: [PATCH 05/86] chore: CATALYST-1117 update contributing.md with merge strategy we use for integrations/makeswift (#2311) --- CONTRIBUTING.md | 82 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 86b3056677..7fcebb1c7f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,42 +1,78 @@ # Contributing to Catalyst + Thanks for showing interest in contributing! The following is a set of guidelines for contributing to Catalyst. These are just guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. -#### Table of Contents +## Repository Structure + +Catalyst is a monorepo that contains the code for the Catalyst Next.js application inside of `core/`, and supporting packages such as the GraphQL API client and the `create-catalyst` CLI in `packages/`. + +The default branch for this repository is called `canary`. This is the primary development branch where active development takes place, including the introduction of new features, bug fixes, and other changes before they are released in stable versions. + +To contribute to the `canary` branch, you can create a new branch off of `canary` and submit a PR against that branch. + +## Makeswift Integration + +In addition to `canary`, we also maintain the `integrations/makeswift` branch, which contains additional code required to integrate with [Makeswift](https://www.makeswift.com). + +To contribute to the `integrations/makeswift` branch, you can create a new branch off of `integrations/makeswift` and submit a PR against that branch. + +### Pulling updates from `canary` into `integrations/makeswift` + +We aim to keep `integrations/makeswift` in sync with `canary`. To do this, we frequently pull the latest code from `canary` into `integrations/makeswift`. + +To pull the latest code from `canary` into `integrations/makeswift`, you can follow these steps: + +1. Fetch the latest code from `canary`: + + ```bash + git checkout canary + git pull + ``` + +2. Fetch the latest code from `integrations/makeswift`: + + ```bash + git checkout integrations/makeswift + git pull + ``` + +3. Checkout a new branch from `integrations/makeswift`: -How Can I Contribute? - * [Pull Requests](#pull-requests) - * [Issues / Bugs](#issues--bugs) - * [Other Ways to Contribute](#other-ways-to-contribute) + ```bash + git checkout -b {new-branch-name} + ``` -Styleguides - * [Git Commit Messages](#git-commit-messages) +4. Merge `canary` into the new branch: -## Pull Requests + ```bash + git merge canary + ``` -First ensure that your feature isn't already being developed or considered (see open PRs and issues). -If it is, please consider contributing to those initiatives. +5. After resolving any merge conflicts, open a new PR in GitHub to merge your new branch into `integrations/makeswift`. This PR should be code reviewed and approved before the next steps. -## Issues / Bugs - -* Please include a clear, specific title and replicable description. +6. Rebase the changes onto the local `integrations/makeswift` branch in order to make the branches 1-1 and keep a linear commit history. -* Please include your environment, OS, and any exceptions/backtraces that occur. The more -information that is given, the more likely we can debug and fix the issue. + ```bash + git checkout integrations/makeswift + git rebase {new-branch-name} + ``` -**If you find a security bug, please do not post as an issue. Send directly to security@bigcommerce.com -instead.** +7. Push the changes up to GitHub, which will automatically close the open PR from step 6. + ```bash + git push + ``` ## Other Ways to Contribute -* Consider reporting bugs, contributing to test coverage, or helping spread the word about Catalyst. +- Consider reporting bugs, contributing to test coverage, or helping spread the word about Catalyst. ## Git Commit Messages -* Use the present tense ("Add feature" not "Added feature") -* Use the imperative mood ("Move cursor to..." not "Moves cursor to...") -* Limit the first line to 72 characters or less -* Reference pull requests and external links liberally +- Use the present tense ("Add feature" not "Added feature") +- Use the imperative mood ("Move cursor to..." not "Moves cursor to...") +- Limit the first line to 72 characters or less +- Reference pull requests and external links liberally -Thank you again for your interest in contributing to Catalyst! \ No newline at end of file +Thank you again for your interest in contributing to Catalyst! From aff111e90ecf903b965537851bd9346e92d58005 Mon Sep 17 00:00:00 2001 From: bc-svc-local <102379007+bc-svc-local@users.noreply.github.com> Date: Tue, 20 May 2025 00:53:42 +0300 Subject: [PATCH 06/86] Update translations (#2321) * feat(other): LOCAL-1444 delivery translation * chore(core): create translations patch * chore: trigger ci --------- Co-authored-by: bc-svc-local Co-authored-by: Matthew Volk --- .changeset/translations-patch-7b3144a6.md | 5 +++++ core/messages/da.json | 3 ++- core/messages/de.json | 3 ++- core/messages/es-419.json | 3 ++- core/messages/es-AR.json | 3 ++- core/messages/es-CL.json | 3 ++- core/messages/es-CO.json | 3 ++- core/messages/es-LA.json | 3 ++- core/messages/es-MX.json | 3 ++- core/messages/es-PE.json | 3 ++- core/messages/es.json | 3 ++- core/messages/fr.json | 3 ++- core/messages/it.json | 3 ++- core/messages/ja.json | 3 ++- core/messages/nl.json | 3 ++- core/messages/no.json | 3 ++- core/messages/pl.json | 3 ++- core/messages/pt-BR.json | 3 ++- core/messages/pt.json | 3 ++- core/messages/sv.json | 3 ++- 20 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 .changeset/translations-patch-7b3144a6.md diff --git a/.changeset/translations-patch-7b3144a6.md b/.changeset/translations-patch-7b3144a6.md new file mode 100644 index 0000000000..ad17b2636a --- /dev/null +++ b/.changeset/translations-patch-7b3144a6.md @@ -0,0 +1,5 @@ +--- +"@bigcommerce/catalyst-core": patch +--- + +Update translations. diff --git a/core/messages/da.json b/core/messages/da.json index 3ac6ea0116..6ff57a89dd 100644 --- a/core/messages/da.json +++ b/core/messages/da.json @@ -385,6 +385,7 @@ "home": "Hjem" }, "ContactUs": { + "home": "Hjem", "Form": { "success": "Tak for din henvendelse. Vi vender snart tilbage til dig.", "successCta": "Fortsæt med at handle", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Vi kunne ikke finde den side.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Prøv at søge efter noget andet, eller gå tilbage til startsiden.", "featuredProducts": "Udvalgte produkter" }, "Components": { diff --git a/core/messages/de.json b/core/messages/de.json index 45df22055b..9e000769c0 100644 --- a/core/messages/de.json +++ b/core/messages/de.json @@ -385,6 +385,7 @@ "home": "Startseite" }, "ContactUs": { + "home": "Startseite", "Form": { "success": "Vielen Dank für Ihre Kontaktaufnahme. Wir melden uns bald bei Ihnen.", "successCta": "Weiter einkaufen", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Wir konnten diese Seite nicht finden!", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Versuchen Sie, nach etwas anderem zu suchen oder zur Startseite zurückzukehren.", "featuredProducts": "Empfohlene Produkte" }, "Components": { diff --git a/core/messages/es-419.json b/core/messages/es-419.json index 687a9697a9..35eee5fb03 100644 --- a/core/messages/es-419.json +++ b/core/messages/es-419.json @@ -385,6 +385,7 @@ "home": "Página de inicio" }, "ContactUs": { + "home": "Página de inicio", "Form": { "success": "Gracias por ponerte en contacto. Nos comunicaremos contigo pronto.", "successCta": "Seguir comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Intenta buscar algo más o regresa a la página de inicio.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-AR.json b/core/messages/es-AR.json index 687a9697a9..35eee5fb03 100644 --- a/core/messages/es-AR.json +++ b/core/messages/es-AR.json @@ -385,6 +385,7 @@ "home": "Página de inicio" }, "ContactUs": { + "home": "Página de inicio", "Form": { "success": "Gracias por ponerte en contacto. Nos comunicaremos contigo pronto.", "successCta": "Seguir comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Intenta buscar algo más o regresa a la página de inicio.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-CL.json b/core/messages/es-CL.json index 687a9697a9..35eee5fb03 100644 --- a/core/messages/es-CL.json +++ b/core/messages/es-CL.json @@ -385,6 +385,7 @@ "home": "Página de inicio" }, "ContactUs": { + "home": "Página de inicio", "Form": { "success": "Gracias por ponerte en contacto. Nos comunicaremos contigo pronto.", "successCta": "Seguir comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Intenta buscar algo más o regresa a la página de inicio.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-CO.json b/core/messages/es-CO.json index 687a9697a9..35eee5fb03 100644 --- a/core/messages/es-CO.json +++ b/core/messages/es-CO.json @@ -385,6 +385,7 @@ "home": "Página de inicio" }, "ContactUs": { + "home": "Página de inicio", "Form": { "success": "Gracias por ponerte en contacto. Nos comunicaremos contigo pronto.", "successCta": "Seguir comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Intenta buscar algo más o regresa a la página de inicio.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-LA.json b/core/messages/es-LA.json index 687a9697a9..35eee5fb03 100644 --- a/core/messages/es-LA.json +++ b/core/messages/es-LA.json @@ -385,6 +385,7 @@ "home": "Página de inicio" }, "ContactUs": { + "home": "Página de inicio", "Form": { "success": "Gracias por ponerte en contacto. Nos comunicaremos contigo pronto.", "successCta": "Seguir comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Intenta buscar algo más o regresa a la página de inicio.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-MX.json b/core/messages/es-MX.json index 687a9697a9..35eee5fb03 100644 --- a/core/messages/es-MX.json +++ b/core/messages/es-MX.json @@ -385,6 +385,7 @@ "home": "Página de inicio" }, "ContactUs": { + "home": "Página de inicio", "Form": { "success": "Gracias por ponerte en contacto. Nos comunicaremos contigo pronto.", "successCta": "Seguir comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Intenta buscar algo más o regresa a la página de inicio.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es-PE.json b/core/messages/es-PE.json index 687a9697a9..35eee5fb03 100644 --- a/core/messages/es-PE.json +++ b/core/messages/es-PE.json @@ -385,6 +385,7 @@ "home": "Página de inicio" }, "ContactUs": { + "home": "Página de inicio", "Form": { "success": "Gracias por ponerte en contacto. Nos comunicaremos contigo pronto.", "successCta": "Seguir comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "No pudimos encontrar esa página.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Intenta buscar algo más o regresa a la página de inicio.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/es.json b/core/messages/es.json index d391cca57f..863e1ed0d3 100644 --- a/core/messages/es.json +++ b/core/messages/es.json @@ -385,6 +385,7 @@ "home": "Inicio" }, "ContactUs": { + "home": "Inicio", "Form": { "success": "Gracias por ponerte en contacto con nosotros. Nos pondremos en contacto contigo pronto.", "successCta": "Seguir comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "No hemos podido encontrar esa página.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Prueba a buscar otra cosa o vuelve a la página de inicio.", "featuredProducts": "Productos destacados" }, "Components": { diff --git a/core/messages/fr.json b/core/messages/fr.json index d4d7aa6edb..39854ad6f8 100644 --- a/core/messages/fr.json +++ b/core/messages/fr.json @@ -385,6 +385,7 @@ "home": "Accueil" }, "ContactUs": { + "home": "Accueil", "Form": { "success": "Merci de nous avoir contactés. Nous reviendrons vers vous bientôt.", "successCta": "Continuer mes achats", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Page introuvable !", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Essayez de rechercher autre chose ou revenez à la page d'accueil.", "featuredProducts": "Produits en vedette" }, "Components": { diff --git a/core/messages/it.json b/core/messages/it.json index 177201b06e..c32df4de45 100644 --- a/core/messages/it.json +++ b/core/messages/it.json @@ -385,6 +385,7 @@ "home": "Home" }, "ContactUs": { + "home": "Home", "Form": { "success": "Grazie per averci contattato. Ti risponderemo al più presto.", "successCta": "Continua a fare acquisti", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Non è stato possibile trovare la pagina.", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Prova a cercare qualcos'altro o torna alla home page.", "featuredProducts": "Prodotti in primo piano" }, "Components": { diff --git a/core/messages/ja.json b/core/messages/ja.json index 2d641ce187..8772e53aa0 100644 --- a/core/messages/ja.json +++ b/core/messages/ja.json @@ -385,6 +385,7 @@ "home": "ホーム" }, "ContactUs": { + "home": "ホーム", "Form": { "success": "お問い合わせありがとうございます。近日中に返信させていただきます。", "successCta": "買い物を続ける", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "そのページは見つかりませんでした!", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "他のものを検索するか、ホームページに戻ってください。", "featuredProducts": "おすすめ商品" }, "Components": { diff --git a/core/messages/nl.json b/core/messages/nl.json index e85e49b8e7..99744030c6 100644 --- a/core/messages/nl.json +++ b/core/messages/nl.json @@ -385,6 +385,7 @@ "home": "Home" }, "ContactUs": { + "home": "Home", "Form": { "success": "Bedankt voor je bericht. We nemen snel contact met je op.", "successCta": "Verdergaan met winkelen", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "We hebben die pagina niet gevonden!", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Probeer iets anders te zoeken of ga terug naar de homepage.", "featuredProducts": "Uitgelichte producten" }, "Components": { diff --git a/core/messages/no.json b/core/messages/no.json index a0b8525c42..1b818631b3 100644 --- a/core/messages/no.json +++ b/core/messages/no.json @@ -385,6 +385,7 @@ "home": "Hjem" }, "ContactUs": { + "home": "Hjem", "Form": { "success": "Takk for at du tok kontakt. Vi kommer tilbake til deg snart.", "successCta": "Fortsett å handle", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Vi fant ikke den siden!", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Prøv å søke etter noe annet, eller gå tilbake til hjemmesiden.", "featuredProducts": "Utvalgt produkter" }, "Components": { diff --git a/core/messages/pl.json b/core/messages/pl.json index e78aa0f4ee..117d5d460f 100644 --- a/core/messages/pl.json +++ b/core/messages/pl.json @@ -385,6 +385,7 @@ "home": "Strona główna" }, "ContactUs": { + "home": "Strona główna", "Form": { "success": "Dziękuję za kontakt. Skontaktujemy się z Tobą wkrótce.", "successCta": "Kontynuuj zakupy", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Nie znaleziono tej strony!", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Spróbuj wyszukać coś innego lub wróć do strony głównej.", "featuredProducts": "Polecane produkty" }, "Components": { diff --git a/core/messages/pt-BR.json b/core/messages/pt-BR.json index a60d41d29e..2cf9945ea9 100644 --- a/core/messages/pt-BR.json +++ b/core/messages/pt-BR.json @@ -385,6 +385,7 @@ "home": "Página inicial" }, "ContactUs": { + "home": "Página inicial", "Form": { "success": "Agradecemos o contato. Responderemos em breve.", "successCta": "Continuar comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Não encontramos essa página!", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Tente fazer uma pesquisa diferente ou volte para a página inicial.", "featuredProducts": "Produtos em destaque" }, "Components": { diff --git a/core/messages/pt.json b/core/messages/pt.json index a60d41d29e..2cf9945ea9 100644 --- a/core/messages/pt.json +++ b/core/messages/pt.json @@ -385,6 +385,7 @@ "home": "Página inicial" }, "ContactUs": { + "home": "Página inicial", "Form": { "success": "Agradecemos o contato. Responderemos em breve.", "successCta": "Continuar comprando", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Não encontramos essa página!", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Tente fazer uma pesquisa diferente ou volte para a página inicial.", "featuredProducts": "Produtos em destaque" }, "Components": { diff --git a/core/messages/sv.json b/core/messages/sv.json index 00a759a477..994fd59046 100644 --- a/core/messages/sv.json +++ b/core/messages/sv.json @@ -385,6 +385,7 @@ "home": "Hem" }, "ContactUs": { + "home": "Hem", "Form": { "success": "Tack för att du hörde av dig. Vi återkommer till dig inom kort.", "successCta": "Fortsätt att handla", @@ -412,7 +413,7 @@ }, "NotFound": { "title": "Vi kunde inte hitta den sidan!", - "subtitle": "Try searching for something else or go back to the home page.", + "subtitle": "Prova att söka efter något annat eller gå tillbaka till startsidan.", "featuredProducts": "Utvalda produkter" }, "Components": { From 6401bb276debff5cb15b2238211f79c49cc73708 Mon Sep 17 00:00:00 2001 From: Jorge Moya Date: Tue, 20 May 2025 08:24:45 -0500 Subject: [PATCH 07/86] feat(core): update ProductListSection totalCount prop to string (#2322) --- .changeset/free-chicken-hammer.md | 5 +++++ core/app/[locale]/(default)/(faceted)/brand/[slug]/page.tsx | 2 +- .../[locale]/(default)/(faceted)/category/[slug]/page.tsx | 2 +- core/app/[locale]/(default)/(faceted)/search/page.tsx | 4 ++-- core/vibes/soul/sections/products-list-section/index.tsx | 2 +- core/vibes/soul/sections/reviews/index.tsx | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changeset/free-chicken-hammer.md diff --git a/.changeset/free-chicken-hammer.md b/.changeset/free-chicken-hammer.md new file mode 100644 index 0000000000..07576ede16 --- /dev/null +++ b/.changeset/free-chicken-hammer.md @@ -0,0 +1,5 @@ +--- +"@bigcommerce/catalyst-core": patch +--- + +Update ProductListSection's and ReviewsSection's `totalCount` prop to string. diff --git a/core/app/[locale]/(default)/(faceted)/brand/[slug]/page.tsx b/core/app/[locale]/(default)/(faceted)/brand/[slug]/page.tsx index 2104fd0ba3..b87a8cafd1 100644 --- a/core/app/[locale]/(default)/(faceted)/brand/[slug]/page.tsx +++ b/core/app/[locale]/(default)/(faceted)/brand/[slug]/page.tsx @@ -147,7 +147,7 @@ export default async function Brand(props: Props) { const streamableTotalCount = Streamable.from(async () => { const search = await streamableFacetedSearch; - return search.products.collectionInfo?.totalItems ?? 0; + return String(search.products.collectionInfo?.totalItems ?? 0); }); const streamablePagination = Streamable.from(async () => { diff --git a/core/app/[locale]/(default)/(faceted)/category/[slug]/page.tsx b/core/app/[locale]/(default)/(faceted)/category/[slug]/page.tsx index f434cbdf1f..cb0f2328a5 100644 --- a/core/app/[locale]/(default)/(faceted)/category/[slug]/page.tsx +++ b/core/app/[locale]/(default)/(faceted)/category/[slug]/page.tsx @@ -160,7 +160,7 @@ export default async function Category(props: Props) { const streamableTotalCount = Streamable.from(async () => { const search = await streamableFacetedSearch; - return search.products.collectionInfo?.totalItems ?? 0; + return String(search.products.collectionInfo?.totalItems ?? 0); }); const streamablePagination = Streamable.from(async () => { diff --git a/core/app/[locale]/(default)/(faceted)/search/page.tsx b/core/app/[locale]/(default)/(faceted)/search/page.tsx index a41770f23c..ba5d3aea0c 100644 --- a/core/app/[locale]/(default)/(faceted)/search/page.tsx +++ b/core/app/[locale]/(default)/(faceted)/search/page.tsx @@ -141,12 +141,12 @@ export default async function Search(props: Props) { const searchTerm = typeof searchParams.term === 'string' ? searchParams.term : ''; if (!searchTerm) { - return 0; + return '0'; } const search = await streamableFacetedSearch; - return search.products.collectionInfo?.totalItems ?? 0; + return String(search.products.collectionInfo?.totalItems ?? 0); }); const streamableEmptyStateTitle = Streamable.from(async () => { diff --git a/core/vibes/soul/sections/products-list-section/index.tsx b/core/vibes/soul/sections/products-list-section/index.tsx index b62b8be950..231b0cffde 100644 --- a/core/vibes/soul/sections/products-list-section/index.tsx +++ b/core/vibes/soul/sections/products-list-section/index.tsx @@ -18,7 +18,7 @@ import { interface Props { breadcrumbs?: Streamable; title?: Streamable; - totalCount: Streamable; + totalCount: Streamable; products: Streamable; filters: Streamable; sortOptions: Streamable; diff --git a/core/vibes/soul/sections/reviews/index.tsx b/core/vibes/soul/sections/reviews/index.tsx index 6fd22af521..14608124dc 100644 --- a/core/vibes/soul/sections/reviews/index.tsx +++ b/core/vibes/soul/sections/reviews/index.tsx @@ -14,7 +14,7 @@ interface Review { interface Props { reviews: Streamable; averageRating: Streamable; - totalCount?: Streamable; + totalCount?: Streamable; paginationInfo?: Streamable; nextLabel?: Streamable; previousLabel?: Streamable; From e145673dc07b97af1115539f6ee330659fa17970 Mon Sep 17 00:00:00 2001 From: Jorge Moya Date: Tue, 20 May 2025 08:25:45 -0500 Subject: [PATCH 08/86] feat(core): accept a list of CDNs for image loader (#2293) * feat(core): accept a list of CDNs for image loader * fix: use array in store-assets * fix: use .at * fix: filter nullish values * fix: typo * fix: use variable * feat: update store assets util to accept cdn index * fix: handle when there is no CDN set --- .changeset/dull-chairs-invite.md | 11 +++++++++++ core/build-config/schema.ts | 2 +- core/components/image/index.tsx | 9 +++++---- core/lib/store-assets.ts | 15 +++++++++++---- core/next.config.ts | 26 +++++++++++++++++++++----- 5 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 .changeset/dull-chairs-invite.md diff --git a/.changeset/dull-chairs-invite.md b/.changeset/dull-chairs-invite.md new file mode 100644 index 0000000000..d5c46700f0 --- /dev/null +++ b/.changeset/dull-chairs-invite.md @@ -0,0 +1,11 @@ +--- +"@bigcommerce/catalyst-core": patch +--- + +Allow a list of CDN hostnames for cases when there can be more than one CDN available for image loader. + +Migration: + +- Update `build-config` schema to make `cdnUrls` an array of strings. +- Update `next.config.ts` to set `cdnUrls` as an array, and set multiple preconnected Link headers (one per CDN). +- `shouldUseLoaderProp` function now reads from array. diff --git a/core/build-config/schema.ts b/core/build-config/schema.ts index f666082f38..a2c802d0c7 100644 --- a/core/build-config/schema.ts +++ b/core/build-config/schema.ts @@ -9,7 +9,7 @@ export const buildConfigSchema = z.object({ ), urls: z.object({ vanityUrl: z.string(), - cdnUrl: z.string().default('cdn11.bigcommerce.com'), + cdnUrls: z.array(z.string()).default(['cdn11.bigcommerce.com']), checkoutUrl: z.string(), }), }); diff --git a/core/components/image/index.tsx b/core/components/image/index.tsx index 66cb587c31..309073e246 100644 --- a/core/components/image/index.tsx +++ b/core/components/image/index.tsx @@ -7,10 +7,11 @@ import { buildConfig } from '~/build-config/reader'; import bcCdnImageLoader from '~/lib/cdn-image-loader'; function shouldUseLoaderProp(props: ImageProps): boolean { - return ( - typeof props.src === 'string' && - props.src.startsWith(`https://${buildConfig.get('urls').cdnUrl}`) - ); + if (typeof props.src !== 'string') return false; + + const { src } = props; + + return buildConfig.get('urls').cdnUrls.some((cdn) => src.startsWith(`https://${cdn}`)); } /** diff --git a/core/lib/store-assets.ts b/core/lib/store-assets.ts index b4f2a1f969..cfa5314c94 100644 --- a/core/lib/store-assets.ts +++ b/core/lib/store-assets.ts @@ -10,10 +10,16 @@ const storeHash = process.env.BIGCOMMERCE_STORE_HASH ?? ''; * @param {string} sizeSegment - The size segment of the URL. Can be of the form `{:size}` (to make it a urlTemplate) or `original` or `123w` or `123x123`. * @param {string} source - The source of the image. Can be either `content` or `image-manager`. * @param {string} path - The path of the image relative to the source. + * @param {number} cdnIndex - The index of the CDN URL to use. Defaults to 0. * @returns {string} The CDN image URL. */ -const cdnImageUrlBuilder = (sizeSegment: string, source: string, path: string): string => { - return `https://${buildConfig.get('urls').cdnUrl}/s-${storeHash}/images/stencil/${sizeSegment}/${source}/${path}`; +const cdnImageUrlBuilder = ( + sizeSegment: string, + source: string, + path: string, + cdnIndex = 0, +): string => { + return `https://${buildConfig.get('urls').cdnUrls.at(cdnIndex)}/s-${storeHash}/images/stencil/${sizeSegment}/${source}/${path}`; }; /** @@ -23,10 +29,11 @@ const cdnImageUrlBuilder = (sizeSegment: string, source: string, path: string): * that the asset is invalidated when the storefront app is deployed. * * @param {string} path - The path of the content asset. + * @param {number} cdnIndex - The index of the CDN URL to use. Defaults to 0. * @returns {string} The full URL to the content asset. */ -export const contentAssetUrl = (path: string): string => { - return `https://${buildConfig.get('urls').cdnUrl}/s-${storeHash}/content/${path}`; +export const contentAssetUrl = (path: string, cdnIndex = 0): string => { + return `https://${buildConfig.get('urls').cdnUrls.at(cdnIndex)}/s-${storeHash}/content/${path}`; }; /** diff --git a/core/next.config.ts b/core/next.config.ts index 02f9b00eeb..604f2e90aa 100644 --- a/core/next.config.ts +++ b/core/next.config.ts @@ -34,11 +34,25 @@ const SettingsQuery = graphql(` async function writeSettingsToBuildConfig() { const { data } = await client.fetch({ document: SettingsQuery }); + const cdnEnvHostnames = process.env.NEXT_PUBLIC_BIGCOMMERCE_CDN_HOSTNAME; + + const cdnUrls = ( + cdnEnvHostnames + ? cdnEnvHostnames.split(',').map((s) => s.trim()) + : [data.site.settings?.url.cdnUrl] + ).filter((url): url is string => !!url); + + if (!cdnUrls.length) { + throw new Error( + 'No CDN URLs found. Please ensure that NEXT_PUBLIC_BIGCOMMERCE_CDN_HOSTNAME is set correctly.', + ); + } + return await writeBuildConfig({ locales: data.site.settings?.locales, urls: { ...data.site.settings?.url, - cdnUrl: process.env.NEXT_PUBLIC_BIGCOMMERCE_CDN_HOSTNAME ?? data.site.settings?.url.cdnUrl, + cdnUrls, }, }); } @@ -76,6 +90,11 @@ export default async (): Promise => { trailingSlash: process.env.TRAILING_SLASH !== 'false', // eslint-disable-next-line @typescript-eslint/require-await async headers() { + const cdnLinks = settings.urls.cdnUrls.map((url) => ({ + key: 'Link', + value: `; rel=preconnect`, + })); + return [ { source: '/(.*)', @@ -84,10 +103,7 @@ export default async (): Promise => { key: 'Content-Security-Policy', value: cspHeader.replace(/\n/g, ''), }, - { - key: 'Link', - value: `; rel=preconnect`, - }, + ...cdnLinks, ], }, ]; From f1c9c5a9516dad0e650488532b140d65e9c0d4b1 Mon Sep 17 00:00:00 2001 From: Hunter Garrett Date: Tue, 20 May 2025 14:20:28 -0400 Subject: [PATCH 09/86] fix: button disabled and loading styles (#2324) --- core/vibes/soul/primitives/button/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/vibes/soul/primitives/button/index.tsx b/core/vibes/soul/primitives/button/index.tsx index 7aab735348..9cb0a5927c 100644 --- a/core/vibes/soul/primitives/button/index.tsx +++ b/core/vibes/soul/primitives/button/index.tsx @@ -58,7 +58,7 @@ export function Button({ {...props} aria-busy={loading} className={clsx( - 'relative z-0 inline-flex h-fit cursor-pointer items-center justify-center overflow-hidden border text-center font-[family-name:var(--button-font-family,var(--font-family-body))] leading-normal font-semibold select-none after:absolute after:inset-0 after:-z-10 after:-translate-x-[105%] after:duration-300 after:[animation-timing-function:cubic-bezier(0,0.25,0,1)] focus-visible:ring-2 focus-visible:ring-[var(--button-focus,hsl(var(--primary)))] focus-visible:ring-offset-2 focus-visible:outline-hidden', + 'relative z-0 inline-flex h-fit cursor-pointer items-center justify-center overflow-hidden border text-center font-[family-name:var(--button-font-family,var(--font-family-body))] leading-normal font-semibold select-none after:absolute after:inset-0 after:-z-10 after:-translate-x-[105%] after:duration-300 after:[animation-timing-function:cubic-bezier(0,0.25,0,1)] focus-visible:ring-2 focus-visible:ring-[var(--button-focus,hsl(var(--primary)))] focus-visible:ring-offset-2 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-30', { primary: 'border-[var(--button-primary-border,hsl(var(--primary)))] bg-[var(--button-primary-background,hsl(var(--primary)))] text-[var(--button-primary-text,hsl(var(--foreground)))] after:bg-[var(--button-primary-background-hover,color-mix(in_oklab,hsl(var(--primary)),white_75%))]', @@ -78,10 +78,10 @@ export function Button({ circle: 'rounded-full after:rounded-full', }[shape], !loading && !disabled && 'hover:after:translate-x-0', - disabled && 'cursor-not-allowed opacity-30', + loading && 'pointer-events-none', className, )} - disabled={disabled || loading} + disabled={disabled} type={type} > Date: Thu, 22 May 2025 11:24:20 -0500 Subject: [PATCH 10/86] Fix public wishlist analytics/server error, fix public wishlist empty state label (#2331) --- .changeset/orange-items-report.md | 104 ++++++++++++++++++ .../(default)/wishlist/[token]/page.tsx | 52 +++++++-- core/messages/en.json | 3 +- .../soul/sections/wishlist-details/index.tsx | 5 + 4 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 .changeset/orange-items-report.md diff --git a/.changeset/orange-items-report.md b/.changeset/orange-items-report.md new file mode 100644 index 0000000000..cad8b9531b --- /dev/null +++ b/.changeset/orange-items-report.md @@ -0,0 +1,104 @@ +--- +"@bigcommerce/catalyst-core": patch +--- + +- Fix public wishlist analytics/server error +- Add translation key for a Publish Wishlist empty state + +## Migration + +### 1. Add the following imports to `core/app/[locale]/(default)/wishlist/[token]/page.tsx`: + +```tsx +import { removeEdgesAndNodes } from '@bigcommerce/catalyst-client'; +import { WishlistAnalyticsProvider } from '~/app/[locale]/(default)/account/wishlists/[id]/_components/wishlist-analytics-provider'; +``` + +### 2. Add the following function into the file: + +```tsx +const getAnalyticsData = async (token: string, searchParamsPromise: Promise) => { + const searchParamsParsed = searchParamsCache.parse(await searchParamsPromise); + const wishlist = await getPublicWishlist(token, searchParamsParsed); + + if (!wishlist) { + return []; + } + + return removeEdgesAndNodes(wishlist.items) + .map(({ product }) => product) + .filter((product) => product !== null) + .map((product) => { + return { + id: product.entityId, + name: product.name, + sku: product.sku, + brand: product.brand?.name ?? '', + price: product.prices?.price.value ?? 0, + currency: product.prices?.price.currencyCode ?? '', + }; + }); +}; +``` + +### 3. Wrap the component in the `WishlistAnalyticsProvider`: + +```tsx +export default async function PublicWishlist({ params, searchParams }: Props) { + // ... + return ( + getAnalyticsData(token, searchParams))}> + // ... + + ); +} +``` + +### 4. Update `/core/messages/en.json` "PublishWishlist" to have translations: + +```json + "PublicWishlist": { + "title": "Public Wish List", + "defaultName": "Public wish list", + "emptyWishlist": "This wish list doesn't have any products yet." + }, +``` + +### 5. Update `WishlistDetails` component to accept the `emptyStateText` and `placeholderCount` props: + +```tsx +// ... +export const WishlistDetails = ({ + className = '', + wishlist: streamableWishlist, + emptyStateText, + paginationInfo, + headerActions, + prevHref, + placeholderCount, + action, + removeAction, +}: Props) => { +``` + +### 6. Update `WishlistDetails` component to pass the `emptyStateText` and `placeholderCount` props to both the `WishlistDetailSkeleton` and `WishlistItems` components: + +```tsx + +``` + +```tsx + +``` diff --git a/core/app/[locale]/(default)/wishlist/[token]/page.tsx b/core/app/[locale]/(default)/wishlist/[token]/page.tsx index 77c59a8ca6..f1660235eb 100644 --- a/core/app/[locale]/(default)/wishlist/[token]/page.tsx +++ b/core/app/[locale]/(default)/wishlist/[token]/page.tsx @@ -1,3 +1,4 @@ +import { removeEdgesAndNodes } from '@bigcommerce/catalyst-client'; import { Metadata } from 'next'; import { notFound } from 'next/navigation'; import { getFormatter, getTranslations, setRequestLocale } from 'next-intl/server'; @@ -10,6 +11,7 @@ import { Breadcrumb, Breadcrumbs } from '@/vibes/soul/sections/breadcrumbs'; import { SectionLayout } from '@/vibes/soul/sections/section-layout'; import { Wishlist, WishlistDetails } from '@/vibes/soul/sections/wishlist-details'; import { addWishlistItemToCart } from '~/app/[locale]/(default)/account/wishlists/[id]/_actions/add-to-cart'; +import { WishlistAnalyticsProvider } from '~/app/[locale]/(default)/account/wishlists/[id]/_components/wishlist-analytics-provider'; import { ExistingResultType } from '~/client/util'; import { WishlistShareButton, @@ -74,6 +76,29 @@ export async function generateMetadata({ params, searchParams }: Props): Promise }; } +const getAnalyticsData = async (token: string, searchParamsPromise: Promise) => { + const searchParamsParsed = searchParamsCache.parse(await searchParamsPromise); + const wishlist = await getPublicWishlist(token, searchParamsParsed); + + if (!wishlist) { + return []; + } + + return removeEdgesAndNodes(wishlist.items) + .map(({ product }) => product) + .filter((product) => product !== null) + .map((product) => { + return { + id: product.entityId, + name: product.name, + sku: product.sku, + brand: product.brand?.name ?? '', + price: product.prices?.price.value ?? 0, + currency: product.prices?.price.currencyCode ?? '', + }; + }); +}; + async function getBreadcrumbs( token: string, searchParams: Promise, @@ -94,6 +119,7 @@ export default async function PublicWishlist({ params, searchParams }: Props) { setRequestLocale(locale); const t = await getTranslations('Wishlist'); + const pwt = await getTranslations('PublicWishlist'); const pt = await getTranslations('Product.ProductDetails'); const wishlistActions = (wishlist?: Wishlist) => { if (!wishlist) { @@ -130,17 +156,19 @@ export default async function PublicWishlist({ params, searchParams }: Props) { }; return ( - - getBreadcrumbs(token, searchParams))} /> - - getPaginationInfo(token, searchParams))} - wishlist={Streamable.from(() => getWishlist(token, t, pt, searchParams))} - /> - + getAnalyticsData(token, searchParams))}> + + getBreadcrumbs(token, searchParams))} /> + + getPaginationInfo(token, searchParams))} + wishlist={Streamable.from(() => getWishlist(token, t, pt, searchParams))} + /> + + ); } diff --git a/core/messages/en.json b/core/messages/en.json index 045b9f6051..f0311f13f7 100644 --- a/core/messages/en.json +++ b/core/messages/en.json @@ -249,7 +249,8 @@ }, "PublicWishlist": { "title": "Public Wish List", - "defaultName": "Public wish list" + "defaultName": "Public wish list", + "emptyWishlist": "This wish list doesn't have any products yet." }, "Blog": { "title": "Blog", diff --git a/core/vibes/soul/sections/wishlist-details/index.tsx b/core/vibes/soul/sections/wishlist-details/index.tsx index 6103011ce0..f22f6e8f55 100644 --- a/core/vibes/soul/sections/wishlist-details/index.tsx +++ b/core/vibes/soul/sections/wishlist-details/index.tsx @@ -46,9 +46,11 @@ interface Props { export const WishlistDetails = ({ className = '', wishlist: streamableWishlist, + emptyStateText, paginationInfo, headerActions, prevHref, + placeholderCount, action, removeAction, }: Props) => { @@ -58,6 +60,7 @@ export const WishlistDetails = ({ } @@ -87,7 +90,9 @@ export const WishlistDetails = ({ From 5525a96a6884282aa1438c55dfb46f7bbf7e03b8 Mon Sep 17 00:00:00 2001 From: Hunter Garrett Date: Thu, 22 May 2025 14:21:29 -0400 Subject: [PATCH 11/86] feat: decouple Select from forms with new SelectField component (#2326) --- .../(default)/account/addresses/page.tsx | 2 +- .../app/[locale]/(default)/account/layout.tsx | 8 +- .../(default)/webpages/[id]/contact/page.tsx | 2 + .../form-field-transformer/index.ts | 2 +- core/vibes/soul/form/dynamic-form/index.tsx | 4 +- core/vibes/soul/form/dynamic-form/schema.ts | 2 +- core/vibes/soul/form/select-field/index.tsx | 69 ++++++ core/vibes/soul/form/select/index.tsx | 202 ------------------ core/vibes/soul/primitives/select/index.tsx | 197 +++++++++++++++++ .../sections/cart/shipping-form/index.tsx | 10 +- .../product-detail/product-detail-form.tsx | 4 +- .../soul/sections/product-detail/schema.ts | 2 +- .../products-list-section/sorting.tsx | 4 +- .../sidebar-menu/sidebar-menu-select.tsx | 4 +- 14 files changed, 289 insertions(+), 223 deletions(-) create mode 100644 core/vibes/soul/form/select-field/index.tsx delete mode 100644 core/vibes/soul/form/select/index.tsx create mode 100644 core/vibes/soul/primitives/select/index.tsx diff --git a/core/app/[locale]/(default)/account/addresses/page.tsx b/core/app/[locale]/(default)/account/addresses/page.tsx index a4b3f4b470..a3d5f5bfe3 100644 --- a/core/app/[locale]/(default)/account/addresses/page.tsx +++ b/core/app/[locale]/(default)/account/addresses/page.tsx @@ -110,7 +110,7 @@ export default async function Addresses({ params, searchParams }: Props) { createLabel={t('create')} deleteLabel={t('delete')} editLabel={t('edit')} - fields={[...fields, { name: 'id', type: 'hidden' }]} + fields={[...fields, { name: 'id', type: 'hidden', label: 'ID' }]} setDefaultLabel={t('setDefault')} showAddFormLabel={t('cta')} title={t('title')} diff --git a/core/app/[locale]/(default)/account/layout.tsx b/core/app/[locale]/(default)/account/layout.tsx index 210c81ec4b..5aa581dd47 100644 --- a/core/app/[locale]/(default)/account/layout.tsx +++ b/core/app/[locale]/(default)/account/layout.tsx @@ -20,10 +20,10 @@ export default async function Layout({ children, params }: Props) { sidebar={ diff --git a/core/app/[locale]/(default)/webpages/[id]/contact/page.tsx b/core/app/[locale]/(default)/webpages/[id]/contact/page.tsx index fb2e8b6d85..6a9eda0fd7 100644 --- a/core/app/[locale]/(default)/webpages/[id]/contact/page.tsx +++ b/core/app/[locale]/(default)/webpages/[id]/contact/page.tsx @@ -111,6 +111,7 @@ async function getContactFields(id: string) { id: 'pageId', name: 'pageId', type: 'hidden', + label: 'Page ID', defaultValue: String(entityId), }; @@ -119,6 +120,7 @@ async function getContactFields(id: string) { id: 'pagePath', name: 'pagePath', type: 'hidden', + label: 'Page Path', defaultValue: path, }; diff --git a/core/data-transformers/form-field-transformer/index.ts b/core/data-transformers/form-field-transformer/index.ts index 9639f3a9ea..a79c2f4fce 100644 --- a/core/data-transformers/form-field-transformer/index.ts +++ b/core/data-transformers/form-field-transformer/index.ts @@ -123,7 +123,7 @@ export const fieldToFieldNameTransformer = (field: Field): Field => { return { ...field, - name: name ?? field.label ?? field.name, + name: name ?? (field.label || field.name), }; }; diff --git a/core/vibes/soul/form/dynamic-form/index.tsx b/core/vibes/soul/form/dynamic-form/index.tsx index ad225c3138..477fe8c018 100644 --- a/core/vibes/soul/form/dynamic-form/index.tsx +++ b/core/vibes/soul/form/dynamic-form/index.tsx @@ -24,7 +24,7 @@ import { FormStatus } from '@/vibes/soul/form/form-status'; import { Input } from '@/vibes/soul/form/input'; import { NumberInput } from '@/vibes/soul/form/number-input'; import { RadioGroup } from '@/vibes/soul/form/radio-group'; -import { Select } from '@/vibes/soul/form/select'; +import { SelectField } from '@/vibes/soul/form/select-field'; import { SwatchRadioGroup } from '@/vibes/soul/form/swatch-radio-group'; import { Textarea } from '@/vibes/soul/form/textarea'; import { Button, ButtonProps } from '@/vibes/soul/primitives/button'; @@ -263,7 +263,7 @@ function DynamicFormField({ case 'select': return ( - + {errors?.map((error) => ( + + {error} + + ))} + + ); +} diff --git a/core/vibes/soul/form/select/index.tsx b/core/vibes/soul/form/select/index.tsx deleted file mode 100644 index 9581e17ded..0000000000 --- a/core/vibes/soul/form/select/index.tsx +++ /dev/null @@ -1,202 +0,0 @@ -'use client'; - -import * as SelectPrimitive from '@radix-ui/react-select'; -import { clsx } from 'clsx'; -import { ChevronDown, ChevronUp } from 'lucide-react'; -import * as React from 'react'; - -import { FieldError } from '@/vibes/soul/form/field-error'; -import { Label } from '@/vibes/soul/form/label'; - -type Props = { - colorScheme?: 'light' | 'dark'; - id?: string; - name: string; - pending?: boolean; - placeholder?: string; - label?: string; - hideLabel?: boolean; - variant?: 'round' | 'rectangle'; - options: Array<{ label: string; value: string }>; - className?: string; - errors?: string[]; - onFocus?: (e: React.FocusEvent) => void; - onBlur?: (e: React.FocusEvent) => void; - onOptionMouseEnter?: (value: string) => void; -} & React.ComponentPropsWithoutRef; - -// eslint-disable-next-line valid-jsdoc -/** - * This component supports various CSS variables for theming. Here's a comprehensive list, along - * with their default values: - * - * ```css - * :root { - * --select-light-trigger-background: hsl(var(--white)); - * --select-light-trigger-border: hsl(var(--contrast-100)); - * --select-light-trigger-border-hover: hsl(var(--contrast-300)); - * --select-light-trigger-border-error: hsl(var(--error)); - * --select-light-trigger-text: hsl(var(--foreground)); - * --select-light-trigger-focus: hsl(var(--primary)); - * --select-light-icon: hsl(var(--foreground)); - * --select-light-content-background: hsl(var(--background)); - * --select-light-item-background-hover: hsl(var(--contrast-100)); - * --select-light-item-background-focus: hsl(var(--contrast-100)); - * --select-light-item-text: hsl(var(--contrast-400)); - * --select-light-item-text-hover: hsl(var(--foreground)); - * --select-light-item-text-focus: hsl(var(--foreground)); - * --select-light-item-checked-text-focus: hsl(var(--foreground)); - * --select-dark-trigger-background: hsl(var(--black)); - * --select-dark-trigger-border: hsl(var(--contrast-500)); - * --select-dark-trigger-border-hover: hsl(var(--contrast-300)); - * --select-dark-trigger-border-error: hsl(var(--error)); - * --select-dark-trigger-text: hsl(var(--background)); - * --select-dark-trigger-focus: hsl(var(--primary)); - * --select-dark-icon: hsl(var(--background)); - * --select-dark-content-background: hsl(var(--foreground)); - * --select-dark-item-background-hover: hsl(var(--contrast-500)); - * --select-dark-item-background-focus: hsl(var(--contrast-500)); - * --select-dark-item-text: hsl(var(--contrast-200)); - * --select-dark-item-text-hover: hsl(var(--background)); - * --select-dark-item-text-focus: hsl(var(--background)); - * --select-dark-item-checked-text-focus: hsl(var(--background)); - * } - * ``` - */ -export function Select({ - colorScheme = 'light', - label, - hideLabel = false, - name, - pending = false, - placeholder = 'Select an item', - variant = 'rectangle', - options, - className, - errors, - onFocus, - onBlur, - onOptionMouseEnter, - value, - ...rest -}: Props) { - const id = React.useId(); - - return ( -
- {label !== undefined && label !== '' && ( - - )} - - 0 - ? 'border-[var(--select-light-trigger-border-error,hsl(var(--error)))]' - : 'border-[var(--select-light-trigger-border,hsl(var(--contrast-100)))]', - dark: - errors && errors.length > 0 - ? 'border-[var(--select-dark-trigger-border-error,hsl(var(--error)))]' - : 'border-[var(--select-dark-trigger-border,hsl(var(--contrast-500)))]', - }[colorScheme], - )} - data-pending={pending ? true : null} - id={id} - onBlur={onBlur} - onFocus={onFocus} - > - - - - - - - - - - - - {options.map((option) => ( - { - onOptionMouseEnter?.(option.value); - }} - value={option.value} - > - {option.label} - - ))} - - - - - - - - {errors?.map((error) => ( - - {error} - - ))} -
- ); -} diff --git a/core/vibes/soul/primitives/select/index.tsx b/core/vibes/soul/primitives/select/index.tsx new file mode 100644 index 0000000000..ddd33a47be --- /dev/null +++ b/core/vibes/soul/primitives/select/index.tsx @@ -0,0 +1,197 @@ +'use client'; + +import * as SelectPrimitive from '@radix-ui/react-select'; +import { clsx } from 'clsx'; +import { ChevronDown, ChevronUp } from 'lucide-react'; +import { type ComponentPropsWithoutRef } from 'react'; + +export type SelectProps = ComponentPropsWithoutRef & + ComponentPropsWithoutRef & { + colorScheme?: 'light' | 'dark'; + id?: string; + pending?: boolean; + placeholder?: string; + label?: string; + variant?: 'round' | 'rectangle'; + options: Array<{ label: string; value: string }>; + onFocus?: (e: React.FocusEvent) => void; + onBlur?: (e: React.FocusEvent) => void; + onOptionMouseEnter?: (value: string) => void; + errors?: string[]; + }; + +// eslint-disable-next-line valid-jsdoc +/** + * This component supports various CSS variables for theming. Here's a comprehensive list, along + * with their default values: + * + * ```css + * :root { + * --select-light-trigger-background: hsl(var(--white)); + * --select-light-trigger-border: hsl(var(--contrast-100)); + * --select-light-trigger-border-hover: hsl(var(--contrast-300)); + * --select-light-trigger-border-error: hsl(var(--error)); + * --select-light-trigger-text: hsl(var(--foreground)); + * --select-light-trigger-focus: hsl(var(--primary)); + * --select-light-icon: hsl(var(--foreground)); + * --select-light-content-background: hsl(var(--background)); + * --select-light-item-background-hover: hsl(var(--contrast-100)); + * --select-light-item-background-focus: hsl(var(--contrast-100)); + * --select-light-item-text: hsl(var(--contrast-400)); + * --select-light-item-text-hover: hsl(var(--foreground)); + * --select-light-item-text-focus: hsl(var(--foreground)); + * --select-light-item-checked-text-focus: hsl(var(--foreground)); + * --select-dark-trigger-background: hsl(var(--black)); + * --select-dark-trigger-border: hsl(var(--contrast-500)); + * --select-dark-trigger-border-hover: hsl(var(--contrast-300)); + * --select-dark-trigger-border-error: hsl(var(--error)); + * --select-dark-trigger-text: hsl(var(--background)); + * --select-dark-trigger-focus: hsl(var(--primary)); + * --select-dark-icon: hsl(var(--background)); + * --select-dark-content-background: hsl(var(--foreground)); + * --select-dark-item-background-hover: hsl(var(--contrast-500)); + * --select-dark-item-background-focus: hsl(var(--contrast-500)); + * --select-dark-item-text: hsl(var(--contrast-200)); + * --select-dark-item-text-hover: hsl(var(--background)); + * --select-dark-item-text-focus: hsl(var(--background)); + * --select-dark-item-checked-text-focus: hsl(var(--background)); + * } + * ``` + */ +export function Select({ + value, + name, + id, + required = false, + pending = false, + colorScheme = 'light', + disabled, + label, + placeholder = 'Select an item', + variant = 'rectangle', + position = 'popper', + side = 'bottom', + sideOffset = 6, + onFocus, + onBlur, + onOptionMouseEnter, + onValueChange, + errors, + options, +}: SelectProps) { + return ( + + 0 + ? 'border-[var(--select-light-trigger-border-error,hsl(var(--error)))]' + : 'border-[var(--select-light-trigger-border,hsl(var(--contrast-100)))]', + dark: + errors && errors.length > 0 + ? 'border-[var(--select-dark-trigger-border-error,hsl(var(--error)))]' + : 'border-[var(--select-dark-trigger-border,hsl(var(--contrast-500)))]', + }[colorScheme], + )} + data-pending={pending ? true : null} + id={id} + onBlur={onBlur} + onFocus={onFocus} + > + + + + + + + + + + + + {options.map((option) => ( + { + onOptionMouseEnter?.(option.value); + }} + value={option.value} + > + {option.label} + + ))} + + + + + + + + ); +} diff --git a/core/vibes/soul/sections/cart/shipping-form/index.tsx b/core/vibes/soul/sections/cart/shipping-form/index.tsx index b3f50d33ea..4743b6831c 100644 --- a/core/vibes/soul/sections/cart/shipping-form/index.tsx +++ b/core/vibes/soul/sections/cart/shipping-form/index.tsx @@ -16,7 +16,7 @@ import { FormStatus } from '@/vibes/soul/form/form-status'; import { Input } from '@/vibes/soul/form/input'; import { Label } from '@/vibes/soul/form/label'; import { RadioGroup } from '@/vibes/soul/form/radio-group'; -import { Select } from '@/vibes/soul/form/select'; +import { SelectField } from '@/vibes/soul/form/select-field'; import { Button } from '@/vibes/soul/primitives/button'; import { shippingActionFormDataSchema } from '../schema'; @@ -267,7 +267,7 @@ export function ShippingForm({ className={clsx('mt-4 space-y-4', { hidden: !showAddressForm })} > {Array.isArray(countries) ? ( -
{Array.isArray(states) ? ( - }) { @@ -9,11 +9,11 @@ export function SidebarMenuSelect({ links }: { links: Array<{ href: string; labe return (