# General Translation Knowledge Base: ¿Qué es la pseudolocalización?
URL: https://generaltranslation.com/es/kb/pseudo-localization.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: La pseudolocalización es una prueba que sustituye tu texto de origen por una versión alterada (con acentos, alrededor de un 40 % más larga y entre corchetes) para que las cadenas codificadas de forma fija, el truncamiento, las fuentes rotas y las oraciones concatenadas salgan a la luz antes de que exista ninguna traducción. Android incluye para ello las pseudoconfiguraciones regionales en-XA y ar-XB.
Category: Internacionalización
Last updated: 2026-10-20
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-20

La pseudolocalización (también escrita pseudo-localización) comprueba si tu código está preparado para la traducción, no si una traducción es buena. Como el texto alterado sigue siendo legible, cualquier persona del equipo puede recorrer la aplicación en una pseudoconfiguración regional y detectar qué se rompe. Se ejecuta en segundos, es gratuita y funciona desde el primer día de desarrollo.

## ¿Cuál es la diferencia entre la pseudotraducción y una pseudoconfiguración regional?

[La documentación de globalización de Microsoft](https://learn.microsoft.com/en-us/globalization/methodology/pseudolocalization) distingue dos partes:

* La **pseudotraducción** transforma las propias cadenas: &quot;Save changes&quot; se convierte en algo como `[Šáṽé çĥáñĝéš~~~~~]`.
* Las **pseudoconfiguraciones regionales** son códigos de configuración regional ficticios, como `qps-ploc` de Windows o `en-XA` de Android, que puedes seleccionar como si fueran un idioma real. Algunas incluyen además formatos de fecha, hora y número deliberadamente inusuales para probar el código de formato.

Microsoft recomienda usar códigos bien formados que nunca vayan a corresponder a una configuración regional real, como los códigos `qps-` de Windows, que pertenecen a un rango que BCP 47 reserva para uso privado. Lo aprendió por las malas: su primera pseudoconfiguración regional fue `tk-TM` (turcomano, Turkmenistán), que más tarde se publicó como configuración regional real de Windows y entró en conflicto con los sistemas de compilación y de pruebas.

## ¿Qué errores detecta la pseudolocalización?

* **Cadenas codificadas de forma fija.** Cualquier texto que no haya pasado por tu capa de i18n se queda en inglés plano mientras todo lo que lo rodea aparece con acentos, así que salta a la vista en todas las pantallas. (Para encontrarlas en el código, consulta [¿Cómo encuentro cadenas codificadas de forma fija que no están traducidas?](/kb/find-hardcoded-strings))
* **Truncamiento y desbordamiento por expansión del texto.** Las cadenas alargadas revelan qué botones, pestañas y encabezados de tabla se recortan, saltan de línea de forma incorrecta o empujan controles fuera de la pantalla.
* **Problemas de codificación y de fuentes.** Los caracteres acentuados y no latinos ponen de manifiesto codificaciones rotas, fuentes que no incluyen los glifos y alturas de línea que cortan los diacríticos.
* **Concatenación.** Una oración formada a partir de fragmentos aparece como varios trozos entre corchetes, `[Ýöû ĥáṽé~~~~] 3 [íţéɱš~~]`, en lugar de uno solo, lo que indica que los traductores recibirían los fragmentos sin la oración completa.
* **Falta de compatibilidad con right-to-left.** Una pseudoconfiguración regional RTL muestra si el diseño se refleja correctamente, qué iconos hay que invertir y dónde fallan los valores left-to-right. (Consulta [¿Cómo admito idiomas RTL (right-to-left) en CSS?](/kb/right-to-left-css))

## ¿Cómo funciona la pseudolocalización?

La mayoría de las herramientas combinan algunas de estas técnicas:

* **Acentos y otros sistemas de escritura.** Reemplaza `a` por caracteres como `á`, `ä` o `å`, y los dígitos por dígitos en círculo, como sugiere la guía de Microsoft.
* **Expansión.** Alarga cada cadena. Para textos de origen en inglés, Microsoft sugiere, a modo de heurística, alrededor de un 40 %, y señala que algunas cadenas llegan a ser un 200 % o incluso un 400 % más largas una vez traducidas; las de una o dos palabras son las que más crecen.
* **Delimitadores.** Envuelve cada cadena entre marcadores, como corchetes o signos de intercalación. Si falta el marcador de cierre, el texto se ha truncado.
* **Identificadores.** Opcionalmente, añade un ID corto a cada cadena para que quien realice las pruebas pueda localizar su origen.
* **Right-to-left.** Invierte la dirección del texto para que la UI se comporte como lo haría en árabe o hebreo, igual que hacen `ar-XB` en Android y el `qps-plocm` reflejado en Windows.

Las traducciones también pueden ser más cortas. Un cambio de ancho depende de una cadena concreta renderizada con una fuente, un tamaño y un grosor determinados; no es un porcentaje fijo para todo un idioma. Las pseudotraducciones con relleno sirven para probar la expansión. Usa también traducciones reales para comprobar las etiquetas más cortas, el espaciado y la alineación.

## ¿Qué plataformas incluyen pseudoconfiguraciones regionales integradas?

| Plataforma          | Pseudoconfiguraciones regionales                                                                          | Qué hacen                                                                                                                                                                     | Cómo activarlas                                                                                                                                                                            |
| ------------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Android             | `en-XA`, `ar-XB`                                                                        | `en-XA` añade acentos, alarga el texto y encierra cada mensaje entre corchetes; `ar-XB` muestra los mensajes de derecha a izquierda (right-to-left) e invierte sus caracteres | `pseudoLocalesEnabled` en el tipo de compilación de depuración; activa las opciones de desarrollador, reinicia el dispositivo y luego elige la pseudoconfiguración regional en la configuración de idioma |
| Xcode (iOS, macOS)  | Double-Length, Right-to-Left, Accented, Bounded String, Tall y otros pseudoidiomas      | Duplican la longitud de las cadenas, invierten la dirección, añaden acentos, delimitan las cadenas para poner de manifiesto el truncamiento y aumentan la altura vertical     | **Product &gt; Scheme &gt; Edit Scheme &gt; Run &gt; Options** y luego elige una opción en el menú **App Language**                                                                        |
| Windows             | `qps-ploc`, `qps-plocm`, `qps-ploca` (además de `qps-Latn-x-sh` a partir de Windows 10) | Pseudoconfiguraciones regionales base, reflejada (right-to-left) y de Asia oriental, con datos de prueba para fechas, fuentes y longitudes de cadena                                            | Pasa el nombre de la pseudoconfiguración regional a las API de NLS, como `GetLocaleInfoEx`; el Multilingual App Toolkit de Microsoft pseudotraduce los recursos                                             |
| Lingui (JavaScript) | Cualquier configuración regional que elijas, como `pseudo-LOCALE`                       | Genera mensajes acentuados en tiempo de compilación, con una variante right-to-left opcional                                                                                  | La clave `pseudoLocale` en la configuración de Lingui                                                                                                                                      |

En Android, según la [guía de pseudoconfiguraciones regionales](https://developer.android.com/guide/topics/resources/pseudolocales), se activan en el archivo Gradle del módulo:

```kotlin title="build.gradle.kts"
android {
    buildTypes.getByName("debug") {
        isPseudoLocalesEnabled = true
    }
}
```

La [referencia de Gradle](https://developer.android.com/reference/tools/gradle-api/8.3/null/com/android/build/api/dsl/BuildType) indica que un filtro `resourceConfigurations` permite eliminar del APK los recursos de las pseudoconfiguraciones regionales. En Xcode, esa misma hoja de esquema también ofrece la opción **Show non-localized strings**, que muestra en mayúsculas las cadenas que Xcode no exportará. (Consulta [Preparing your interface for localization](https://developer.apple.com/documentation/xcode/preparing-your-interface-for-localization), de Apple). Windows recoge sus códigos en la página [Pseudoconfiguraciones regionales](https://learn.microsoft.com/en-us/windows/win32/intl/pseudo-locales) y aclara que, de forma predeterminada, no aparecen enumerados como configuraciones regionales del sistema ([Using pseudoconfiguraciones regionales](https://learn.microsoft.com/en-us/windows/win32/intl/using-pseudo-locales-for-localization-testing)). Por su parte, Lingui documenta su configuración inicial en la [guía de pseudolocalización](https://lingui.dev/guides/pseudolocalization).

## Pseudolocalizar cadenas en JavaScript

En la web no existe una pseudoconfiguración regional integrada, pero escribir una transformación solo lleva unas pocas líneas. Esta acentúa las letras ASCII, alarga el texto en torno a un 40 % y encierra el resultado entre corchetes, sin tocar los `{placeholders}` ni las etiquetas HTML, de modo que la interpolación y el marcado sigan funcionando:

```js title="pseudo.mjs"
// Equivalentes acentuados de las letras ASCII
const ACCENTS = {
  a: 'á', b: 'ƀ', c: 'ç', d: 'ð', e: 'é', f: 'ƒ', g: 'ĝ', h: 'ĥ', i: 'í',
  j: 'ĵ', k: 'ķ', l: 'ļ', m: 'ɱ', n: 'ñ', o: 'ö', p: 'þ', q: 'ǫ', r: 'ŕ',
  s: 'š', t: 'ţ', u: 'û', v: 'ṽ', w: 'ŵ', x: 'ẋ', y: 'ý', z: 'ž',
  A: 'Á', B: 'Ɓ', C: 'Ç', D: 'Ð', E: 'É', F: 'Ƒ', G: 'Ĝ', H: 'Ĥ', I: 'Í',
  J: 'Ĵ', K: 'Ķ', L: 'Ļ', M: 'Ṁ', N: 'Ñ', O: 'Ö', P: 'Þ', Q: 'Ǫ', R: 'Ŕ',
  S: 'Š', T: 'Ţ', U: 'Û', V: 'Ṽ', W: 'Ŵ', X: 'Ẋ', Y: 'Ý', Z: 'Ž',
};

// Los marcadores de posición como {name} y las etiquetas como <b> deben conservarse intactos
const PROTECTED = /(\{[^}]*\}|<[^>]+>)/;

export function pseudoLocalize(text, { expansion = 0.4 } = {}) {
  const accented = text
    .split(PROTECTED)
    .map((part, i) =>
      i % 2 === 1 ? part : part.replace(/[A-Za-z]/g, (ch) => ACCENTS[ch])
    )
    .join('');
  // Añade un relleno de aproximadamente el 40 % de la longitud del texto de origen para simular traducciones más largas
  const padding = '~'.repeat(Math.ceil(text.length * expansion));
  // Los corchetes indican dónde empieza y termina una cadena, para que se note cualquier truncamiento
  return `[${accented}${padding}]`;
}
```

```js title="demo.mjs"
import { pseudoLocalize } from './pseudo.mjs';

for (const source of ['Save changes', 'Hello, {name}!', 'Read the <a>terms</a>']) {
  console.log(pseudoLocalize(source));
}
```

Al ejecutar `node demo.mjs` con Node.js 24:

```text title="Output"
[Šáṽé çĥáñĝéš~~~~~]
[Ĥéļļö, {name}!~~~~~~]
[Ŕéáð ţĥé <a>ţéŕɱš</a>~~~~~~~~~]
```

Para usarla, aplícala a cada mensaje que devuelva tu capa de i18n mientras esté activo un indicador de depuración o una configuración regional ficticia. Así, cualquier oración concatenada queda en evidencia:

```js title="concatenation.mjs"
import { pseudoLocalize } from './pseudo.mjs';

// ❌ Tres fragmentos: los traductores nunca ven la oración completa
console.log(pseudoLocalize('You have') + ' 3 ' + pseudoLocalize('items'));
// ✅ Un solo mensaje con un marcador de posición
console.log(pseudoLocalize('You have {count} items'));
```

```text title="Output"
[Ýöû ĥáṽé~~~~] 3 [íţéɱš~~]
[Ýöû ĥáṽé {count} íţéɱš~~~~~~~~~]
```

La expresión regular de marcadores de posición maneja variables simples como `{name}`. Los mensajes ICU de tipo plural y select anidan llaves, así que aplica la pseudolocalización a la salida ya formateada en lugar de al mensaje sin procesar. Lo mismo ocurre con el paquete npm [`pseudo-localization`](https://github.com/tryggvigy/pseudo-localization): su `pseudoLocalizeString('Hello, {name}!')` devuelve `Ħḗḗŀŀǿǿ, {ƞȧȧḿḗḗ}!`, con lo que también acentúa el nombre del marcador de posición; por eso, ejecútalo sobre la salida traducida, tal como indica su README. Ese paquete también ofrece una estrategia `bidi` para pruebas right-to-left y un modo DOM que pseudolocaliza una página completa. Si quieres hacer tu propia comprobación RTL, establece `dir="rtl"` en el elemento `<html>` mientras la pseudoconfiguración regional esté activa.

Para encontrar cadenas codificadas de forma fija, aplica la transformación en el límite de i18n. Una transformación del DOM de toda la página también modifica el texto codificado de forma fija, así que sirve para probar el diseño, pero oculta qué cadenas se saltaron tus llamadas de traducción. Transformar la salida con formato también modifica los nombres interpolados y otros datos; limita esa salida a la UI de pruebas.

## Lo que la pseudolocalización no prueba

La pseudolocalización no dice nada sobre la calidad de la traducción, el orden de las palabras ni el tono. Tampoco permite poner a prueba las reglas de plural: el inglés tiene 2 formas plurales y el árabe tiene 6, pero una cadena en inglés con acentos sigue teniendo solo las 2 del inglés. Según la guía de Microsoft, &quot;no sustituye por completo&quot; la validación de la aplicación traducida, así que prueba también con idiomas reales antes del lanzamiento. En la [lista de verificación para el lanzamiento de una aplicación multilingüe](/kb/multilingual-app-launch-checklist) encontrarás qué debes revisar.

## Combina la pseudolocalización con traducciones reales

General Translation te permite probar traducciones reales durante el desarrollo: con una clave de API de proyecto que tenga permiso de traducción en tiempo de ejecución, `gt-next` solicita traducciones al servicio de GT bajo demanda. Cambia a alemán para comprobar la redacción y el diseño reales, y a un idioma con reglas de plural distintas para probar esas ramas. El texto que quede fuera de [`<T>`](/docs/react/reference/components/t) o de una función de traducción se mantiene en el idioma de origen. (Consulta el [Inicio rápido de Next.js](/docs/react/nextjs-quickstart)). Usa la pseudolocalización para una primera revisión del diseño que los testers puedan leer y, después, genera las traducciones para el lanzamiento con la [CLI](/docs/cli/reference/commands/translate) y revísalas en el [Editor de Traducciones](/docs/platform/dashboard/guides/reviewing-translations) de GT y en la aplicación en ejecución. Alargar artificialmente el texto en inglés no permite saber si una oración traducida es correcta ni si cabe en el mismo espacio.

## Puntos clave

* La pseudolocalización reemplaza el texto de origen por versiones con acentos, relleno, corchetes o en espejo para detectar errores de i18n antes de que empiece la traducción.
* Detecta cadenas codificadas de forma fija, problemas de truncamiento, de fuentes y de codificación, oraciones concatenadas y la falta de compatibilidad con la escritura right-to-left.
* Android (`en-XA`, `ar-XB`), Xcode (pseudoidiomas en las opciones del esquema) y Windows (`qps-ploc`, `qps-plocm`, `qps-ploca`) la integran de forma nativa; en la web, basta con una breve función de transformación o con el paquete `pseudo-localization`.
* No evalúa la calidad de la traducción ni las reglas de plural; para eso, haz pruebas con traducciones reales, que `gt-next` puede generar bajo demanda durante el desarrollo.

## Related questions

- [¿Cómo encuentro cadenas codificadas de forma fija que no están traducidas?](https://generaltranslation.com/es/kb/find-hardcoded-strings.mdx): Ejecuta en CI un linter que marque los literales de cadena visibles para el usuario, como la regla no-literal-string de eslint-plugin-i18next para JSX, la comprobación HardcodedText de Android Lint o el linter HardCodedString de erb_lint para Rails. Después, recorre la app con una pseudoconfiguración regional para detectar el texto que las comprobaciones estáticas no pueden rastrear.
- [¿Cómo doy soporte a idiomas RTL (right-to-left) en CSS?](https://generaltranslation.com/es/kb/right-to-left-css.mdx): Coloca dir="rtl" y lang en el elemento html, ya que lang por sí solo no cambia la dirección, y luego sustituye el CSS físico, como margin-left, por propiedades lógicas, como margin-inline-start. Las filas flex, las columnas de grid y la alineación de texto predeterminada se invierten solas; translateX(), left y right, no.
- [Lista de comprobación de pruebas de localización para aplicaciones multilingües](https://generaltranslation.com/es/kb/multilingual-app-launch-checklist.mdx): Prueba nueve aspectos en cada configuración regional compatible en una compilación de producción: recorridos completos, incluidos los estados de error y los correos electrónicos; cambio de idioma; plurales; moneda y zonas horarias; expansión del texto; diseño right-to-left; accesibilidad; entrega de traducciones; y URL de idioma rastreables. Asigna a cada comprobación un criterio de aprobación explícito.
- [Internacionalización vs. localización (i18n vs. l10n)](https://generaltranslation.com/es/kb/internationalization-vs-localization.mdx): La internacionalización (i18n) es el trabajo de código y diseño que permite que un mismo producto admita muchas configuraciones regionales; por ejemplo, dar formato a fechas con Intl o admitir texto right-to-left. La localización (l10n) lo adapta a una configuración regional concreta, lo que abarca la traducción, pero también la moneda, los formatos de fecha, las unidades, el tono y los aspectos legales.

## Previous and next questions

- Previous question: [¿Qué es hreflang y cómo se configura?](https://generaltranslation.com/es/kb/what-is-hreflang.mdx)
- Next question: [¿Qué es un sistema de gestión de traducciones (TMS)?](https://generaltranslation.com/es/kb/what-is-a-translation-management-system.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/es/kb/sitemap.md) for every article.
