CLI
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Installation
- npm
- yarn
npm i -D @formatjs/cli
yarn add -D @formatjs/cli
Ajoutez la commande suivante dans vos scripts du package.json :
{
"scripts": {
"extract": "formatjs extract",
"compile": "formatjs compile"
}
}
Nous avons développé cette CLI qui vous permet d'extraire des messages depuis une liste de fichiers. Elle utilise @formatjs/ts-transformer en arrière-plan et peut extraire les messages si vous utilisez l'une des méthodes ci-dessous :
import {defineMessages, defineMessage} from 'react-intl'
defineMessages({
foo: {
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
},
})
defineMessage({
id: 'single',
defaultMessage: 'single message',
description: 'header',
})
import {FormattedMessage} from 'react-intl'
;<FormattedMessage id="foo" defaultMessage="foo" description="bar" />
function Comp(props) {
const {intl} = props
return intl.formatMessage({
// The whole `intl.formatMessage` is required so we can extract
id: 'foo',
defaultMessage: 'foo',
description: 'bar',
})
}
Extraction
- npm
- yarn
npm run extract -- --help
# Usage: formatjs extract [options] [files...]
# Extract string messages from React components that use react-intl.
# The input language is expected to be TypeScript or ES2017 with JSX.
For example:
npm run extract -- "src/**/*.{ts,tsx,vue}" --out-file lang.json
yarn extract --help
# Usage: formatjs extract [options] [files...]
# Extract string messages from React components that use react-intl.
# The input language is expected to be TypeScript or ES2017 with JSX.
For example:
yarn extract "src/**/*.{ts,tsx,vue}" --out-file lang.json
Toujours encadrer votre motif glob (" ou ') comme "src/**/*" pour éviter l'expansion automatique par le shell, qui varie selon l'environnement (zsh vs fish vs bash).
--format [path]
Chemin vers un fichier de formattage qui contrôle la structure du fichier JSON généré par --out-file.
Ce fichier doit exporter une fonction nommée format avec la signature appropriée.
type FormatFn = <T = Record<string, MessageDescriptor>>(
msgs: Record<string, MessageDescriptor>
) => T
Particulièrement utile pour convertir notre format extrait vers un format spécifique à un TMS (système de gestion de traduction).
Voir nos formateurs intégrés pour des exemples.
--in-file [path]
Fichier contenant la liste des chemins de fichiers à extraire. Utile pour contourner les limites de ligne de commande de bash.
--out-file [path]
Chemin du fichier cible où le plugin écrira un fichier .json agrégé contenant toutes les traductions des files fournies. Ce drapeau ignore --messages-dir.
--id-interpolation-pattern [pattern]
Si certains descripteurs de message n'ont pas d'ID, ce pattern générera automatiquement des IDs. Valeur par défaut : [sha512:contenthash:base64:6]. Voir nodejs crypto createHash pour les algorithmes de hachage et nodejs buffer docs pour les encodages de digest.
--extract-source-location
Détermine si les métadonnées de localisation du message dans le fichier source doivent être extraites. Si true, les champs file, start et end seront présents pour chaque descripteur. (par défaut : false)
--additional-component-names [comma-separated-names]
Noms supplémentaires de composants pour l'extraction de messages, ex : ['FormattedFooBarMessage']. NOTE : Par défaut, nous vérifions que FormattedMessage est importé depuis moduleSourceName pour garantir le fonctionnement des alias. Cette option ignore cette vérification et est donc moins sûre.
--additional-function-names [comma-separated-names]
Noms supplémentaires de fonctions pour l'extraction de messages, ex : ['$t'].
--ignore [files]
Liste de chemins glob à exclure de l'extraction de traductions.
--throws
Détermine s'il faut lever une exception en cas d'échec du traitement d'un fichier dans le lot.
--pragma [pragma]
Analyse une pragma personnalisée supplémentaire spécifique. Permet d'étiqueter des fichiers avec des métadonnées comme project. Exemple avec ce fichier :
// @intl-meta project:my-custom-project
import {FormattedMessage} from 'react-intl'
;<FormattedMessage defaultMessage="foo" id="bar" />
et avec l'option {pragma: "intl-meta"}, nous convertirons // @intl-meta project:my-custom-project en {project: 'my-custom-project'} dans le fichier résultat.
--preserve-whitespace
Détermine s'il faut conserver les espaces et sauts de ligne en sortie. Nous les supprimons généralement car ils sont souvent utilisés abusivement pour la mise en forme.
--flatten
Détermine s'il faut remonter les sélecteurs et aplatir les phrases autant que possible. Ex :
I have {count, plural, one{a dog} other{many dogs}}
devient
{count, plural, one{I have a dog} other{I have many dogs}}
L'objectif est de fournir autant de phrases complètes que possible, car les fragments de phrases ne sont pas adaptés pour la traduction.
Vérification
Vérifiez les fichiers de traduction pour vous assurer que les clés sont traduites et que les messages sont structurellement compatibles avec la locale source.
- npm
- yarn
npm run formatjs verify [options] <translationFiles>
yarn formatjs verify [options] <translationFiles>
--source-locale <sourceLocale>
La locale source des fichiers de traduction. Un fichier nommé <sourceLocale>.json doit exister dans la liste des fichiers de traduction. Il sert de référence pour vérifier les autres traductions.
--missing-keys
Active la vérification des clés manquantes dans la locale cible par rapport à la locale source. Cela garantit qu'aucun message n'est non traduit.
--structural-equality
Active la vérification de l'égalité structurelle des messages entre la locale source et la cible. Cela assure que les traductions sont formatables et ne manquent aucun jeton.
--extra-keys
Détermine s'il faut vérifier les clés présentes dans la locale cible mais absentes de la locale source. Cela garantit que les fichiers de traduction ne contiennent pas de clés obsolètes ou inutilisées.
Compilation
Compile les fichiers extraits via formatjs extract en un fichier JSON
compatible avec react-intl. Effectue également la vérification des messages ICU. Voir Distribution des messages pour plus de détails.
- npm
- yarn
npm run compile -- --help
yarn compile --help
--format [path]
Chemin vers un fichier formateur qui convertit <translation_file> en Record<string, string> pour la compilation. Le fichier doit exporter une fonction nommée compile avec la signature :
type CompileFn = <T = Record<string, MessageDescriptor>>(
msgs: T
) => Record<string, string>
Particulièrement utile pour reconvertir un format spécifique à un TMS vers le format react-intl.
Voir nos formateurs intégrés pour des exemples.
--out-file <output>
Fichier cible contenant les messages compilés.
--ast
Détermine si le message doit être compilé en AST plutôt qu'en simple chaîne. Voir Utilisation avancée.
--pseudo-locale <pseudoLocale>
Compile les messages en pseudo-locales. Options disponibles :
Pour le message anglais my name is {name}
| Locale | Message |
|---|---|
xx-LS | my name is {name}SSSSSSSSSSSSSSSSSSSSSSSSS |
xx-AC | MY NAME IS {name} |
xx-HA | [javascript]my name is {name} |
en-XA | [ḿẏ ƞȧȧḿḗḗ īş {name}] |
en-XB | ɯʎ uɐɯǝ ıs {name} |
Nécessite --ast
Extraction et compilation avec un seul script
Dans certains environnements, vous pouvez vouloir extraire vos messages directement dans un format prêt à l'emploi pour react-intl, sans utiliser de format intermédiaire. Ceci est utile pour créer rapidement le fichier de langue originale utilisant les messages par défaut, ou pour des systèmes de gestion de traduction (TMS) fonctionnant mieux avec les fichiers compilés. Notez que les fichiers compilés ne contiennent pas les descriptions des messages, ce qui les rend moins pratiques pour les traducteurs. L'idéal est d'utiliser un formateur personnalisé adapté à votre TMS.
Pour réaliser extraction et compilation en un seul script, configurez simplement un exemple dans package.json :
"scripts": {
"extract": "formatjs extract",
"compile": "formatjs compile",
"extract-compile": "formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]' && formatjs compile 'temp.json' --out-file lang/en.json && rm temp.json"
}
Détail du script
Le script extract-compile exécute trois opérations séquentielles.
formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]'
La première commande extrait les messages de tous les fichiers TypeScript dans les sous-dossiers de src. Excluez les fichiers problématiques avec --ignore myFolder/myFile.ts.
formatjs compile 'temp.json' --out-file lang/en.json
La deuxième commande compile les messages de temp.json dans lang/en.json, prêt pour react-intl.
rm temp.json
La dernière commande supprime le fichier d'extraction temp.json. Supprimez cette étape si vous souhaitez conserver le fichier.
Fichiers résultants
Vous pouvez observer ici la différence entre les formats de fichier extrait (utilisant le formateur par défaut) et compilé. Dans le script ci-dessus, temp.json représente le fichier extrait tandis que en.json est le fichier compilé.
- Extracted messages
- Compiled messages
{
"hak27d": {
"defaultMessage": "Control Panel",
"description": "title of control panel section"
},
"haqsd": {
"defaultMessage": "Delete user {name}",
"description": "delete button"
},
"19hjs": {
"defaultMessage": "New Password",
"description": "placeholder text"
},
"explicit-id": {
"defaultMessage": "Confirm Password",
"description": "placeholder text"
}
}
{
"hak27d": "Control Panel",
"haqsd": "Delete user {name}",
"19hjs": "New Password",
"explicit-id": "Confirm Password"
}
Compilation de dossier
Compilez par lot un dossier contenant des fichiers extraits via formatjs extract vers un dossier contenant des fichiers JSON compatibles react-intl. Cette opération inclut également la vérification des messages ICU. Voir Distribution des messages pour plus de détails.
- npm
- yarn
npm run formatjs compile-folder [options] <folder> <outFolder>
yarn formatjs compile-folder [options] <folder> <outFolder>
La structure du dossier doit suivre le format <folder>/<locale>.json et la sortie sera <outFolder>/<locale>.json.
--format [path]
Chemin vers un fichier formateur qui convertit <translation_file> en Record<string, string> pour la compilation. Le fichier doit exporter une fonction nommée compile avec la signature :
type CompileFn = <T = Record<string, MessageDescriptor>>(
msgs: T
) => Record<string, string>
Particulièrement utile pour reconvertir un format spécifique à un TMS vers le format react-intl.
--ast
Détermine si le message doit être compilé en AST plutôt qu'en simple chaîne. Voir Utilisation avancée.
--skip-errors
Détermine si la compilation doit continuer après une erreur de traitement. Les clés comportant des erreurs seront exclues du fichier de sortie.
Formateurs intégrés
Nous fournissons les formateurs intégrés suivants pour l'intégration avec des TMS tiers :
| TMS | --format |
|---|---|
| BabelEdit | simple |
| Crowdin Chrome JSON | crowdin |
| Lingohub | simple |
| Localize's Simple JSON | simple |
| Localizely | simple |
| locize | simple |
| Lokalise Structured JSON | lokalise |
| Phrase | simple |
| POEditor Key-Value JSON | simple |
| SimpleLocalize | simple |
| Smartling ICU JSON | smartling |
| Transifex's Structured JSON | transifex |
Les format d'extract et compile doivent être identiques : si vous utilisez extract --format smartling, vous devez également utiliser compile --format smartling et vice versa.
Formateurs personnalisés
Vous pouvez implémenter votre propre formateur en utilisant nos interfaces :
import {FormatFn, CompileFn, Comparator} from '@formatjs/cli'
interface VendorJson {}
// [Optional] Format @formatjs/cli structure to vendor's structure
export const format: FormatFn<VendorJson> = () => {}
// [Optional] Format vendor's structure to @formatjs/cli structure
export const compile: CompileFn<VendorJson> = () => {}
// [Optional] Sort the messages in a specific order during serialization
export const compareMessages: Comparator = () => {}
Consultez notre code de formateur intégré pour des exemples.
API Node
Installez @formatjs/cli-lib pour une utilisation programmatique.
- npm
- yarn
npm i -D @formatjs/cli-lib
yarn add -D @formatjs/cli-lib
Extraction
import {extract} from '@formatjs/cli-lib'
const resultAsString: Promise<string> = extract(files, {
idInterpolationPattern: '[sha512:contenthash:base64:6]',
})
Compilation
import {compile} from '@formatjs/cli-lib'
const resultAsString: Promise<string> = compile(files, {
ast: true,
})
Formateur personnalisé
import {FormatFn, CompileFn, Comparator} from '@formatjs/cli-lib'
export const format: FormatFn = msgs => msgs
// Sort key reverse alphabetically
export const compareMessages = (el1, el2) => {
return el1.key < el2.key ? 1 : -1
}
export const compile: CompileFn = msgs => {
const results: Record<string, string> = {}
for (const k in msgs) {
results[k] = msgs[k].defaultMessage!
}
return results
}