Skip to content

Commit 6c25fc8

Browse files
committed
feat(docs): add new docs translation es
1 parent 28eadc3 commit 6c25fc8

File tree

6 files changed

+278
-4
lines changed

6 files changed

+278
-4
lines changed

docs/es/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ sudo systemctl start frankenphp
130130
- [El modo worker](worker.md)
131131
- [Soporte para Early Hints (código de estado HTTP 103)](early-hints.md)
132132
- [Tiempo real](mercure.md)
133+
- [Hot reloading](https://frankenphp.dev/docs/hot-reload/)
134+
- [Registro de actividad](https://frankenphp.dev/docs/logging/)
133135
- [Servir eficientemente archivos estáticos grandes](x-sendfile.md)
134136
- [Configuración](config.md)
135137
- [Escribir extensiones PHP en Go](extensions.md)
@@ -140,6 +142,7 @@ sudo systemctl start frankenphp
140142
- [Crear una compilación estática](static.md)
141143
- [Compilar desde las fuentes](compile.md)
142144
- [Monitoreo de FrankenPHP](metrics.md)
145+
- [Integración con WordPress](https://frankenphp.dev/docs/wordpress/)
143146
- [Integración con Laravel](laravel.md)
144147
- [Problemas conocidos](known-issues.md)
145148
- [Aplicación de demostración (Symfony) y benchmarks](https://github.com/dunglas/frankenphp-demo)

docs/es/config.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,12 @@ Esto es útil para entornos de desarrollo.
213213
}
214214
```
215215

216-
Si no se especifica el directorio `watch`, volverá a `./**/*.{php,yaml,yml,twig,env}`,
217-
que observa todos los archivos `.php`, `.yaml`, `.yml`, `.twig` y `.env` en el directorio y subdirectorios
218-
donde se inició el proceso de FrankenPHP. En su lugar, también puede especificar uno o más directorios mediante un
219-
[patrón de nombre de archivo de shell](https://pkg.go.dev/path/filepath#Match):
216+
Esta función se utiliza frecuentemente en combinación con [hot reload](hot-reload.md).
217+
218+
Si el directorio `watch` no está especificado, retrocederá a `./**/*.{env,php,twig,yaml,yml}`,
219+
lo cual vigila todos los archivos `.env`, `.php`, `.twig`, `.yaml` y `.yml` en el directorio y subdirectorios
220+
donde se inició el proceso de FrankenPHP. También puede especificar uno o más directorios mediante un
221+
[patrón de nombres de ficheros de shell](https://pkg.go.dev/path/filepath#Match):
220222

221223
```caddyfile
222224
{

docs/es/hot-reload.md

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
# Hot reload
2+
3+
FrankenPHP incluye una función de **hot reload** integrada diseñada para mejorar significativamente la experiencia del desarrollador.
4+
5+
![Mercure](../hot-reload.png)
6+
7+
Esta función proporciona un flujo de trabajo similar a **Hot Module Replacement (HMR)** encontrado en herramientas modernas de JavaScript (como Vite o webpack).
8+
En lugar de actualizar manualmente el navegador después de cada cambio de archivo (código PHP, plantillas, archivos JavaScript y CSS...),
9+
FrankenPHP actualiza el contenido en tiempo real.
10+
11+
La Hot Reload funciona de forma nativa con WordPress, Laravel, Symfony y cualquier otra aplicación o framework PHP.
12+
13+
Cuando está activada, FrankenPHP vigila el directorio de trabajo actual en busca de cambios en el sistema de archivos.
14+
Cuando se modifica un archivo, envía una actualización [Mercure](mercure.md) al navegador.
15+
16+
Dependiendo de la configuración, el navegador:
17+
18+
- **Transformará el DOM** (preservando la posición de desplazamiento y el estado de los inputs) si [Idiomorph](https://github.com/bigskysoftware/idiomorph) está cargado.
19+
- **Recargará la página** (recarga en vivo estándar) si Idiomorph no está presente.
20+
21+
## Configuración
22+
23+
Para habilitar la Hot Reload, active Mercure y luego agregue la subdirectiva `hot_reload` a la directiva `php_server` en su `Caddyfile`.
24+
25+
> [!WARNING]
26+
> Esta función está destinada **únicamente a entornos de desarrollo**.
27+
> No active `hot_reload` en producción, ya que vigilar el sistema de archivos implica una sobrecarga de rendimiento y expone endpoints internos.
28+
29+
```caddyfile
30+
localhost
31+
32+
mercure {
33+
anonymous
34+
}
35+
36+
root public/
37+
php_server {
38+
hot_reload
39+
}
40+
```
41+
42+
Por omisión, FrankenPHP vigilará todos los archivos en el directorio de trabajo actual que coincidan con este patrón glob: `./**/*.{css,env,gif,htm,html,jpg,jpeg,js,mjs,php,png,svg,twig,webp,xml,yaml,yml}`
43+
44+
Es posible establecer explícitamente los archivos a vigilar usando la sintaxis glob:
45+
46+
```caddyfile
47+
localhost
48+
49+
mercure {
50+
anonymous
51+
}
52+
53+
root public/
54+
php_server {
55+
hot_reload src/**/*{.php,.js} config/**/*.yaml
56+
}
57+
```
58+
59+
Use la forma larga para especificar el tema de Mercure a utilizar, así como qué directorios o archivos vigilar, proporcionando rutas a la opción `hot_reload`:
60+
61+
```caddyfile
62+
localhost
63+
64+
mercure {
65+
anonymous
66+
}
67+
68+
root public/
69+
php_server {
70+
hot_reload {
71+
topic hot-reload-topic
72+
watch src/**/*.php
73+
watch assets/**/*.{ts,json}
74+
watch templates/
75+
watch public/css/
76+
}
77+
}
78+
```
79+
80+
## Integración Lado-Cliente
81+
82+
Mientras el servidor detecta los cambios, el navegador necesita suscribirse a estos eventos para actualizar la página.
83+
FrankenPHP expone la URL del Mercure Hub a utilizar para suscribirse a los cambios de archivos a través de la variable de entorno `$_SERVER['FRANKENPHP_HOT_RELOAD']`.
84+
85+
Una biblioteca JavaScript de conveniencia, [frankenphp-hot-reload](https://www.npmjs.com/package/frankenphp-hot-reload), también está disponible para manejar la lógica lado-cliente.
86+
Para usarla, agregue lo siguiente a su diseño principal:
87+
88+
```php
89+
<!DOCTYPE html>
90+
<title>FrankenPHP Hot Reload</title>
91+
<?php if (isset($_SERVER['FRANKENPHP_HOT_RELOAD'])): ?>
92+
<meta name="frankenphp-hot-reload:url" content="<?=$_SERVER['FRANKENPHP_HOT_RELOAD']?>">
93+
<script src="https://cdn.jsdelivr.net/npm/idiomorph"></script>
94+
<script src="https://cdn.jsdelivr.net/npm/frankenphp-hot-reload/+esm" type="module"></script>
95+
<?php endif ?>
96+
```
97+
98+
La biblioteca se suscribirá automáticamente al hub de Mercure, obtendrá la URL actual en segundo plano cuando se detecte un cambio en un archivo y transformará el DOM.
99+
Está disponible como un paquete [npm](https://www.npmjs.com/package/frankenphp-hot-reload) y en [GitHub](https://github.com/dunglas/frankenphp-hot-reload).
100+
101+
Alternativamente, puede implementar su propia lógica lado-cliente suscribiéndose directamente al hub de Mercure usando la clase nativa de JavaScript `EventSource`.
102+
103+
### Modo Worker
104+
105+
Si está ejecutando su aplicación en [Modo Worker](https://frankenphp.dev/docs/worker/), el script de su aplicación permanece en memoria.
106+
Esto significa que los cambios en su código PHP no se reflejarán inmediatamente, incluso si el navegador se recarga.
107+
108+
Para la mejor experiencia de desarrollador, debe combinar `hot_reload` con [la subdirectiva `watch` en la directiva `worker`](config.md#watching-for-file-changes).
109+
110+
- `hot_reload`: actualiza el **navegador** cuando los archivos cambian
111+
- `worker.watch`: reinicia el worker cuando los archivos cambian
112+
113+
```caddy
114+
localhost
115+
116+
mercure {
117+
anonymous
118+
}
119+
120+
root public/
121+
php_server {
122+
hot_reload
123+
worker {
124+
file /path/to/my_worker.php
125+
watch
126+
}
127+
}
128+
```
129+
130+
### Funcionamiento
131+
132+
1. **Vigilancia**: FrankenPHP monitorea el sistema de archivos en busca de modificaciones usando [la biblioteca `e-dant/watcher`](https://github.com/e-dant/watcher) internamente (contribuimos con el binding de Go).
133+
2. **Reinicio (Modo Worker)**: si `watch` está habilitado en la configuración del worker, el worker de PHP se reinicia para cargar el nuevo código.
134+
3. **Envío**: se envía una carga útil JSON que contiene la lista de archivos modificados al [hub de Mercure](https://mercure.rocks) integrado.
135+
4. **Recepción**: El navegador, escuchando a través de la biblioteca JavaScript, recibe el evento de Mercure.
136+
5. **Actualización**:
137+
138+
- Si se detecta **Idiomorph**, obtiene el contenido actualizado y transforma el HTML actual para que coincida con el nuevo estado, aplicando los cambios al instante sin perder el estado.
139+
- De lo contrario, se llama a `window.location.reload()` para recargar la página.

docs/es/logging.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# Registro de actividad
2+
3+
FrankenPHP se integra perfectamente con [el sistema de registro de Caddy](https://caddyserver.com/docs/logging).
4+
Puede registrar mensajes usando funciones estándar de PHP o aprovechar la función dedicada `frankenphp_log()` para capacidades avanzadas de registro estructurado.
5+
6+
## `frankenphp_log()`
7+
8+
La función `frankenphp_log()` le permite emitir registros estructurados directamente desde su aplicación PHP,
9+
facilitando la ingesta en plataformas como Datadog, Grafana Loki o Elastic, así como el soporte para OpenTelemetry.
10+
11+
Internamente, `frankenphp_log()` envuelve [el paquete `log/slog` de Go](https://pkg.go.dev/log/slog) para proporcionar funciones avanzadas de registro.
12+
13+
Estos registros incluyen el nivel de gravedad y datos de contexto opcionales.
14+
15+
```php
16+
function frankenphp_log(string $message, int $level = FRANKENPHP_LOG_LEVEL_INFO, array $context = []): void
17+
```
18+
19+
### Parámetros
20+
21+
- **`message`**: El string del mensaje de registro.
22+
- **`level`**: El nivel de gravedad del registro. Puede ser cualquier entero arbitrario. Se proporcionan constantes de conveniencia para niveles comunes: `FRANKENPHP_LOG_LEVEL_DEBUG` (`-4`), `FRANKENPHP_LOG_LEVEL_INFO` (`0`), `FRANKENPHP_LOG_LEVEL_WARN` (`4`) y `FRANKENPHP_LOG_LEVEL_ERROR` (`8`)). Por omisión es `FRANKENPHP_LOG_LEVEL_INFO`.
23+
- **`context`**: Un array asociativo de datos adicionales para incluir en la entrada del registro.
24+
25+
### Ejemplo
26+
27+
```php
28+
<?php
29+
30+
// Registrar un mensaje informativo simple
31+
frankenphp_log("¡Hola desde FrankenPHP!");
32+
33+
// Registrar una advertencia con datos de contexto
34+
frankenphp_log(
35+
"Uso de memoria alto",
36+
FRANKENPHP_LOG_LEVEL_WARN,
37+
[
38+
'uso_actual' => memory_get_usage(),
39+
'uso_pico' => memory_get_peak_usage(),
40+
],
41+
);
42+
43+
```
44+
45+
Al ver los registros (por ejemplo, mediante `docker compose logs`), la salida aparecerá como JSON estructurado:
46+
47+
```json
48+
{"level":"info","ts":1704067200,"logger":"frankenphp","msg":"¡Hola desde FrankenPHP!"}
49+
{"level":"warn","ts":1704067200,"logger":"frankenphp","msg":"Uso de memoria alto","uso_actual":10485760,"uso_pico":12582912}
50+
```
51+
52+
## `error_log()`
53+
54+
FrankenPHP también permite el registro mediante la función estándar `error_log()`. Si el parámetro `$message_type` es `4` (SAPI),
55+
estos mensajes se redirigen al registrador de Caddy.
56+
57+
Por omisión, los mensajes enviados a través de `error_log()` se tratan como texto no estructurado.
58+
Son útiles para la compatibilidad con aplicaciones o bibliotecas existentes que dependen de la biblioteca estándar de PHP.
59+
60+
### Ejemplo
61+
62+
```php
63+
error_log("Fallo en la conexión a la base de datos", 4);
64+
```
65+
66+
Esto aparecerá en los registros de Caddy, a menudo con un prefijo que indica que se originó desde PHP.
67+
68+
> [!TIP]
69+
> Para una mejor observabilidad en entornos de producción, prefiera `frankenphp_log()`
70+
> ya que permite filtrar registros por nivel (Depuración, Error, etc.)
71+
> y consultar campos específicos en su infraestructura de registro.

docs/es/wordpress.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# WordPress
2+
3+
Ejecute [WordPress](https://wordpress.org/) con FrankenPHP para disfrutar de una pila moderna y de alto rendimiento con HTTPS automático, HTTP/3 y compresión Zstandard.
4+
5+
## Instalación Mínima
6+
7+
1. [Descargue WordPress](https://wordpress.org/download/)
8+
2. Extraiga el archivo ZIP y abra una terminal en el directorio extraído
9+
3. Ejecute:
10+
```console
11+
frankenphp php-server
12+
```
13+
4. Vaya a `http://localhost/wp-admin/` y siga las instrucciones de instalación
14+
5. ¡Listo!
15+
16+
Para una configuración lista para producción, prefiera usar `frankenphp run` con un `Caddyfile` como este:
17+
18+
```caddyfile
19+
example.com
20+
21+
php_server
22+
encode zstd br gzip
23+
log
24+
```
25+
26+
## Hot Reload
27+
28+
Para usar la función de [Hot reload](hot-reload.md) con WordPress, active [Mercure](mercure.md) y agregue la subdirectiva `hot_reload` a la directiva `php_server` en su `Caddyfile`:
29+
30+
```caddyfile
31+
localhost
32+
33+
mercure {
34+
anonymous
35+
}
36+
37+
php_server {
38+
hot_reload
39+
}
40+
```
41+
42+
Luego, agregue el código necesario para cargar las bibliotecas JavaScript en el archivo `functions.php` de su tema de WordPress:
43+
44+
```php
45+
function hot_reload() {
46+
?>
47+
<?php if (isset($_SERVER['FRANKENPHP_HOT_RELOAD'])): ?>
48+
<meta name="frankenphp-hot-reload:url" content="<?=$_SERVER['FRANKENPHP_HOT_RELOAD']?>">
49+
<script src="https://cdn.jsdelivr.net/npm/idiomorph"></script>
50+
<script src="https://cdn.jsdelivr.net/npm/frankenphp-hot-reload/+esm" type="module"></script>
51+
<?php endif ?>
52+
<?php
53+
}
54+
add_action('wp_head', 'hot_reload');
55+
```
56+
57+
Finalmente, ejecute `frankenphp run` desde el directorio raíz de WordPress.

docs/es/worker.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ El siguiente comando activará un reinicio si algún archivo que termine en `.ph
3535
frankenphp php-server --worker /ruta/a/tu/script/worker.php --watch="/ruta/a/tu/app/**/*.php"
3636
```
3737

38+
Esta función se utiliza frecuentemente en combinación con [hot reloading](hot-reload.md).
39+
3840
## Symfony Runtime
3941

4042
> [!TIP]

0 commit comments

Comments
 (0)