Saltar al contenido
Saltar al contenido

Referencia / CLI

Página traducida automáticamente

Esta página se tradujo automáticamente, así que puede contener errores o sonar un poco rara. La versión en inglés es la fuente de la verdad. Leer el original en inglés.

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 --json

Flags

FlagArgumentoPor defectoEfecto
--dry-runningunodesactivadoinforma 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_NOT_CONFIGURED 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.

verbatra.config.ts
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 argument

Se 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 a cart.items_one y cart.items_other, y lo mismo vale para una entrada gettext con msgid_plural y un recurso <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á. extract nunca borra; verbatra diff --unused lista 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 translate para 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 con SOURCE_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 comoCuándo
dynamicla 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.
conflictsuna 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.
withoutDefaultuna clave se añadió con valor vacío porque su llamada no tenía valor por defecto. Rellénalo y luego traduce.
diagnosticsun 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_modules, .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:

Salida
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ódigoSignificado
0el análisis se ejecutó, encontrara lo que encontrara
2no 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

Editar en GitHub

En esta página