# Edit ICU select and selectordinal

> The Selectors view gives every branch of an ICU select or selectordinal its own row, so you translate one branch at a time instead of retyping the syntax around it. Ordinal branches come from the target language CLDR rules.

Source: https://stringlane.app/docs/use-selectors-view
Last updated: 2026-09-16

An ICU `select` picks one of several fixed branches — a status, a gender, a plan tier. A `selectordinal` picks one by the ordinal category of a number: 1st, 2nd, 3rd, 4th.

Both are one long brace-string on disk:

```
{status, select, pending {Pending, clears in 1-2 days} cleared {Cleared} failed {Failed, try another card} other {Status unknown}}
```

Editing that as a single text field is how a stray brace ships. The Selectors view gives every branch its own row.

## Reading the view

![The txnStatusNote key with a SELECT chip and a 3 MISSING chip. English shows four branch rows labelled pending, cleared, failed and other; German shows three and offers an Add branch button for the missing failed branch; Spanish, Japanese and Brazilian Portuguese show No branches with buttons to add all four](/docs-screenshots/selectors-view-branches.webp)

Each locale panel holds one row per branch, labelled with the branch name on the left and the translation on the right. The header counts them: **4 of 4 branches** for a locale that has them all, **3 of 4** for one that does not.

- A **`SELECT`** or **`ORDINAL`** chip beside the key name says which kind it is.
- The character-width bar and budget work per branch, because each branch is a string a user will actually see.
- The base locale panel is marked **`SOURCE`**. Its branch set is what every other locale is measured against.

## Adding a branch a locale is missing

A locale panel that is short a branch offers it directly: **Add branch: `+ failed` · in base**. Click it and the row appears, empty, ready to translate. A locale with no branches at all offers every one the base declares.

The `new branch…` field beside those buttons is for a branch the base does **not** have. Use it sparingly: a branch no other locale declares renders only when the app supplies that exact value, and StringLane reports it as `select_branch_extra` so it stays visible rather than silently accumulating.

## Why an ordinal shows a different branch list per language

This is the part that surprises people, and it is correct.

![The txnRankNote key with an ORDINAL chip. English shows four branch rows: one, two, few and other. German offers a single Add branch button labelled other, marked CLDR-required for de. French offers two, one and other, marked CLDR-required for fr. Spanish, Japanese and Brazilian Portuguese each offer only other](/docs-screenshots/selectors-view-ordinal.webp)

Ordinal categories are a property of the language, not of your string. English distinguishes 1**st**, 2**nd**, 3**rd** and 4**th**, so it needs `one`, `two`, `few` and `other`. French distinguishes only 1**er** from the rest, so it needs `one` and `other`. German, Spanish, Japanese and Brazilian Portuguese need `other` alone.

StringLane asks each target locale for the set that locale requires and labels those buttons **CLDR-required for `<locale>`**. So a four-branch English source does not mean four branches everywhere, and a locale showing one branch is not incomplete.

A branch the language genuinely requires and the locale does not have is an error, `select_branch_missing`: the missing case renders nothing at all. See the [validation codes](/docs/reference/validation-codes).

## What it does not do

It does not judge whether your German branch says the right thing. The checks here are structural: the branch exists, the placeholders inside it survive, its length fits the budget you set. Reading the text is still yours.

Nested ICU inside a branch — a plural within a select — is edited as text in that branch's row. The view splits one level, which is the level that carries the branch names.

## Frequently asked questions

### How do I edit an ICU select in StringLane?

Select the key. Each branch of the select gets its own row per locale, labelled with its branch name, so you translate the text without touching the surrounding braces. Branches the base declares but this locale does not have are offered as Add branch buttons under the locale panel.

### Why does a selectordinal show different branches in different languages?

Because ordinal categories are per-language CLDR rules, not a fixed list. English needs one, two, few and other for 1st, 2nd, 3rd and 4th; French needs one and other; German, Spanish, Japanese and Brazilian Portuguese need only other. StringLane asks each locale for the branches that locale actually requires, and marks them CLDR-required.
