All lessons

Reference · 72 terms

Glossary

Every term the course uses, defined in one to three plain sentences. Each definition links to the lesson that teaches the term and, where a specification exists, to the specification. The page groups terms by theme and sorts them alphabetically within each group.

Standards and identifiers

The tags, databases, and specifications that name locales and carry their data.

14 terms
Accept-Language

The HTTP request header that lists the user's preferred languages with relative weights: Accept-Language: de-CH, de;q=0.9, en;q=0.8. A missing q means 1.0. It is input to server-side locale negotiation, not a guarantee of what the user receives.

Taught in: Locale fallbackRFC 9110 §12.5.4: Accept-LanguageSee also: Locale negotiation, BCP 47

BCP 47

The IETF standard for language tags such as en-US, zh-Hant-TW, and de-DE-u-co-phonebk. It fixes the subtag order: language, script, region, variants, extensions. HTML lang, HTTP Accept-Language, and Intl.* all expect this tag syntax. BCP 47 currently comprises RFC 5646 (syntax) and RFC 4647 (matching).

Taught in: OrientationRFC 5646: Tags for Identifying LanguagesSee also: Language subtag, Script subtag, Region subtag, Locale negotiation

CLDR

The Common Locale Data Repository: the Unicode Consortium's database of per-locale conventions (date patterns, plural rules, collation tailorings, list patterns, translated names). Browsers, ICU, and operating systems all use it. When Intl knows that German joins lists with und, that fact is CLDR data.

Taught in: OrientationUnicode CLDR projectSee also: ICU, ECMA-402 (the Intl object), Plural category

ECMA-402 (the Intl object)

The specification behind JavaScript's Intl namespace: NumberFormat, DateTimeFormat, PluralRules, Collator, Segmenter, and the locale-negotiation behavior they share. It standardizes which data-driven i18n the engine must ship, so your bundle does not have to.

Taught in: FormattersECMA-402: ECMAScript Internationalization APISee also: ICU, CLDR

Fallback chain

The ordered path a runtime walks when the exact requested locale is not available. The chain runs pt-BR, then pt, then the root or default. Truncation runs right to left and never sideways: pt-PT is not on pt-BR's chain.

Taught in: Locale fallbackSee also: Locale negotiation, Language subtag

ICU

International Components for Unicode: the open-source C/C++ and Java libraries that implement Unicode algorithms and CLDR data (formatting, collation, segmentation, MessageFormat). Most platforms build their i18n features on it, including the JavaScript Intl object in the major engines.

Taught in: OrientationICU projectSee also: CLDR, ECMA-402 (the Intl object), MessageFormat (ICU)

Language subtag

The first, mandatory part of a BCP 47 tag: the pt in pt-BR. It is usually a two- or three-letter ISO 639 code. It names the language itself. Every later subtag narrows the tag.

Taught in: Locale fallbackSee also: Script subtag, Region subtag, Fallback chain

Locale

An identifier for a set of user conventions: language, script, region, and optional variants. Formatting, sorting, and matching decisions depend on it. de-DE and de-AT share a language but differ in details like currency. You pass a locale as the first argument to every Intl constructor.

Taught in: OrientationSee also: BCP 47, CLDR

Locale negotiation

The step that picks which of your available locales a user gets, based on their request. It is an algorithm you choose: RFC 4647 lookup, best-fit distance matching, or server-side Accept-Language parsing. The three can give different answers from the same inputs.

Taught in: Locale fallbackRFC 4647: Matching of Language TagsSee also: Fallback chain, Accept-Language, BCP 47

MessageFormat (ICU)

ICU's syntax for translatable strings with variables and grammar-aware branches: {count, plural, one {# file} other {# files}}. Plural and select arms let the translator, not your code, decide how many shapes the sentence needs.

Taught in: Plurals & genderICU User Guide: Formatting MessagesSee also: Plural category, Select message, String externalization

MessageFormat 2.0 (MF2)

Unicode's redesign of ICU MessageFormat. It became a stable specification in 2024. It replaces the single-line {count, plural, ...} form with .input / .match declarations, quoted {{...}} patterns, and pluggable :number / :date functions. It also handles multi-variable selection and bidi more cleanly. There is no native JavaScript API yet. You use a polyfill (the messageformat package) while the TC39 Intl.MessageFormat proposal advances.

Taught in: Plurals & genderUnicode MessageFormat 2.0 specification (UTS #35 Part 9)See also: MessageFormat (ICU), Plural category, Select message

Region subtag

A two-letter ISO 3166-1 code or a three-digit UN M.49 area code in a BCP 47 tag. Examples: the BR in pt-BR, and 419 in es-419 for Latin America. It scopes conventions (date order, currency, spelling) to a place without changing the language.

Taught in: Locale fallbackSee also: Language subtag, Script subtag

Script subtag

A four-letter ISO 15924 code that names the writing system: the Hans and Hant in zh-Hans and zh-Hant. In locale matching it outranks region. Serving Simplified script to a Traditional-script reader is a worse miss than serving another region's Traditional.

Taught in: Locale fallbackSee also: Language subtag, Region subtag, Locale negotiation

Unicode

The character standard that assigns every character in every supported script a number (a code point). It also defines properties and algorithms over them: normalization, bidirectionality, segmentation, case. The rest of this page assumes it.

Taught in: Unicode pitfallsThe Unicode StandardSee also: Code point, CLDR

Text and scripts

The pieces that form a string, and how writing systems render, wrap, and mirror.

19 terms
Bidi algorithm

The Unicode Bidirectional Algorithm (UAX #9): the rules that arrange mixed right-to-left and left-to-right text. Every character has a directional class: strong, weak, or neutral. Neutrals like $ take direction from their neighbors. That mechanism causes most RTL interpolation bugs.

Taught in: BiDiUAX #9: Unicode Bidirectional AlgorithmSee also: Directional isolate (FSI/PDI), RTL mirroring

Case folding

A separate, locale-independent transformation that Unicode defines for case-insensitive comparison. It is deliberately stable: two systems that fold the same string always agree. Security checks should fold (or pin a locale). A locale-sensitive lowercase like toLocaleLowerCase diverges on Turkish systems. A plain toLowerCase does not.

Taught in: Unicode pitfallsSee also: Case mapping

Case mapping

The transformation between lowercase, uppercase, and titlecase forms. It is locale-sensitive and not always reversible: Turkish maps I to dotless ı, and German ß uppercases to SS.

Taught in: Unicode pitfallsSee also: Case folding

Code point

The number Unicode assigns to a character, written like U+0041 for A. JavaScript's codePointAt and the spread operator [...str] work in code points. .length does not.

Taught in: Unicode pitfallsSee also: Code unit, Grapheme cluster

Code unit

The 16-bit unit that forms a JavaScript string (UTF-16). Code points above U+FFFF take two code units (a surrogate pair), so '😀'.length is 2. .length counts code units, not characters.

Taught in: Unicode pitfallsSee also: Code point, Grapheme cluster

Combining mark

A character that attaches to the one before it instead of standing alone: accents, Hebrew vowel points, Devanagari vowel signs. e followed by U+0301 (combining acute) renders as é: one grapheme, two code points.

Taught in: Unicode pitfallsSee also: NFC, NFD, Grapheme cluster

CSS logical properties

CSS properties that reference text flow instead of physical sides: margin-inline-start instead of margin-left, inset-inline-end instead of right. Under dir="rtl" they resolve to the mirrored side automatically: one stylesheet serves both directions.

Taught in: RTL mirroringCSS Logical Properties and Values Level 1See also: RTL mirroring

Directional isolate (FSI/PDI)

The FSI/RLI/LRI…PDI control characters (Unicode 6.3). They render a span by its own direction and present it as one neutral block to the surrounding text. HTML's <bdi> and dir="auto" are the markup equivalents. Wrap every interpolated variable in one.

Taught in: BiDiUAX #9: Unicode Bidirectional AlgorithmSee also: Bidi algorithm

Font fallback

The per-character walk down your font-family list. For each character, the browser uses the first font that has a glyph. The walk ends at an OS default that differs per platform. Nothing errors. One headline quietly mixes several fonts.

Taught in: CJK fallbackSee also: Han unification, Webfont

Grapheme cluster

What a reader perceives as one character. It may span several code points: é as e plus a combining accent, or a family emoji built from 7 code points. Unicode defines the boundaries in UAX #29. Intl.Segmenter with granularity: 'grapheme' counts them.

Taught in: Unicode pitfallsUAX #29: Unicode Text SegmentationSee also: Code point, Combining mark, Word segmentation

Han unification

Unicode's decision to give Chinese, Japanese, and Korean one shared code point per cognate Han character. 直 is U+76F4 everywhere, but its expected shape differs by regional convention. The font decides which shape renders, and the lang attribute steers that choice.

Taught in: CJK fallbackWikipedia: Han unificationSee also: Font fallback, Webfont

Kinsoku shori

Japanese line-breaking prohibitions. Characters like 。 、 and small kana must not start a line. Opening brackets must not end one. JIS X 4051 standardizes the rules. CSS line-break: strict enforces the strict set.

Taught in: Line-breakingW3C: Requirements for Japanese Text LayoutSee also: Line breaking, Word segmentation

Line breaking

The rules that decide where a line may wrap. English wraps at spaces. Chinese and Japanese wrap between most character pairs, minus prohibitions. Thai wraps at dictionary word boundaries. UAX #14 defines the character classes. CSS line-break and overflow-wrap tune the behavior.

Taught in: Line-breakingUAX #14: Unicode Line Breaking AlgorithmSee also: Kinsoku shori, Word segmentation

NFC

Normalization Form C: the Unicode normalization that composes characters where a precomposed form exists. e plus a combining acute becomes the single code point é. Normalize to NFC at system boundaries: it is the standard fix for visually identical strings that compare unequal.

Taught in: Unicode pitfallsUAX #15: Unicode Normalization FormsSee also: NFD, Combining mark

NFD

Normalization Form D: the decomposed counterpart of NFC, where é becomes e plus a combining accent. NFD café is 5 code points where NFC is 4. macOS's older HFS+ filesystem stored filenames decomposed, a common source of NFC/NFD mismatches.

Taught in: Unicode pitfallsUAX #15: Unicode Normalization FormsSee also: NFC, Combining mark

RTL mirroring

Flipping a layout for right-to-left locales. Navigation, chevrons, progress direction, and paddings swap sides. Some elements deliberately keep their place: media-playback controls and most numerals, by convention. Which elements flip is a design decision. The browser does not infer it.

Taught in: RTL mirroringSee also: CSS logical properties, Bidi algorithm

Text expansion

The length change between source and translation. Short English strings grow the most: the IBM guidance republished by W3C plans for 200–300% growth on sources up to 10 characters. Chinese and Japanese often contract.

Taught in: Text expansionW3C: Text size in translationSee also: Pseudolocalization

Webfont

A font that ships to the browser with the page, not one you assume installed. For CJK this is a weight problem: a full Chinese or Japanese face covers thousands of code points. Subsetting and CSS unicode-range matter far more than they do for Latin.

Taught in: CJK fallbackSee also: Font fallback, Han unification

Word segmentation

Finding word boundaries in text that does not mark them with spaces. Thai needs a dictionary to wrap lines. Chinese and Japanese need one for search and text selection. UAX #29 defines default boundaries. Intl.Segmenter exposes the machinery to your code.

Taught in: Line-breakingUAX #29: Unicode Text SegmentationSee also: Line breaking, Grapheme cluster

Formatting

Turning numbers, dates, lists, and sort orders into locale-correct output.

20 terms
Calendar system

The rules that turn a moment into a year, month, and day: Gregorian, Buddhist, Hijri, Hebrew, Persian, Japanese, and more. CLDR ships the data, Intl.DateTimeFormat applies it, and BCP 47 carries the choice in the -u-ca- extension. With no extension, locale data decides: that is how plain th-TH renders year 2569 (Gregorian + 543). Intl.supportedValuesOf("calendar") lists what a runtime ships.

Taught in: CalendarsUTS #35 Part 4: DatesSee also: Era (calendar), Week info (first day / weekend), BCP 47, CLDR

Collation

Locale-correct string comparison: the order a sorted list should read in. The alphabet is locale data: Swedish files ä after z, Polish gives ł its own slot after l. Intl.Collator is the API. A plain .sort() is code-point order.

Taught in: SortingUTS #10: Unicode Collation AlgorithmSee also: UCA (Unicode Collation Algorithm), Tailoring

Decimal separator

The character between a number's integer and fraction parts: . in en-US, , in de-DE. The group separator is its mirror: 1,234.56 and 1.234,56 are the same amount. Both separators are locale data. Derive them at runtime from formatToParts on a known number instead of a hardcoded table.

Taught in: Input parsingUTS #35 part 3: NumbersSee also: Numbering system, Wire format

DST (daylight saving time)

The seasonal clock shift some regions observe. None of the intuitive rules hold. Japan observes none. Lord Howe Island shifts 30 minutes rather than an hour. The change dates are legislation, which is why the IANA database ships multiple updates most years.

Taught in: Time zonestz database: Theory and pragmaticsSee also: IANA time zone database, UTC offset, Wall-clock time

Era (calendar)

A named span that resets a calendar's year counter. The Japanese calendar starts a new era at each imperial accession. January 8, 1989 turned Shōwa 64 into Heisei 1. May 1, 2019 turned Heisei 31 into Reiwa 1. No rule predicts an era name: the government announces it, and Reiwa got thirty days' notice. Era tables are data with an update path, never constants.

Taught in: CalendarsSee also: Calendar system, CLDR

IANA time zone database

The registry that maps zone names like Europe/Berlin to their full history of offsets and DST rules. It is also called tzdata or the Olson database. It ships multiple updates most years because offsets are political decisions. Store zone names, not offsets.

Taught in: Time zonesIANA: Time Zone DatabaseSee also: ECMA-402 (the Intl object)

Measurement system

Whether a locale uses metric or US/imperial units. Intl.NumberFormat formats the unit you pass. It never converts the value, never picks the system, and does not expose the system. Only the US, Liberia, and Myanmar are US-customary. The UK is mixed. The rest is metric. Your code maps locale to system and converts before formatting.

Taught in: FormattersMDN: Intl.NumberFormat unit styleSee also: CLDR, ECMA-402 (the Intl object)

Minor units (ISO 4217)

The number of decimal digits a currency officially carries: USD has 2, JPY 0, BHD 3. Intl.NumberFormat applies this automatically: format 1234.56 as JPY and it rounds to ¥1,235. Hardcoding two decimals is a money bug.

Taught in: FormattersISO 4217: Currency codesSee also: ECMA-402 (the Intl object)

Mononym

A single given name that is a person's whole name. It is common in parts of Southern India, Malaysia, and Indonesia, and it is not a data-entry error. A form with a required last-name field does not mis-store a mononymous user. It blocks them at submit, or teaches them to enter “.” to pass the check.

Taught in: Address & nameW3C: Personal names around the worldSee also: Patronymic

Numbering system

The digit set a locale writes numbers in. latn (0–9) is the most common, but ar-EG defaults to arab (٠–٩), and CLDR defines dozens more. Digits are output and input: a parser must know which set the user typed before it can read a value.

Taught in: Input parsingSee also: ECMA-402 (the Intl object), CLDR

Ordinal

The plural rule set for position words (1st, 2nd, 3rd), separate from the cardinal rules for quantities. English resolves 1, 2, 3, 4 to the categories one, two, few, other. Request it with new Intl.PluralRules(locale, { type: 'ordinal' }).

Taught in: Plurals & genderSee also: Plural category

Patronymic

A name formed from a parent's given name, not inherited as a family name. Icelandic Guðmundsdóttir is “Guðmundur's daughter”. Iceland sorts its telephone directories by given name because a patronymic does not work as a surname. A schema that files one under last_name misfiles the person.

Taught in: Address & nameW3C: Personal names around the worldSee also: Mononym

Plural category

One of the six grammatical buckets CLDR sorts numbers into per language: zero, one, two, few, many, other. The names are deliberately abstract: one matches 21 in Russian but not in English. Only other exists in every language. Arabic and Welsh use all six.

Taught in: Plurals & genderCLDR: Plural RulesSee also: Ordinal, MessageFormat (ICU), CLDR

Select message

The ICU MessageFormat branch that switches on a plain string instead of a number: pass exactly female and the female arm renders. CLDR plays no part: it is a keyword match. The format still requires an other arm, the catch-all for values the translator never saw.

Taught in: Plurals & genderSee also: MessageFormat (ICU), Plural category

Tailoring

A locale's changes to the default collation order. Swedish moves å ä ö after z. German phonebook order expands ä to ae, so Müller files with Mueller. You can select a tailoring in the locale tag itself: de-DE-u-co-phonebk.

Taught in: SortingSee also: Collation, UCA (Unicode Collation Algorithm)

UCA (Unicode Collation Algorithm)

The base algorithm for collation implementations. Strings compare in passes against a default ordering table (DUCET): base letters first, then accents, then case. Locales then tailor that table to their own alphabet. UTS #10 defines it.

Taught in: SortingUTS #10: Unicode Collation AlgorithmSee also: Collation, Tailoring

UTC offset

A location's clock difference from UTC, written like +05:30. An offset describes one moment, not a place. It moves with DST and with legislation. It is not always whole hours: India runs +05:30, Nepal +05:45. An IANA zone name carries the full history that an offset discards.

Taught in: Time zonesSee also: IANA time zone database, DST (daylight saving time), Wall-clock time

Wall-clock time

The time a local clock displays (“9:00 AM”), as opposed to an instant on the UTC timeline. A future appointment is a wall-clock promise. Store the wall time plus an IANA zone name, and resolve it to an instant late. Governments can change the mapping before the date arrives. Some wall times never happen: New York clocks jump from 02:00 to 03:00 at the spring DST boundary.

Taught in: Time zonesSee also: UTC offset, DST (daylight saving time), IANA time zone database

Week info (first day / weekend)

Locale data for the calendar grid: the first day of the week, the weekend days, and the week-1 rule. Intl.Locale(...).getWeekInfo() reports all three (older engines expose a weekInfo property). The values vary: the US starts Sunday, Europe Monday, and Saudi Arabia and Israel rest Friday-Saturday. A hardcoded Sunday-first, Sat-Sun-weekend grid is a bug outside those regions.

Taught in: CalendarsTC39 Intl Locale Info proposalSee also: Calendar system, CLDR, ECMA-402 (the Intl object)

Wire format

The canonical, locale-free representation for data in transit and in storage: ISO 8601 for dates (2003-02-01), plain numbers or integer minor units for money. Locale-specific display exists only at the edges. Format on the way out. Parse it away immediately on the way in.

Taught in: Input parsingRFC 3339: Date and Time on the InternetSee also: Decimal separator, Minor units (ISO 4217)

Workflow and QA

How strings travel from your repo to translators and back, and how teams check quality.

19 terms
Character limit

A length budget for a UI string, usually so it fits a fixed container. The trap is that "character" is ambiguous. str.length counts UTF-16 code units, a spread counts code points, and Intl.Segmenter counts graphemes. The three diverge on emoji and decomposed accents. The UI enforces pixel width, not any of these counts. A character limit is only a proxy for the box.

Taught in: Text expansionSee also: Text expansion, Grapheme cluster, Code unit

Error severity

How much a single logged error costs. MQM defaults are neutral 0, minor 1, major 5, critical 25. The steps are deliberately steep: one safety or legal error outweighs many stylistic ones. Severity, not error count, drives the score. That is why most review arbitration is a severity dispute. The weights are configurable per scorecard.

Taught in: LQA scoringSee also: MQM (Multidimensional Quality Metrics), LQA (language quality assurance)

Fuzzy match

A translation-memory hit that is close but not identical to the new source segment. It carries a percentage similarity score. Pricing follows the score: a high-percentage match costs less to review than a low one. Both cost less than translation from scratch.

Taught in: Translation pipelineSee also: Translation memory, Source word

g11n (globalization)

The business umbrella over internationalization and localization: the whole program of taking a product to multiple markets. g + 11 letters + n. The industry also folds the four terms into the acronym GILT (globalization, internationalization, localization, translation).

Taught in: OrientationSee also: i18n (internationalization), l10n (localization), t9n (translation)

gettext PO

The GNU gettext catalog format: plain-text files of msgid (source) and msgstr (translation) pairs. Plurals use msgid_plural and indexed msgstr[n] entries. It is decades old and still in wide use, especially in open-source projects.

Taught in: Translation pipelineGNU gettext manual: PO FilesSee also: XLIFF, String externalization

i18n (internationalization)

Engineering a product so teams can adapt it to any locale: no hardcoded date order, no count !== 1 plural logic, no left-to-right-only layout. The numeronym keeps the first letter, counts the 18 letters between, and keeps the last. It is design-time work, done once. Localization recurs per market on top of it.

Taught in: OrientationW3C: Localization vs. InternationalizationSee also: l10n (localization), g11n (globalization), t9n (translation)

l10n (localization)

Producing the content and conventions for one market: the German strings, the Egyptian date conventions, adapted imagery and legal text. l + 10 letters + n. It recurs with every market you add. For that reason it budgets separately from the one-time i18n work that enables it.

Taught in: OrientationW3C: Localization vs. InternationalizationSee also: i18n (internationalization), t9n (translation), String externalization

LQA (language quality assurance)

Reviewing translated output in context (in the built product, not in a spreadsheet) for accuracy, grammar, truncation, and layout breaks. Reviewers typically score against an error typology, so teams measure quality instead of asserting it.

Taught in: LQA scoringSee also: MQM (Multidimensional Quality Metrics), Error severity, Termbase, MT post-editing

MQM (Multidimensional Quality Metrics)

The industry-standard framework for analytic translation quality evaluation. It combines a fixed error typology with severity weights to produce penalty points, normed per 1000 words into a score. The typology currently has seven top-level dimensions: Terminology, Accuracy, Linguistic conventions, Style, Locale conventions, Audience appropriateness, Design and markup. Older MQM material calls Linguistic conventions "Fluency".

Taught in: LQA scoringMQM error typologySee also: LQA (language quality assurance), Error severity

MT post-editing

Having a human translator correct machine-translation output instead of translating from scratch. Vendors price and schedule it as its own service. ISO 18587 distinguishes light post-editing (fix errors) from full post-editing (reach human-translation quality).

ISO 18587: Post-editing of machine translation outputSee also: LQA (language quality assurance), Translation memory

Pseudolocalization

Transforming source strings into readable-but-strange variants (accented Ḥéļļö, padded, or RTL-flipped) before you buy any translation. Text that appears untransformed in the UI is a hardcoded string. Padded text that clips will clip in German. It belongs in CI.

Taught in: PseudolocMicrosoft Learn: Pseudo-localesSee also: String externalization, Text expansion

Source word

The usual pricing unit for translation: one word of the source text. Source-word counts make quotes predictable before work starts. Target length varies by language. Source length does not.

Taught in: Translation pipelineSee also: Fuzzy match, Translation memory

String externalization

Moving user-facing text out of code into a resource file keyed by ID. Translators then work on a file instead of your source. It is the precondition for everything else in the pipeline: a hardcoded string is invisible to translation.

Taught in: Translation pipelineSee also: gettext PO, XLIFF, Pseudolocalization

String freeze

The point in a release cycle after which source strings stop changing, so translators work against a stable set. Strings edited after the freeze either ship untranslated or force another translation round.

See also: String externalization, TMS (translation management system)

t9n (translation)

Converting text between languages: one part of localization, and the narrowest of the four terms. t + 9 letters + n. A translator can fix wording. A hardcoded date order comes from design time and is out of their reach.

Taught in: OrientationSee also: l10n (localization), i18n (internationalization), Translation memory

Termbase

A glossary of approved translations for product-specific terms: feature names, legal phrases, do-not-translate brands. A translation memory accumulates whole segments as you go. A termbase differs: teams curate it term-by-term up front and enforce it in QA checks.

Taught in: Translation pipelineSee also: Translation memory, LQA (language quality assurance)

TMS (translation management system)

The system that routes strings through the pipeline. It pulls resource files from your repo and assigns work to translators. It applies the translation memory and termbase, then pushes finished files back. It is the pipeline's workflow engine, distinct from the file formats it moves.

See also: Translation memory, XLIFF, String freeze

Translation memory

A database of previously translated segments. Tools query it as new source text arrives. Translators reuse exact matches and lightly edit near matches instead of retranslating. That is why repeated strings cost a fraction of new words.

Taught in: Translation pipelineSee also: Fuzzy match, Termbase, Source word

XLIFF

XML Localization Interchange File Format: the OASIS standard for moving translatable content between tools. A file carries paired source and target segments plus state metadata. The current major version series is 2.x.

Taught in: Translation pipelineOASIS: XLIFF Version 2.0See also: gettext PO, TMS (translation management system), String externalization