Référence / CLI
Page traduite automatiquement
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.
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
verbatra pseudo [flags]Exemples
# 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 --jsonOptions
| Option | Argument | Défaut | Effet |
|---|---|---|---|
--mode | <mode> | accented | la transformation : accented ou bidi, qui affiche chaque mot de droite à gauche (sinon INVALID_) |
--locale | <code> | en-XA (ar-XB avec --mode bidi) | la pseudo-locale à générer ; lettres, chiffres et tirets uniquement (sinon INVALID_) |
--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_ |
La commande accepte aussi les options globales --cwd, --config et --json.
Comportement
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, 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 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é _ ou _, donc le fichier reçoit aussi chaque catégorie qui manque à la source (_, _, _, _, 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
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
La pseudo-locale est écrite hors de tes vrais fichiers de locale, par défaut sous .verbatra-local/pseudo, que verbatra init 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_ refuse, avant toute lecture ou écriture :
- une pseudo-locale qui nomme ta locale source ou une locale cible,
- un
--outqui place le fichier dans le même répertoire qu'un fichier de locale configuré, - un
--outabsolu, 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 ne dépense jamais rien pour lui, et check et diff ne le signalent jamais.
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
Schéma : pseudo-envelope.json valide l'enveloppe entière ; Schémas liste les autres.
Avec --json, l'enveloppe 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
Le résultat va sur stdout ; la ligne de progression et l'étape suivante vont sur stderr :
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 serverUne 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.
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.
Voir aussi
verbatra translatefait le vrai travail, dès que tu as une clé.verbatra doctorvalide aussi un projet sans rien dépenser.- Formats liste la syntaxe des placeholders de chaque format.
- Le fichier de config documente
files.pattern, qui fixe la structure du fichier généré.