Cada ejemplo de abajo es un repositorio real con .lingo/config.json confirmado y las traducciones ya listas, para que puedas revisar la configuración junto al resultado que genera. La mayoría son aplicaciones que puedes ejecutar; un par están ahí solo para mostrar un formato de archivo por sí mismo. Clona o haz fork de uno, ejecuta lingo link para conectar tu propio motor y haz push.
Elige primero un enfoque#
Hay dos formas de localizar con la CLI, y eso define cuáles ejemplos te resultan relevantes.
Traduce los archivos que ya tienes. Tu framework guarda las traducciones en su propio formato — Rails YAML, Android XML, Laravel PHP, ARB, Markdown — y la CLI traduce esos archivos directamente. Tu código no cambia en nada. Así funcionan nueve de los once ejemplos de abajo.
Escribe sin claves. Envuelves las cadenas donde aparecen con l.text(...), lingo extract te genera un catálogo con claves hash, y no hay claves de traducción que nombrar ni mantener. Eso suma un paso de compilación y un paquete en tiempo de ejecución, y es justo lo que muestran los dos ejemplos de apps web.
Apps móviles#
| Ejemplo | Formato | Por qué elegir este |
|---|---|---|
| iOS | xcode-xcstrings | Un String Catalog reúne todos los idiomas, así que la ruta de destino es la misma que la de origen. |
| Android | android | values/ sin nada extra como origen, más los calificadores propios de Android (values-pt-rBR/) |
| Flutter | flutter | Se conservan los metadatos de @ y los placeholders de ICU; @@locale se reescribe en cada archivo |
Apps web#
Los dos ejemplos sin claves. Ambos envuelven strings con l.text(...) y generan su catálogo con lingo extract, así que la columna del medio nombra el paquete de runtime en vez de un formato de archivo.
| Ejemplo | Paquete | Por qué elegir este |
|---|---|---|
| React + Vite | @lingo.dev/react | Authoring sin claves; las declaraciones generadas limitan l.text() a los strings extraídos |
| Next.js | @lingo.dev/react-next | Creación sin claves más enrutamiento por idioma, hreflang y un selector: Pages Router |
hreflang en producción
LingoHead construye sus URLs de hreflang a partir de una prop baseUrl que, por defecto, está vacía, así que de entrada las etiquetas son relativas. Los motores de búsqueda esperan URLs absolutas: pásale el origen de tu sitio (<LingoHead baseUrl="https://example.com" />) antes de depender de ellas.
Contenido y especificaciones#
| Ejemplo | Formato | Por qué elegir este |
|---|---|---|
| Documentación en Markdown | md, mdx | Prosa por defecto, con campos de frontmatter y props de MDX activados de forma explícita |
| Markdoc | markdoc, json | Contenido de Next.js y strings de la interfaz en un solo push: tres entradas, cada una con opciones distintas. |
| OpenAPI | yaml-openapi | Solo resúmenes y descripciones; rutas, operation IDs y enums se mantienen intactos |
Catálogos de frameworks#
| Ejemplo | Formato | Por qué elegir este |
|---|---|---|
| Rails | yaml-root-key | El idioma es la clave raíz del YAML, así que esa misma clave raíz se reescribe |
| Laravel | php, po | Catálogos de Laravel más un archivo gettext; los placeholders de :name se conservan en ambos |
| Módulos de TypeScript | typescript | Catálogos como módulos de TypeScript en lugar de JSON. Solo el formato; ninguna aplicación los consume. |
Los catálogos de TypeScript necesitan un default export
El formato typescript lee una exportación predeterminada: export default { … }, con o sin as const. Una exportación con nombre no genera contenido traducible, y la ejecución termina copiando el código fuente tal cual. Así que, si un push reporta archivos localizados pero prácticamente cero tokens de salida, primero revisa la forma de la exportación.
Cómo usar uno de estos#
npm install -g @lingo.dev/cli
lingo login
lingo link # writes your own orgId and engineId into .lingo/config.json
lingo push --waitNinguno de los ejemplos versiona orgId ni engineId; eso evita que un fork haga push a través del motor de otra persona. lingo link completa ambos localmente.
Si prefieres la GitHub App en lugar de la CLI
La GitHub App lee engineId desde el .lingo/config.json confirmado en tu repositorio: resuelve la organización desde la propia instalación de la App, pero el motor tiene que estar en el archivo. Después de hacer un fork, ejecuta lingo link y confirma la configuración actualizada antes de instalar la App.
No todos los formatos tienen ejemplo#
Estos once cubren los frameworks por los que más pregunta la gente, pero el CLI traduce dieciocho formatos. xliff, srt, Xcode .strings y .stringsdict, yaml genérico y JSON/JSONC independiente funcionan sin necesidad de tener un repositorio aquí; consulta Formats para ver la lista completa y la configuración que necesita cada uno.
