---
title: "verbatra pseudo"
description: "Génère une pseudo-locale à partir de tes chaînes source pour repérer les boutons tronqués et les libellés non extraits, sans fournisseur ni clé d'API."
type: "reference"
---
# verbatra pseudo

Génère une pseudo-locale à partir de tes chaînes source pour repérer les boutons tronqués et les libellés non extraits, sans fournisseur ni clé d'API.

<AvailableFrom version="0.11.0" />

Fais tourner ton app dans une langue qui n'existe pas. `pseudo` construit une fausse locale à partir de tes chaînes source : chaque valeur est accentuée, allongée et entourée de marqueurs visibles, si bien que les boutons tronqués, les phrases recollées en morceaux et les libellés jamais extraits sautent aux yeux. Avec `--mode bidi`, elle affiche plutôt chaque chaîne de droite à gauche. La commande ne construit aucun fournisseur, ne lit aucune clé d'API et ne fait aucune requête réseau, elle fonctionne donc avant qu'une clé existe.

## Synopsis [#synopsis]

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

## Exemples [#exemples]

```bash
# générer en-XA sous .verbatra-local/pseudo
verbatra pseudo

# afficher chaque chaîne de droite à gauche en ar-XB
verbatra pseudo --mode bidi

# l'écrire là où le serveur de dev sert déjà des fichiers statiques (ne commite pas un fichier bidi : GitHub signale son Unicode caché)
verbatra pseudo --out public/locales-pseudo

# résultat lisible par une machine pour un script
verbatra pseudo --json
```

## Options [#options]

| Option | Argument | Défaut | Effet |
| --- | --- | --- | --- |
| `--mode` | `<mode>` | `accented` | <AvailableFrom version="0.12.0" /> la transformation : `accented` ou `bidi`, qui affiche chaque mot de droite à gauche (sinon `INVALID_OPTION`) |
| `--locale` | `<code>` | `en-XA` (`ar-XB` avec `--mode bidi`) | la pseudo-locale à générer ; lettres, chiffres et tirets uniquement (sinon `INVALID_LOCALE`) |
| `--out` | `<path>` | `.verbatra-local/pseudo` | répertoire où écrire la pseudo-locale, relatif au répertoire de travail et à l'intérieur de la racine du projet ; une valeur vide est `INVALID_OUT` |

La commande accepte aussi les [options globales](https://verbatra.kreitz-webdev.de/fr/docs/cli.md#options-globales) `--cwd`, `--config` et `--json`.

## Comportement [#comportement]

### Ce que fait la transformation [#ce-que-fait-la-transformation]

| Étape | Ce que tu vois |
| --- | --- |
| Accentuer | chaque lettre ASCII devient un sosie accentué, donc `Save` se lit `Śáṽé` |
| Allonger | la valeur grandit d'environ un tiers de sa longueur traduisible, à peu près ce dont l'allemand a besoin face à l'anglais |
| Marquer | la valeur est entourée de `[` et `]`, donc une chaîne tronquée ou concaténée se voit tout de suite |

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

Seul le texte traduisible change. Les placeholders survivent dans toutes les syntaxes que reconnaissent les [adaptateurs de format](https://verbatra.kreitz-webdev.de/fr/docs/formats.md), et dans un message ICU les noms d'arguments, les mots-clés `plural` et `select` et les sélecteurs de branche restent tels quels. Les formes plurielles vue-i18n séparées par des barres verticales sont transformées une à une : `car | cars` devient `[ćáŕ··] | [ćáŕś··]`. La transformation est déterministe, donc le fichier produit des diffs propres.

### Mode de droite à gauche [#mode-de-droite-à-gauche]

<AvailableFrom version="0.12.0" />

`--mode bidi` remplace les accents par un forçage de droite à gauche, l'approche qu'Android et Chromium suivent pour leur pseudo-locale `ar-XB`, si bien qu'une mise en page qui suppose un texte de gauche à droite se voit avant qu'existe la moindre traduction de droite à gauche.

| Étape | Ce que tu vois |
| --- | --- |
| Forcer | chaque mot est entouré d'une marque et d'un forçage de droite à gauche (`U+200F U+202E` avant, `U+202C U+200F` après), donc `Save` s'affiche `evaS` |
| Garder | les placeholders, la syntaxe ICU, le balisage, les chiffres et la ponctuation restent hors du forçage et se lisent de gauche à droite, comme dans un vrai texte de droite à gauche |

Rien n'est accentué, allongé ni mis entre crochets : la largeur, c'est le mode par défaut qui la teste. Le fichier garde les lettres dans leur ordre d'origine, et chaque valeur passe le même contrôle d'intégrité, donc les placeholders et les branches de pluriel restent identiques à l'octet près.

La pseudo-locale par défaut est `ar-XB`, que `Intl.Locale` et la plupart des bibliothèques i18n résolvent de droite à gauche, donc une app qui déduit `dir` de la locale bascule toute seule. `ar-XB` suit les règles de pluriel de l'arabe (`zero`, `one`, `two`, `few`, `many`, `other`). Les messages ICU, les `<plurals>` Android, gettext, les catalogues Apple et les barres verticales vue-i18n résolvent un nombre avec les formes que le fichier a déjà. `i18next-json` range chaque forme sous sa propre clé `_one` ou `_other`, donc le fichier reçoit aussi chaque catégorie qui manque à la source (`_zero`, `_two`, `_few`, `_many`, et les formes ordinales de même), remplie à partir de la forme `other` de la source, et aucun nombre ne se rabat sur ta langue de repli. Passe `--locale en-XB` pour garder les règles de pluriel de l'anglais, et pose `dir="rtl"` toi-même.

Un assainisseur qui retire les caractères de formatage Unicode enlève le forçage, et la chaîne s'affiche de nouveau de gauche à droite. Les éditeurs et scanners de code qui signalent les caractères bidirectionnels cachés marquent le fichier, une raison de plus pour qu'il reste sous `.verbatra-local`.

### Rien de cassé n'atteint jamais le fichier [#rien-de-cassé-natteint-jamais-le-fichier]

Chaque valeur générée passe le même contrôle d'intégrité que la traduction d'un fournisseur : les mêmes placeholders que la source, une syntaxe de message valide, pas de dégénérescence, pas de vide. Une valeur qui échouerait est copiée telle quelle depuis la source et nommée sous `copied verbatim` ; c'est un signalement, pas un échec.

### Où va la sortie [#où-va-la-sortie]

La pseudo-locale est écrite hors de tes vrais fichiers de locale, par défaut sous `.verbatra-local/pseudo`, que [`verbatra init`](https://verbatra.kreitz-webdev.de/fr/docs/cli/init.md) ajoute au `.gitignore` (`pseudo` complète l'entrée si elle manque). Ton `files.pattern` est développé dans ce répertoire, donc avec `locales/{locale}.json` l'exécution par défaut écrit `.verbatra-local/pseudo/locales/en-XA.json`. Pointe ton serveur de dev dessus, ou passe `--out` pour écrire là où ton build sert déjà des fichiers.

`PSEUDO_OUTPUT_CONFLICT` refuse, avant toute lecture ou écriture :

- une pseudo-locale qui nomme ta locale source ou une locale cible,
- un `--out` qui place le fichier dans le même répertoire qu'un fichier de locale configuré,
- un `--out` absolu, qui sort de la racine du projet ou qui, une fois les liens symboliques résolus, aboutit hors du projet, à sa racine ou sur un fichier dont dépend le projet.

Comme le fichier est hors de `files.pattern`, [`translate`](https://verbatra.kreitz-webdev.de/fr/docs/cli/translate.md) ne dépense jamais rien pour lui, et [`check`](https://verbatra.kreitz-webdev.de/fr/docs/cli/check.md) et [`diff`](https://verbatra.kreitz-webdev.de/fr/docs/cli/diff.md) ne le signalent jamais.

### Formats écrits en retouchant un fichier existant [#formats-écrits-en-retouchant-un-fichier-existant]

Les writers de `xliff` et `apple-xcstrings` retouchent des unités déjà présentes dans le document cible : le fichier de la pseudo-locale est donc recopié depuis ton fichier source à chaque écriture, et une clé ajoutée plus tard à la source arrive quand même. Dans un XLIFF copié, `target-language` est réécrit vers la pseudo-locale.

### Sortie JSON [#sortie-json]

Schéma : [`pseudo-envelope.json`](https://verbatra.kreitz-webdev.de/schema/v1/pseudo-envelope.json) valide l'enveloppe entière ; [Schémas](https://verbatra.kreitz-webdev.de/fr/docs/cli/output.md#schémas) liste les autres.

Avec `--json`, l'[enveloppe JSON](https://verbatra.kreitz-webdev.de/fr/docs/cli/output.md#sortie-json) porte `locale`, `mode` (`accented` ou `bidi`), `path`, `entries` (entrées écrites, y compris les formes de pluriel ajoutées en mode bidi), `transformed` (valeurs qui diffèrent de la source), `copied` (clés copiées telles quelles) et `written` (`false` quand le fichier était déjà à jour).

### Retour dans le terminal [#retour-dans-le-terminal]

<AvailableFrom version="0.12.0" />

Le résultat va sur stdout ; la ligne de progression et l'étape suivante vont sur 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
```

Une deuxième exécution sur une source inchangée rapporte `unchanged` au lieu de `wrote`. `--quiet` supprime les lignes stderr. Voir [Sortie dans le terminal](https://verbatra.kreitz-webdev.de/fr/docs/cli/output.md#sortie-dans-le-terminal).

## Codes de sortie [#codes-de-sortie]

| Code | Signification |
| --- | --- |
| `0` | la pseudo-locale a été générée, que le fichier ait changé ou non ; les valeurs copiées telles quelles n'y changent rien |
| `2` | exécution impossible : une erreur d'utilisation, un problème de config ou de source, ou une pseudo-locale ou un chemin de sortie refusé |

Voir [le contrat des codes de sortie](https://verbatra.kreitz-webdev.de/fr/docs/cli/output.md#codes-de-sortie).

## Voir aussi [#voir-aussi]

- [`verbatra translate`](https://verbatra.kreitz-webdev.de/fr/docs/cli/translate.md) fait le vrai travail, dès que tu as une clé.
- [`verbatra doctor`](https://verbatra.kreitz-webdev.de/fr/docs/cli/doctor.md) valide aussi un projet sans rien dépenser.
- [Formats](https://verbatra.kreitz-webdev.de/fr/docs/formats.md) liste la syntaxe des placeholders de chaque format.
- [Le fichier de config](https://verbatra.kreitz-webdev.de/fr/docs/config-file.md) documente `files.pattern`, qui fixe la structure du fichier généré.
