---
title: "verbatra pseudo"
description: "Erzeuge aus deinen Quellstrings eine Pseudo-Locale, damit abgeschnittene Buttons und nicht extrahierte Labels auffallen, ohne Provider-Aufruf und ohne API-Key."
type: "reference"
---
# verbatra pseudo

Erzeuge aus deinen Quellstrings eine Pseudo-Locale, damit abgeschnittene Buttons und nicht extrahierte Labels auffallen, ohne Provider-Aufruf und ohne API-Key.

<AvailableFrom version="0.11.0" />

Lass deine App in einer Sprache laufen, die es nicht gibt. `pseudo` baut aus deinen Quellstrings eine Fake-Locale: Jeder Wert bekommt Akzente, wird länger und steckt zwischen sichtbaren Markern, sodass abgeschnittene Buttons, zusammengestückelte Sätze und nie extrahierte Labels auffallen. Mit `--mode bidi` zeigt er stattdessen jeden String von rechts nach links. Der Befehl erstellt keinen Provider, liest keinen API-Key und macht keine Netzwerkanfrage, er funktioniert also, bevor es einen API-Key gibt.

## Synopsis [#synopsis]

```bash
verbatra pseudo [flags]
```

## Beispiele [#beispiele]

```bash
# en-XA unter .verbatra-local/pseudo erzeugen
verbatra pseudo

# jeden String in ar-XB von rechts nach links darstellen
verbatra pseudo --mode bidi

# dorthin schreiben, wo der Dev-Server schon statische Dateien ausliefert (eine Bidi-Datei nicht committen: GitHub markiert ihr verstecktes Unicode)
verbatra pseudo --out public/locales-pseudo

# maschinenlesbares Ergebnis für ein Skript
verbatra pseudo --json
```

## Flags [#flags]

| Flag | Argument | Standard | Wirkung |
| --- | --- | --- | --- |
| `--mode` | `<mode>` | `accented` | <AvailableFrom version="0.12.0" /> die Transformation: `accented` oder `bidi`, das jedes Wort von rechts nach links darstellt (sonst `INVALID_OPTION`) |
| `--locale` | `<code>` | `en-XA` (`ar-XB` mit `--mode bidi`) | die zu erzeugende Pseudo-Locale; nur Buchstaben, Ziffern und Bindestriche (sonst `INVALID_LOCALE`) |
| `--out` | `<path>` | `.verbatra-local/pseudo` | Verzeichnis, unter das die Pseudo-Locale geschrieben wird, relativ zum Arbeitsverzeichnis und innerhalb der Projektwurzel; ein leerer Wert ist `INVALID_OUT` |

Außerdem nimmt der Befehl die [globalen Flags](https://verbatra.kreitz-webdev.de/de/docs/cli.md#globale-flags) `--cwd`, `--config` und `--json`.

## Verhalten [#verhalten]

### Was die Transformation tut [#was-die-transformation-tut]

| Schritt | Was du siehst |
| --- | --- |
| Akzente | jeder ASCII-Buchstabe wird zu einem akzentuierten Doppelgänger, `Save` liest sich also `Śáṽé` |
| Verlängern | der Wert wächst um etwa ein Drittel seiner übersetzbaren Länge, ungefähr das, was Deutsch gegenüber Englisch braucht |
| Markieren | der Wert steht zwischen `[` und `]`, ein abgeschnittener oder zusammengesetzter String fällt also sofort auf |

Aus `Hello {{name}}, you have {{count}} unread messages` wird
`[Ĥéĺĺó {{name}}, ýóú ĥáṽé {{count}} úńŕéáḋ ṁéśśáġéś············]`.

Nur übersetzbarer Text ändert sich. Platzhalter überleben in jeder Syntax, die die [Format-Adapter](https://verbatra.kreitz-webdev.de/de/docs/formats.md) kennen, und in einer ICU-Nachricht bleiben Argumentnamen, die Schlüsselwörter `plural` und `select` und die Zweig-Selektoren unverändert. Durch Pipes getrennte Pluralformen von vue-i18n werden einzeln umgewandelt: `car | cars` wird zu `[ćáŕ··] | [ćáŕś··]`. Die Transformation ist deterministisch, die Datei lässt sich also sauber diffen.

### Rechts-nach-links-Modus [#rechts-nach-links-modus]

<AvailableFrom version="0.12.0" />

`--mode bidi` ersetzt die Akzente durch eine Rechts-nach-links-Überschreibung, so wie Android und Chromium ihre Pseudo-Locale `ar-XB` bauen. Ein Layout, das Links-nach-rechts-Text voraussetzt, fällt so auf, bevor es irgendeine Rechts-nach-links-Übersetzung gibt.

| Schritt | Was du siehst |
| --- | --- |
| Überschreiben | jedes Wort steht zwischen Rechts-nach-links-Marke und -Überschreibung (`U+200F U+202E` davor, `U+202C U+200F` danach), `Save` erscheint also als `evaS` |
| Behalten | Platzhalter, ICU-Syntax, Markup, Ziffern und Satzzeichen bleiben außerhalb der Überschreibung und laufen von links nach rechts, wie in echtem Rechts-nach-links-Text |

Nichts bekommt Akzente, wird länger oder steht in Klammern: Die Breite testet der Standardmodus. Die Datei behält die Buchstaben in ihrer gespeicherten Reihenfolge, und jeder Wert besteht dasselbe Integritäts-Gate, Platzhalter und Plural-Zweige bleiben also Byte für Byte gleich.

Standard ist die Pseudo-Locale `ar-XB`, die `Intl.Locale` und die meisten i18n-Bibliotheken als rechts nach links auflösen, eine App, die `dir` aus der Locale ableitet, dreht also von selbst um. `ar-XB` folgt den arabischen Pluralregeln (`zero`, `one`, `two`, `few`, `many`, `other`). ICU-Nachrichten, Android-`<plurals>`, gettext, Apple-Kataloge und vue-i18n-Pipes lösen eine Anzahl gegen die Formen auf, die die Datei schon hat. `i18next-json` hält jede Form unter einem eigenen `_one`- oder `_other`-Key, deshalb bekommt die Datei zusätzlich jede Kategorie, die der Quelle fehlt (`_zero`, `_two`, `_few`, `_many` und Ordinalformen ebenso), gefüllt aus der `other`-Form der Quelle, und keine Anzahl fällt auf deine Fallback-Sprache zurück. Mit `--locale en-XB` behältst du die englischen Pluralregeln und setzt `dir="rtl"` selbst.

Ein Sanitizer, der Unicode-Formatzeichen entfernt, nimmt die Überschreibung mit, und der String läuft wieder von links nach rechts. Editoren und Code-Scanner, die vor versteckten bidirektionalen Zeichen warnen, markieren die Datei, ein Grund mehr, dass sie unter `.verbatra-local` bleibt.

### Nichts Kaputtes landet je in der Datei [#nichts-kaputtes-landet-je-in-der-datei]

Jeder erzeugte Wert besteht dasselbe Integritäts-Gate wie die Übersetzung eines Providers: dieselben Platzhalter wie die Quelle, gültige Nachrichtensyntax, nicht entartet, nicht leer. Ein Wert, der durchfallen würde, wird unverändert aus der Quelle kopiert und unter `copied verbatim` genannt; das ist ein Hinweis, kein Fehler.

### Wohin die Ausgabe geht [#wohin-die-ausgabe-geht]

Die Pseudo-Locale landet außerhalb deiner echten Locale-Dateien, standardmäßig unter `.verbatra-local/pseudo`, das [`verbatra init`](https://verbatra.kreitz-webdev.de/de/docs/cli/init.md) in `.gitignore` einträgt (`pseudo` ergänzt den Eintrag, falls er fehlt). Dein `files.pattern` wird in diesem Verzeichnis aufgelöst, mit `locales/{locale}.json` schreibt der Standardlauf also `.verbatra-local/pseudo/locales/en-XA.json`. Richte deinen Dev-Server darauf aus, oder schreib mit `--out` dorthin, wo dein Build schon ausliefert.

`PSEUDO_OUTPUT_CONFLICT` lehnt ab, bevor irgendetwas gelesen oder geschrieben wird:

- eine Pseudo-Locale, die deine Quell-Locale oder eine Ziel-Locale benennt,
- ein `--out`, das die Datei in dasselbe Verzeichnis wie eine konfigurierte Locale-Datei legt,
- ein `--out`, das absolut ist, aus der Projektwurzel herausführt oder nach dem Auflösen symbolischer Links außerhalb des Projekts, in seiner Wurzel oder auf einer Datei landet, von der das Projekt abhängt.

Weil die Datei außerhalb von `files.pattern` liegt, gibt [`translate`](https://verbatra.kreitz-webdev.de/de/docs/cli/translate.md) nie Geld für sie aus, und [`check`](https://verbatra.kreitz-webdev.de/de/docs/cli/check.md) und [`diff`](https://verbatra.kreitz-webdev.de/de/docs/cli/diff.md) melden sie nie.

### Formate, die durch Patchen einer vorhandenen Datei geschrieben werden [#formate-die-durch-patchen-einer-vorhandenen-datei-geschrieben-werden]

Die Writer für `xliff` und `apple-xcstrings` patchen Einheiten, die schon im Zieldokument stehen. Deshalb wird die Pseudo-Locale-Datei bei jedem Schreiben neu aus deiner Quelldatei kopiert, und ein später zur Quelle hinzugefügter Key kommt trotzdem an. Bei einer kopierten XLIFF-Datei wird `target-language` auf die Pseudo-Locale umgeschrieben.

### JSON-Ausgabe [#json-ausgabe]

Schema: [`pseudo-envelope.json`](https://verbatra.kreitz-webdev.de/schema/v1/pseudo-envelope.json) validiert den ganzen Envelope; [Schemas](https://verbatra.kreitz-webdev.de/de/docs/cli/output.md#schemas) listet die übrigen auf.

Mit `--json` trägt der [JSON-Envelope](https://verbatra.kreitz-webdev.de/de/docs/cli/output.md#json-ausgabe) `locale`, `mode` (`accented` oder `bidi`), `path`, `entries` (geschriebene Einträge, samt der im Bidi-Modus ergänzten Pluralformen), `transformed` (Werte, die sich von der Quelle unterscheiden), `copied` (unverändert kopierte Keys) und `written` (`false`, wenn die Datei schon aktuell war).

### Rückmeldung im Terminal [#rückmeldung-im-terminal]

<AvailableFrom version="0.12.0" />

Das Ergebnis geht auf stdout; die Fortschrittszeile und der nächste Schritt gehen auf stderr:

```text output
verbatra: pseudolocalizing the source... done (0.1s)
verbatra pseudo
  en-XA (accented): 118 of 120 entries pseudolocalized
    copied verbatim: legal.disclaimer, brand.name
  wrote .verbatra-local/pseudo/locales/en-XA.json
next: load .verbatra-local/pseudo/locales/en-XA.json as the en-XA locale in your dev server
```

Ein zweiter Lauf über eine unveränderte Quelle meldet `unchanged` statt `wrote`. `--quiet` unterdrückt die stderr-Zeilen. Siehe [Terminalausgabe](https://verbatra.kreitz-webdev.de/de/docs/cli/output.md#terminalausgabe).

## Exit-Codes [#exit-codes]

| Code | Bedeutung |
| --- | --- |
| `0` | die Pseudo-Locale wurde erzeugt, ob sich die Datei geändert hat oder nicht; unverändert kopierte Werte ändern daran nichts |
| `2` | konnte nicht laufen: ein Bedienfehler, ein Config- oder Quellproblem oder eine abgelehnte Pseudo-Locale oder ein abgelehnter Ausgabepfad |

Siehe [den Exit-Code-Vertrag](https://verbatra.kreitz-webdev.de/de/docs/cli/output.md#exit-codes).

## Siehe auch [#siehe-auch]

- [`verbatra translate`](https://verbatra.kreitz-webdev.de/de/docs/cli/translate.md) macht das Echte, sobald du einen API-Key hast.
- [`verbatra doctor`](https://verbatra.kreitz-webdev.de/de/docs/cli/doctor.md) prüft ein Projekt ebenfalls, ohne etwas auszugeben.
- [Formate](https://verbatra.kreitz-webdev.de/de/docs/formats.md) listet die Platzhaltersyntax jedes Formats.
- [Die Config-Datei](https://verbatra.kreitz-webdev.de/de/docs/config-file.md) dokumentiert `files.pattern`, das den Aufbau der erzeugten Datei bestimmt.
