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.
- 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 missingqmeans 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-Language ↗See also: Locale negotiation, BCP 47
- BCP 47
The IETF standard for language tags such as
en-US,zh-Hant-TW, andde-DE-u-co-phonebk. It fixes the subtag order: language, script, region, variants, extensions. HTMLlang, HTTPAccept-Language, andIntl.*all expect this tag syntax. BCP 47 currently comprises RFC 5646 (syntax) and RFC 4647 (matching).Taught in: OrientationRFC 5646: Tags for Identifying Languages ↗See 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
Intlknows that German joins lists withund, that fact is CLDR data.Taught in: OrientationUnicode CLDR project ↗See also: ICU, ECMA-402 (the Intl object), Plural category
- ECMA-402 (the Intl object)
The specification behind JavaScript's
Intlnamespace: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 API ↗See also: ICU, CLDR
- Fallback chain
The ordered path a runtime walks when the exact requested locale is not available. The chain runs
pt-BR, thenpt, then the root or default. Truncation runs right to left and never sideways:pt-PTis not onpt-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
Intlobject in the major engines.Taught in: OrientationICU project ↗See also: CLDR, ECMA-402 (the Intl object), MessageFormat (ICU)
- Language subtag
The first, mandatory part of a BCP 47 tag: the
ptinpt-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-DEandde-ATshare a language but differ in details like currency. You pass a locale as the first argument to everyIntlconstructor.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-Languageparsing. The three can give different answers from the same inputs.Taught in: Locale fallbackRFC 4647: Matching of Language Tags ↗See 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 Messages ↗See 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/.matchdeclarations, quoted{{...}}patterns, and pluggable:number/:datefunctions. It also handles multi-variable selection and bidi more cleanly. There is no native JavaScript API yet. You use a polyfill (themessageformatpackage) while the TC39Intl.MessageFormatproposal 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
BRinpt-BR, and419ines-419for 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
HansandHantinzh-Hansandzh-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 Standard ↗See also: Code point, CLDR
Text and scripts
The pieces that form a string, and how writing systems render, wrap, and mirror.
- 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 Algorithm ↗See 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
toLocaleLowerCasediverges on Turkish systems. A plaintoLowerCasedoes 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
Ito dotlessı, and German ß uppercases toSS.Taught in: Unicode pitfallsSee also: Case folding
- Code point
The number Unicode assigns to a character, written like
U+0041for A. JavaScript'scodePointAtand the spread operator[...str]work in code points..lengthdoes 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
'😀'.lengthis 2..lengthcounts 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.
efollowed 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-startinstead ofmargin-left,inset-inline-endinstead ofright. Underdir="rtl"they resolve to the mirrored side automatically: one stylesheet serves both directions.Taught in: RTL mirroringCSS Logical Properties and Values Level 1 ↗See 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>anddir="auto"are the markup equivalents. Wrap every interpolated variable in one.Taught in: BiDiUAX #9: Unicode Bidirectional Algorithm ↗See also: Bidi algorithm
- Font fallback
The per-character walk down your
font-familylist. 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
eplus a combining accent, or a family emoji built from 7 code points. Unicode defines the boundaries in UAX #29.Intl.Segmenterwithgranularity: 'grapheme'counts them.Taught in: Unicode pitfallsUAX #29: Unicode Text Segmentation ↗See 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
langattribute steers that choice.Taught in: CJK fallbackWikipedia: Han unification ↗See 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: strictenforces the strict set.Taught in: Line-breakingW3C: Requirements for Japanese Text Layout ↗See 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-breakandoverflow-wraptune the behavior.Taught in: Line-breakingUAX #14: Unicode Line Breaking Algorithm ↗See also: Kinsoku shori, Word segmentation
- NFC
Normalization Form C: the Unicode normalization that composes characters where a precomposed form exists.
eplus 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 Forms ↗See also: NFD, Combining mark
- NFD
Normalization Form D: the decomposed counterpart of NFC, where é becomes
eplus a combining accent. NFDcafé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 Forms ↗See 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 translation ↗See 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-rangematter 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.Segmenterexposes the machinery to your code.Taught in: Line-breakingUAX #29: Unicode Text Segmentation ↗See also: Line breaking, Grapheme cluster
Formatting
Turning numbers, dates, lists, and sort orders into locale-correct output.
- 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.DateTimeFormatapplies it, and BCP 47 carries the choice in the-u-ca-extension. With no extension, locale data decides: that is how plainth-THrenders year 2569 (Gregorian + 543).Intl.supportedValuesOf("calendar")lists what a runtime ships.Taught in: CalendarsUTS #35 Part 4: Dates ↗See 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.Collatoris the API. A plain.sort()is code-point order.Taught in: SortingUTS #10: Unicode Collation Algorithm ↗See 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.56and1.234,56are the same amount. Both separators are locale data. Derive them at runtime fromformatToPartson a known number instead of a hardcoded table.Taught in: Input parsingUTS #35 part 3: Numbers ↗See 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 pragmatics ↗See 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/Berlinto 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 Database ↗See also: ECMA-402 (the Intl object)
- Measurement system
Whether a locale uses metric or US/imperial units.
Intl.NumberFormatformats 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 style ↗See 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.NumberFormatapplies this automatically: format1234.56as JPY and it rounds to¥1,235. Hardcoding two decimals is a money bug.Taught in: FormattersISO 4217: Currency codes ↗See 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 world ↗See also: Patronymic
- Numbering system
The digit set a locale writes numbers in.
latn(0–9) is the most common, butar-EGdefaults toarab(٠–٩), 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' }).- 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_namemisfiles the person.Taught in: Address & nameW3C: Personal names around the world ↗See 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:
onematches 21 in Russian but not in English. Onlyotherexists in every language. Arabic and Welsh use all six.Taught in: Plurals & genderCLDR: Plural Rules ↗See also: Ordinal, MessageFormat (ICU), CLDR
- Select message
The ICU MessageFormat branch that switches on a plain string instead of a number: pass exactly
femaleand thefemalearm renders. CLDR plays no part: it is a keyword match. The format still requires anotherarm, 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 Algorithm ↗See 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 aweekInfoproperty). 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 proposal ↗See 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 Internet ↗See 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.
- Character limit
A length budget for a UI string, usually so it fits a fixed container. The trap is that "character" is ambiguous.
str.lengthcounts UTF-16 code units, a spread counts code points, andIntl.Segmentercounts 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) andmsgstr(translation) pairs. Plurals usemsgid_pluraland indexedmsgstr[n]entries. It is decades old and still in wide use, especially in open-source projects.Taught in: Translation pipelineGNU gettext manual: PO Files ↗See also: XLIFF, String externalization
- i18n (internationalization)
Engineering a product so teams can adapt it to any locale: no hardcoded date order, no
count !== 1plural 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. Internationalization ↗See 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. Internationalization ↗See 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 typology ↗See 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 output ↗See 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-locales ↗See 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.0 ↗See also: gettext PO, TMS (translation management system), String externalization