"The context field is a key in disguise"
A key is mandatory on every string, unique, and lives in a global namespace you maintain. context is optional, describes meaning ("the window" vs "measured by distance" for "Close"), and is set on the few strings that are ambiguous. Most strings carry no context. The source text stays the lookup either way.
| A key | A context | |
|---|---|---|
| Required | On every string | Only where the meaning is ambiguous |
| Unique | Yes, in a global namespace you maintain | No — two strings may share one |
| What it holds | A name for the string | A description of its meaning |
| How many | One per string, thousands per app | A handful per app |
Close is a button label and a distance; Proche is a friend and a shop nearby. Those are the strings that get a context, and it says what they mean ("the window", "distance"), which is exactly what a translator would ask you. The rest carry nothing. The source text remains the lookup in both cases; two identical texts with two contexts are two rows. See Add context.