R2.06.4copy-variable range deliverydesign

Variable ranges must ship with the copy

Aliases: interpolation range · message placeholder bounds · {name} range

What it is

A sentence with interpolation is not one sentence. It is a family. “Hello, {name},” “{count} selected,” “Move from {source} to {target}” — if the package only shows one filled example, implementation can only lay out that width. Copy-variable range delivery ships, with the sentence, each variable’s legal length, magnitude, plural forms, and empty shape, so both the shortest and longest members of the family have a place to land.

This is about slots inside authored copy, not about percentile bounds on a user-data column. {name} is a stretch of a greeting template; P99 of a name column is a different job. They may happen to share a length; they do not share a deliverable.

Why it happens

Templates expand at runtime. On the board, {name} is filled as “Alex,” {count} as “3,” and the line looks exact. If that line is built as a single row and the bubble as a fixed width, a compound family name or an email as {name} clips the subject; {count} at 12048, or at 0 still using a plural, breaks grammar and width together. Variables can also be empty: if {source} is missing, does the whole sentence drop, fall back to an interpolation-free spare, or read “unknown”? That choice lives in the range note. It cannot be read off one filled sample.

A range is not a single maximum. Length, the enum set, zero, and whether an oversized value switches templates (“All selected” instead of “99999 selected”) are members of the same family. Shipping only the sample ships the modal member; the rest will be invented at implementation.

Where it stops holding

Static sentences with no interpolation have no range to ship; do not invent fake variables to fill a table. Dates and money already owned by a formatter should point at that format and its longest localized form, not a homemade {date} character count. When server and client both concatenate, write the range on the layer that actually emits the user-visible sentence, so two sides do not guess two ceilings. If the value comes from user input and is already clipped at the input layer, the copy range is the post-clip shape, not the pre-clip paste.

Applying it

  • Attach a range table to every braced string: variable name, type, shortest sample, longest sample, spare sentence on zero/empty, and whether an oversized value switches templates.
  • Ship at least two frames per sentence: all variables at their shortest, all at the approved longest. Add a count = 0 or empty-name frame when those shapes exist.
  • Put plurals, classifiers, and units in the range, not only the width of Arabic digits. {count} at 1 and at 0 often need a different sentence.
  • Run the built template with the longest sample and the zero sample. A clipped subject, an unapproved “0 items selected,” or an oversized count shoving a neighboring button means the range did not ship with the sentence. Put the table in the copy source; do not let implementation hard-code {name} to eight characters.

Related

  • Same group: R2.06.1 Placeholder copy will be implemented as written · R2.06.2 Copy length changes the layout · R2.06.3 Copy and design must be reviewed in the same pass · R2.06.5 The same concept keeps the same wording on every surface · R2.06.6 Handoff must reserve space for translation length
  • Adjacent: R2.05 Edge-case Completeness in Handoff · S1.01 Text Expansion and Layout Resilience
  • Search terms: copy-variable range delivery · interpolation range · message placeholder bounds

Cards in the same group

Quick Actions

Share

Share this page

ios_share

https://hci.top/en/handbook/R2.06.4