Skip to content

Localization principles

These rules govern every FontLab and Vexy translation: the application UI, the Help Panel, the manuals and the marketing pages. They come from the FontLab 9 UI review of 2026 (issues 132 and 133 in the fl10n repository), from the decisions the founder made while reviewing it, and from the localization literature the company keeps. A per-language guide applies them to one language; the translator handoff says how to propose a change. Three companion pages go deeper: interface strings for mnemonics, shortcuts, placeholders and reused words; memories, glossaries and machine drafts for how the translation memories and the engine are used; quality for the error types, severities and checks a review measures against. The term tables and the translation memories under localization/ in this repository are the data these rules produce.

Where the data lives

What Canonical location Format
English terms and definitions glossary/terms/<id>.yaml YAML, one term per file
Core memory: approved translations, status and translator notes localization/<code>-core.tmx TMX 1.4, one file per language, hand-maintained, one unit per glossary term
Project memory: reviewed FontLab UI strings localization/<code>-fontlab-ui.tmx TMX 1.4, one file per language, generated from the reviewed application catalogs by localization/sync_all.py
Rules and reasoning this section of the site Markdown, written by hand

The two memories have different jobs. The core memory is general knowledge: how the language names a kerning class, a master or an advance width. A translation engine receives it as a glossary, a hint on how to render the terms inside any sentence. The project memory is a cache of whole strings: when a FontLab message matches one of its sources verbatim, the reviewed translation is reused without asking anyone. A term therefore lives in the core memory only; scripts/check_tm.py fails the build if a core source segment is repeated in the project memory. A language that has no reviewed catalog yet has only a core memory.

scripts/build_glossary.py turns each core memory into the published <code>-terms.md table on every site build, so the table can never disagree with the memory. scripts/build_tmx.py regenerates the project memories from the reviewed catalogs. Nothing else in the company maintains a competing glossary or localization guideline; if a rule is missing here, add it here.

Choose professional terminology

Prefer the term a professional type designer uses over the term a general software user would guess. Take usage from Glyphs and FontForge first, then Adobe, then Apple, and only then Microsoft. The order reverses for standard operating-system commands: Copy, Paste, Quit, Undo, Preferences and their kin follow the localized platform, because users expect the OS word and Qt's own catalogs already use it. Corporate memories are often wrong: an old style typeface in Polish is antykwa renesansowa, not stary styl.

Understand what the term means in FontLab before you translate it. The same English word can name different things: width is the advance width of a glyph (German Dickte), the geometric width of a box (Breite), the width axis of a variable font (Weite) or tracking (Laufweite). Master, instance, element, reference, component, layer, pin and anchor are distinct objects; a translation that merges two of them is wrong even when it reads well.

Jargon is fine when the profession uses it, and an attested professional loan is never a terminology error; an unattested calque is. German keeps Kerning, Master, Hinting and Lookup; Polish turns master into matryca, the casting matrix, because it sounds like the English and names the right thing. A FontLab operation with a fixed meaning keeps its name: Oblique is not any slant, Flex is a hint, Power Nudge is a mode. Translate such a name only when the target language has an established equivalent for exactly that operation.

One meaning, one translation

When one concept has two renderings in the catalog, keep the shorter and more elegant one everywhere, including help text and the manual. Search the whole catalog for the concept, not for the string; a second rendering usually hides in a preference or a history entry. Record the winner in localization/<code>-core.tmx so the next catalog cannot reintroduce the loser.

Do not add detail the original does not have

If the English says pair in a kerning context, write pair, not kerning pair. If it says cloud, write cloud, not anchor cloud. If it says references, write references. Element references can also become Referenzen in a German control whose visible context already names elements; retain the full term in standalone text. If it says mask, write mask, even though a FontLab mask is a layer. Compounds are where translators add specificity by reflex, and compact UI strings have no room for it.

The same rule cuts the other way: do not drop a distinction the English keeps. Rename glyph in kerning pairs and classes affects all classes, not only kerning classes.

Keep the length of the original

English UI strings are already compressed for a space-limited control. Carry that compression over. In German and other languages that allow it, write in headline style: no article, no copula. This rule governs compact target labels only. Source English keeps its articles and syntactic cues so that translators can see the relationships, and explanatory prose in any language keeps its grammar. A verbless label must still be unambiguous on screen: a noun that can be read as a verb (Skalieren, Füllung) is checked in the running interface. Wenn Maske aktiv, not Wenn die Maskenebene aktiv ist; wenn neue Dickte kleiner als aktuelle; Gleiche Farbmarke wählen, not Glyphen mit gleicher Farbmarke auswählen. Drop padding the English carries only because it had room: Reset to default is Zurücksetzen; Select OCR languages to enable is OCR-Sprachen auswählen, because the list contains only available languages.

Elsewhere the layout absorbs growth. A planning budget of about a third for sentences and up to double for single words (Bearbeiten for Edit) tells a developer how much room to leave; it never approves a control, which only the runtime review can do. Panels with dense labels, such as Measurements, are the strict case: no translation may be longer than the English. Use the abbreviations the English uses (UC, lc) and the target language's standard short forms (cap., bdc, may., min.). Where a fixed professional term is one character longer, such as German Oberlänge for Ascender, keep the term and record the exception.

Drop the verb where the target language can imply it. German Pinsel in Konturen umwandeln becomes Pinsel zu Konturen: the reader supplies werden. The pattern covers every conversion: Zu Komponente, Referenz zu Komponente, Schnittmenge aus Konturen instead of Schnittmenge der Konturen bilden.

Compounds and loanwords

German writes ordinary compounds closed (Dateiname, Dicktenausdruck) and hyphenates compounds whose first part is a thinly loaned English word: Kerning-Klasse, Demo-Modus, Master-Dickten, Code-Editor, Stil-Gruppe, Element-Referenz. Other languages follow their own orthography, but the test is the same: would a native reader see one word or a borrowed word with a suffix?

Units and measurements

UPM is units per em. Translate the em with the typographic term of the language (German Geviert, French cadratin, Spanish eme, Polish firet) and UPM as the resolution of that em: Geviertauflösung, rozdzielczość firetu. A distance reads from–to: Descender to UPM is Unterlänge bis Gevierthöhe, Del descendente a la altura de eme. PPM is pixels per em; write it out in explanatory prose and keep the short form in compact hinting fields.

The fallback original term

Some English terms will not travel. Overshoot, stem, sidebearing, Cousins, Skin, True Fill: a translator who renders the word gets a calque nobody in the target profession uses, and a translator who reaches for the local professional word may not know which concept the English names. For such terms the glossary carries a second source text, the fallback original term: a short, plain English phrase, chosen so that translating it literally gives a defensible target term. Overshoot carries optical surplus; Polish took it and arrived at naddatek. Stem carries main stroke; the current Polish professional term is trzon. Cousins carries related glyphs shown alongside; Matchmaker carries master matcher; Power Nudge carries extended nudge.

The fallback is not a synonym for prose, and it is not the definition. It is the phrase to translate instead of the term when the term itself has no equivalent, and it says what the term means in the fewest words that still distinguish it from its neighbours. It lives in the glossary as the fallback field of the term file and travels in every core memory as the x-fallback property, so a translator, a vendor and a translation engine all see it beside the English term. A translation engine that receives a term with an empty target and a fallback is told to translate the plain phrase; a translator reads the fallback before proposing a term. Brand names and other non translatable terms have no fallback, because they are never translated.

Write a fallback when a literal translation of the term would mislead, when the English is an idiom or a product coinage, or when three languages have already stumbled on the term. A term the professions share (kerning is kerning almost everywhere) may still carry one, because the plain phrase helps the many languages that lack the loan; the glossary errs on that side. Keep it to at most six words. An eponym (Tunni line) and an operation that keeps its name everywhere (Flex) have none. If the best fallback is the definition, the term has a definition problem, not a fallback problem. The same principle applies beyond the glossary: when a language has no word for a concept, name the thing by what it does, as the founder did for overshoot, and expect the other languages to follow the same route.

Follower nodes

For localization, interpret legacy English Servant node and Servant as Follower node and Follower, physically following a leader. The node follows the movement of neighboring key nodes under Power Nudge. The servant and social fan/supporter metaphors are obsolete. The glossary's fallback original term is Follower node. Keep English catalog sources, resource keys and the servant-node identifier stable. Translate visible labels, X/Y variants, tooltips and help consistently.

Use German Folgeknoten, Spanish nodo seguidor, French nœud suiveur and Polish węzeł naśladowca. Compact labels are Folgeknoten, seguidor, suiveur and Naśladowca. Inflect running text naturally. Spanish keeps its spelling because seguidor also names physical following; German and French use terms that directly express following movement. The Polish term is the user's explicit choice.

FontLab names tools and windows with a readability hyphen even when both parts are native: Glyphen-Fenster, Schrift-Fenster, Kontur-Werkzeug. The German guide records compact hinzu, the synchron word family and the contextual short forms. Apply these by UI role, including every plural form; do not run an unrestricted text replacement over prose.

Names of features

FontLab's feature names are part of the product's voice, and the voice is playful, plain and a little cheeky. Translate them in that spirit; do not protect them as if they were brands. Only brands and trademarks stay English (FontLab, Fontographer, TransType, Vexy, the file formats and domains). A feature name that is an ordinary English word or a joke gets an ordinary word or a joke in the target language.

Humor and wordplay make a term memorable and are welcome as long as the information survives when the joke is missed. German Synchronsprecher for Matchmaker plays on coordinated masters and a dubbing actor. The copy-text labels Leer zeichen getrennt and Komma,getrennt visibly demonstrate their separators; do not extend those spellings to ordinary prose. Matchmaker is Polish swat, the village matchmaker, and should be equally plain elsewhere. True Fill is Polish Pełna krasa, "in full glory"; find a similarly snappy idiom rather than a description. Dream Up is wyczaruj, "conjure up". Sketchboard is szkicownik, a sketchbook. Skin is skórka, the diminutive of skin, as in the skin of a fruit.

Power names (Power Brush, Power Guide, Power Nudge, Power Stroke) are power in the register of an energy drink or a superhero cartoon, not serious power. Translate the adjective with the same wink: Polish Pędzel mocy, Prowadnica mocy, Obrys mocy (the genitive mocy, "of power", the way a Power Ranger is of power), and superholowanie for Power Nudge (super towing); German Power-Schub, Power-Pinsel, Power-Strich. A translation that makes them sound like an industrial rating has missed the tone.

Smart features (Smart Corner, Smart Filter, Smart Pencil, Smart Link, smart fill) take the native, simple word for sly or clever, with a hint of peasant cunning, and never intelligent, which now reads as a claim about AI: German schlau, Spanish astuto/a, French futé/e, Polish sprytny. Inflect it normally.

Down to earth. Prefer the everyday word to the sophisticated one. Nudge is Polish holowanie, towing, the thing a tow truck does to a car; Follower nodes are węzły typu Naśladowca, nodes that follow movement; Cousins is kuzynostwo, the cousins as a family group. Sketchboard, Skin, Genius, Follower and Cousins are concepts a language can name; keep the English only where the target language has no plain word for that exact thing, and record why.

Handyman verbs. Many tools borrow their names from real tools: Knife, Scissors, Pencil, Brush, Eraser, Magnet, the Attach tool. Where the target language has the verbs a craftsman uses with the real tool (to nick, to snip, to sketch, to rub out), use them for the digital tool's actions rather than a generic apply or edit. The tool's name carries an image; let the verbs carry it too.

A FontLab operation with a fixed technical meaning keeps a fixed name in every language, translated or not: Oblique is not any slant, Flex is a hint, OT Def is an identifier. Translate such a name only when the target language has an established equivalent for exactly that operation.

Do-not-translate with restraint

Do-not-translate is a decision about brands and identifiers, not a refuge from a hard term. Protect product names, trademarks, service and domain names, file format identifiers, OpenType tags and code (FontLab, Vexy, kern, OS/2, VFJ). Everything else may be translated, and a common noun built on a protected name may inflect and translate around it: Unicode is a proper name, but a Unicode codepoint is Polish jednostka unikodu, a unit of unicode, written as a common noun; FontLab account is konto FontLab; Vexy coins is żetony Vexy coin, tokens of Vexy coin. Tables inside a font are tablica CVT and tablica OS/2, with the tag protected and the noun translated. A memory that marks such terms do-not-translate hides a decision that has not been made; mark them translatable and record the rendering.

FontAudit is an explicit house exception: transliterate its name in non-Latin writing systems, including Chinese. Follow the core memory's spelling and approval status. Preserve FontAudit in code and identifiers.

OpenType procedures and compact labels

Translate OpenType lookup using the fallback procedure unless a different term has strong evidence in authored font documentation or translated font-tool UI. Prefer Glyphs where it supplies such evidence. German uses Lookup, French lookup, Polish procedura, and Russian процедура. The per-language core records other attested exceptions. Preserve feature-file keywords and OpenType structure names, and keep a lookup distinct from an individual rule. A contextual Rules panel title can remain the approved panel name.

Translate Fusion through Welder, the named live boolean group filter; Polish uses Spawacz. Apply current terms inside mnemonic-marked words too: compare the word without its accelerator, then choose a usable accelerator in the revised label. Do not treat a literal conjunction ampersand as part of the term.

For Dimensions and Glyph Window preferences, aim for at most 120% of the English label's character length. This is a review target, not permission to omit meaning or a guarantee of pixel fit. Tooltips can explain more. Ukrainian needs particular care: omit redundant font wording when the surrounding UI supplies it, and use the shorter flag term where color is already clear. TTH option labels can omit the verb use and abbreviate TrueType hinting as TTH.

Derive words from the chosen noun

Once a noun is settled, the verbs, adjectives and compounds follow from it, not from the English. Polish kerning is kerning, so the verb is kernować and the adjective kernowy (klasa kernowa, para kernowa, wyjątek kernowy), not kerningować or kerningowy; hinting gives hintować and hintowy. A native compound beats a two-word calque where the language forms compounds (autowarstwa for auto layer, German Auto-Ebene). When the plural of the chosen noun is awkward, choose a collective noun: Polish kuzynostwo avoids deciding between kuzyni and kuzyny. An eponym declines like a name (linia Tunniego, after Eduardo Tunni). Keep the distinctions the target profession makes even where English does not: a font table is tablica, a table in the interface is tabela; a stroke cap (zakończenie) is not a typographic terminal (zwieńczenie). Record every such derivation in the core memory note so that the next translator inherits the family, not just the noun.

Text that is also evidence

Some English strings are wrong. When the source text does not describe what the control does, translate the behavior and record the source defect; the FontLab review keeps such findings in the application repository under i18n/source-review/. A translation must not invent a feature, a version or a limitation the code does not have, and it must keep every placeholder, shortcut, path, tag and markup exactly.

What a review must produce

Every change to a shipped translation is recorded with the previous text, the new text and the reason, keyed by message id, in an exact ledger. Provenance follows the chain of ledgers by content, so a decision that returns a string to its earlier form is still traceable. The reasoning for the less obvious choices goes into the language guide on this site; the terms go into the core memory; the reviewed strings go into the project memory. A review is not complete until all three agree.

Keep each message contract and source revision with its translation so that changed behavior receives a fresh review.

For help, manuals and tutorials, follow the document workflow: check segmentation, reused passages, media and the routes through which readers reach the translated material.

Then review the working interface. Check the interpreted values, missing-resource behavior and messages produced during a task, as well as the translated catalog. Record the build and locale settings so the next reviewer can reproduce the result.