---
title: Predefined message keys
slug: experience/predefined-message-keys
docTags: 
createdAt: 2026-06-02T15:34:05.160Z
---

# Predefined message keys in PXP

The Purple experience uses a set of predefined message keys that allow you to customize all user-facing text in your app. Find a list below.&#x20;

## Bookmarks

Keys controlling the bookmarks feature - the list view, deletion dialogs, and creation date display.

| Key                                    | Default Value                                                     | Notes                                       |
| -------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------- |
| `APP_BAR_TITLE_BOOKMARKS`              | Bookmarks                                                         | Title in the app bar when viewing bookmarks |
| `BOOKMARKS_TITLE`                      | Your bookmarks                                                    | Page heading                                |
| `BOOKMARK_CREATION_DATE_MESSAGE`       | Added on %s                                                       | `%s` = formatted date string                |
| `BOOKMARK_PAGE_LABEL`                  | Page                                                              | Label prefix for page-level bookmarks       |
| `BOOKMARK_PAGE_LABEL_MESSAGE`          | Page %s                                                           | `%s` = page number                          |
| `BOOKMARK_NO_RESULTS`                  | There are no bookmarks.                                           | Empty state message                         |
| `BOOKMARK_ERROR`                       | Error loading bookmarks                                           | Error state heading                         |
| `BOOKMARK_ERROR_BUTTON`                | Reload                                                            | Button label for reload on error            |
| `BOOKMARK_CUSTOM_MESSAGE_SINGULAR`     | 1 bookmark                                                        | Count label - singular                      |
| `BOOKMARK_CUSTOM_MESSAGE_PLURAL`       | %s bookmarks                                                      | `%s` = count; used for 2 or more            |
| `ARTICLE_BOOKMARKS_TITLE`              | Articles                                                          | Section heading for article bookmarks       |
| `ARTICLE_BOOKMARKS_MESSAGE_SINGULAR`   | 1 article bookmarked                                              | Count label - singular                      |
| `ARTICLE_BOOKMARKS_MESSAGE_PLURAL`     | %s articles bookmarked                                            | `%s` = count                                |
| `BUTTON_DELETE_ALL_BOOKMARKS`          | Delete all bookmarks                                              | Button label                                |
| `BOOKMARK_DELETE_TITLE`                | Delete bookmark                                                   | Dialog title                                |
| `BOOKMARK_DELETE_MESSAGE`              | Are you sure you want to delete this bookmark?                    | Dialog body (no title known)                |
| `BOOKMARK_DELETE_MESSAGE_WITH_TITLE`   | Are you sure you want to delete the bookmark for "%s"?            | `%s` = bookmark title                       |
| `BOOKMARK_DELETE_All_TITLE`            | Delete bookmarks                                                  | Dialog title for bulk delete                |
| `BOOKMARK_DELETE_ALL_MESSAGE`          | Are you sure you want to delete all bookmarks?                    | Bulk delete dialog body                     |
| `BOOKMARK_DELETE_ALL_OF_ISSUE_MESSAGE` | Are you sure you want to delete all bookmarks for the issue "%s"? | `%s` = issue name                           |
| `BOOKMARK_DELETE_CANCEL`               | Cancel                                                            | Cancel button in delete dialog              |
| `BOOKMARK_DELETE_CONFIRM`              | Delete                                                            | Confirm button in delete dialog             |

## Issues and Downloads

Keys for the issue list, issue detail view, download dialogs, and update prompts.

| Key                                 | Default Value                                                                                         | Notes                                             |
| ----------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| `ISSUE_TITLE`                       | %s                                                                                                    | `%s` = issue title                                |
| `ISSUE_DESCRIPTION`                 | %s                                                                                                    | `%s` = issue description body                     |
| `ISSUE_DESCRIPTION_TOGGLE_EXPAND`   | more                                                                                                  | Expand toggle label                               |
| `ISSUE_DESCRIPTION_TOGGLE_COLLAPSE` | collapse                                                                                              | Collapse toggle label                             |
| `ISSUE_PUBLICATION_TITLE`           | %s                                                                                                    | `%s` = publication name                           |
| `ISSUE_MORE`                        | Read article                                                                                          | CTA button on issue tile                          |
| `ISSUE_NOT_FOUND`                   | The requested content could not be found.                                                             | 404 state                                         |
| `ISSUE_ERROR`                       | Error loading issue data                                                                              | Error state heading                               |
| `ISSUE_ERROR_BUTTON`                | Try again                                                                                             | Reload button                                     |
| `ISSUE_UPDATE_BADGE_MESSAGE`        | Update available                                                                                      | Badge text on issue tile                          |
| `ISSUE_UPDATE_TITLE`                | Update available                                                                                      | Dialog title                                      |
| `ISSUE_UPDATE_MESSAGE`              | A new version of this issue "%s" is available. Would you like to read the old version or the new one? | `%s` = issue name                                 |
| `ISSUE_UPDATE_OLD_VERSION`          | Read old version                                                                                      | Dialog button                                     |
| `ISSUE_UPDATE_NEW_VERSION`          | Read new version                                                                                      | Dialog button                                     |
| `ISSUE_DELETE_TITLE`                | Delete issue                                                                                          | Dialog title                                      |
| `ISSUE_DELETE_MESSAGE`              | Do you really want to delete the issue %s?                                                            | `%s` = issue name                                 |
| `ISSUE_DELETE_CONFIRM`              | Delete                                                                                                | Confirm button                                    |
| `ISSUE_DELETE_CANCEL`               | Cancel                                                                                                | Cancel button                                     |
| `ISSUE_DOWNLOAD_CONFIRM_TITLE`      | Download issue                                                                                        | Dialog title                                      |
| `ISSUE_DOWNLOAD_CONFIRM_MESSAGE`    | Downloading issue "%(issue.name)s"?                                                                   | `%(issue.name)s` = issue name (named placeholder) |
| `ISSUE_DOWNLOAD_CONFIRM_OK`         | OK                                                                                                    | Confirm button                                    |
| `ISSUE_DOWNLOAD_CONFIRM_CANCEL`     | Cancel                                                                                                | Cancel button                                     |
| `ISSUE_ACTION_READ`                 | Read                                                                                                  | Issue action button                               |
| `ISSUE_ACTION_DOWNLOAD`             | Download                                                                                              | Issue action button                               |
| `ISSUE_ACTION_DOWNLOADING`          | Downloading...                                                                                        | Issue action button (in progress state)           |
| `ISSUE_ACTION_PREVIEW`              | Preview                                                                                               | Issue action button                               |
| `ISSUE_ACTION_PURCHASE`             | Purchase for %s                                                                                       | `%s` = price string                               |
| `ISSUE_ACTION_PURCHASE_LOADING`     | Loading price...                                                                                      | Shown while price is fetched                      |
| `ISSUE_ACTION_PURCHASE_UNAVAILABLE` | Price not available                                                                                   | Shown when price cannot be retrieved              |
| `ISSUE_ACTION_SUBSCRIBE`            | Subscribe                                                                                             | Issue action button                               |
| `ISSUE_ACTION_LOGIN`                | Login                                                                                                 | Issue action button (requires login)              |
| `ISSUE_ACTION_COUPON`               | Coupon                                                                                                | Issue action button                               |
| `ISSUE_ACTION_CANCEL`               | Cancel                                                                                                | Issue action button                               |
| `ISSUE_ACTION_DELETE`               | Delete                                                                                                | Issue action button                               |
| `ISSUE_ACTION_DELETE_BOOKMARKS`     | Delete all for this issue                                                                             | Issue action button                               |

## Subscriptions

Keys for the subscription store screen, pricing display, and subscription management.

| Key                                              | Default Value                                         | Notes                                                                        |
| ------------------------------------------------ | ----------------------------------------------------- | ---------------------------------------------------------------------------- |
| `PUBLICATION_SUBSCRIPTIONS_TITLE`                | Subscriptions for                                     | Screen heading (publication name appended)                                   |
| `PUBLICATION_SUBSCRIPTIONS_HEADER`               | Introduction text regarding subscriptions             | Introductory text block - replace with your own copy                         |
| `PUBLICATION_SUBSCRIPTIONS_FOOTER`               | `<strong>Terms of use</strong> Terms of use go here`  | Footer HTML block - replace with your legal terms                            |
| `PUBLICATION_SUBSCRIPTIONS_MANAGE_SUBSCRIPTIONS` | Manage Subscriptions                                  | Link/button label                                                            |
| `PUBLICATION_SUBSCRIPTIONS_RESTORE_PURCHASES`    | Restore Purchases                                     | Button label                                                                 |
| `SUBSCRIPTION_TITLE`                             | %s                                                    | `%s` = subscription product name                                             |
| `SUBSCRIPTION_DESCRIPTION`                       | %s                                                    | `%s` = subscription description                                              |
| `SUBSCRIPTION_PRICE`                             | %s                                                    | `%s` = price string                                                          |
| `SUBSCRIPTION_ACTION_PURCHASE`                   | Purchase for %s                                       | `%s` = price string                                                          |
| `SUBSCRIPTION_ACTION_PURCHASE_UNAVAILABLE`       | Price not available                                   | Shown when price cannot be loaded                                            |
| `SUBSCRIPTION_PRICE_TRIAL`                       | Free for %1$s %2$s                                    | `%1$s` = duration number, `%2$s` = unit (e.g. days)                          |
| `SUBSCRIPTION_PRICE_DISCOUNT`                    | Try %1$s x %2$s %3$s for %4$s                         | `%1$s` = count, `%2$s` = duration, `%3$s` = unit, `%4$s` = discounted price  |
| `SUBSCRIPTION_PRICE_INTRODUCTORY`                | Try %1$s x %2$s %3$s for %4$s                         | Same placeholders as discount price                                          |
| `SUBSCRIPTION_PRICE_FINAL`                       | Then %1$s / %2$s %3$s                                 | `%1$s` = regular price, `%2$s` = duration, `%3$s` = unit                     |
| `SUBSCRIPTION_ISSUES_PROMOTION`                  | %1$s issues for %2$s.                                 | `%1$s` = issue count, `%2$s` = price                                         |
| `SUBSCRIPTION_ISSUES_ADDITIONAL_PROMOTION`       | %1$s issues for the price of %2$s. Was %3$s Now %4$s. | `%1$s` = count, `%2$s` = new price, `%3$s` = old price, `%4$s` = final price |
| `RESTORE_PURCHASES_BUTTON`                       | Restore purchases                                     | Button label (standalone)                                                    |
| `RESTORE_PURCHASES_TEASER`                       | Already a subscriber?                                 | Teaser text above restore button                                             |

## Vouchers and Coupon Codes

Keys for the voucher redemption screen.

| Key                                | Default Value                                                                  | Notes                                  |
| ---------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------- |
| `COUPON_TITLE`                     | Voucher                                                                        | Screen/section title                   |
| `COUPON_CODE_TITLE`                | Enter voucher code                                                             | Input field label                      |
| `COUPON_CODE_PLACEHOLDER`          | VOUCHER CODE                                                                   | Input placeholder text                 |
| `COUPON_SUBMIT_BUTTON`             | Redeem voucher                                                                 | Submit button                          |
| `COUPON_TEASER`                    | `<h4>Redeem your voucher here</h4>If you've received a promotional voucher...` | Introductory text block; supports HTML |
| `COUPON_ACTIVATED_TITLE`           | Your activated voucher codes                                                   | Heading for the list of active codes   |
| `COUPON_DEACTIVATE_BUTTON`         | Delete                                                                         | Button to remove a code                |
| `COUPON_DEACTIVATE_TITLE`          | Deactivate voucher code                                                        | Dialog title                           |
| `COUPON_DEACTIVATE_MESSAGE`        | Do you really want to deactivate the code %s?                                  | `%s` = coupon code                     |
| `COUPON_DEACTIVATE_BUTTON_CONFIRM` | OK                                                                             | Confirm button                         |
| `COUPON_DEACTIVATE_BUTTON_CANCEL`  | Cancel                                                                         | Cancel button                          |
| `COUPON_VALID_TITLE`               | Add voucher                                                                    | Success dialog title                   |
| `COUPON_VALID_MESSAGE`             | The code you entered is valid.                                                 | Success dialog body                    |
| `COUPON_VALID_BUTTON_OK`           | OK                                                                             | Success dialog confirm                 |
| `COUPON_VALID_BUTTON_CANCEL`       | Cancel                                                                         | Success dialog cancel                  |

## Login and Logout

Keys for the login form and logout confirmation.

| Key                          | Default Value                                        | Notes                                  |
| ---------------------------- | ---------------------------------------------------- | -------------------------------------- |
| `LOGIN_TITLE`                | Login                                                | Screen title                           |
| `LOGIN_TEASER`               | Log in for more content                              | Teaser text above the form             |
| `LOGIN_TEASER_RELOGIN`       | You have been logged out. Please log in again.       | Shown after session expiry             |
| `LOGIN_USERNAME_PLACEHOLDER` | Email                                                | Username field placeholder             |
| `LOGIN_PASSWORD_PLACEHOLDER` | Password                                             | Password field placeholder             |
| `LOGIN_SUBMIT_BUTTON`        | Log in                                               | Submit button                          |
| `LOGIN_HELP`                 | Forgotten your password? `<a href='...'>recover</a>` | Helper text; supports HTML with a link |
| `LOGIN_LOGOUT_TITLE`         | Logout                                               | Logout confirm dialog title            |
| `LOGIN_LOGOUT_TEASER`        | Do you really want to logout?                        | Logout confirm dialog body             |
| `LOGIN_LOGOUT_BUTTON`        | Log out                                              | Logout button label                    |
| `LOGOUT_TITLE`               | Logout                                               | Alternative logout dialog title        |
| `LOGOUT_MESSAGE`             | Do you really want to logout?                        | Alternative logout dialog body         |
| `LOGOUT_BUTTON_CONFIRM`      | Logout                                               | Confirm button                         |
| `LOGOUT_BUTTON_CANCEL`       | Cancel                                               | Cancel button                          |

## Search

Keys for the search screen and results display.

| Key                                | Default Value                                                         | Notes                                |
| ---------------------------------- | --------------------------------------------------------------------- | ------------------------------------ |
| `SEARCH_FIELD_PLACEHOLDER`         | Search...                                                             | Input placeholder                    |
| `SEARCH_RESULT_TITLE`              | %s results                                                            | `%s` = result count                  |
| `SEARCH_RESULT_EMPTY_TITLE`        | no results                                                            | Heading when nothing is found        |
| `SEARCH_RESULT_NO_RESULT`          | No content was found for your search phrase "%1$s". Please try again. | `%1$s` = search term                 |
| `SEARCH_RESULT_NO_SEARCH`          | Please enter a search phrase.                                         | Shown before any search is submitted |
| `SEARCH_RESULT_PAGE_LABEL_MESSAGE` | Page %s                                                               | `%s` = page number in result         |
| `SEARCH_RESULT_PAGE_HIT_EXCERPT`   | %s                                                                    | `%s` = matching excerpt text         |
| `SEARCH_RESULT_TOGGLE_EXPAND`      | Show more                                                             | Show more results button             |
| `SEARCH_RESULT_TOGGLE_COLLAPSE`    | Collapse                                                              | Collapse results button              |

## Navigation

Keys for bottom navigation labels and section headings.

| Key                               | Default Value   | Notes                           |
| --------------------------------- | --------------- | ------------------------------- |
| `NAVIGATION_HOME`                 | Home            | Bottom nav tab                  |
| `NAVIGATION_NEWSSTAND`            | Newsstand       | Bottom nav tab                  |
| `NAVIGATION_FEED`                 | Newsfeed        | Bottom nav tab                  |
| `NAVIGATION_SEARCH`               | Search          | Bottom nav tab                  |
| `HOME_LIST_TITLE`                 | Latest Articles | Section heading on home screen  |
| `HOME_SWIPER_TITLE`               | Latest Issues   | Section heading on home screen  |
| `TOGGLE_PUBLICATION_TYPE_CHANNEL` | Articles        | Toggle label for article view   |
| `TOGGLE_PUBLICATION_TYPE_KIOSK`   | Issues          | Toggle label for issue view     |
| `DROPDOWN_CATEGORY_RESET`         | Show All        | Category filter reset option    |
| `DROPDOWN_ISSUE_STATE_RESET`      | All Issues      | Issue state filter - all        |
| `DROPDOWN_ISSUE_STATE_PURCHASED`  | My Issues       | Issue state filter - purchased  |
| `DROPDOWN_ISSUE_STATE_LOCAL`      | My Downloads    | Issue state filter - downloaded |

## List and Dialog Controls

Generic keys that are used across list views, expandable content, and modal dialogs.

| Key                                    | Default Value                                       | Notes                                   |
| -------------------------------------- | --------------------------------------------------- | --------------------------------------- |
| `LIST_NO_RESULTS`                      | There are no contents matching the filter criteria. | Empty state                             |
| `LIST_ERROR`                           | Error loading data. %s                              | `%s` = error detail                     |
| `LIST_ERROR_BUTTON`                    | Reload                                              | Reload button on list error             |
| `LIST_ENTRY_TOGGLE_EXPAND`             | Show %u more                                        | `%u` = count of hidden items            |
| `LIST_ENTRY_TOGGLE_COLLAPSE`           | Show %u less                                        | `%u` = count                            |
| `LIST_ENTRIES_TOGGLE_EXPAND`           | Show %u more                                        | Same as above; used in grouped contexts |
| `LIST_ENTRIES_TOGGLE_COLLAPSE`         | Show %u less                                        | Same as above                           |
| `LIST_GROUPED_ENTRY_TOGGLE_EXPAND`     | Show %u more                                        | Grouped entry expand                    |
| `LIST_GROUPED_ENTRY_TOGGLE_COLLAPSE`   | Show %u less                                        | Grouped entry collapse                  |
| `LIST_GROUPED_ENTRIES_TOGGLE_EXPAND`   | Show %u more                                        | Grouped entries expand                  |
| `LIST_GROUPED_ENTRIES_TOGGLE_COLLAPSE` | Show %u less                                        | Grouped entries collapse                |
| `LIST_ACTION_SELECT_ALL`               | Select all                                          | Bulk action                             |
| `LIST_ACTION_UNSELECT_ALL`             | Deselect all                                        | Bulk action                             |
| `LIST_ACTION_CONFIRM`                  | Confirm                                             | Bulk action confirm                     |
| `LIST_ACTION_RESET`                    | Reset                                               | Bulk action reset                       |
| `DIALOG_TITLE`                         | Dialog                                              | Generic dialog title fallback           |
| `DIALOG_ERROR`                         | Error                                               | Generic error dialog title fallback     |
| `PULL_TO_REFRESH_PULL`                 | Pull to refresh                                     | Pull-to-refresh hint                    |
| `PULL_TO_REFRESH_RELEASE`              | Release to refresh                                  | Pull-to-refresh release hint            |
| `MENU_ITEM`                            | %s                                                  | `%s` = menu item label                  |
| `VIEW_ERROR`                           | Error loading data. %s                              | `%s` = error detail                     |
| `VIEW_ERROR_BUTTON`                    | Reload                                              | Reload button on view error             |

## Error Messages

Keys for all user-facing error notifications. Most accept a `%s` placeholder for a technical error detail that can be appended to the message.

| Key                                      | Default Value                                                    | Notes                                          |
| ---------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------- |
| `ERROR_LOGIN`                            | The login could not be performed. %s                             | `%s` = error detail                            |
| `ERROR_PURCHASE`                         | The purchase could not be completed. %s                          | `%s` = error detail                            |
| `ERROR_SUBSCRIPTION`                     | The subscription could not be purchased. Please try again later. |                                                |
| `ERROR_PRODUCT`                          | Product data could not be loaded. %s                             | `%s` = error detail                            |
| `ERROR_DOWNLOAD`                         | Download failed for %2$s. %1$s                                   | `%1$s` = error detail, `%2$s` = item name      |
| `ERROR_CONTENT_OPEN`                     | Error opening content. %s                                        | `%s` = error detail                            |
| `ERROR_PREVIEW_OPEN`                     | Error opening preview. %s                                        | `%s` = error detail                            |
| `ERROR_DEEP_LINK_LANDING`                | Shared issue could not be opened. %s                             | `%s` = error detail                            |
| `ERROR_SEARCH`                           | The search could not be performed. Please try again later        |                                                |
| `ERROR_SHARE`                            | Content could not be shared.                                     |                                                |
| `ERROR_ADD_BOOKMARK`                     | Bookmark could not be created. %1$s                              | `%1$s` = error detail                          |
| `ERROR_DELETE_BOOKMARK`                  | This bookmark could not be deleted. %s                           | `%s` = error detail                            |
| `ERROR_DELETE_BOOKMARK_WITH_TITLE`       | The bookmark for "%2$s" could not be deleted. %1$s               | `%1$s` = error detail, `%2$s` = bookmark title |
| `ERROR_DELETE_ALL_BOOKMARKS`             | Not all bookmarks could be deleted. %s                           | `%s` = error detail                            |
| `ERROR_COUPON_INVALID`                   | The code you entered is not valid.                               |                                                |
| `ERROR_COUPON_INVALID_BUTTON`            | OK                                                               | Dialog button                                  |
| `ERROR_COUPON_EXISTS`                    | This code is already added.                                      |                                                |
| `ERROR_COUPON_EXISTS_BUTTON`             | OK                                                               | Dialog button                                  |
| `ERROR_COUPON_OFFLINE`                   | No internet connection! This code could not be added.            |                                                |
| `ERROR_COUPON_OFFLINE_BUTTON`            | OK                                                               | Dialog button                                  |
| `ERROR_COUPON_DEACTIVATE`                | This code could not be deactivated.                              |                                                |
| `ERROR_COUPON_DEACTIVATE_BUTTON`         | OK                                                               | Dialog button                                  |
| `ERROR_COUPON_DEACTIVATE_OFFLINE`        | No internet connection! This code could not be deactivated.      |                                                |
| `ERROR_COUPON_DEACTIVATE_OFFLINE_BUTTON` | OK                                                               | Dialog button                                  |
| `ERROR_COUPON_DEACTIVATE_UNKNOWN`        | Code is unknown! This code could not be deactivated.             |                                                |
| `ERROR_COUPON_DEACTIVATE_UNKNOWN_BUTTON` | OK                                                               | Dialog button                                  |

## System and Access Messages

Generic system messages for authentication state, connectivity, and unknown errors.

| Key                   | Default Value                                 | Notes                                               |
| --------------------- | --------------------------------------------- | --------------------------------------------------- |
| `ACCESS_DENIED`       | Access denied.                                | Shown when content requires a subscription or login |
| `PAYMENT_REQUIRED`    | Access denied.                                | Shown when payment is required to access content    |
| `NOT_LOGGED_IN`       | You are not logged in.                        |                                                     |
| `ALREADY_LOGGED_IN`   | You are already logged in.                    |                                                     |
| `ALREADY_OWNED`       | You already own this product.                 |                                                     |
| `INVALID_CREDENTIALS` | Please check your username and password.      |                                                     |
| `NETWORK`             | Please check your internet connection.        | Offline / connectivity error                        |
| `NOT_FOUND`           | The requested content could not be found.     |                                                     |
| `NO_ISSUES_FOUND`     | The requested content could not be found.     |                                                     |
| `RESOURCE_NOT_FOUND`  | The requested resource could not be found.    |                                                     |
| `UNKNOWN_OFFER`       | The requested offer could not be found.       |                                                     |
| `UNKNOWN_PRODUCT`     | The requested product could not be found.     |                                                     |
| `UNKNOWN_VENDOR`      | Vendor is unknown.                            |                                                     |
| `UNKNOWN`             | An unknown error occurred.                    | Generic fallback error                              |
| `CANCELLED`           | Process was cancelled by user.                |                                                     |
| `CONFIGURATION_ERROR` | Error in remote system.                       |                                                     |
| `INSUFFICIENT_SPACE`  | The storage on your device is not sufficient. | Shown during downloads                              |
| `VALIDATION_FAILED`   | The purchase could not be validated.          |                                                     |

## Article Content (Extended)

These keys are available in apps using the extended storefront and control article detail page elements, sponsorship labels and custom post types.

| Key                                       | Default Value                                                 | Notes                             |
| ----------------------------------------- | ------------------------------------------------------------- | --------------------------------- |
| `ARTICLE_CONTENT_PUBLICATION_DATE`        | Published: %1s at %2s                                         | `%1s` = date, `%2s` = time        |
| `ARTICLE_CONTENT_TAG_HEADLINE`            | Tags                                                          | Label above tag list              |
| `ARTICLE_SPONSOR_TEXT_SPONSORED`          | Sponsored by `<span class="sponsor-name">%s</span>`           | `%s` = sponsor name; HTML allowed |
| `ARTICLE_SPONSOR_TEXT_NATIVE_ADVERTORIAL` | Partnered content with `<span class="sponsor-name">%s</span>` | `%s` = sponsor name               |
| `ARTICLE_SPONSOR_TEXT_NATIVE_TRUE`        | Partnered content with `<span class="sponsor-name">%s</span>` | `%s` = sponsor name               |
| `ARTICLE_SPONSORED_BRAND`                 | Advertisement feature with %s                                 | `%s` = brand name                 |
| `ARTICLE_SPONSOR_TEXT`                    | Advertisement feature with %s                                 | `%s` = sponsor name               |
| `READ_TIME`                               | %s min read                                                   | `%s` = estimated minutes          |
| `AUTHOR_ARTICLES_HEADLINE`                | Recent articles by %s                                         | `%s` = author name                |
| `HERO_ARTICLE_BUTTON`                     | Read more                                                     | CTA on hero article tile          |
| `TAXONOMY_LATEST_ARTICLES_HEADLINE`       | What's new?                                                   | Heading on taxonomy/tag pages     |

## Content and Catalog Items

Keys for the Content component, which displays generic catalog items such as articles, chapters, episodes, or any non-issue content type. The Content component is separate from the Issue component - both support similar action patterns but have independent sets of message keys, so you can customize their labels independently.

| Key                                   | Default Value              | Notes                                                                                     |
| ------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------- |
| `CONTENT_TITLE`                       | %s                         | `%s` = content title                                                                      |
| `CONTENT_DESCRIPTION`                 | %s                         | `%s` = content description body                                                           |
| `CONTENT_PUBLICATION_TITLE`           | %s                         | `%s` = publication name                                                                   |
| `CONTENT_DESCRIPTION_TOGGLE_EXPAND`   | Show more                  | Expand toggle for long descriptions                                                       |
| `CONTENT_DESCRIPTION_TOGGLE_COLLAPSE` | Show less                  | Collapse toggle for long descriptions                                                     |
| `CONTENT_ERROR`                       | Error loading content data | Error state heading                                                                       |
| `CONTENT_ERROR_BUTTON`                | Try again                  | Reload button on error state                                                              |
| `CONTENT_UPDATE_BADGE_MESSAGE`        | Update available           | Badge text on content tile                                                                |
| `CONTENT_ACTION_READ`                 | Read                       | Action button - content is unlocked                                                       |
| `CONTENT_ACTION_SUBSCRIBE`            | Subscribe                  | Action button - locked content, subscription option available                             |
| `CONTENT_ACTION_LOGIN`                | Login                      | Action button - locked content, login required; only shown when the user is not logged in |
| `CONTENT_ACTION_COUPON`               | Coupon                     | Action button - locked content, coupon entry option available                             |
| `CONTENT_ACTION_PURCHASE`             | Purchase for %s            | Action button - locked content, single purchase available; `%s` = formatted price         |
| `CONTENT_ACTION_PURCHASE_LOADING`     | Loading price...           | Shown while the price is being fetched from the store                                     |
| `CONTENT_ACTION_PURCHASE_UNAVAILABLE` | Price not available        | Shown when the price cannot be loaded (missing product ID or store configuration error)   |

## PDF Downloads

The keys label the download button variants: full PDF, single page, and left/right page of a two-page spread.

| Key                         | Default Value        | Notes                      |
| --------------------------- | -------------------- | -------------------------- |
| `DOWNLOAD_PDF_FULL`         | Download full PDF    | Button label               |
| `DOWNLOAD_PDF_SINGLE`       | Download single page | Button label               |
| `DOWNLOAD_PDF_SINGLE_LEFT`  | Download left page   | Button label (spread view) |
| `DOWNLOAD_PDF_SINGLE_RIGHT` | Download right page  | Button label (spread view) |

# Placeholder Syntax Reference

Purple message keys use **sprintf-js** style placeholders:

| Syntax         | Meaning                                            | Example              |
| -------------- | -------------------------------------------------- | -------------------- |
| `%s`           | Single string value                                | `Added on %s`        |
| `%u`           | Unsigned integer                                   | `Show %u more`       |
| `%1$s`, `%2$s` | Positional string (for reordering in translations) | `%1$s error in %2$s` |
| `%(name)s`     | Named placeholder                                  | `%(issue.name)s`     |

When writing translations, always preserve placeholder tokens exactly - including the `$` and position number where present.
