# Idiomas y diálogos

> Traduce una app de escritorio de Pyzed a varios idiomas, cambia el idioma mientras corre y usa los diálogos listos para usar ya traducidos.

Source: https://albakore.github.io/pyzed/es/guides/i18n/

## Idiomas

`pyzed.i18n` guarda un catálogo de textos por idioma. Las vistas buscan los textos con
`pz.t`, así que cambiar el idioma desde un handler vuelve a dibujar toda la app en el nuevo.

```python
import pyzed as pz
from pyzed import i18n

i18n.add("en", {"greeting": "Hello, {name}!", "files": {"one": "{count} file", "other": "{count} files"}})
i18n.add("es", {"greeting": "¡Hola, {name}!", "files": {"one": "{count} archivo", "other": "{count} archivos"}})
i18n.set_language(i18n.system_language())   # o "es", "pt_BR"...

class Hola(pz.App):
    def view(self):
        return pz.column([
            pz.text(pz.t("greeting", name="Kev")),
            pz.text(pz.t("files", count=3)),
            pz.button("English", on_press=lambda: i18n.set_language("en")),
        ])
```

- Los marcadores como `{name}` se rellenan con los argumentos por nombre.
- Un texto con formas `one`/`other` (y opcionalmente `zero`) es un plural; `count=` elige la forma.
- Las tablas anidadas se vuelven claves con puntos: `{"menu": {"open": "Abrir"}}` es `pz.t("menu.open")`.
- Si falta un texto se prueba de `"es_AR"` a `"es"`, luego el idioma de respaldo (`"en"`, ver
  `i18n.set_fallback`) y por último se devuelve la clave.

Los catálogos pueden estar en archivos, uno por idioma, junto a tu app:

```text
locales/
├── en.json      {"greeting": "Hello, {name}!"}
└── es.toml      greeting = "¡Hola, {name}!"
```

```python
i18n.load("locales")   # ["en", "es"]
```

Los componentes de Pyzed (los diálogos de abajo, el menú del dock) también se traducen. Inglés
y español vienen incluidos; sus claves empiezan por `pyzed.` (`pyzed.ok`, `pyzed.cancel`...),
así que `i18n.add("fr", {"pyzed": {"ok": "OK", "cancel": "Annuler"}})` añade francés.

## Diálogos

`pyzed.ui` trae diálogos listos. Guarda en tu estado cuál está abierto y envuelve la vista con
`ui.dialog_layer`, que oscurece la ventana y centra el diálogo:

(Image: Un diálogo de confirmación)

```python
from pyzed import ui

class Archivos(pz.App):
    preguntando = False

    def eliminar(self):
        ...
        self.preguntando = False

    def view(self):
        dialogo = None
        if self.preguntando:
            dialogo = ui.confirm("¿Eliminar 3 archivos?", self.eliminar,
                                 lambda: setattr(self, "preguntando", False), danger=True)
        return ui.dialog_layer(self.vista_principal(), dialogo,
                               on_dismiss=lambda: setattr(self, "preguntando", False))
```

| Diálogo | Qué hace |
| --- | --- |
| `ui.alert(mensaje, on_close, kind=)` | Un mensaje con un botón Aceptar; `kind` añade un icono de info, éxito, aviso o error. |
| `ui.confirm(mensaje, on_confirm, on_cancel, danger=)` | Una pregunta de sí o no; `danger=True` hace el botón un Eliminar rojo. |
| `ui.prompt(titulo, valor, on_input, on_submit, on_cancel)` | Pide una línea de texto (Enter acepta). |
| `ui.choice(mensaje, [(texto, on_press), ...], on_cancel)` | Tus propios botones; el último es el principal. |
| `ui.unsaved_changes(nombre, on_save, on_discard, on_cancel)` | «¿Guardar los cambios antes de cerrar?» |

Para cualquier otra cosa, `ui.modal(contenido, title=, footer=[...])` es la misma superficie
con tu propio contenido. Ver [`examples/dialogs.py`](https://github.com/albakore/pyzed/blob/main/examples/dialogs.py).
