---
title: "Idiomas y locales"
description: "Qué idiomas puede traducir verbatra, cómo llegan los códigos de locale a cada proveedor y cómo se tratan los plurales y el texto de derecha a izquierda."
type: "concept"
---
# Idiomas y locales

Qué idiomas puede traducir verbatra, cómo llegan los códigos de locale a cada proveedor y cómo se tratan los plurales y el texto de derecha a izquierda.

<AvailableFrom version="0.12.0" />

verbatra no tiene una lista de idiomas propia: acepta cualquier código de locale BCP 47 válido, así
que puedes usar los idiomas que admite tu proveedor, y en un proyecto solo humano, todos. verbatra
escribe cada código como lo espera el proveedor, exige a cada traducción las reglas de plural de su
idioma y te avisa antes de una ejecución cuando un proveedor no puede servir un locale.

## Códigos de locale [#códigos-de-locale]

Cada locale de tu configuración debe ser una etiqueta BCP 47 válida, como `fr`, `pt-BR`, `sr-Latn`
o `es-419`; para archivos llamados `pt_BR.json`, escribe `pt-BR` y pon `files.localeStyle` en
`posix`. Las reglas completas están en [Códigos de locale](https://verbatra.kreitz-webdev.de/es/docs/config-file.md#códigos-de-locale).

El código de tu configuración es el que verbatra guarda en todas partes: rutas de archivo,
[el archivo de bloqueo](https://verbatra.kreitz-webdev.de/es/docs/the-lock-file.md) y [la caché](https://verbatra.kreitz-webdev.de/es/docs/the-cache.md). Una grafía propia del
proveedor solo existe dentro de una petición. Reescribir un código que ya traduces, como `pt_BR` a
`pt-BR`, conserva su historial; consulta
[Un código de locale reescrito](https://verbatra.kreitz-webdev.de/es/docs/the-lock-file.md#un-código-de-locale-reescrito).

## Cobertura por proveedor [#cobertura-por-proveedor]

La calidad con la que se traduce un idioma depende del proveedor; cada fila enlaza a su propia
lista.

| Proveedor | Idiomas | Código enviado | Glosario | Tono |
| --- | --- | --- | --- | --- |
| `anthropic` | Sin lista fija. [Claude multilingual support](https://platform.claude.com/docs/en/build-with-claude/multilingual-support) | Tal como está escrito, más los nombres en inglés del idioma, la escritura y la región | Términos del locale en el prompt | En el prompt |
| `openai` | Sin lista fija. [Using the OpenAI API in different languages](https://help.openai.com/en/articles/6742369-how-do-i-use-the-openai-api-in-different-languages) | Tal como está escrito, más los nombres | Términos del locale en el prompt | En el prompt |
| `gemini` | [Gemini language support](https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/google-models#languages-gemini) | Tal como está escrito, más los nombres | Términos del locale en el prompt | En el prompt |
| `opencode` | Lo que cubra el modelo de Zen que elijas | Tal como está escrito, más los nombres | Términos del locale en el prompt | En el prompt |
| `openai-compatible` | Lo que cubra el modelo que ejecutas | Tal como está escrito, más los nombres | Términos del locale en el prompt | En el prompt |
| `deepl` | [DeepL supported languages](https://developers.deepl.com/docs/getting-started/supported-languages) | Normalizado a los códigos de DeepL | Solo un glosario de DeepL creado de antemano, por `glossaryId`, para 32 idiomas | Formality de DeepL para algunos idiomas, no con una clave gratuita |
| `google-translate` | [Cloud Translation language support](https://docs.cloud.google.com/translate/docs/languages) (para el nivel Basic, v2, que usa verbatra vale la lista NMT) | Normalizado para chino y noruego, si no, tal como está escrito | Ninguno | Ninguno |
| `libretranslate` | Los modelos instalados en tu servidor; [la lista upstream](https://docs.libretranslate.com/) muestra los que se pueden instalar | Solo el idioma, salvo `pt-BR`, `zh-Hans` y `zh-Hant` | Ninguno | Ninguno |
| `none` | No aplica: no se llama a ningún proveedor | No se envía nada | No aplica | No aplica |

Lo que significa en la práctica:

- **Los proveedores LLM** no tienen lista cerrada. Intentan cualquier idioma que nombres, y la
  calidad baja donde hay pocos datos de entrenamiento, así que un destino con pocos recursos merece
  una revisión humana. Las [señales de revisión](https://verbatra.kreitz-webdev.de/es/docs/translation-safety.md#señales-de-revisión)
  señalan los resultados más sospechosos.
- **DeepL y Google Cloud Translation** tienen una lista cerrada, que se comprueba antes de una
  ejecución.
- **LibreTranslate** sirve los modelos que haya instalado tu servidor.
- Un `tone` o un glosario que un proveedor no puede respetar se informa como aviso; consulta
  [Tono y glosario entre proveedores](https://verbatra.kreitz-webdev.de/es/docs/providers.md#tono-y-glosario-entre-proveedores).

### Cómo recibe el código cada proveedor [#cómo-recibe-el-código-cada-proveedor]

DeepL y Google Cloud Translation reciben algunos códigos con su propia grafía, y DeepL rechaza un
destino `en` o `pt` sin más antes de cualquier petición. Los proveedores LLM reciben el código más
los [nombres en inglés](https://verbatra.kreitz-webdev.de/es/docs/translation-safety.md#nombres-de-idioma-escritura-y-región) del idioma,
la escritura y la región. `localeMap` en las `options` del proveedor sustituye el código por locale;
el mapeo completo está en
[Códigos de locale enviados al proveedor](https://verbatra.kreitz-webdev.de/es/docs/providers.md#códigos-de-locale-enviados-al-proveedor).

## Comprobar el soporte antes de una ejecución [#comprobar-el-soporte-antes-de-una-ejecución]

Antes de gastar nada, verbatra juzga cada locale configurado según el proveedor, y
[`verbatra doctor --locales`](https://verbatra.kreitz-webdev.de/es/docs/cli/doctor.md#soporte-de-locales) imprime los veredictos:

- **supported**: el código que envía verbatra está en la tabla del proveedor, o el proveedor es un
  LLM.
- **unverified**: solo figura su idioma base, el código viene de una entrada explícita de
  `localeMap`, o el proveedor es un servidor LibreTranslate cuyos modelos solo se conocen por su
  lista en vivo. Se traduce, con el aviso `LOCALE_UNVERIFIED_BY_PROVIDER`.
- **unsupported**: no figuran ni el código ni su idioma base. `translate`, `watch` y una nueva
  traducción de una sola clave rechazan la ejecución entera con
  [`LOCALE_UNSUPPORTED_BY_PROVIDER`](https://verbatra.kreitz-webdev.de/es/docs/error-codes.md#locale_unsupported_by_provider).

Deja fuera el locale con `--locales` o, si el proveedor añadió el idioma después, mapéalo en
`localeMap`: una entrada explícita se da por buena. Las tablas incluidas son copias de las listas de
los proveedores (DeepL con 125 códigos y Google con 198, ambas del 2026-09-28); `verbatra doctor
--live` comprueba la lista actual.

Para un proveedor LLM no se rechaza nada. Un destino fuera de los idiomas que los LLM traducen bien
de forma probada recibe el aviso `LOCALE_NOT_WELL_TESTED`, como recordatorio para revisar su
salida. La lista compara el idioma base, así que `pt-BR` cuenta
como portugués: árabe (`ar`), chino (`zh`), neerlandés (`nl`), inglés (`en`), francés (`fr`), alemán
(`de`), hindi (`hi`), indonesio (`id`), italiano (`it`), japonés (`ja`), coreano (`ko`), polaco
(`pl`), portugués (`pt`), ruso (`ru`), español (`es`), sueco (`sv`), turco (`tr`), ucraniano (`uk`)
y vietnamita (`vi`).

## Escrituras y variantes regionales [#escrituras-y-variantes-regionales]

Una subetiqueta de escritura o de región cambia lo que se pide al proveedor, no cómo guarda verbatra
nada:

| Tu locale | DeepL | Google Cloud Translation | LibreTranslate | Proveedores LLM |
| --- | --- | --- | --- | --- |
| `pt-BR` / `pt-PT` | `PT-BR` / `PT-PT` | `pt-BR` / `pt-PT` | `pt-BR` / `pt` | Portuguese (Brazil) / Portuguese (Portugal) |
| `es-419`, `es-MX` | `ES-419` | `es-419`, `es-MX` | `es` | Spanish (Latin America), Spanish (Mexico) |
| `zh-Hans` / `zh-Hant` | `ZH-HANS` / `ZH-HANT` | `zh-CN` / `zh-TW` | `zh-Hans` / `zh-Hant` | Chinese (Simplified) / Chinese (Traditional) |
| `sr-Latn` / `sr-Cyrl` | `SR` para ambos | `sr-Latn` / `sr-Cyrl` | `sr` para ambos | Serbian (Latin) / Serbian (Cyrillic) |

DeepL y LibreTranslate solo conservan la escritura para el chino, así que `sr-Latn` y `sr-Cyrl`
reciben la escritura que el motor use para el serbio; un proveedor LLM, al que se le dice la
escritura por su nombre, es la opción fiable. La señal `LENGTH_RATIO_OUTLIER` pondera los caracteres
según su escritura, así que un texto compacto en chino, japonés o coreano no se marca por corto, y un
término del glosario en una escritura sin espacios entre palabras se compara por inclusión.

## Plurales [#plurales]

verbatra lee las categorías de plural de un idioma, ordinales incluidos, de las reglas CLDR de los
datos ICU de Node.js: el inglés tiene dos categorías cardinales, el ruso y el polaco cuatro, el árabe
y el galés seis, el japonés solo `other`. Para un locale sin reglas en Node.js, el aviso de la
ejecución asume `one` y `other`, mientras que la puerta de integridad, `check` y `doctor` solo exigen
`other`; la comprobación `plural-rules` de [`verbatra doctor`](https://verbatra.kreitz-webdev.de/es/docs/cli/doctor.md) nombra ese locale.

Cómo se mantiene correcto un plural depende del formato:

- **i18next** identifica cada forma con un sufijo CLDR (`items_one`, `items_few`). Cuando al origen
  le falta una categoría que necesita el destino, la ejecución informa
  `PLURAL_CATEGORIES_INCOMPLETE`; con `generatePlurals: true` y un proveedor LLM, verbatra escribe
  las formas que faltan. Consulta
  [Añadir un idioma](https://verbatra.kreitz-webdev.de/es/docs/add-a-language.md#idiomas-con-más-categorías-de-plural).
- **next-intl y ARB** guardan un plural ICU entero en un solo valor, y se rechaza un valor cuyas
  ramas no encajan con el idioma de destino; consulta
  [Ramas de plural por idioma de destino](https://verbatra.kreitz-webdev.de/es/docs/translation-safety.md#ramas-de-plural-por-idioma-de-destino).
- **Apple, Android y gettext** conservan exactamente las formas que tiene cada locale, y una forma
  que falta hay que añadirla a mano. gettext conserva su cabecera `Plural-Forms` tal como está.

### Avisos de plural [#avisos-de-plural]

[`verbatra check`](https://verbatra.kreitz-webdev.de/es/docs/cli/check.md#categorías-de-plural) y `verbatra doctor` avisan de cada plural
al que le falta una categoría que usa su idioma, en cada formato de la lista anterior salvo gettext,
cuyas formas siguen su propia cabecera; los plurales de otros formatos no se comprueban. DeepL,
Google Cloud Translation y LibreTranslate traducen las formas que existen, pero nunca generan formas
nuevas.

## Idiomas de derecha a izquierda [#idiomas-de-derecha-a-izquierda]

El árabe, el hebreo, el persa, el urdu y otros idiomas de derecha a izquierda no necesitan ningún
tratamiento especial: un valor se lee, se envía, se comprueba y se vuelve a escribir tal cual, sin
añadir, quitar ni reordenar marcas de dirección. Lo que significa para ti:

- **Fija la dirección en tu aplicación, no en las cadenas**, con el atributo `dir`, CSS o la
  dirección de diseño de tu plataforma. La
  [comprobación del marcado en línea](https://verbatra.kreitz-webdev.de/es/docs/translation-safety.md#paridad-del-marcado-en-línea) rechaza
  una traducción que añade un atributo `dir` que el origen no tiene.
- **Las marcas de dirección son texto corriente** y pueden perderse; revisa las traducciones que
  dependen de una. Incrustaciones, anulaciones o aislamientos sin cerrar (si la fuente cierra los
  suyos) o anulaciones añadidas activan [`BIDI_CONTROLS_CHANGED`](https://verbatra.kreitz-webdev.de/es/docs/error-codes.md#bidi_controls_changed).
- **Un orden de placeholders distinto** solo activa `INTEGRITY_REORDERED`, porque en otro idioma
  otro orden suele ser correcto.
- **Studio muestra los valores de derecha a izquierda** para cada locale cuya escritura va en ese
  sentido, según la dirección del navegador o la escritura probable del locale (`ku-Arab` de derecha
  a izquierda, `ku` de izquierda a derecha). Solo cambia la visualización.
- **[`verbatra pseudo --mode bidi`](https://verbatra.kreitz-webdev.de/es/docs/cli/pseudo.md) muestra tu fuente de derecha a izquierda**
  en un pseudolocale `ar-XB` y destapa los supuestos de diseño de izquierda a derecha antes de que
  exista ninguna traducción. Las imágenes e iconos espejados los revisas tú.

## Idiomas con pocos recursos y modelos locales [#idiomas-con-pocos-recursos-y-modelos-locales]

Para un idioma que tu proveedor alojado cubre mal:

- **Ejecuta un modelo local con `openai-compatible`.** Tiene que ser un modelo de chat ajustado a
  instrucciones que devuelva un único objeto JSON; consulta
  [Elegir un modelo local](https://verbatra.kreitz-webdev.de/es/docs/providers.md#elegir-un-modelo-local).
- **Usa un modelo de traducción dedicado fuera de verbatra** y trae el resultado de vuelta con el
  [ida y vuelta del libro de trabajo](https://verbatra.kreitz-webdev.de/es/docs/manual-translation.md), que aplica las mismas comprobaciones
  de integridad. Ninguno se conecta a `openai-compatible`, porque no son modelos de chat: [MADLAD-400](https://huggingface.co/google/madlad400-3b-mt) (Apache-2.0, más
  de 400 idiomas), [TranslateGemma](https://huggingface.co/google/translategemma-4b-it) (55 idiomas,
  condiciones de uso de Gemma) y
  [NLLB-200](https://huggingface.co/facebook/nllb-200-distilled-600M) (unos 200 idiomas, pero con
  licencia CC-BY-NC-4.0, así que no sirve para un producto comercial). Comprueba tú mismo la licencia
  de cada modelo.
- **Que traduzca una persona.** El [flujo sin traducción automática](https://verbatra.kreitz-webdev.de/es/docs/human-only-workflow.md) funciona con
  cualquier idioma.
