Ir al contenido

Idiomas y diálogos

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.

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:

locales/
├── en.json {"greeting": "Hello, {name}!"}
└── es.toml greeting = "¡Hola, {name}!"
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.

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:

Un diálogo de confirmación

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.