
OCR i18n — LATIN Line Image
A single-line latin script image for OCR engines. Pair with the UTF-8 ground-truth text twin.
- File
- JPG · OCR I18n · 900 × 160 px
- Use case
- OCR testingInternationalization· Paired fixture
Parallel text and accented, multi-script content — for testing translation pipelines, Unicode handling, and localization tooling.

A single-line latin script image for OCR engines. Pair with the UTF-8 ground-truth text twin.

UTF-8 ground-truth transcript for the latin OCR line image — exact expected OCR output.

A single-line cjk script image for OCR engines. Pair with the UTF-8 ground-truth text twin.

UTF-8 ground-truth transcript for the cjk OCR line image — exact expected OCR output.

A single-line arabic script image for OCR engines. Pair with the UTF-8 ground-truth text twin.

UTF-8 ground-truth transcript for the arabic OCR line image — exact expected OCR output.

A Shift-JIS encoded Japanese CSV — for CJK charset detection and Shift-JIS→UTF-8 conversion in importers.

An EPUB 3 in Arabic that declares page-progression-direction="rtl" in the spine, dir="rtl" on the body, and a right-aligned stylesheet. Paired with a left-to-right control carrying the same structure, so a reader's page-turn direction can be checked rather than assumed.

The right-to-left case again in an unconnected script: Hebrew, with the same rtl spine direction and body dir. Arabic shaping and Hebrew ordering fail independently, so a reader that handles one is not proven to handle the other.

A Japanese EPUB 3 set in vertical-rl, declaring writing-mode with the standard property plus the -epub- and -webkit- prefixes readers actually implement, and an rtl spine so pages turn the way a tategaki book does.

Left-to-right prose with an Arabic run isolated by dir="rtl" and a Latin identifier isolated by dir="ltr" inside an Arabic phrase. The everyday bidi case that breaks when a renderer applies paragraph direction to every character in the paragraph.

The left-to-right control for the direction set: identical package structure to the Arabic fixture, differing only in the language tag and the spine direction. A reference point, not a test case on its own.

A title containing two characters above the Basic Multilingual Plane - a blue book and a musical clef - plus a Japanese description. Anything that counts characters as UTF-16 code units, or truncates a title to a byte length, splits a surrogate pair here.

Mark-to-base and mark-to-mark positioning with a real GDEF glyph-class definition: three zero-width combining accents attach to ten base letters at documented anchors, and stacking a second mark uses the mkmk anchor. For testing diacritic placement without needing a full Unicode face. Original typeface, free to use.

Language-specific substitution through locl: tagging text as Turkish swaps the i, tagging it as Romanian swaps the S, and untagged text gets neither. The fixture for finding out whether your pipeline propagates a language tag from the document all the way to the shaper. Original typeface, free to use.

A horizontal Latin face that also carries vhea and vmtx, so vertical-layout code has something small and predictable to run against: every glyph advances 1000 units downward with a 250-unit top side bearing. For testing writing-mode support and metric-table selection without needing a CJK font. Original typeface, free to use.

Four precomposed accented letters built the way real fonts build them — as composite glyphs referencing a base letter and a combining mark with a translation. For testing component resolution, nested-glyph handling, and subsetters that must keep a component's base glyph alive. Original typeface, free to use.

An email whose Subject uses RFC 2047 UTF-8 encoded-words (café / crème) — for header decoding tests.

An attachment whose filename uses RFC 2231 UTF-8 encoding (résumé) — for MIME filename decoders.

A Subject header carrying accented Latin text and an emoji as a single UTF-8 base64 encoded-word. Its Q-encoded twin decodes to the identical string, so the two together isolate the encoding from the charset.

The same Subject as the UTF-8 'B' twin, written with 'Q' encoding instead: underscores stand for spaces and every non-token octet is an =XX escape. A decoder that forgets the underscore rule produces visibly different text from its twin.

A German Subject encoded as ISO-8859-1 'Q', the shape most legacy mail actually uses. Each umlaut is one =XX escape, so a decoder that assumes UTF-8 produces mojibake rather than a clean error.

The ISO-8859-1 Subject again, base64-encoded instead of Q-encoded. Base64 hides the charset entirely, so this is the fixture that catches a decoder guessing the charset from the octets instead of reading the encoded-word's charset token.

A Japanese Subject as a Shift_JIS base64 encoded-word. Shift_JIS second bytes overlap ASCII punctuation values, so a decoder that scans the decoded octets for delimiters before converting the charset splits the string in the wrong place.

A Russian Subject as a KOI8-R base64 encoded-word. KOI8-R orders Cyrillic letters by Latin transliteration rather than alphabetically, so a decoder that substitutes any other Cyrillic codepage returns readable-looking but wrong text.

A single Subject built from three encoded-words in three charsets and two encodings. RFC 2047 allows this, and it is what happens when a subject is quoted through several mail systems, so each word has to be decoded on its own terms.

A Subject split mid-word across two adjacent encoded-words. RFC 2047 requires the linear whitespace between them to be discarded, so the correct result is one word; a decoder that keeps the space renders a split that reads as a typo.

A Subject folded across four physical lines, one encoded-word per line, which is the shape RFC 2047 prescribes for long international headers. Because the fold whitespace is discarded on decode, each continuation word carries its own leading space inside the encoded-word — omit that and the subject decodes run-together.

One unbroken encoded-word of 148 characters, well past the 75-character ceiling RFC 2047 sets. Real senders emit these, and a decoder should still recover the whole word rather than truncating it at 75 or rejecting the header.

Encoded-words used everywhere they turn up in practice: both display names, the Subject, and — against the spec but very common — inside the quoted filename parameter, where RFC 2231 is the conformant mechanism. A tolerant parser decodes all four.

The conformant answer to non-ASCII filenames: a filename split into three numbered RFC 2231 segments with a charset and a language tag, plus size and creation-date parameters. Parsers commonly handle filename*= but not the numbered continuation form.

One mailbox whose four messages each use a different charset and alternate between quoted-printable and base64, with RFC 2047 subjects to match. The file itself is LF-stored while the encoded payloads decode to CRLF text — the split every importer has to handle.

An English↔Spanish parallel corpus in JSON Lines — 20 aligned sentence pairs of everyday phrases. A fixture for training and evaluating machine-translation models and for testing UTF-8 handling of accented characters.

The English member of a correct three-locale hreflang cluster: it lists itself, both translations and the x-default, and its canonical agrees. Ships with the German page so reciprocity can be verified across real files.

The German member of the same cluster, with lang="de" on the html element and the identical alternate block. For testing that an audit compares the annotation set rather than the document language, and that the two agree.

A deliberately invalid annotation block: `en-UK` is not a region code, `de_DE` uses an underscore, `zz` is not a language, one alternate has no hreflang attribute at all, one drops to http, there is no x-default, and the canonical points outside the cluster. For testing that every defect is reported, not just the first.

A gettext .pot template extracted from source — msgid entries with empty msgstr values, source-location comments, and a plural form — the starting point for a new language translation.

A translated gettext .po catalog (Spanish) with a full header, source-location and translator comments, c-format flags, and a plural-form entry — for testing PO parsers and translation-memory tools.

An OASIS XLIFF 1.2 file with English source and Spanish target trans-units and notes — the classic interchange format between authoring tools and translation-management systems.

An OASIS XLIFF 2.0 file with the same content as its 1.2 twin, using the modern unit/segment structure — for testing XLIFF 2.0 parsers and 1.2-to-2.0 converters.

An Apple Localizable.strings file (English) — quoted key = value pairs with comments and %@ placeholders, as iOS/macOS apps use per-locale in .lproj folders.

The Spanish twin of the Apple .strings catalog — for testing .strings parsers and en/es diffing against the same keys.

A Flutter Application Resource Bundle (English) — JSON messages with matching @key metadata (descriptions and typed placeholders) using ICU {name} syntax, as Flutter's gen-l10n consumes.

The Spanish twin of the Flutter ARB bundle — for testing ARB parsers, the gen-l10n pipeline, and ICU placeholder handling.

An Android values/strings.xml (English) with string resources, a <plurals> block, and a <string-array>, using positional %1$s placeholders — the res/values/ default catalog.

The Spanish Android strings.xml (as res/values-es/) — for testing Android resource parsers, plurals, and string-array localization.

A .NET Resources.resx file (English) with the standard ResX schema and resheader block plus name/value string data and comments, using {0} composite-format placeholders.

The Spanish satellite RESX (Resources.es.resx) — for testing .NET resource parsers and culture-based resource resolution against the same keys.

An i18next translation JSON (English) with {{name}} interpolation and an object-form plural (one/other) — the common React/Node i18n catalog shape.

The Spanish i18next catalog twin — for testing i18next loaders, interpolation, and plural resolution against the same keys.

A right-to-left Arabic i18next catalog — real Arabic UI strings for testing bidirectional text handling, RTL layout, Unicode, and font fallback.

A right-to-left Hebrew i18next catalog — real Hebrew UI strings for testing bidirectional text handling, RTL layout, Unicode, and font fallback.

A Japanese (CJK) i18next catalog — real Japanese UI strings for testing CJK Unicode handling, wide-character layout, and font fallback.

A Chinese (CJK) i18next catalog — real Chinese UI strings for testing CJK Unicode handling, wide-character layout, and font fallback.

A French (fr) gettext PO catalog with seven UI strings — for i18n toolchain tests.

Compiled gettext MO binary for French — pair with the matching PO for loader tests.

A German (de) gettext PO catalog with seven UI strings — for i18n toolchain tests.

Compiled gettext MO binary for German — pair with the matching PO for loader tests.

A Portuguese (Brazil) (pt-BR) gettext PO catalog with seven UI strings — for i18n toolchain tests.

Compiled gettext MO binary for Portuguese (Brazil) — pair with the matching PO for loader tests.

A Korean (ko) gettext PO catalog with seven UI strings — for i18n toolchain tests.

Compiled gettext MO binary for Korean — pair with the matching PO for loader tests.

A Translation Memory eXchange (TMX 1.4) file with English source and four target locales — for CAT tool and TMX parser tests.

Flat JSON locale pack for French with Mustache-style {{name}} placeholders.

Flat JSON locale pack for German with Mustache-style {{name}} placeholders.

Flat JSON locale pack for Portuguese (Brazil) with Mustache-style {{name}} placeholders.

Flat JSON locale pack for Korean with Mustache-style {{name}} placeholders.





Mozilla Fluent SAMPLE catalog (English) with placeholders and plural select — for Fluent parsers and CAT tools.

Mozilla Fluent SAMPLE catalog (Spanish) with placeholders and plural select — for Fluent parsers and CAT tools.

Mozilla Fluent SAMPLE catalog (French) with placeholders and plural select — for Fluent parsers and CAT tools.

Mozilla Fluent SAMPLE catalog (Arabic RTL) with placeholders and plural select — for Fluent parsers and CAT tools.

Mozilla Fluent SAMPLE catalog (Hebrew RTL) with placeholders and plural select — for Fluent parsers and CAT tools.

Mozilla Fluent SAMPLE catalog (English US) with placeholders and plural select — for Fluent parsers and CAT tools.

ICU MessageFormat SAMPLE JSON (English) with plural/select patterns for i18n runtimes.

ICU MessageFormat SAMPLE JSON (Spanish) with plural/select patterns for i18n runtimes.

ICU MessageFormat SAMPLE JSON (French) with plural/select patterns for i18n runtimes.

ICU MessageFormat SAMPLE JSON (Arabic) with plural/select patterns for i18n runtimes.

ICU MessageFormat SAMPLE JSON (Hebrew) with plural/select patterns for i18n runtimes.

ICU MessageFormat SAMPLE JSON (German) with plural/select patterns for i18n runtimes.

ICU MessageFormat SAMPLE JSON (Japanese) with plural/select patterns for i18n runtimes.

ICU MessageFormat SAMPLE JSON (Chinese) with plural/select patterns for i18n runtimes.

English ICU plural and selectordinal SAMPLE catalogue for plural-rule engines.

Arabic RTL ICU plural SAMPLE covering zero/one/two/few/many/other categories.

ICU select SAMPLE for gender/status branching in message formatters.

Hebrew RTL ICU select SAMPLE for bidirectional UI string pipelines.

Arabic RTL UI string pack SAMPLE for bidirectional layout and font-fallback tests.

Hebrew RTL UI string pack SAMPLE for bidirectional layout and font-fallback tests.

Arabic Egypt RTL UI string pack SAMPLE for bidirectional layout and font-fallback tests.

Hebrew Israel RTL UI string pack SAMPLE for bidirectional layout and font-fallback tests.

Persian RTL UI string pack SAMPLE for bidirectional layout and font-fallback tests.

Urdu RTL UI string pack SAMPLE for bidirectional layout and font-fallback tests.

Crowdin-shaped SAMPLE bilingual export JSON for localization TMS importers.

Crowdin-shaped SAMPLE French bilingual export for TMS round-trip tests.

Bilingual EN→ES CSV SAMPLE for spreadsheet-based localization workflows.

Bilingual EN→AR RTL CSV SAMPLE for spreadsheet CAT and RTL review tools.

Four-locale multilingual CSV SAMPLE for bulk translation import tests.

Pseudolocalization SAMPLE (bracket-wrapped) for i18n layout overflow testing.

Extra ICU MessageFormat SAMPLE locale (it) for catalog breadth.

Extra ICU MessageFormat SAMPLE locale (nl) for catalog breadth.

Extra ICU MessageFormat SAMPLE locale (sv) for catalog breadth.

Extra ICU MessageFormat SAMPLE locale (pl) for catalog breadth.

Extra ICU MessageFormat SAMPLE locale (tr) for catalog breadth.

Minimal i18next SAMPLE catalog for locale da (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale fi (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale nb (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale cs (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale hu (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale ro (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale uk (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale el (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale he (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale ar (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale th (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale vi (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale id (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale ms (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale ko (greeting/save/cancel).

Minimal i18next SAMPLE catalog for locale hi (greeting/save/cancel).

CLDR-style SAMPLE plural forms for locale en (items key).

CLDR-style SAMPLE plural forms for locale pl (items key).

CLDR-style SAMPLE plural forms for locale ru (items key).

CLDR-style SAMPLE plural forms for locale ar (items key).

English ICU MessageFormat catalog whose messages nest a select inside a plural branch and a plural inside a select branch, shipped with the argument bindings and the exact output each one must produce. Includes the '#' binding trap: inside a nested plural, '#' refers to the inner argument, so the outer count is written explicitly.

Arabic ICU MessageFormat catalog whose messages nest a select inside a plural branch and a plural inside a select branch, shipped with the argument bindings and the exact output each one must produce. Includes the '#' binding trap: inside a nested plural, '#' refers to the inner argument, so the outer count is written explicitly.

Polish ICU MessageFormat catalog whose messages nest a select inside a plural branch and a plural inside a select branch, shipped with the argument bindings and the exact output each one must produce. Includes the '#' binding trap: inside a nested plural, '#' refers to the inner argument, so the outer count is written explicitly.

The 'Rana and 5 others like this' pattern: ICU plural arguments with offset:1 and offset:2, where the explicit =0/=1/=2 selectors match the RAW value but '#' prints the value MINUS the offset. Ships every boundary case with its expected output.

English st/nd/rd/th suffixes done properly, via ICU selectordinal rather than a hand-written switch. The case list covers the teens (11th, 12th, 13th) and the wrap-around (21st, 102nd, 111th) that a naive n % 10 lookup gets wrong.

Welsh is the only CLDR locale that uses all six plural categories for cardinals AND all six for ordinals, which makes it the strongest single probe for a plural-rule engine. Each branch names its own category so the assertion is about selection, not wording, and the two rule sets disagree for n = 4, 5, 7, 8 and 9.

The quoting rules that make ICU messages surprising: a single quote starts a literal section only when the next character is one ICU cares about, a doubled '' is always one apostrophe, and '#' inside a plural branch is a literal hash. Every message is paired with the exact string it must produce.

A English Java ResourceBundle with MessageFormat patterns, a ChoiceFormat plural, positional arguments, escaped braces and apostrophes, a backslash line continuation, and non-ASCII carried as \uXXXX escapes because .properties is defined as ISO-8859-1. The bytes on disk are pure ASCII.

A German Java ResourceBundle with MessageFormat patterns, a ChoiceFormat plural, positional arguments, escaped braces and apostrophes, a backslash line continuation, and non-ASCII carried as \uXXXX escapes because .properties is defined as ISO-8859-1. The bytes on disk are pure ASCII.

Arabic CLDR cardinal and ordinal plural rules with the exact integer samples that select each category, the equivalent gettext Plural-Forms expression, and a note on the trap the language exposes: a catalog written with only one/other silently renders 'many' counts (11-99) with the singular noun form.

Welsh CLDR cardinal and ordinal plural rules with the exact integer samples that select each category, the equivalent gettext Plural-Forms expression, and a note on the trap the language exposes: welsh is the only cldr locale using all six categories for both cardinals and ordinals, and its categories are enumerations (3, 6) rather than modulo ranges — a rule engine that assumes 'few' means a range fails here.

Polish CLDR cardinal and ordinal plural rules with the exact integer samples that select each category, the equivalent gettext Plural-Forms expression, and a note on the trap the language exposes: cldr gives polish four categories but the traditional gettext header gives it three — gettext folds cldr 'many' and 'other' together because its rule takes an integer n and never sees v.

Russian CLDR cardinal and ordinal plural rules with the exact integer samples that select each category, the equivalent gettext Plural-Forms expression, and a note on the trap the language exposes: 1 and 21 take the same form but 11 does not; a naive n==1 check gets 21 wrong.

English CLDR cardinal and ordinal plural rules with the exact integer samples that select each category, the equivalent gettext Plural-Forms expression, and a note on the trap the language exposes: '1.

Japanese CLDR cardinal and ordinal plural rules with the exact integer samples that select each category, the equivalent gettext Plural-Forms expression, and a note on the trap the language exposes: japanese needs exactly one form; a pipeline that requires a 'one' key produces a catalog no japanese translator can fill in meaningfully.

One row per language, one column per CLDR plural category, filled with the smallest integers that select it — the sheet to hand a translator or a PM when explaining why 'one' and 'other' is not enough. Japanese needs one form and Welsh needs six.

A Polish gettext catalog with a real Plural-Forms header and 3 msgstr[] forms per plural entry, source-location and extracted comments, and c-format flags. Pairs with the compiled .mo of the same content, so a loader can be tested end to end rather than on the text format alone.

The compiled Polish MO twin. Plural entries are encoded the way msgfmt does it — the original is 'singular\\0plural' and the translation is the 3 forms joined by NUL — and the header entry carries the Plural-Forms expression, so ngettext resolves without the .po file present.

A Russian gettext catalog with a real Plural-Forms header and 3 msgstr[] forms per plural entry, source-location and extracted comments, and c-format flags. Pairs with the compiled .mo of the same content, so a loader can be tested end to end rather than on the text format alone.

The compiled Russian MO twin. Plural entries are encoded the way msgfmt does it — the original is 'singular\\0plural' and the translation is the 3 forms joined by NUL — and the header entry carries the Plural-Forms expression, so ngettext resolves without the .po file present.

A Arabic gettext catalog with a real Plural-Forms header and 6 msgstr[] forms per plural entry, source-location and extracted comments, and c-format flags. Pairs with the compiled .mo of the same content, so a loader can be tested end to end rather than on the text format alone.

The compiled Arabic MO twin. Plural entries are encoded the way msgfmt does it — the original is 'singular\\0plural' and the translation is the 6 forms joined by NUL — and the header entry carries the Plural-Forms expression, so ngettext resolves without the .po file present.

A Welsh gettext catalog with a real Plural-Forms header and 6 msgstr[] forms per plural entry, source-location and extracted comments, and c-format flags. Pairs with the compiled .mo of the same content, so a loader can be tested end to end rather than on the text format alone.

The compiled Welsh MO twin. Plural entries are encoded the way msgfmt does it — the original is 'singular\\0plural' and the translation is the 6 forms joined by NUL — and the header entry carries the Plural-Forms expression, so ngettext resolves without the .po file present.

A German catalog carrying every state a PO entry can be in but the happy one: two fuzzy entries (one of them a plural) with #| previous-msgid comments, an entry that is present but untranslated, three obsolete #~ entries including an obsolete plural and an obsolete msgctxt entry, and two complete entries as the control.

The English word "Open" translated four different ways in one file — three msgctxt variants plus the context-free entry — alongside a multi-line msgid that must be concatenated with no separator, a no-c-format entry whose %% is literal text, and explicit tab and quote escapes with a significant trailing space.

The XLIFF 1.2 half of a version twin covering how each version expresses a plural group. XLIFF 1.2 uses a <group restype="x-gettext-plurals"> whose trans-units are ordered by gettext form index; XLIFF 2.0 dropped restype, so the same content becomes one <unit> per CLDR category, named by category rather than by index.

The XLIFF 2.0 half of a version twin covering how each version expresses a plural group. XLIFF 1.2 uses a <group restype="x-gettext-plurals"> whose trans-units are ordered by gettext form index; XLIFF 2.0 dropped restype, so the same content becomes one <unit> per CLDR category, named by category rather than by index.

The XLIFF 1.2 half of a version twin covering how each version represents inline markup and placeholders. XLIFF 1.2 keeps the original markup inline in <bpt>/<ept> and uses <g>, <x/> and <ph>; XLIFF 2.0 replaced all of them with <pc>, <ph/>, <sc/>/<ec/> and moved the markup into an <originalData> block referenced by id.

The XLIFF 2.0 half of a version twin covering how each version represents inline markup and placeholders. XLIFF 1.2 keeps the original markup inline in <bpt>/<ept> and uses <g>, <x/> and <ph>; XLIFF 2.0 replaced all of them with <pc>, <ph/>, <sc/>/<ec/> and moved the markup into an <originalData> block referenced by id.

The XLIFF 1.2 half of a version twin covering how each version records translation progress. XLIFF 1.2 has approved="yes|no" plus a ten-value target state; XLIFF 2.0 removed approved and cut the vocabulary to four ordered values (initial, translated, reviewed, final) with everything else pushed into a namespaced subState.

The XLIFF 2.0 half of a version twin covering how each version records translation progress. XLIFF 1.2 has approved="yes|no" plus a ten-value target state; XLIFF 2.0 removed approved and cut the vocabulary to four ordered values (initial, translated, reviewed, final) with everything else pushed into a namespaced subState.

English Android quantity strings: 4 <plurals> blocks with an <item> for each of the 2 CLDR quantities en actually selects. Rename to plurals.xml and drop into res/values/ to use it as-is.

Polish Android quantity strings: 4 <plurals> blocks with an <item> for each of the 4 CLDR quantities pl actually selects. Rename to plurals.xml and drop into res/values-pl/ to use it as-is.

Arabic Android quantity strings: 4 <plurals> blocks with an <item> for each of the 6 CLDR quantities ar actually selects. Rename to plurals.xml and drop into res/values-ar/ to use it as-is.

Welsh Android quantity strings: 4 <plurals> blocks with an <item> for each of the 6 CLDR quantities cy actually selects. Rename to plurals.xml and drop into res/values-cy/ to use it as-is.

Japanese Android quantity strings: 4 <plurals> blocks with an <item> for each of the 1 CLDR quantities ja actually selects. Rename to plurals.xml and drop into res/values-ja/ to use it as-is.

Every escaping rule aapt2 enforces on a strings.xml, in one file: backslash-escaped apostrophes and quotes, quoted values that preserve leading whitespace, an escaped @ and ?, CDATA-wrapped inline HTML, <xliff:g> placeholder protection with examples, formatted="false", translatable="false" and a scoped tools:ignore.

English Apple plural rules as a .stringsdict property list — the only place iOS and macOS accept plural variants, since a plain .strings file has no plural concept at all. Ships as .xml because the bytes are an XML plist; rename to Localizable.stringsdict to use it.

Arabic Apple plural rules as a .stringsdict property list — the only place iOS and macOS accept plural variants, since a plain .strings file has no plural concept at all. Ships as .xml because the bytes are an XML plist; rename to Localizable.stringsdict to use it.

Polish Apple plural rules as a .stringsdict property list — the only place iOS and macOS accept plural variants, since a plain .strings file has no plural concept at all. Ships as .xml because the bytes are an XML plist; rename to Localizable.stringsdict to use it.

Welsh Apple plural rules as a .stringsdict property list — the only place iOS and macOS accept plural variants, since a plain .strings file has no plural concept at all. Ships as .xml because the bytes are an XML plist; rename to Localizable.stringsdict to use it.

Russian Apple plural rules as a .stringsdict property list — the only place iOS and macOS accept plural variants, since a plain .strings file has no plural concept at all. Ships as .xml because the bytes are an XML plist; rename to Localizable.stringsdict to use it.

A German .strings file whose replace_confirm value puts %2$@ before %1$@, because German inverts the pair English uses. Also covers %% as a literal percent, an escaped double quote, a doubled-backslash UNC path and an escaped newline inside a value.

The encoding fixture the .strings format needs: a Japanese catalog written as UTF-16 Little Endian with a byte-order mark, which is what Xcode has historically produced and what a UTF-8-only reader turns into mojibake or a decode error. Also carries full-width punctuation and an ideographic space for width and line-breaking tests.

A English ARB whose plural messages carry an ICU branch for each of the 2 categories en selects, plus a select message and a summary line with typed placeholders — int with compactLong, and a DateTime with a yMMMd format — which is what makes gen_l10n emit a typed Dart method rather than a plain string.

A Arabic ARB whose plural messages carry an ICU branch for each of the 6 categories ar selects, plus a select message and a summary line with typed placeholders — int with compactLong, and a DateTime with a yMMMd format — which is what makes gen_l10n emit a typed Dart method rather than a plain string.

A Polish ARB whose plural messages carry an ICU branch for each of the 4 categories pl selects, plus a select message and a summary line with typed placeholders — int with compactLong, and a DateTime with a yMMMd format — which is what makes gen_l10n emit a typed Dart method rather than a plain string.

A Welsh ARB whose plural messages carry an ICU branch for each of the 6 categories cy selects, plus a select message and a summary line with typed placeholders — int with compactLong, and a DateTime with a yMMMd format — which is what makes gen_l10n emit a typed Dart method rather than a plain string.

A English (United States) resource file built around composite format strings — {0:N2}, {2:P1}, {0:C}, {0:d} and {0:t} — whose rendered output depends entirely on CultureInfo. Includes a whitespace-significant resource guarded by xml:space, and documents the suffixed-key convention .NET falls back on because String.Format has no plural selector.

A German (Germany) resource file built around composite format strings — {0:N2}, {2:P1}, {0:C}, {0:d} and {0:t} — whose rendered output depends entirely on CultureInfo. Includes a whitespace-significant resource guarded by xml:space, and documents the suffixed-key convention .NET falls back on because String.Format has no plural selector.

A Arabic (Egypt) resource file built around composite format strings — {0:N2}, {2:P1}, {0:C}, {0:d} and {0:t} — whose rendered output depends entirely on CultureInfo. Includes a whitespace-significant resource guarded by xml:space, and documents the suffixed-key convention .NET falls back on because String.Format has no plural selector.

A Polish (Poland) resource file built around composite format strings — {0:N2}, {2:P1}, {0:C}, {0:d} and {0:t} — whose rendered output depends entirely on CultureInfo. Includes a whitespace-significant resource guarded by xml:space, and documents the suffixed-key convention .NET falls back on because String.Format has no plural selector.

A reference sheet in which each of the ten shipped bidi control characters appears literally between ASCII guards, with its code point, UTF-8 bytes and the job it does. The two override characters are named but deliberately absent: a bidi rendering fixture does not need to ship the Trojan Source vector.

Six Arabic sentences containing a Latin filename, a phone number, a version range, a mixed-script path, a percentage and a bracketed insertion — each shown first as a translator usually delivers it and then with the one invisible character that makes it render correctly. The two forms differ by exactly one code point.

Mirroring is a rendering property of the bidi algorithm, not a transformation of the text: a U+0028 LEFT PARENTHESIS inside an RTL run is DRAWN as ')' while the stored byte never changes. These Hebrew and Arabic lines make that testable, and list the neutral characters that look like they should mirror but do not.

The HTML half of bidi handling: paragraphs with dir=ltr, dir=rtl and dir=auto, the same user-supplied string with and without a <bdi> wrapper, one balanced <bdo> showing display override scoped to a single element, and explicit RLM/FSI marks inside markup. No scripts and no external resources.

Three notification templates in English, Arabic and Hebrew, each given raw and with every interpolation slot wrapped in FSI…PDI, plus four argument sets covering an LTR name in an RTL sentence, an RTL name in an LTR sentence and a name beginning with a neutral character. This is the fixture for the bug where a display name reorders the sentence around it.

A flat index of the bidi cases in this wave — which mark each one uses, what it should render as, and why the neutral characters involved need help. Row b8 is the control case with no marks, against which the other seven are compared.

The same number, 1234567.89, rendered for twelve locales, with the group and decimal separator that produced each one named by code point and present literally in the cell. Four of the separators are not ASCII — U+00A0, U+202F, U+2019 and U+066C — and ar-EG additionally switches the digits themselves.

The structured twin of the number-format table, plus four documented traps: es-ES's minimumGroupingDigits=2 (which leaves a four-digit integer ungrouped), the four non-ASCII group separators, the arab numbering system's own digits, and the seven locales here whose decimal separator is a comma.

12345.60 in each locale's own currency, with the fraction-digit count and the symbol placement that produced it. JPY takes zero decimals and rounds; six rows separate the amount from the symbol with U+00A0 rather than a plain space; and ar-EG puts the amount in Arabic-Indic digits.

The structured currency table with the three traps spelled out: minor units belong to the CURRENCY not the locale (JPY 0, USD 2, KWD/BHD/JOD 3), the gap before a trailing symbol is U+00A0 in six of these locales, and CLDR's ar-EG pattern contains an invisible U+200F that breaks naive equality assertions.

Short and medium date patterns, the short time pattern and the hour cycle for ten locales, each with the rendering of 2026-03-14T09:05. The ar-EG patterns contain U+200F between their fields and ru-RU's medium pattern ends in a quoted literal, so neither is the plain ASCII it appears to be.

The structured date table plus the four traps worth their own test: day/month ambiguity in short dates, the RLM embedded in CLDR's Arabic pattern, quoted literal text inside the Russian pattern, and the localized day-period marker that a 12-hour formatter must not drop.

Every separator, sign and digit set a locale-aware formatter has to survive, each present literally between ASCII guards: the no-break and narrow-no-break spaces, de-CH's U+2019 group separator, the Arabic decimal and thousands separators, the four numbering systems' digits, and CLDR's U+2212 MINUS SIGN, which is not the ASCII hyphen.

Era and era-year for one instant across five calendar systems. The three whose months and days align with the Gregorian calendar — Japanese (Reiwa 8), ROC (Minguo 115) and Thai Buddhist (2569) — carry a full rendered date; the Hijri and Hebrew entries carry the year only, because their day and month depend on the calculation variant and, for Hijri, on observation. Saying so is the point of the fixture.

Test names in German, French, Japanese, Greek and Russian, stored as UTF-8 with no BOM and an explicit encoding declaration. A reporter that assumes the platform default encoding produces mojibake here rather than an error.

A feature written entirely in French keywords, declared by the # language: fr header that must be the first line of the file. Parsers that hardcode English keywords read this as a feature with no scenarios rather than reporting an error, so it fails silently.
We use Google Analytics and show ads via Adsterra. Non-essential cookies and ad scripts run only after you allow the matching categories. See our cookie policy.