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

# Internationalization (i18n)

> Override UI strings, rename concepts like "Track" to "Standard", or provide full translations for new languages.

Soundcheck supports internationalization through Backstage's
[translation system](https://backstage.io/docs/plugins/internationalization/).
You can override individual strings (e.g., renaming "Track" to
"Standard"), replace all strings for a specific language, or mix both
approaches.

## Overriding Strings

Use `createTranslationMessages` with `soundcheckTranslationRef` to
override specific strings:

```typescript theme={"theme":{"light":"github-light","dark":"dracula"}}
// packages/app/src/App.tsx

import { createTranslationMessages } from '@backstage/core-plugin-api/alpha';
import { soundcheckTranslationRef } from '@spotify/backstage-plugin-soundcheck/alpha';

createTranslationMessages({
  ref: soundcheckTranslationRef,
  messages: {
    'common.track': 'Standard',
    'soundcheckHeader.tabTracks': 'Standards',
    'tracksListPage.title': 'Standards',
  },
});
```

Only the keys you specify are overridden — everything else keeps the
default English text. See the
[Backstage i18n docs](https://backstage.io/docs/plugins/internationalization/)
for how to register translation overrides and full language translations
in your app.

## Available Translation Keys

`soundcheckTranslationRef` is exported from `@spotify/backstage-plugin-soundcheck/alpha`.
`createTranslationMessages` is fully typed against it, so your IDE will
autocomplete valid keys. With `full: true`, TypeScript reports errors for
any missing keys.

The keys are organized into categories that correspond to features:

| Category prefix          | Covers                                            |
| ------------------------ | ------------------------------------------------- |
| `common.*`               | Shared terms (Track, Check, Entity, Cancel, etc.) |
| `form.*`                 | Form field labels and helpers                     |
| `soundcheckHeader.*`     | Top-level navigation tabs                         |
| `trackPage.*`            | Track detail view                                 |
| `trackActions.*`         | Track action menu (Edit, Delete, Recertify)       |
| `checkPage.*`            | Check detail view                                 |
| `checkForm.*`            | Check creation/edit form                          |
| `campaignPage.*`         | Campaign detail view                              |
| `campaignForm.*`         | Campaign creation/edit form                       |
| `trackEntitiesTable.*`   | Track entities table columns                      |
| `techInsightsPage.*`     | Tech Insights page                                |
| `techInsightsTable.*`    | Tech Insights table                               |
| `collectorsPage.*`       | Integrations list                                 |
| `collectorPage.*`        | Integration detail                                |
| `healthPage.*`           | Health page sections                              |
| `factExplorer.*`         | Fact Explorer dialog                              |
| `frequency.*`            | Schedule frequency component                      |
| `timePeriodBar.*`        | Time period selector                              |
| `exportTrackEntities.*`  | Track entity CSV export headers                   |
| `exportCheckEntities.*`  | Check entity CSV export headers                   |
| `certificationSidebar.*` | Entity certification sidebar                      |
| `certificationsPage.*`   | Certifications page                               |

This is not exhaustive — see the source for the full list of 120+
categories.

## Examples

### Rename "Track" to "Scorecard"

```typescript theme={"theme":{"light":"github-light","dark":"dracula"}}
createTranslationMessages({
  ref: soundcheckTranslationRef,
  messages: {
    'common.track': 'Scorecard',
    'soundcheckHeader.tabTracks': 'Scorecards',
    'tracksListPage.title': 'Scorecards',
    'trackCreatePage.title': 'Create Scorecard',
    'trackPage.notFoundTitle': 'Scorecard not found',
    'trackPage.notFoundBody':
      'There is no scorecard with the requested id: {{trackId}}.',
  },
});
```

### Customize empty state messages

```typescript theme={"theme":{"light":"github-light","dark":"dracula"}}
createTranslationMessages({
  ref: soundcheckTranslationRef,
  messages: {
    'emptyStateNoTracks.createTitle': 'Create your first scorecard',
    'emptyStateNoTracks.noTitle': 'No scorecards yet',
    'emptyStateNoTracks.description':
      'Create your first scorecard to start tracking quality.',
    'emptyStateNoChecks.createTitle': 'Create your first check',
    'emptyStateNoChecks.noTitle': 'No checks configured',
    'emptyStateNoChecks.description': 'Set up checks to monitor your services.',
  },
});
```
