PHPackages                             informaticadoslago/laravel-translations - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Localization &amp; i18n](/categories/localization)
4. /
5. informaticadoslago/laravel-translations

ActiveLibrary[Localization &amp; i18n](/categories/localization)

informaticadoslago/laravel-translations
=======================================

Traduce ficheros de idioma de Laravel (PHP y JSON) con Google Translate u OpenAI, con caché en base de datos y peticiones en lote.

v1.0.1(1mo ago)05MITPHPPHP ^8.3

Since Jul 4Pushed 1mo agoCompare

[ Source](https://github.com/informaticadoslago/laravel-translations)[ Packagist](https://packagist.org/packages/informaticadoslago/laravel-translations)[ RSS](/packages/informaticadoslago-laravel-translations/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (4)Versions (3)Used By (0)

informaticadoslago/laravel-translations
=======================================

[](#informaticadoslagolaravel-translations)

[![Latest Version on Packagist](https://camo.githubusercontent.com/c90a4a19e699654d6ea87f2de77e174a6a24553edf328f1efeeb692ae2063c99/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f696e666f726d6174696361646f736c61676f2f6c61726176656c2d7472616e736c6174696f6e732e737667)](https://packagist.org/packages/informaticadoslago/laravel-translations)[![Total Downloads](https://camo.githubusercontent.com/f08ed351161a8e4a266a13e307f137a870b24d3143f952574bcbbe322482d573/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f696e666f726d6174696361646f736c61676f2f6c61726176656c2d7472616e736c6174696f6e732e737667)](https://packagist.org/packages/informaticadoslago/laravel-translations)[![License](https://camo.githubusercontent.com/31aa65a3c0838f34bccc4d7a31875c2a8c162bea76b42fbbfda5b555b65ef44a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f696e666f726d6174696361646f736c61676f2f6c61726176656c2d7472616e736c6174696f6e732e737667)](https://packagist.org/packages/informaticadoslago/laravel-translations)

Cadena completa de traducción para Laravel en un solo paquete:

1. **Extrae** los textos del código (`__()`, `@lang`, `trans()`, `Lang::get()`) a `lang/{locale}.json` y `lang/{locale}/*.php` — comando `informaticadoslago:extract`.
2. **Traduce** esos ficheros a otros idiomas con **Google Translate** u **OpenAI**, con **caché en base de datos** y peticiones **en lote** — comando `informaticadoslago:translate`.

Flujo completo
--------------

[](#flujo-completo)

```
# 1. Sacar los textos del código al idioma origen (es)
php artisan informaticadoslago:extract app resources/views --lang=es

# 2. Traducir el JSON de literales al inglés (en dummy para probar)
php artisan informaticadoslago:translate lang/es.json --to=en
```

El extractor separa automáticamente:

- **literales** (`__('Bienvenido')`, `__('Se guardó.')`) → `lang/es.json`
- **short-keys** (`__('messages.form.title')`) → `lang/es/messages.php` (anidado)

> El traductor tiene sentido sobre el **JSON** (y sobre PHP con texto real). Los ficheros de short-keys guardan el nombre de la clave como valor, así que ahí debes escribir tú el texto origen antes de traducirlos.

Qué hace bien
-------------

[](#qué-hace-bien)

- **Google vía POST + JSON** (no `q=` repetidos en la query): evita el error `Required Text` y que Laravel colapse el array de textos.
- **Deduplicación**: si un texto aparece 20 veces, se traduce una sola vez.
- **Caché en BD**: lo ya traducido no se vuelve a pedir a la API.
- **Escritura atómica**: el fichero de destino sólo se escribe si toda la traducción fue bien; nunca queda un JSON/PHP a medias.
- **PHP anidado y JSON con puntos en las claves**: se traducen sólo los valores; claves y estructura quedan intactas.
- Placeholders (`:name`, `{count}`, `%s`), HTML y saltos de línea se conservan.

Requisitos
----------

[](#requisitos)

- PHP 8.1+
- Laravel 10, 11 o 12

Instalación
-----------

[](#instalación)

### Desde un repositorio propio (Git)

[](#desde-un-repositorio-propio-git)

En el `composer.json` de tu proyecto:

```
"repositories": [
    { "type": "vcs", "url": "https://github.com/informaticadoslago/laravel-translations" }
]
```

```
composer require informaticadoslago/laravel-translations:dev-main
```

### Desde una carpeta local (para probar hoy mismo)

[](#desde-una-carpeta-local-para-probar-hoy-mismo)

```
"repositories": [
    { "type": "path", "url": "../laravel-translations" }
]
```

```
composer require informaticadoslago/laravel-translations:@dev
```

Configuración
-------------

[](#configuración)

Publica la configuración y ejecuta la migración de la caché:

```
php artisan vendor:publish --tag=translations-config
php artisan migrate
```

En tu `.env`:

```
# dummy | google | openai
TRANSLATIONS_PROVIDER=google
TRANSLATIONS_API_KEY=tu_clave_aqui

# Sólo si usas OpenAI:
TRANSLATIONS_OPENAI_MODEL=gpt-4o-mini

# Opcionales:
TRANSLATIONS_DATABASE=true
TRANSLATIONS_BATCH_SIZE=20
TRANSLATIONS_TIMEOUT=60
```

> Con `TRANSLATIONS_PROVIDER=dummy` puedes probar todo el flujo sin gastar cuota ni configurar claves: prefija cada texto con `[en] ...`.

Uso: extraer (`informaticadoslago:extract`)
-------------------------------------------

[](#uso-extraer-informaticadoslagoextract)

```
php artisan informaticadoslago:extract {carpetas...} [opciones]
```

```
# Escanea app y resources/views, escribe lang/es.json y lang/es/*.php
php artisan informaticadoslago:extract app resources/views --lang=es

# Ver qué encontraría, sin escribir nada
php artisan informaticadoslago:extract app --dry

# Solo el JSON de literales
php artisan informaticadoslago:extract app --formats=json

# Incluir .js/.ts y guardar informe de referencias
php artisan informaticadoslago:extract resources --include-js --report=storage/lang-report.json
```

OpciónDescripción`paths...`Carpetas a escanear. Por defecto, `config('translations.extract.paths')`.`--lang=`Locale destino de los ficheros. Por defecto `config('app.locale')`.`--formats=``array`, `json` o `both` (por defecto).`--dry`No escribe; lista lo que encontraría.`--only=`En `--dry`: `all`, `php` o `json`.`--report=`Guarda un informe JSON `clave → fichero:línea`.`--include-js`Escanea también `.js` y `.ts`.`--force`Sobrescribe valores de claves ya existentes.`--clean`Elimina claves que ya no aparecen en el código (conserva sus traducciones si siguen usándose).`--debug-exclude`Muestra qué ficheros se excluyen y por qué.Qué funciones detecta, qué directivas Blade y qué excluir se configura en `config/translations.php` (`php_functions`, `key_functions`, `blade_directives`, `js_functions`, `exclude`). Una exclusión que acaba en `/` (p.ej. `vendor/`) descarta esa carpeta a cualquier profundidad.

### Claves fuera de las vistas: `trans_key()`

[](#claves-fuera-de-las-vistas-trans_key)

`php_functions` (`__`, `trans`, …) usa una heurística para decidir el destino: `grupo.item` → fichero PHP; texto suelto → JSON. Como salvaguarda, una clave con **espacios** se trata como literal (JSON), para no mandar frases como *"Se guardó correctamente."* a un fichero PHP.

Eso deja fuera un caso: claves definidas **en `config/`** (p.ej. las etiquetas de un menú en `config/sidebar.php`), que son valores de array sueltos y se traducen con variable en la vista (`__($item['label'])`), no con un literal que el extractor pueda ver.

Para eso están las **`key_functions`** (por defecto `['trans_key']`): funciones cuyo literal es **siempre** un short-key namespaced y va al fichero PHP, con espacios o sin ellos, sin pasar por la heurística.

`trans_key()` es un helper *no-op* que devuelve la clave tal cual (no traduce), así que es seguro en config (incluido `config:cache`); la traducción real la sigue haciendo `__()` en la vista:

```
// app/helpers.php
if (! function_exists('trans_key')) {
    function trans_key(string $key): string { return $key; }
}

// config/sidebar.php
'label' => trans_key('menu.Gestión Académica'),
```

```
// config/translations.php
'extract'       => ['paths' => ['app', 'resources/views', 'config']],
'key_functions' => ['trans_key'],
```

> Cuidado con el solapamiento JSON/PHP: una clave con punto (`menu.X`) Laravel la busca solo en el fichero PHP, nunca en `lang/es.json`. Si esa misma clave quedó en `es.json` de una extracción anterior (heurística previa), **eclipsa** al fichero PHP y verás el literal. Límpiala del JSON.

Uso: traducir (`informaticadoslago:translate`)
----------------------------------------------

[](#uso-traducir-informaticadoslagotranslate)

### Ejemplos

[](#ejemplos)

Traducir toda la carpeta `lang/es` al inglés:

```
php artisan informaticadoslago:translate lang/es --to=en
```

Un solo fichero PHP a varios idiomas:

```
php artisan informaticadoslago:translate lang/es/auth.php --to=en --to=fr --to=pt
```

Un fichero JSON:

```
php artisan informaticadoslago:translate lang/es.json --to=en
```

Sobrescribir destinos existentes y sin usar la caché:

```
php artisan informaticadoslago:translate lang/es --to=en --overwrite --nodatabase
```

Sacar la salida a otra carpeta:

```
php artisan informaticadoslago:translate lang/es --to=en --target_dir=resources/lang/custom
```

### Opciones

[](#opciones)

OpciónDescripción`--from=`Locale de origen. Se autodetecta de la ruta si se omite.`--to=*`Locale(s) de destino. Repetible: `--to=en --to=fr`. **Obligatorio.**`--target_dir=`Carpeta de salida. Por defecto, junto al origen.`--provider=`Fuerza `google`, `openai` o `dummy` ignorando la config.`--batch=`Tamaño de lote (nº de textos por petición).`--overwrite`Sobrescribe ficheros de destino existentes.`--nodatabase`Desactiva la caché en BD para esta ejecución.### Detección de rutas

[](#detección-de-rutas)

OrigenLocaleDestino (`--to=en`)`lang/es``es``lang/en/\*.php`lang/es/auth.php``es``lang/en/auth.php``lang/es.json``es``lang/en.json`Uso del motor desde código
--------------------------

[](#uso-del-motor-desde-código)

El comando es sólo un cliente del motor. Puedes traducir cualquier colección de textos (BD, CSV, emails…) con la misma lógica de caché y lotes:

```
use InformaticadosLago\Translations\Support\Translator;
use InformaticadosLago\Translations\Cache\TranslationCache;
use InformaticadosLago\Translations\Providers\GoogleProvider;

$provider   = new GoogleProvider(config('translations.api_key'));
$translator = new Translator($provider, new TranslationCache('google'), batchSize: 20);

$traducidos = $translator->translate(['Hola', 'Adiós', 'Hola'], 'es', 'en');
// ['Hello', 'Goodbye', 'Hello']  → "Hola" se traduce una sola vez

$translator->stats();
// ['total' => 3, 'cached' => 0, 'translated' => 2, 'empty' => 0, 'batches' => 1]
```

Estructura del paquete
----------------------

[](#estructura-del-paquete)

```
src/
  Commands/ExtractCommand.php       Escanea el código → ficheros lang.
  Commands/TranslateCommand.php     Traduce ficheros lang.
  Contracts/TranslationProvider.php Interfaz de proveedor.
  Providers/GoogleProvider.php      Google (POST + JSON).
  Providers/OpenAIProvider.php      OpenAI (JSON en lote).
  Providers/DummyProvider.php       Pruebas sin API.
  Cache/TranslationCache.php        Caché sobre Eloquent.
  Models/TranslationsCache.php      Modelo de la tabla.
  Support/StringScanner.php         Escaneo + clasificación + exclusiones.
  Support/LangWriter.php            Merge/clean + escritura anidada.
  Support/Translator.php            Motor de traducción (dedupe + caché + lotes).
  Support/LangFile.php              Lectura/escritura PHP y JSON.
  Support/LocaleDetector.php        Detección de locale y rutas.
config/translations.php
database/migrations/..._create_translations_caches_table.php

```

Añadir otro proveedor (DeepL, Azure…)
-------------------------------------

[](#añadir-otro-proveedor-deepl-azure)

Implementa la interfaz y regístralo en `TranslateCommand::resolveProvider()`:

```
use InformaticadosLago\Translations\Contracts\TranslationProvider;

class DeepLProvider implements TranslationProvider
{
    public function name(): string { return 'deepl'; }

    public function translate(array $texts, string $origin, string $target): array
    {
        // ... devolver las traducciones en el mismo orden que $texts
    }
}
```

Licencia
--------

[](#licencia)

MIT.

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance90

Actively maintained with recent releases

Popularity5

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

48d ago

PHP version history (2 changes)v1.0.0PHP ^8.1

v1.0.1PHP ^8.3

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/299829565?v=4)[informaticadoslago](/maintainers/informaticadoslago)[@informaticadoslago](https://github.com/informaticadoslago)

---

Top Contributors

[![informaticadoslago](https://avatars.githubusercontent.com/u/299829565?v=4)](https://github.com/informaticadoslago "informaticadoslago (3 commits)")

---

Tags

laraveli18ntranslationsopenailanggoogle-translate

### Embed Badge

![Health badge](/badges/informaticadoslago-laravel-translations/health.svg)

```
[![Health](https://phpackages.com/badges/informaticadoslago-laravel-translations/health.svg)](https://phpackages.com/packages/informaticadoslago-laravel-translations)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.4M354](/packages/psalm-plugin-laravel)[laravel/cashier

Laravel Cashier provides an expressive, fluent interface to Stripe's subscription billing services.

2.6k31.8M163](/packages/laravel-cashier)[mike-bronner/laravel-model-caching

Automatic caching for Eloquent models.

2.4k161.4k2](/packages/mike-bronner-laravel-model-caching)[forjedio/inertia-table

Backend-driven dynamic tables for Laravel + Inertia.js

272.0k](/packages/forjedio-inertia-table)[api-platform/laravel

API Platform support for Laravel

58190.1k21](/packages/api-platform-laravel)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

265.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
