CLI
Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →
Installazione
- npm
- yarn
npm i -D @formatjs/cli
yarn add -D @formatjs/cli
Aggiungi il seguente comando agli scripts del tuo package.json:
{
"scripts": {
"extract": "formatjs extract",
"compile": "formatjs compile"
}
}
Abbiamo sviluppato questa CLI che ti aiuta a estrarre messaggi da una lista di file. Utilizza @formatjs/ts-transformer internamente e può estrarre messaggi se dichiarati tramite uno dei seguenti meccanismi:
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',
})
}
Estrazione
- 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
Racchiudi sempre tra virgolette (" o ') il tuo pattern glob (come "src/**/*") per evitare l'espansione automatica della shell, che varia in base al terminale utilizzato (zsh vs fish vs bash).
--format [path]
Percorso a un file formattatore che definisce la struttura del file JSON generato da --out-file.
Il file formattatore deve esportare una funzione chiamata format con la firma appropriata.
type FormatFn = <T = Record<string, MessageDescriptor>>(
msgs: Record<string, MessageDescriptor>
) => T
Particolarmente utile per convertire dal nostro formato estratto a un formato specifico per TMS.
Vedi i nostri formatter integrati per esempi.
--in-file [path]
File contenente l'elenco dei percorsi dei file da estrarre. Utile per superare il limite della riga di comando di bash.
--out-file [path]
Percorso del file di destinazione dove il plugin scriverà un file .json aggregato contenente tutte le traduzioni dai files forniti. Questo flag ignorerà --messages-dir.
--id-interpolation-pattern [pattern]
Se alcuni descrittori di messaggio non hanno ID, questo pattern genererà automaticamente gli ID. Predefinito: [sha512:contenthash:base64:6]. Consulta crypto createHash di Node.js per gli algoritmi di hash e documentazione buffer di Node.js per le codifiche di digest.
--extract-source-location
Indica se estrarre i metadati sulla posizione del messaggio nel file sorgente. Se true, ogni descrittore estratto avrà i campi file, start e end. (predefinito: false)
--additional-component-names [comma-separated-names]
Nomi aggiuntivi di componenti da cui estrarre messaggi, es: ['FormattedFooBarMessage']. NOTA: Di default verifichiamo che FormattedMessage sia importato da moduleSourceName per garantire il funzionamento degli alias. Questa opzione non effettua tale verifica ed è quindi meno sicura.
--additional-function-names [comma-separated-names]
Nomi aggiuntivi di funzioni da cui estrarre messaggi, es: ['$t'].
--ignore [files]
Elenco di percorsi glob da cui non estrarre traduzioni.
--throws
Indica se generare un'eccezione in caso di errore durante l'elaborazione di qualsiasi file nel batch.
--pragma [pragma]
Analizza un pragma personalizzato aggiuntivo specifico. Permette di taggare file con metadati come project. Ad esempio con questo file:
// @intl-meta project:my-custom-project
import {FormattedMessage} from 'react-intl'
;<FormattedMessage defaultMessage="foo" id="bar" />
e con l'opzione {pragma: "intl-meta"}, analizzeremo // @intl-meta project:my-custom-project convertendolo in {project: 'my-custom-project'} nel file risultato.
--preserve-whitespace
Indica se preservare spazi bianchi e a capo nell'output. Rimuoviamo normalmente spazi consecutivi e a capo poiché spesso abusati per scopi di styling.
--flatten
Indica se elevare i selettori e appiattire le frasi il più possibile. Es:
I have {count, plural, one{a dog} other{many dogs}}
diventa
{count, plural, one{I have a dog} other{I have many dogs}}
L'obiettivo è fornire il maggior numero possibile di frasi complete poiché le frasi frammentate non sono di facile traduzione.
Verifica
Verifica i file di traduzione per assicurarsi che le chiavi siano tradotte e che i messaggi siano strutturalmente compatibili con la lingua di origine.
- npm
- yarn
npm run formatjs verify [options] <translationFiles>
yarn formatjs verify [options] <translationFiles>
--source-locale <sourceLocale>
La lingua di origine dei file di traduzione. Deve esistere un file denominato <sourceLocale>.json nell'elenco dei file di traduzione. Questo viene utilizzato come sorgente per verificare le altre traduzioni.
--missing-keys
Indica se verificare la presenza di chiavi mancanti nella lingua di destinazione rispetto a quella di origine. Ciò garantisce sostanzialmente che non ci siano messaggi non tradotti.
--structural-equality
Indica se verificare l'uguaglianza strutturale dei messaggi tra la lingua di origine e quella di destinazione. Ciò assicura che le traduzioni siano formattabili e non manchino di alcun token.
--extra-keys
Indica se verificare la presenza di chiavi esistenti nella lingua di destinazione ma non in quella di origine. Ciò garantisce che i file di traduzione non contengano chiavi obsolete o inutilizzate.
Compilazione
Compila i file estratti da formatjs extract in un file JSON utilizzabile da react-intl.
Questa operazione esegue anche la verifica dei messaggi ICU. Vedere Distribuzione dei messaggi per maggiori dettagli.
- npm
- yarn
npm run compile -- --help
yarn compile --help
--format [path]
Percorso a un file formattatore che converte <translation_file> in Record<string, string> per la compilazione. Il file deve esportare una funzione chiamata compile con la firma:
type CompileFn = <T = Record<string, MessageDescriptor>>(
msgs: T
) => Record<string, string>
È particolarmente utile per convertire da un formato specifico di un TMS al formato react-intl.
Vedi i nostri formatter integrati per esempi.
--out-file <output>
Il file di destinazione che contiene i messaggi compilati.
--ast
Se compilare i messaggi in AST invece che in semplice stringa. Vedi Utilizzo Avanzato
--pseudo-locale <pseudoLocale>
Indica se compilare i messaggi in pseudo-lingue. Pseudo-lingue disponibili:
Dato il messaggio in inglese 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} |
Richiede --ast
Estrazione e compilazione con un singolo script
In alcuni ambienti potresti voler estrarre i messaggi in un file pronto per l'uso con react-intl senza utilizzare un formato di file intermedio per i messaggi estratti. Ciò potrebbe essere utile per creare rapidamente e facilmente il file per la lingua originale che utilizza i messaggi predefiniti. Potrebbe anche essere utile se si utilizza un sistema di gestione delle traduzioni (TMS) particolarmente adatto a lavorare con i file compilati. Tieni presente che il file compilato non contiene le descrizioni dei messaggi, quindi è più difficile da utilizzare per i traduttori. Idealmente, dovresti trovare o scrivere un formatter personalizzato che puoi utilizzare per estrarre i messaggi in un formato di file compatibile con il tuo TMS.
Per eseguire estrazione e compilazione in un singolo script, puoi semplicemente impostare uno script nel package.json come in questo esempio:
"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"
}
Analisi dello script
Lo script di esempio extract-compile consiste in tre operazioni eseguite una dopo l'altra.
formatjs extract 'src/**/*.ts*' --out-file temp.json --flatten --id-interpolation-pattern '[sha512:contenthash:base64:6]'
Il primo script estrae i messaggi da tutti i file TypeScript che si trovano nelle sottocartelle di src. Potresti dover ignorare alcuni file che potrebbero causare errori o avvisi nello script, ad esempio --ignore myFolder/myFile.ts.
formatjs compile 'temp.json' --out-file lang/en.json
Il secondo script compila i messaggi da temp.json nel file lang/en.json. Questo file è pronto per essere utilizzato da react-intl.
rm temp.json
L'ultimo script elimina il file estratto temp.json. Sentiti libero di rimuoverlo dallo script se desideri conservare questo file.
I file risultanti
Qui puoi vedere la differenza tra i formati dei file estratti (utilizzando il formattatore predefinito) e quelli compilati. Nello script precedente, temp.json è il file estratto e en.json è il file compilato.
- 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"
}
Compilazione della Cartella
Compila in batch una cartella con file estratti da formatjs extract in una cartella contenente file JSON utilizzabili da react-intl. Esegue anche la verifica dei messaggi ICU. Vedi Distribuzione dei Messaggi per maggiori dettagli.
- npm
- yarn
npm run formatjs compile-folder [options] <folder> <outFolder>
yarn formatjs compile-folder [options] <folder> <outFolder>
La struttura della cartella dovrebbe essere nella forma <folder>/<locale>.json e l'output sarà <outFolder>/<locale>.json.
--format [path]
Percorso a un file formattatore che converte <translation_file> in Record<string, string> per la compilazione. Il file deve esportare una funzione chiamata compile con la firma:
type CompileFn = <T = Record<string, MessageDescriptor>>(
msgs: T
) => Record<string, string>
Particolarmente utile per convertire da un formato specifico di un TMS nuovamente nel formato react-intl.
--ast
Se compilare i messaggi in AST invece che in semplice stringa. Vedi Utilizzo Avanzato
--skip-errors
Se continuare la compilazione dopo aver incontrato un errore nell'analisi di un messaggio. Le chiavi con errori non verranno incluse nel file di output.
Formattatori Integrati
Forniamo i seguenti formattatori integrati per l'integrazione con TMS di terze parti:
| 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 |
I format di extract e compile devono coincidere: se usi extract --format smartling, devi usare anche compile --format smartling e viceversa.
Formattatori Personalizzati
Puoi fornire il tuo formattatore utilizzando le nostre interfacce:
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 = () => {}
Consulta il nostro codice dei formattatori integrati per alcuni esempi.
API Node
Installa @formatjs/cli-lib per l'utilizzo programmatico
- npm
- yarn
npm i -D @formatjs/cli-lib
yarn add -D @formatjs/cli-lib
Estrazione
import {extract} from '@formatjs/cli-lib'
const resultAsString: Promise<string> = extract(files, {
idInterpolationPattern: '[sha512:contenthash:base64:6]',
})
Compilazione
import {compile} from '@formatjs/cli-lib'
const resultAsString: Promise<string> = compile(files, {
ast: true,
})
Formattatore Personalizzato
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
}