Referencia / CLI
Página traducida automáticamente
verbatra extract
Analiza el código de tu aplicación en busca de llamadas de traducción y añade las claves nuevas al archivo del locale de origen.
Empieza por tu código en lugar de por un archivo de locale. extract recorre las raíces de código que configuras, encuentra en ellas las llamadas de traducción y añade cada clave que el archivo del locale de origen todavía no tiene. Así verbatra sirve en un proyecto que aún no está internacionalizado, y no gasta nada: ni proveedor, ni clave de API, ni petición de red.
Sinopsis
verbatra extract [flags]Ejemplos
# add every new key found in your source to the source locale file
verbatra extract
# preview the keys that would be added, write nothing
verbatra extract --dry-run
# machine-readable result for a CI step
verbatra extract --jsonFlags
| Flag | Argumento | Por defecto | Efecto |
|---|---|---|---|
--dry-run | ninguno | desactivado | informa de lo que se añadiría y no escribe nada |
También acepta los flags globales --cwd, --config y --json; las raíces de código de extract se resuelven desde la raíz del proyecto.
Comportamiento
Configuración
extract se rige por el bloque extract de tu configuración. Una ejecución sin él falla con EXTRACT_ y sale con 2. Para i18next-json, verbatra init escribe el bloque como comentario en la configuración generada; quítale el comentario y ajusta roots.
import { defineConfig } from "@verbatra/cli";
export default defineConfig({
sourceLocale: "en",
targetLocales: ["de", "fr"],
format: "i18next-json",
files: { pattern: "locales/{locale}.json" },
provider: { id: "gemini", options: { model: "gemini-2.5-flash", maxOutputTokens: 4096 } },
extract: {
framework: "i18next",
roots: ["src"],
},
});Qué encuentra
El framework i18next lee las formas de llamada t(...), $t(...) y <object>.t(...) en archivos .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts y .cts, cada una también como llamada opcional y con una lista explícita de argumentos de tipo. La clave es el primer argumento; un valor por defecto es el segundo argumento o un campo defaultValue en el objeto de opciones:
t("nav.home"); // key only, written with an empty value
t("nav.away", "Away"); // positional default
t("nav.help", { defaultValue: "Help" }); // default on the options object
t?.("nav.back"); // optional call
t<string>("nav.next"); // explicit type argumentSe entienden los comentarios, las cadenas y las expresiones regulares, así que no se recoge una llamada dentro de un comentario ni un t( entre comillas dentro de una cadena. La clave y el valor por defecto deben ser cada uno un literal completo: t("user." + id) se informa como dinámica, y un valor por defecto concatenado añade la clave sin valor por defecto en lugar de con uno truncado. Una clave con un segmento de ruta vacío (t("user."), t(".lead"), t("a..b")) acabaría bajo un hijo sin nombre que tu aplicación nunca lee, así que también se informa como dinámica.
Los namespaces todavía no se resuelven
Una clave con namespace como t("common:nav.home") se informa como dinámica y nunca se escribe: una configuración de verbatra direcciona un solo archivo de catálogo, así que no hay ningún sitio que signifique lo que tu configuración de i18next quiere decir. Si tu proyecto nombra un namespace en cada llamada, la ejecución no añade nada. Hoy extract es útil en un proyecto que mantiene un solo namespace y escribe sus claves sin el prefijo.
Qué escribe
Solo el archivo del locale de origen, y solo claves realmente nuevas:
- Una clave que ya está en el catálogo conserva su valor tal cual; un valor por defecto en la llamada nunca sobrescribe una edición.
- Una clave que el catálogo solo tiene en formas de plural cuenta como presente:
t("cart.items", { count })no añade nada junto acart.items_yone cart.items_, y lo mismo vale para una entrada gettext conother msgid_y un recursoplural <plurals>de Android. En un formato que no marca las formas de plural, como YAML, cuenta toda clave que termina en un sufijo de plural de i18next. - Una clave del catálogo que ninguna llamada menciona se queda donde está.
extractnunca borra;verbatra diff --unusedlista esas claves. - Una ejecución que no encuentra nada nuevo no escribe nada, así que el archivo queda idéntico byte a byte.
- Nunca se escribe un archivo de locale de destino. Ejecuta después
verbatra translatepara rellenar las claves nuevas. Una clave añadida con valor vacío se omite hasta que escribas su texto de origen, y la ejecución la nombra conSOURCE_.VALUE_ EMPTY
Los catálogos xliff y apple-xcstrings nunca se crean desde cero: crea primero el catálogo de origen (el de .xcstrings en Xcode) y extract lo amplía después.
Qué informa en lugar de adivinar
Todo lo que el análisis no puede resolver vuelve como datos, así que un archivo incómodo nunca aborta una ejecución. Nada de esto cambia el código de salida.
| Se informa como | Cuándo |
|---|---|
dynamic | la clave no es una única cadena estática completa, o nombra una ruta que verbatra no puede direccionar: una variable, un acceso a propiedad, un literal de plantilla con una expresión, una concatenación, una clave con namespace o un segmento de ruta vacío. Nunca se escribe. |
conflicts | una clave aparece en dos llamadas con valores por defecto distintos. No se escribe ninguno, para que el catálogo nunca dependa del orden de recorrido. |
withoutDefault | una clave se añadió con valor vacío porque su llamada no tenía valor por defecto. Rellénalo y luego traduce. |
diagnostics | un archivo o directorio no se pudo leer hasta el final: desapareció, supera el límite de 2.000.000 bytes, el análisis falló con él, o un comentario, literal de plantilla, elemento JSX o cadena sin cerrar abandonó el resto. Se sigue informando de lo leído antes de ese punto. |
Límites del análisis
No se lee nada fuera de las roots configuradas. node_, .git, .next, .turbo, .verbatra, dist, build y coverage se omiten siempre, extract.exclude añade tus propios nombres de directorio y no se siguen los enlaces simbólicos. El resultado lleva solo claves, valores y ubicaciones de archivo y línea, nunca el contenido de un archivo de código.
Salida JSON
Esquema: extract-envelope.json valida el envoltorio completo; Esquemas enumera los demás.
Con --json, el envoltorio lleva un resultado:
interface ExtractResult {
sourcePath: string; // the source locale file, relative to the project root
scannedFiles: number;
added: { key: string; value: string; file: string; line: number }[];
existingKeys: number; // keys found that were already in the catalog
withoutDefault: string[];
dynamic: { file: string; line: number }[];
conflicts: { key: string; values: string[]; locations: { file: string; line: number }[] }[];
diagnostics: { file: string; reason: "unreadable" | "too-large" | "unparseable" | "unreadable-directory" }[];
written: boolean; // false for a dry run and for a run that added nothing
dryRun: boolean;
}Información en el terminal
El resumen va a stdout. En stderr, una línea de spinner cuenta los archivos analizados; si se añadieron claves, una sugerencia propone verbatra translate, o tras --dry-run el mismo extract sin el flag. --quiet omite las líneas de stderr:
verbatra: scanning the source... done (0.6s)
verbatra extract
42 files scanned, 18 keys already present
added 3 keys to locales/en.json
new keys (3):
nav.home src/components/Nav.tsx:14
nav.away src/components/Nav.tsx:15
cart.empty src/routes/cart.tsx:31
dynamic keys (1):
src/routes/product.tsx:88
next: verbatra translate (translate the new keys)Consulta Salida en el terminal para el color, el spinner y las variables que los controlan.
Códigos de salida
| Código | Significado |
|---|---|
0 | el análisis se ejecutó, encontrara lo que encontrara |
2 | no se pudo ejecutar: un error de uso, falta el bloque extract, un formato que no se resuelve, un catálogo de origen que no se puede analizar o un catálogo de origen que no se pudo escribir |
No hay salida 1: las llamadas dinámicas y los valores por defecto en conflicto son hallazgos, no fallos. Consulta Códigos de salida para el contrato que sigue cada comando.
Relacionado
- Extrae claves del código fuente recorre el flujo desde la llamada hasta la clave traducida.
- El archivo de configuración documenta el bloque
extract. verbatra translaterellena los locales de destino una vez que existen las claves nuevas.verbatra typesdeclara las claves para TypeScript.verbatra checkinforma del desfase que crean las claves nuevas.- El SDK ofrece la misma capacidad como
extract().