> ## Documentation Index
> Fetch the complete documentation index at: https://swish.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Translations

> Customize or translate any text in the Swish UI by overriding translation keys.

Every text string in the Swish UI can be customized or translated. Pass overrides under `translations`, keyed by language code.

```js theme={null}
window.SwishOptions = {
  translations: {
    en: {
      "saveButton.save": "Add to Wishlist",
      "saveButton.saved": "Wishlisted",
      "drawer.home.emptyCalloutTitle": "Your wishlist is empty",
    },
  },
};
```

Swish ships with several built-in locales and loads the one matching your storefront's active language, falling back to English when a language isn't built in. Your overrides are merged on top of the loaded locale, so you only need to specify the keys you want to change.

## In the customiser

**Global → Translations** lists your store's languages: your default language first, then each language you sell in, marked **Translated** or **Needs translation**. Open a language to change its text line by line, grouped by where customers see it, with the English beside each line. A line you leave empty keeps Swish's own text, which is English for a language Swish doesn't include. Search finds a line in any area, and **Products → Product option names** gives a product option such as Size its own name (see [Variant option labels](#variant-option-labels)).

Your changes reach your storefront when you save. The customiser's preview doesn't show them yet. A `translations` block set in your theme's `window.SwishOptions` takes precedence over what you save here.

## Built-in languages

Swish includes translations for the following languages:

| Language | Code |
| - | - |
| English | `en` |
| German | `de` |
| Finnish | `fi` |
| Russian | `ru` |
| Swedish | `sv` |
| Polish | `pl` |

> [!NOTE]
>
> Missing a language? Email [support@swish.app](mailto:support@swish.app) and we'll add it.

## Languages Swish doesn't include

To translate Swish into a language it doesn't include, add that language's code to `translations`. Customers who browse in that language see your translations, and English for any key you leave out - including your own `en` overrides.

```js theme={null}
window.SwishOptions = {
  translations: {
    en: { "saveButton.save": "Add to Wishlist" },
    fr: { "saveButton.save": "Ajouter à ma liste" },
  },
};
```

Use your storefront's language code in lower case. Portuguese and Chinese keep their region after an underscore: `pt_br`, `pt_pt`, `zh_cn` and `zh_tw`. Every other language uses its two-letter code, so `fr` covers both `fr` and `fr-CA` storefronts.

## Translation keys

Keys use dot notation matching the nested structure of the locale file. For example, the nested object `saveButton.save` maps to the key `"saveButton.save"`.

## Variant option labels

Product variant option labels (e.g. `Size`, `Color`) come from Shopify and are
shown as-is. To translate or rename one, add an override under the `optionName.`
prefix, followed by the **exact option name as set in your Shopify admin**. The
key is case-sensitive, so `optionName.Size` and `optionName.size` are different
keys.

```js theme={null}
translations: {
  pl: {
    "optionName.Size": "Rozmiar",
    "optionName.Color": "Kolor",
  },
}
```

This applies everywhere the label appears - the option header, the "select
option" prompts, and product card variant labels. Without an override the
original Shopify name is shown.

## Interpolation

Some strings include `{{placeholder}}` tokens that are replaced with dynamic values at runtime. Keep these tokens in your overrides - removing them will cause the dynamic value to be missing.

```js theme={null}
// Original: "Add to {{listName}}"
// Override with placeholder preserved:
"drawer.addListItems.title": "Hinzufügen zu {{listName}}"
```

## Pluralization

Strings that vary by count use `One` and `Other` suffixes. The SDK selects the correct form based on the `count` value: `One` when the count is exactly 1, `Other` for everything else.

```js theme={null}
translations: {
  en: {
    "drawer.lists.numItemsOne": "{{count}} item",
    "drawer.lists.numItemsOther": "{{count}} items",
  },
}
```

## Translation key reference

### Saves

| Key | Default |
| - | - |
| `saves.myLists` | Your Lists |
| `saves.forYouLists` | Smart Lists |
| `saves.allItems` | All Items |

### Save button

| Key | Default |
| - | - |
| `saveButton.save` | Save item |
| `saveButton.unsave` | Unsave item |
| `saveButton.saved` | Item saved |

### Buy buttons

| Key | Default |
| - | - |
| `buyButtons.addToCart` | Add to Cart |
| `buyButtons.addingToCart` | Adding to Cart |
| `buyButtons.addedToCart` | In Cart |
| `buyButtons.addToCartError` | Failed to add to Cart |
| `buyButtons.soldOut` | Sold Out |
| `buyButtons.quickBuy` | Quick Buy |
| `buyButtons.notifyMe` | Notify me when available |

`buyButtons.notifyMe` labels the [Notify Me](https://swish.app/docs/guides/customize/placements/product-detail.md#notify-me-button) button — the placed one on your own product page, and the one that stands in for "Sold Out" inside Swish's drawer product detail and quick buy.

### Notify me

The back-in-stock signup dialog.

| Key | Default |
| - | - |
| `notifyMe.title` | Notify Me |
| `notifyMe.description` | Get a notification as soon as this product is back in stock by signing up below! |
| `notifyMe.emailLabel` | Enter your email |
| `notifyMe.submit` | Notify me when available |
| `notifyMe.success.title` | You're on the list |
| `notifyMe.success.description` | We'll email you as soon as this is back in stock. |
| `notifyMe.success.done` | Done |
| `notifyMe.invalidEmail` | Enter a valid email address |
| `notifyMe.error` | Something went wrong. Please try again. |

### Toasts

These strings appear in toast notifications triggered by SDK actions.

| Key | Default |
| - | - |
| `toast.saved` | Saved |
| `toast.addToList` | Add to List |
| `toast.view` | View |
| `toast.linkCopied` | Link copied |
| `toast.listNowPublic` | List is now public |
| `toast.listNowPrivate` | List is now private |
| `toast.saveForLaterTitle` | Save this for later? |
| `toast.saveForLater` | Save for later |
| `toast.savedForLater` | We've saved this for you |
| `toast.alreadySaved` | You've already saved this |
| `toast.undo` | Undo save |
| `toast.productThumbnail` | Product thumbnail |

### Variant select

| Key | Default |
| - | - |
| `variantSelect.title` | Save |
| `variantSelect.save` | Save |
| `variantSelect.selectOptions` | Select options |
| `variantSelect.selectOption` | Select \{\{optionName}} |

### List select

| Key | Default |
| - | - |
| `listSelect.title` | Saved |
| `listSelect.subtitle` | Lists |
| `listSelect.save` | Save |
| `listSelect.createNewList` | Create new list |
| `listSelect.unsave` | Unsave item |

### List editor

| Key | Default |
| - | - |
| `listEditor.create.title` | Create new list |
| `listEditor.create.listName` | Enter list name |
| `listEditor.create.save` | Save |
| `listEditor.edit.title` | Edit list |
| `listEditor.edit.listName` | Enter list name |
| `listEditor.edit.save` | Save |

### List menu

| Key | Default |
| - | - |
| `listMenu.title` | List menu |
| `listMenu.edit` | Edit name |
| `listMenu.delete` | Delete list |
| `listMenu.addItems` | Add items |
| `listMenu.share` | Share list |
| `listMenu.cancel` | Cancel |
| `listMenu.public.title` | Make list public |
| `listMenu.public.description` | A public list can be viewed by anyone with a shared link. |
| `listMenu.public.text` | Make public |
| `listMenu.private.title` | Make list private |
| `listMenu.private.description` | A private list can only be viewed by you. |
| `listMenu.private.text` | Make private |

### Delete list alert

| Key | Default |
| - | - |
| `deleteListAlert.title` | Delete list? |
| `deleteListAlert.description` | Any items in this list remain saved. |
| `deleteListAlert.confirm` | Delete |
| `deleteListAlert.cancel` | Cancel |

### Unsave alert

| Key | Default |
| - | - |
| `unsaveAlert.title` | Unsave item? |
| `unsaveAlert.description` | Unsaving this item will remove it from all lists. |
| `unsaveAlert.confirm` | Unsave |
| `unsaveAlert.cancel` | Cancel |
| `unsaveAlert.error` | Failed to unsave item |

### Save for later alert

Shown before a removed cart item is saved when [`intents.saveCartLine.confirm`](https://swish.app/docs/guides/features/save-from-cart) is `"dialog"`.

| Key | Default |
| - | - |
| `saveForLaterAlert.title` | Save this for later? |
| `saveForLaterAlert.description` | You removed this from your cart. Save it to find it again later. |
| `saveForLaterAlert.confirm` | Save for later |
| `saveForLaterAlert.cancel` | No thanks |

### Sign in

| Key | Default |
| - | - |
| `signIn.title` | Sign In |
| `signIn.description` | Sign in to your account to access your saved items and shopping history across all devices. |
| `signIn.continue` | Continue |

`signIn.description` is what the home, [saves](https://swish.app/docs/guides/customize/views/saves.md) and [lists](https://swish.app/docs/guides/customize/views/lists.md) views fall back to when their `sign-in` section carries no `options.message`. Overriding the key changes all three; set `message` per view to differ between them. A `message` may itself be a `t:`-prefixed key, so per-view copy can be translated too.

### Drawer header

Screen-reader labels for the drawer header's icon-only account and close
buttons, and its greeting. The close button shows when the header section's
`useCloseButton` option is on, and the greeting when its `headerStyle` is
`"greeting"`. See [Drawer](https://swish.app/docs/guides/customize/views/drawer.md).

| Key | Default |
| - | - |
| `accountButton.label` | Account |
| `drawerHeader.close` | Close |
| `drawerHeader.greeting` | Hi, \{\{firstName}} |
| `drawerHeader.guestGreeting` | Welcome |

`drawerHeader.guestGreeting` is what a guest sees when the header section's
`guestGreeting` is empty.

### Drawer - Home

| Key | Default |
| - | - |
| `drawer.home.emptyCalloutTitle` | No saved items |
| `drawer.home.emptyCalloutText` | Tap the heart icon on any item to save it. |
| `drawer.home.emptyCalloutSignIn` | Sign in |
| `drawer.home.emptyCalloutShopping` | Go shopping |
| `drawer.home.miniMenu.contactUs` | Contact Us |
| `drawer.home.miniMenu.shipping` | Shipping |
| `drawer.home.miniMenu.returns` | Returns |
| `drawer.home.miniMenu.faqs` | FAQs |

The `miniMenu` keys are the preset titles offered for [Home mini-menu links](https://swish.app/docs/guides/customize/views/home.md). A link whose `title` is one of these keys follows the shopper's language; any other `title` renders verbatim.

### Drawer - Product detail

| Key | Default |
| - | - |
| `drawer.productDetail.errorLoadingProduct` | Error loading product |
| `drawer.productDetail.productNotFound` | Product not found |
| `drawer.productDetail.productNotFoundDescription` | The product you're looking for doesn't exist or has been removed. |
| `drawer.productDetail.description` | Description |
| `drawer.productDetail.viewProduct` | View Product |
| `drawer.productDetail.selectOptions` | Select options |
| `drawer.productDetail.selectOption` | Select \{\{optionName}} |
| `drawer.productDetail.readMore` | Read more |
| `drawer.productDetail.showLess` | Show less |

### Drawer - Lists

| Key | Default |
| - | - |
| `drawer.lists.title` | Your Lists |
| `drawer.lists.createList` | Create list |
| `drawer.lists.numItemsOne` | \{\{count}} item |
| `drawer.lists.numItemsOther` | \{\{count}} items |
| `drawer.lists.viewAll` | View All |

### Drawer - List detail

| Key | Default |
| - | - |
| `drawer.listDetail.allItems` | Wishlist |
| `drawer.listDetail.saved` | Saved |
| `drawer.listDetail.listUnavailable` | List unavailable |
| `drawer.listDetail.addItems` | Add Items |
| `drawer.listDetail.expand` | Expand view |
| `drawer.listDetail.collapse` | Collapse view |

### Drawer - Add list items

| Key | Default |
| - | - |
| `drawer.addListItems.title` | Add to \{\{listName}} |
| `drawer.addListItems.cancel` | Cancel |
| `drawer.addListItems.close` | Close |
| `drawer.addListItems.errorAddingItems` | Failed to add items to list |
| `drawer.addListItems.errorLoadingItems` | Failed to load saved items. Please try again. |
| `drawer.addListItems.noSavedItems` | No saved items to add. Save some products first! |
| `drawer.addListItems.allItemsInList` | All saved items are already in this list. |
| `drawer.addListItems.done` | Done |

### Drawer - Notifications

| Key | Default |
| - | - |
| `drawer.notifications.title` | Notifications |
| `drawer.notifications.signInTitle` | Sign In |
| `drawer.notifications.signInDescription` | Sign up or log in to your account to access your saved items, orders and more. |
| `drawer.notifications.markAllRead` | Mark all as read |
| `drawer.notifications.priceDropSuffixWithPrice` | is now \{\{price}} |
| `drawer.notifications.backInStockSuffix` | is available again |
| `drawer.notifications.lowInStockSuffix` | is low in stock |
| `drawer.notifications.priceDrop` | Price drop |
| `drawer.notifications.backInStock` | Back in stock |
| `drawer.notifications.lowInStock` | Low stock |

### Drawer - Orders

| Key | Default |
| - | - |
| `drawer.orders.title` | Orders |
| `drawer.orders.descriptionOne` | \{\{status}} • \{\{count}} items • \{\{totalPrice}} |
| `drawer.orders.descriptionOther` | \{\{status}} • \{\{count}} items • \{\{totalPrice}} |
| `drawer.orders.signInTitle` | Sign In |
| `drawer.orders.signInDescription` | Sign up or log in to your account to access your saved items, orders and more. |
| `drawer.orders.noOrders` | No orders found |
| `drawer.orders.noOrdersDescription` | Orders you place will show up here. |

### Drawer - Order detail

| Key | Default |
| - | - |
| `drawer.orderDetail.title` | Order \{\{orderName}} |
| `drawer.orderDetail.orderAgain` | Order Again |
| `drawer.orderDetail.saveToList` | Save to List |
| `drawer.orderDetail.contactUs` | Contact Us |
| `drawer.orderDetail.buyAgain` | Buy Again |
| `drawer.orderDetail.descriptionOne` | \{\{count}} items • \{\{totalPrice}} • \{\{status}} |
| `drawer.orderDetail.descriptionOther` | \{\{count}} items • \{\{totalPrice}} • \{\{status}} |
| `drawer.orderDetail.unavailable` | Unavailable |
| `drawer.orderDetail.copyTrackingNumber` | Copy tracking number |
| `drawer.orderDetail.trackingCopied` | Tracking number copied |
| `drawer.orderDetail.openTrackingLink` | Open tracking link |
| `drawer.orderDetail.savedToListsTitle` | Saved to Lists |
| `drawer.orderDetail.savedToListsText` | Order \{\{orderName}} saved to lists |
| `drawer.orderDetail.createListError` | Failed to create list |
| `drawer.orderDetail.savedListName` | Order \{\{orderName}} |

### Drawer - Profile

| Key | Default |
| - | - |
| `drawer.profile.title` | Profile |
| `drawer.profile.signInTitle` | Sign In |
| `drawer.profile.signInDescription` | Sign up or log in to access your account to manage your notification preferences, address and more. |
| `drawer.profile.firstName` | First name |
| `drawer.profile.lastName` | Last name |
| `drawer.profile.email` | Email |
| `drawer.profile.birthdate` | Birthday (dd/mm/yyyy) |
| `drawer.profile.addressesOne` | Addresses (\{\{count}}) |
| `drawer.profile.addressesOther` | Addresses (\{\{count}}) |
| `drawer.profile.defaultAddress` | Default |
| `drawer.profile.addAddress` | Add Address |
| `drawer.profile.manageAddresses` | Manage Addresses |
| `drawer.profile.marketingConsentTitle` | Marketing consent |
| `drawer.profile.marketingConsent.email` | Email |
| `drawer.profile.marketingConsent.emailDescription` | Receive email about sale alerts and exclusive offers. |
| `drawer.profile.marketingConsent.sms` | SMS |
| `drawer.profile.marketingConsent.smsDescription` | Receive texts about launch alerts and offers. |
| `drawer.profile.notificationsTitle` | Notifications |
| `drawer.profile.notifications.priceDrop` | Price drop |
| `drawer.profile.notifications.priceDropDescription` | Know when your saved items drop in price. |
| `drawer.profile.notifications.backInStock` | Back in stock |
| `drawer.profile.notifications.backInStockDescription` | Know when your saved items are back in stock. |
| `drawer.profile.notifications.lowInStock` | Low in stock |
| `drawer.profile.notifications.lowInStockDescription` | Know when your saved items are low in stock. |
| `drawer.profile.save` | Save |
| `drawer.profile.signOut` | Sign out |

### Order status

| Key | Default |
| - | - |
| `drawer.orderStatus.completed` | Completed |
| `drawer.orderStatus.partially_fulfilled` | Partially delivered |
| `drawer.orderStatus.unfulfilled` | Not shipped |
| `drawer.orderStatus.attempted_delivery` | Attempted delivery |
| `drawer.orderStatus.canceled` | Canceled |
| `drawer.orderStatus.carrier_picked_up` | Carrier picked up |
| `drawer.orderStatus.confirmed` | Confirmed |
| `drawer.orderStatus.delivered` | Delivered |
| `drawer.orderStatus.failure` | Failure |
| `drawer.orderStatus.fulfilled` | Shipped |
| `drawer.orderStatus.in_transit` | In transit |
| `drawer.orderStatus.in_progress` | In progress |
| `drawer.orderStatus.marked_as_fulfilled` | Marked as shipped |
| `drawer.orderStatus.not_delivered` | Not delivered |
| `drawer.orderStatus.out_for_delivery` | Out for delivery |
| `drawer.orderStatus.picked_up` | Picked up |
| `drawer.orderStatus.ready_for_pickup` | Ready for pickup |
| `drawer.orderStatus.submitted` | Submitted |

### Order menu

| Key | Default |
| - | - |
| `orderMenu.title` | Order menu |
| `orderMenu.copyOrderNumber` | Copy order number |
| `orderMenu.orderNumberCopied` | Order number copied |
| `orderMenu.viewMoreInfo` | View more info |

### Product cards

| Key | Default |
| - | - |
| `productCard.badges.sale` | On Sale |
| `productCard.badges.soldOut` | Sold Out |
| `productCard.badges.lowStock` | Low in Stock |
| `productCard.imageToggle` | Alternate view |
| `productOptions.soldOut` | Sold Out |
| `productOptions.selectPlaceholder` | Select an option |

### Product recommendations

| Key | Default |
| - | - |
| `productRecommendations.relatedTitle` | You may also like |
| `productRecommendations.complementaryTitle` | Pair it with |

### Smart lists

| Key | Default |
| - | - |
| `smartLists.recentlyViewed` | Recently Viewed |
| `smartLists.savedFromCart` | Saved From Cart |

### Sections

| Key | Default |
| - | - |
| `savedItemsSection.title` | Saved Items |
| `savedItemsSection.emptyState` | No saved items |
| `savedFromCartSection.title` | Saved From Cart |
| `savedFromCartSection.emptyState` | No saved items from cart yet. |
| `recentlyViewedSection.title` | Recently Viewed |
| `recentlyViewedSection.emptyState` | No recently viewed items. |

### Navigation

| Key | Default |
| - | - |
| `drawerNavigation.home` | For You |
| `drawerNavigation.lists` | Lists |
| `drawerNavigation.notifications` | Notifications |
| `drawerNavigation.chat` | Chat |
| `drawerNavigation.orders` | Orders |
| `drawerNavigation.profile` | Profile |
| `drawerNavigation.saves` | Saves |

### Since last visit callout

| Key | Default |
| - | - |
| `sinceLastVisitCallout.title` | Unread notifications |
| `sinceLastVisitCallout.priceDropOne` | \{\{countLabel}} of your saved item has gone on sale |
| `sinceLastVisitCallout.priceDropOther` | \{\{countLabel}} of your saved items have gone on sale |
| `sinceLastVisitCallout.backInStockOne` | \{\{countLabel}} item is back in stock |
| `sinceLastVisitCallout.backInStockOther` | \{\{countLabel}} items are back in stock |
| `sinceLastVisitCallout.lowInStockOne` | \{\{countLabel}} item is low in stock |
| `sinceLastVisitCallout.lowInStockOther` | \{\{countLabel}} items are low in stock |

### Slider

The back and forward arrows on a slider, shown to shoppers on a mouse or
trackpad. Used as accessibility labels for screen readers.

| Key | Default |
| - | - |
| `slider.previous` | Show previous items |
| `slider.next` | Show next items |

### Other

| Key | Default |
| - | - |
| `errorBoundary.title` | Something went wrong. |
| `quantityInput.label` | Quantity |
| `toggle.label` | Toggle |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.