From 7f1fe36b3ea7aaad29d64c44a306e8471794fd93 Mon Sep 17 00:00:00 2001 From: Max Gramser Date: Sat, 19 Sep 2026 14:44:13 +0200 Subject: [PATCH] German, French, Italian, Spanish, Portuguese and Polish texts for the screens, and a check for the editor's special characters Co-Authored-By: Claude Opus 5 --- screen_manager/translations/de.json | 181 +++++++++++++++++++++++++++- screen_manager/translations/es.json | 181 +++++++++++++++++++++++++++- screen_manager/translations/fr.json | 181 +++++++++++++++++++++++++++- screen_manager/translations/it.json | 181 +++++++++++++++++++++++++++- screen_manager/translations/pl.json | 181 +++++++++++++++++++++++++++- screen_manager/translations/pt.json | 181 +++++++++++++++++++++++++++- tools/i18n.py | 5 + 7 files changed, 1085 insertions(+), 6 deletions(-) diff --git a/screen_manager/translations/de.json b/screen_manager/translations/de.json index d2898ed..78f0b60 100644 --- a/screen_manager/translations/de.json +++ b/screen_manager/translations/de.json @@ -14,6 +14,18 @@ "group_min": "1" }, "time": { + "just_now": "Gerade eben", + "minutes_ago": "Vor {n} Min.", + "hours_ago": "Vor 1 Stunde | Vor {n} Stunden", + "yesterday": "Gestern", + "days_ago": "Vor 1 Tag | Vor {n} Tagen", + "weeks_ago": "Vor 1 Woche | Vor {n} Wochen", + "months_ago": "Vor 1 Monat | Vor {n} Monaten", + "years_ago": "Vor 1 Jahr | Vor {n} Jahren", + "in_minutes": "In {n} Min.", + "in_hours": "In 1 Stunde | In {n} Stunden", + "tomorrow": "Morgen", + "in_days": "In 1 Tag | In {n} Tagen", "am": "AM", "pm": "PM" }, @@ -78,9 +90,177 @@ "day_month": "{day}. {month}", "weekday_time": "{weekday}, {time}" }, + "duration": { + "seconds": "{n} s", + "minutes": "{n} Min.", + "hours": "{n} Std.", + "hours_minutes": "{h} Std. {m} Min.", + "days": "{n} T.", + "days_hours": "{d} T. {h} Std." + }, + "status": { + "connecting": "Verbinde mit Home Assistant", + "waiting": "Warte auf ESP Screens", + "loading_tiles": "Kacheln werden geladen...", + "ha_not_connected": "HA nicht verbunden", + "manager_not_active": "ESP Screens nicht aktiv", + "choose_tiles": "Kacheln in HA wählen", + "home": "Zuhause", + "no_network": "Kein Netzwerk" + }, + "settings": { + "title": "Einstellungen", + "brightness": "Helligkeit", + "night": "Nacht", + "screen": "Bildschirm", + "this_screen": "Dieser Bildschirm", + "dark_mode": "Dunkler Modus", + "auto_standby": "Auto-Standby", + "standby_after": "Standby nach", + "standby_brightness": "Helligkeit Standby", + "night_mode": "Nachtmodus", + "starts": "Beginnt", + "ends": "Endet", + "night_brightness": "Helligkeit nachts", + "back_to_page_1": "Zurück zu Seite 1", + "after": "Nach", + "also_on_standby": "Auch im Standby", + "swipe_between_pages": "Zwischen Seiten wischen", + "page_buttons": "Seitentasten", + "rotation": "Drehung", + "address": "Adresse", + "firmware": "Firmware", + "home_assistant": "Home Assistant", + "restart": "Neu starten", + "connected": "Verbunden", + "not_connected": "Nicht verbunden", + "tap_again_to_restart": "Zum Neustart erneut tippen", + "seconds": "{n} Sek.", + "minutes": "{n} Min.", + "hours": "{n} Std.", + "hours_minutes": "{h} Std. {m}" + }, + "tile": { + "tap_to_open": "Zum Öffnen tippen", + "page": "Seite {n}", + "refused": "Abgelehnt", + "command_sent": "Befehl gesendet...", + "confirmed": "Von Home Assistant bestätigt" + }, + "alert": { + "notification": "Benachrichtigung", + "ok": "OK" + }, + "light": { + "color": "Farbe", + "color_temperature": "Farbtemperatur", + "brightness": "Helligkeit", + "waiting": "Warte..." + }, + "effects": { + "effect": "Effekt", + "nothing": "Nichts zur Auswahl", + "loading": "Wird geladen...", + "not_connected": "Nicht verbunden" + }, + "climate": { + "target": "Ziel", + "mode": "Modus", + "fan": "Lüfter", + "swing": "Schwenken", + "now": "Jetzt {value}" + }, + "vacuum": { + "check_robot": "Roboter in HA prüfen", + "auto_suction": "Automatische Saugkraft", + "robot_chooses": "Der Roboter wählt Saugkraft und Wasser", + "per_room": "Saugkraft und Wasser je Raum", + "speed_quiet": "Leise", + "speed_balanced": "Normal", + "speed_turbo": "Turbo", + "speed_max": "Max", + "pause_cleaning": "Reinigung pausieren", + "pause": "Pause", + "resume": "Fortsetzen", + "start_cleaning": "Reinigung starten", + "clean": "Reinigen", + "dock": "Station" + }, + "cover": { + "position": "Position", + "tilt": "Neigung", + "tilt_value": "Neigung {n}%" + }, + "weather": { + "feels_like": "Gefühlt {n}°", + "no_forecast": "Keine Tagesvorhersage von Home Assistant", + "coming_days": "Nächste Tage" + }, + "history": { + "no_data": "Keine Daten", + "average": "Durchschnitt", + "average_of": "Durchschnitt über {duration}", + "now": "Jetzt", + "range_hour": "1 Stunde", + "range_day": "24 Stunden", + "range_week": "1 Woche", + "high": "Hoch {value}", + "low": "Tief {value}", + "times": "einmal | {n}-mal", + "loading": "Verlauf wird geladen...", + "empty": "Kein Verlauf in diesem Zeitraum", + "unavailable": "Kein Verlauf verfügbar" + }, + "media": { + "muted": "Stumm", + "not_playing": "Keine Wiedergabe", + "loading": "Wird geladen" + }, + "timer": { + "running": "Läuft", + "paused": "Pausiert", + "stopped": "Gestoppt", + "pause": "Pause", + "start": "Starten", + "cancel": "Abbrechen", + "paused_left": "Pausiert {time}" + }, + "sun": { + "name": "Sonne", + "sunrise": "Sonnenaufgang {time}", + "sunset": "Sonnenuntergang {time}", + "rise": "auf {time}", + "set": "unter {time}" + }, + "script": { + "running": "Läuft...", + "never_run": "Nie ausgeführt", + "last_time": "Zuletzt {time}", + "yesterday_time": "Gestern {time}", + "last_date": "Zuletzt {date}" + }, + "camera": { + "no_image": "Kein Bild von dieser Kamera", + "loading": "Bild wird geladen", + "live": "Live", + "recording": "Aufnahme", + "tap_to_view": "Zum Ansehen tippen", + "no_image_yet": "Noch kein Bild" + }, + "calibration": { + "title": "Folge der Kalibrierung", + "touch_check": "GT911-Touchtest", + "hold": "Jedes Tippen kurz halten", + "crosshair": "Tippe auf das Kreuz\nPunkt {point}/5 - Tippen {tap}/3", + "gently": "Sanft tippen, etwas länger", + "same": "Dreimal auf dasselbe Kreuz tippen", + "rejected": "Messung verworfen; bitte erneut", + "save_failed": "Speichern fehlgeschlagen; bitte erneut" + }, "ha": { "on": "Ein", "off": "Aus", + "unavailable": "Nicht verfügbar", "climate": { "off": "Aus", "heat": "Heizbetrieb", @@ -201,7 +381,6 @@ "window_on": "Geöffnet", "window_off": "Geschlossen" }, - "unavailable": "Nicht verfügbar", "button": { "activate": "Aktivieren", "run": "Ausführen", diff --git a/screen_manager/translations/es.json b/screen_manager/translations/es.json index 963120b..ec93699 100644 --- a/screen_manager/translations/es.json +++ b/screen_manager/translations/es.json @@ -14,6 +14,18 @@ "group_min": "2" }, "time": { + "just_now": "Justo ahora", + "minutes_ago": "Hace {n} min", + "hours_ago": "Hace 1 hora | Hace {n} horas", + "yesterday": "Ayer", + "days_ago": "Hace 1 día | Hace {n} días", + "weeks_ago": "Hace 1 semana | Hace {n} semanas", + "months_ago": "Hace 1 mes | Hace {n} meses", + "years_ago": "Hace 1 año | Hace {n} años", + "in_minutes": "En {n} min", + "in_hours": "En 1 hora | En {n} horas", + "tomorrow": "Mañana", + "in_days": "En 1 día | En {n} días", "am": "a. m.", "pm": "p. m." }, @@ -78,9 +90,177 @@ "day_month": "{day} {month}", "weekday_time": "{weekday}, {time}" }, + "duration": { + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} h", + "hours_minutes": "{h} h {m} min", + "days": "{n} d", + "days_hours": "{d} d {h} h" + }, + "status": { + "connecting": "Conectando con Home Assistant", + "waiting": "Esperando a ESP Screens", + "loading_tiles": "Cargando mosaicos...", + "ha_not_connected": "HA no conectado", + "manager_not_active": "ESP Screens no activo", + "choose_tiles": "Elige los mosaicos en HA", + "home": "Casa", + "no_network": "Sin red" + }, + "settings": { + "title": "Configuración", + "brightness": "Brillo", + "night": "Noche", + "screen": "Pantalla", + "this_screen": "Esta pantalla", + "dark_mode": "Modo oscuro", + "auto_standby": "Reposo automático", + "standby_after": "Reposo tras", + "standby_brightness": "Brillo en reposo", + "night_mode": "Modo noche", + "starts": "Empieza", + "ends": "Termina", + "night_brightness": "Brillo nocturno", + "back_to_page_1": "Volver a la página 1", + "after": "Tras", + "also_on_standby": "También en reposo", + "swipe_between_pages": "Deslizar entre páginas", + "page_buttons": "Botones de página", + "rotation": "Rotación", + "address": "Dirección", + "firmware": "Firmware", + "home_assistant": "Home Assistant", + "restart": "Reiniciar", + "connected": "Conectado", + "not_connected": "No conectado", + "tap_again_to_restart": "Toca otra vez para reiniciar", + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} h", + "hours_minutes": "{h} h {m}" + }, + "tile": { + "tap_to_open": "Toca para abrir", + "page": "Página {n}", + "refused": "Rechazado", + "command_sent": "Orden enviada...", + "confirmed": "Confirmado por Home Assistant" + }, + "alert": { + "notification": "Notificación", + "ok": "OK" + }, + "light": { + "color": "Color", + "color_temperature": "Temperatura del color", + "brightness": "Brillo", + "waiting": "Esperando..." + }, + "effects": { + "effect": "Efecto", + "nothing": "Nada que elegir", + "loading": "Cargando...", + "not_connected": "No conectado" + }, + "climate": { + "target": "Deseada", + "mode": "Modo", + "fan": "Ventilador", + "swing": "Oscilación", + "now": "Ahora {value}" + }, + "vacuum": { + "check_robot": "Revisa el robot en HA", + "auto_suction": "Succión automática", + "robot_chooses": "El robot elige succión y agua", + "per_room": "Succión y agua por habitación", + "speed_quiet": "Silencioso", + "speed_balanced": "Normal", + "speed_turbo": "Turbo", + "speed_max": "Máx.", + "pause_cleaning": "Pausar limpieza", + "pause": "Pausa", + "resume": "Reanudar", + "start_cleaning": "Iniciar limpieza", + "clean": "Limpiar", + "dock": "Base" + }, + "cover": { + "position": "Posición", + "tilt": "Inclinación", + "tilt_value": "Inclinación {n}%" + }, + "weather": { + "feels_like": "Sensación {n}°", + "no_forecast": "Sin previsión diaria de Home Assistant", + "coming_days": "Próximos días" + }, + "history": { + "no_data": "Sin datos", + "average": "media", + "average_of": "media de {duration}", + "now": "Ahora", + "range_hour": "1 hora", + "range_day": "24 horas", + "range_week": "1 semana", + "high": "Máx. {value}", + "low": "Mín. {value}", + "times": "una vez | {n} veces", + "loading": "Cargando historial...", + "empty": "Sin historial en este periodo", + "unavailable": "No hay historial" + }, + "media": { + "muted": "Silenciado", + "not_playing": "No se reproduce nada", + "loading": "Cargando" + }, + "timer": { + "running": "En marcha", + "paused": "En pausa", + "stopped": "Detenido", + "pause": "Pausa", + "start": "Iniciar", + "cancel": "Cancelar", + "paused_left": "En pausa {time}" + }, + "sun": { + "name": "Sol", + "sunrise": "Amanecer {time}", + "sunset": "Atardecer {time}", + "rise": "sale {time}", + "set": "se pone {time}" + }, + "script": { + "running": "En curso...", + "never_run": "Nunca ejecutado", + "last_time": "Última {time}", + "yesterday_time": "Ayer {time}", + "last_date": "Última {date}" + }, + "camera": { + "no_image": "Sin imagen de esta cámara", + "loading": "Cargando imagen", + "live": "En directo", + "recording": "Grabando", + "tap_to_view": "Toca para ver", + "no_image_yet": "Aún no hay imagen" + }, + "calibration": { + "title": "Sigue la calibración", + "touch_check": "Prueba táctil GT911", + "hold": "Mantén cada toque un momento", + "crosshair": "Toca la cruz\nPunto {point}/5 - toque {tap}/3", + "gently": "Toca suave, un poco más", + "same": "Toca 3 veces la misma cruz", + "rejected": "Medida rechazada; inténtalo de nuevo", + "save_failed": "No se pudo guardar; inténtalo de nuevo" + }, "ha": { "on": "Encendido", "off": "Apagado", + "unavailable": "No disponible", "climate": { "off": "Apagado", "heat": "Calor", @@ -201,7 +381,6 @@ "window_on": "Abierto", "window_off": "Cerrado" }, - "unavailable": "No disponible", "button": { "activate": "Activar", "run": "Ejecutar", diff --git a/screen_manager/translations/fr.json b/screen_manager/translations/fr.json index a0458cc..e310e59 100644 --- a/screen_manager/translations/fr.json +++ b/screen_manager/translations/fr.json @@ -14,6 +14,18 @@ "group_min": "1" }, "time": { + "just_now": "À l'instant", + "minutes_ago": "Il y a {n} min", + "hours_ago": "Il y a {n} heure | Il y a {n} heures", + "yesterday": "Hier", + "days_ago": "Il y a {n} jour | Il y a {n} jours", + "weeks_ago": "Il y a {n} semaine | Il y a {n} semaines", + "months_ago": "Il y a {n} mois | Il y a {n} mois", + "years_ago": "Il y a {n} an | Il y a {n} ans", + "in_minutes": "Dans {n} min", + "in_hours": "Dans {n} heure | Dans {n} heures", + "tomorrow": "Demain", + "in_days": "Dans {n} jour | Dans {n} jours", "am": "AM", "pm": "PM" }, @@ -78,9 +90,177 @@ "day_month": "{day} {month}", "weekday_time": "{weekday} {time}" }, + "duration": { + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} h", + "hours_minutes": "{h} h {m} min", + "days": "{n} j", + "days_hours": "{d} j {h} h" + }, + "status": { + "connecting": "Connexion à Home Assistant", + "waiting": "En attente d'ESP Screens", + "loading_tiles": "Chargement des tuiles...", + "ha_not_connected": "HA non connecté", + "manager_not_active": "ESP Screens inactif", + "choose_tiles": "Choisissez les tuiles dans HA", + "home": "Accueil", + "no_network": "Pas de réseau" + }, + "settings": { + "title": "Paramètres", + "brightness": "Luminosité", + "night": "Nuit", + "screen": "Écran", + "this_screen": "Cet écran", + "dark_mode": "Mode sombre", + "auto_standby": "Veille auto", + "standby_after": "Veille après", + "standby_brightness": "Luminosité en veille", + "night_mode": "Mode nuit", + "starts": "Début", + "ends": "Fin", + "night_brightness": "Luminosité de nuit", + "back_to_page_1": "Retour à la page 1", + "after": "Après", + "also_on_standby": "Aussi en veille", + "swipe_between_pages": "Balayer entre les pages", + "page_buttons": "Boutons de page", + "rotation": "Rotation", + "address": "Adresse", + "firmware": "Firmware", + "home_assistant": "Home Assistant", + "restart": "Redémarrer", + "connected": "Connecté", + "not_connected": "Non connecté", + "tap_again_to_restart": "Touchez encore pour redémarrer", + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} h", + "hours_minutes": "{h} h {m}" + }, + "tile": { + "tap_to_open": "Touchez pour ouvrir", + "page": "Page {n}", + "refused": "Refusé", + "command_sent": "Commande envoyée...", + "confirmed": "Confirmé par Home Assistant" + }, + "alert": { + "notification": "Notification", + "ok": "OK" + }, + "light": { + "color": "Couleur", + "color_temperature": "Température de couleur", + "brightness": "Luminosité", + "waiting": "Attente..." + }, + "effects": { + "effect": "Effet", + "nothing": "Rien à choisir", + "loading": "Chargement...", + "not_connected": "Non connecté" + }, + "climate": { + "target": "Consigne", + "mode": "Mode", + "fan": "Ventilation", + "swing": "Oscillation", + "now": "Actuel {value}" + }, + "vacuum": { + "check_robot": "Vérifiez le robot dans HA", + "auto_suction": "Aspiration automatique", + "robot_chooses": "Le robot choisit l'aspiration et l'eau", + "per_room": "Aspiration et eau par pièce", + "speed_quiet": "Silencieux", + "speed_balanced": "Normal", + "speed_turbo": "Turbo", + "speed_max": "Max", + "pause_cleaning": "Mettre en pause", + "pause": "Pause", + "resume": "Reprendre", + "start_cleaning": "Démarrer le nettoyage", + "clean": "Nettoyer", + "dock": "Base" + }, + "cover": { + "position": "Position", + "tilt": "Inclinaison", + "tilt_value": "Inclinaison {n}%" + }, + "weather": { + "feels_like": "Ressenti {n}°", + "no_forecast": "Pas de prévisions journalières de Home Assistant", + "coming_days": "Prochains jours" + }, + "history": { + "no_data": "Pas de données", + "average": "moyenne", + "average_of": "moyenne sur {duration}", + "now": "Maintenant", + "range_hour": "1 heure", + "range_day": "24 heures", + "range_week": "1 semaine", + "high": "Max {value}", + "low": "Min {value}", + "times": "une fois | {n} fois", + "loading": "Chargement de l'historique...", + "empty": "Pas d'historique pour cette période", + "unavailable": "Aucun historique disponible" + }, + "media": { + "muted": "Muet", + "not_playing": "Aucune lecture", + "loading": "Chargement" + }, + "timer": { + "running": "En cours", + "paused": "En pause", + "stopped": "Arrêté", + "pause": "Pause", + "start": "Démarrer", + "cancel": "Annuler", + "paused_left": "En pause {time}" + }, + "sun": { + "name": "Soleil", + "sunrise": "Lever {time}", + "sunset": "Coucher {time}", + "rise": "lever {time}", + "set": "coucher {time}" + }, + "script": { + "running": "En cours...", + "never_run": "Jamais lancé", + "last_time": "Dernier {time}", + "yesterday_time": "Hier {time}", + "last_date": "Dernier {date}" + }, + "camera": { + "no_image": "Pas d'image de cette caméra", + "loading": "Chargement de l'image", + "live": "En direct", + "recording": "Enregistrement", + "tap_to_view": "Touchez pour voir", + "no_image_yet": "Pas encore d'image" + }, + "calibration": { + "title": "Suivez l'étalonnage", + "touch_check": "Test tactile GT911", + "hold": "Maintenez chaque toucher un instant", + "crosshair": "Touchez la croix\nPoint {point}/5 - toucher {tap}/3", + "gently": "Touchez doucement, un peu plus longtemps", + "same": "Touchez 3 fois la même croix", + "rejected": "Mesure rejetée ; réessayez", + "save_failed": "Échec de l'enregistrement ; réessayez" + }, "ha": { "on": "Activé", "off": "Désactivé", + "unavailable": "Indisponible", "climate": { "off": "Éteint", "heat": "Chauffage", @@ -201,7 +381,6 @@ "window_on": "Ouvert", "window_off": "Fermé" }, - "unavailable": "Indisponible", "button": { "activate": "Activer", "run": "Exécuter", diff --git a/screen_manager/translations/it.json b/screen_manager/translations/it.json index 374249c..a4d412e 100644 --- a/screen_manager/translations/it.json +++ b/screen_manager/translations/it.json @@ -14,6 +14,18 @@ "group_min": "2" }, "time": { + "just_now": "Proprio ora", + "minutes_ago": "{n} min fa", + "hours_ago": "1 ora fa | {n} ore fa", + "yesterday": "Ieri", + "days_ago": "1 giorno fa | {n} giorni fa", + "weeks_ago": "1 settimana fa | {n} settimane fa", + "months_ago": "1 mese fa | {n} mesi fa", + "years_ago": "1 anno fa | {n} anni fa", + "in_minutes": "Tra {n} min", + "in_hours": "Tra 1 ora | Tra {n} ore", + "tomorrow": "Domani", + "in_days": "Tra 1 giorno | Tra {n} giorni", "am": "AM", "pm": "PM" }, @@ -78,9 +90,177 @@ "day_month": "{day} {month}", "weekday_time": "{weekday} {time}" }, + "duration": { + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} h", + "hours_minutes": "{h} h {m} min", + "days": "{n} g", + "days_hours": "{d} g {h} h" + }, + "status": { + "connecting": "Connessione a Home Assistant", + "waiting": "In attesa di ESP Screens", + "loading_tiles": "Caricamento riquadri...", + "ha_not_connected": "HA non connesso", + "manager_not_active": "ESP Screens non attivo", + "choose_tiles": "Scegli i riquadri in HA", + "home": "Casa", + "no_network": "Nessuna rete" + }, + "settings": { + "title": "Impostazioni", + "brightness": "Luminosità", + "night": "Notte", + "screen": "Schermo", + "this_screen": "Questo schermo", + "dark_mode": "Modalità scura", + "auto_standby": "Standby automatico", + "standby_after": "Standby dopo", + "standby_brightness": "Luminosità standby", + "night_mode": "Modalità notte", + "starts": "Inizio", + "ends": "Fine", + "night_brightness": "Luminosità notte", + "back_to_page_1": "Torna a pagina 1", + "after": "Dopo", + "also_on_standby": "Anche in standby", + "swipe_between_pages": "Scorri tra le pagine", + "page_buttons": "Pulsanti pagina", + "rotation": "Rotazione", + "address": "Indirizzo", + "firmware": "Firmware", + "home_assistant": "Home Assistant", + "restart": "Riavvia", + "connected": "Connesso", + "not_connected": "Non connesso", + "tap_again_to_restart": "Tocca di nuovo per riavviare", + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} h", + "hours_minutes": "{h} h {m}" + }, + "tile": { + "tap_to_open": "Tocca per aprire", + "page": "Pagina {n}", + "refused": "Rifiutato", + "command_sent": "Comando inviato...", + "confirmed": "Confermato da Home Assistant" + }, + "alert": { + "notification": "Notifica", + "ok": "OK" + }, + "light": { + "color": "Colore", + "color_temperature": "Temperatura colore", + "brightness": "Luminosità", + "waiting": "In attesa..." + }, + "effects": { + "effect": "Effetto", + "nothing": "Niente da scegliere", + "loading": "Caricamento...", + "not_connected": "Non connesso" + }, + "climate": { + "target": "Impostata", + "mode": "Modalità", + "fan": "Ventola", + "swing": "Oscillazione", + "now": "Ora {value}" + }, + "vacuum": { + "check_robot": "Controlla il robot in HA", + "auto_suction": "Aspirazione automatica", + "robot_chooses": "Il robot sceglie aspirazione e acqua", + "per_room": "Aspirazione e acqua per stanza", + "speed_quiet": "Silenzioso", + "speed_balanced": "Normale", + "speed_turbo": "Turbo", + "speed_max": "Max", + "pause_cleaning": "Pausa pulizia", + "pause": "Pausa", + "resume": "Riprendi", + "start_cleaning": "Avvia pulizia", + "clean": "Pulisci", + "dock": "Base" + }, + "cover": { + "position": "Posizione", + "tilt": "Inclinazione", + "tilt_value": "Inclinazione {n}%" + }, + "weather": { + "feels_like": "Percepita {n}°", + "no_forecast": "Nessuna previsione giornaliera da Home Assistant", + "coming_days": "Prossimi giorni" + }, + "history": { + "no_data": "Nessun dato", + "average": "media", + "average_of": "media su {duration}", + "now": "Ora", + "range_hour": "1 ora", + "range_day": "24 ore", + "range_week": "1 settimana", + "high": "Max {value}", + "low": "Min {value}", + "times": "una volta | {n} volte", + "loading": "Caricamento storico...", + "empty": "Nessuno storico in questo periodo", + "unavailable": "Nessuno storico disponibile" + }, + "media": { + "muted": "Muto", + "not_playing": "Nessuna riproduzione", + "loading": "Caricamento" + }, + "timer": { + "running": "In corso", + "paused": "In pausa", + "stopped": "Fermo", + "pause": "Pausa", + "start": "Avvia", + "cancel": "Annulla", + "paused_left": "In pausa {time}" + }, + "sun": { + "name": "Sole", + "sunrise": "Alba {time}", + "sunset": "Tramonto {time}", + "rise": "alba {time}", + "set": "tramonto {time}" + }, + "script": { + "running": "In esecuzione...", + "never_run": "Mai eseguito", + "last_time": "Ultima {time}", + "yesterday_time": "Ieri {time}", + "last_date": "Ultima {date}" + }, + "camera": { + "no_image": "Nessuna immagine da questa telecamera", + "loading": "Caricamento immagine", + "live": "Dal vivo", + "recording": "Registrazione", + "tap_to_view": "Tocca per vedere", + "no_image_yet": "Ancora nessuna immagine" + }, + "calibration": { + "title": "Segui la calibrazione", + "touch_check": "Test touch GT911", + "hold": "Tieni premuto ogni tocco un attimo", + "crosshair": "Tocca la croce\nPunto {point}/5 - tocco {tap}/3", + "gently": "Tocca delicatamente, un po' più a lungo", + "same": "Tocca 3 volte la stessa croce", + "rejected": "Misura scartata; riprova", + "save_failed": "Salvataggio non riuscito; riprova" + }, "ha": { "on": "Acceso", "off": "Spento", + "unavailable": "Non disponibile", "climate": { "off": "Spento", "heat": "Riscaldamento", @@ -201,7 +381,6 @@ "window_on": "Aperto", "window_off": "Chiuso" }, - "unavailable": "Non disponibile", "button": { "activate": "Attiva", "run": "Esegui", diff --git a/screen_manager/translations/pl.json b/screen_manager/translations/pl.json index 138dade..d6594ab 100644 --- a/screen_manager/translations/pl.json +++ b/screen_manager/translations/pl.json @@ -14,6 +14,18 @@ "group_min": "2" }, "time": { + "just_now": "Przed chwilą", + "minutes_ago": "{n} min temu", + "hours_ago": "1 godzinę temu | {n} godziny temu | {n} godzin temu", + "yesterday": "Wczoraj", + "days_ago": "1 dzień temu | {n} dni temu | {n} dni temu", + "weeks_ago": "1 tydzień temu | {n} tygodnie temu | {n} tygodni temu", + "months_ago": "1 miesiąc temu | {n} miesiące temu | {n} miesięcy temu", + "years_ago": "1 rok temu | {n} lata temu | {n} lat temu", + "in_minutes": "Za {n} min", + "in_hours": "Za 1 godzinę | Za {n} godziny | Za {n} godzin", + "tomorrow": "Jutro", + "in_days": "Za 1 dzień | Za {n} dni | Za {n} dni", "am": "AM", "pm": "PM" }, @@ -78,9 +90,177 @@ "day_month": "{day} {month}", "weekday_time": "{weekday}, {time}" }, + "duration": { + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} godz.", + "hours_minutes": "{h} godz. {m} min", + "days": "{n} d", + "days_hours": "{d} d {h} godz." + }, + "status": { + "connecting": "Łączenie z Home Assistant", + "waiting": "Czekam na ESP Screens", + "loading_tiles": "Ładowanie kafelków...", + "ha_not_connected": "HA niepołączony", + "manager_not_active": "ESP Screens nieaktywny", + "choose_tiles": "Wybierz kafelki w HA", + "home": "Dom", + "no_network": "Brak sieci" + }, + "settings": { + "title": "Ustawienia", + "brightness": "Jasność", + "night": "Noc", + "screen": "Ekran", + "this_screen": "Ten ekran", + "dark_mode": "Tryb ciemny", + "auto_standby": "Auto czuwanie", + "standby_after": "Czuwanie po", + "standby_brightness": "Jasność czuwania", + "night_mode": "Tryb nocny", + "starts": "Początek", + "ends": "Koniec", + "night_brightness": "Jasność nocna", + "back_to_page_1": "Wróć do strony 1", + "after": "Po", + "also_on_standby": "Także w czuwaniu", + "swipe_between_pages": "Przesuwanie stron", + "page_buttons": "Przyciski stron", + "rotation": "Obrót", + "address": "Adres", + "firmware": "Firmware", + "home_assistant": "Home Assistant", + "restart": "Uruchom ponownie", + "connected": "Połączono", + "not_connected": "Brak połączenia", + "tap_again_to_restart": "Dotknij ponownie, aby uruchomić ponownie", + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} godz.", + "hours_minutes": "{h} godz. {m}" + }, + "tile": { + "tap_to_open": "Dotknij, aby otworzyć", + "page": "Strona {n}", + "refused": "Odrzucono", + "command_sent": "Wysłano polecenie...", + "confirmed": "Potwierdzone przez Home Assistant" + }, + "alert": { + "notification": "Powiadomienie", + "ok": "OK" + }, + "light": { + "color": "Kolor", + "color_temperature": "Temperatura barwy", + "brightness": "Jasność", + "waiting": "Czekam..." + }, + "effects": { + "effect": "Efekt", + "nothing": "Brak wyboru", + "loading": "Ładowanie...", + "not_connected": "Brak połączenia" + }, + "climate": { + "target": "Cel", + "mode": "Tryb", + "fan": "Wentylator", + "swing": "Wahadło", + "now": "Teraz {value}" + }, + "vacuum": { + "check_robot": "Sprawdź robota w HA", + "auto_suction": "Automatyczna siła ssania", + "robot_chooses": "Robot wybiera ssanie i wodę", + "per_room": "Ssanie i woda według pokoju", + "speed_quiet": "Cichy", + "speed_balanced": "Normalny", + "speed_turbo": "Turbo", + "speed_max": "Maks.", + "pause_cleaning": "Wstrzymaj sprzątanie", + "pause": "Pauza", + "resume": "Wznów", + "start_cleaning": "Rozpocznij sprzątanie", + "clean": "Sprzątaj", + "dock": "Stacja" + }, + "cover": { + "position": "Pozycja", + "tilt": "Nachylenie", + "tilt_value": "Nachylenie {n}%" + }, + "weather": { + "feels_like": "Odczuwalna {n}°", + "no_forecast": "Brak prognozy dziennej z Home Assistant", + "coming_days": "Najbliższe dni" + }, + "history": { + "no_data": "Brak danych", + "average": "średnia", + "average_of": "średnia z {duration}", + "now": "Teraz", + "range_hour": "1 godzina", + "range_day": "24 godziny", + "range_week": "1 tydzień", + "high": "Maks. {value}", + "low": "Min. {value}", + "times": "raz | {n} razy | {n} razy", + "loading": "Ładowanie historii...", + "empty": "Brak historii w tym okresie", + "unavailable": "Brak dostępnej historii" + }, + "media": { + "muted": "Wyciszony", + "not_playing": "Nic nie gra", + "loading": "Ładowanie" + }, + "timer": { + "running": "Działa", + "paused": "Wstrzymany", + "stopped": "Zatrzymany", + "pause": "Pauza", + "start": "Start", + "cancel": "Anuluj", + "paused_left": "Wstrzymany {time}" + }, + "sun": { + "name": "Słońce", + "sunrise": "Wschód {time}", + "sunset": "Zachód {time}", + "rise": "wschód {time}", + "set": "zachód {time}" + }, + "script": { + "running": "Działa...", + "never_run": "Nigdy nie uruchomiono", + "last_time": "Ostatnio {time}", + "yesterday_time": "Wczoraj {time}", + "last_date": "Ostatnio {date}" + }, + "camera": { + "no_image": "Brak obrazu z tej kamery", + "loading": "Ładowanie obrazu", + "live": "Na żywo", + "recording": "Nagrywanie", + "tap_to_view": "Dotknij, aby zobaczyć", + "no_image_yet": "Brak obrazu" + }, + "calibration": { + "title": "Postępuj według kalibracji", + "touch_check": "Test dotyku GT911", + "hold": "Przytrzymaj każde dotknięcie chwilę", + "crosshair": "Dotknij krzyżyka\nPunkt {point}/5 - dotknięcie {tap}/3", + "gently": "Dotykaj delikatnie, nieco dłużej", + "same": "Dotknij 3 razy ten sam krzyżyk", + "rejected": "Pomiar odrzucony; spróbuj ponownie", + "save_failed": "Zapis nieudany; spróbuj ponownie" + }, "ha": { "on": "włączono", "off": "wyłączono", + "unavailable": "niedostępny", "climate": { "off": "wyłączono", "heat": "grzanie", @@ -201,7 +381,6 @@ "window_on": "otwarto", "window_off": "zamknięto" }, - "unavailable": "niedostępny", "button": { "activate": "Aktywuj", "run": "Uruchom", diff --git a/screen_manager/translations/pt.json b/screen_manager/translations/pt.json index 7c081c4..864422f 100644 --- a/screen_manager/translations/pt.json +++ b/screen_manager/translations/pt.json @@ -14,6 +14,18 @@ "group_min": "2" }, "time": { + "just_now": "Agora mesmo", + "minutes_ago": "Há {n} min", + "hours_ago": "Há {n} hora | Há {n} horas", + "yesterday": "Ontem", + "days_ago": "Há {n} dia | Há {n} dias", + "weeks_ago": "Há {n} semana | Há {n} semanas", + "months_ago": "Há {n} mês | Há {n} meses", + "years_ago": "Há {n} ano | Há {n} anos", + "in_minutes": "Daqui a {n} min", + "in_hours": "Daqui a {n} hora | Daqui a {n} horas", + "tomorrow": "Amanhã", + "in_days": "Daqui a {n} dia | Daqui a {n} dias", "am": "da manhã", "pm": "da tarde" }, @@ -78,9 +90,177 @@ "day_month": "{day} {month}", "weekday_time": "{weekday}, {time}" }, + "duration": { + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} h", + "hours_minutes": "{h} h {m} min", + "days": "{n} d", + "days_hours": "{d} d {h} h" + }, + "status": { + "connecting": "A ligar ao Home Assistant", + "waiting": "À espera do ESP Screens", + "loading_tiles": "A carregar mosaicos...", + "ha_not_connected": "HA sem ligação", + "manager_not_active": "ESP Screens inativo", + "choose_tiles": "Escolha os mosaicos no HA", + "home": "Casa", + "no_network": "Sem rede" + }, + "settings": { + "title": "Configuração", + "brightness": "Brilho", + "night": "Noite", + "screen": "Ecrã", + "this_screen": "Este ecrã", + "dark_mode": "Modo escuro", + "auto_standby": "Espera automática", + "standby_after": "Espera após", + "standby_brightness": "Brilho em espera", + "night_mode": "Modo noturno", + "starts": "Início", + "ends": "Fim", + "night_brightness": "Brilho noturno", + "back_to_page_1": "Voltar à página 1", + "after": "Após", + "also_on_standby": "Também em espera", + "swipe_between_pages": "Deslizar entre páginas", + "page_buttons": "Botões de página", + "rotation": "Rotação", + "address": "Endereço", + "firmware": "Firmware", + "home_assistant": "Home Assistant", + "restart": "Reiniciar", + "connected": "Ligado", + "not_connected": "Sem ligação", + "tap_again_to_restart": "Toque de novo para reiniciar", + "seconds": "{n} s", + "minutes": "{n} min", + "hours": "{n} h", + "hours_minutes": "{h} h {m}" + }, + "tile": { + "tap_to_open": "Toque para abrir", + "page": "Página {n}", + "refused": "Recusado", + "command_sent": "Comando enviado...", + "confirmed": "Confirmado pelo Home Assistant" + }, + "alert": { + "notification": "Notificação", + "ok": "OK" + }, + "light": { + "color": "Cor", + "color_temperature": "Temperatura de cor", + "brightness": "Brilho", + "waiting": "A aguardar..." + }, + "effects": { + "effect": "Efeito", + "nothing": "Nada para escolher", + "loading": "A carregar...", + "not_connected": "Sem ligação" + }, + "climate": { + "target": "Alvo", + "mode": "Modo", + "fan": "Ventilador", + "swing": "Oscilação", + "now": "Agora {value}" + }, + "vacuum": { + "check_robot": "Verifique o robô no HA", + "auto_suction": "Sucção automática", + "robot_chooses": "O robô escolhe a sucção e a água", + "per_room": "Sucção e água por divisão", + "speed_quiet": "Silencioso", + "speed_balanced": "Normal", + "speed_turbo": "Turbo", + "speed_max": "Máx.", + "pause_cleaning": "Pausar limpeza", + "pause": "Pausa", + "resume": "Retomar", + "start_cleaning": "Iniciar limpeza", + "clean": "Limpar", + "dock": "Base" + }, + "cover": { + "position": "Posição", + "tilt": "Inclinação", + "tilt_value": "Inclinação {n}%" + }, + "weather": { + "feels_like": "Sensação {n}°", + "no_forecast": "Sem previsão diária do Home Assistant", + "coming_days": "Próximos dias" + }, + "history": { + "no_data": "Sem dados", + "average": "média", + "average_of": "média de {duration}", + "now": "Agora", + "range_hour": "1 hora", + "range_day": "24 horas", + "range_week": "1 semana", + "high": "Máx. {value}", + "low": "Mín. {value}", + "times": "uma vez | {n} vezes", + "loading": "A carregar histórico...", + "empty": "Sem histórico neste período", + "unavailable": "Sem histórico disponível" + }, + "media": { + "muted": "Sem som", + "not_playing": "Nada a reproduzir", + "loading": "A carregar" + }, + "timer": { + "running": "Em curso", + "paused": "Em pausa", + "stopped": "Parado", + "pause": "Pausa", + "start": "Iniciar", + "cancel": "Cancelar", + "paused_left": "Em pausa {time}" + }, + "sun": { + "name": "Sol", + "sunrise": "Nascer {time}", + "sunset": "Pôr {time}", + "rise": "nasce {time}", + "set": "põe-se {time}" + }, + "script": { + "running": "Em curso...", + "never_run": "Nunca executado", + "last_time": "Última {time}", + "yesterday_time": "Ontem {time}", + "last_date": "Última {date}" + }, + "camera": { + "no_image": "Sem imagem desta câmara", + "loading": "A carregar imagem", + "live": "Em direto", + "recording": "A gravar", + "tap_to_view": "Toque para ver", + "no_image_yet": "Ainda sem imagem" + }, + "calibration": { + "title": "Siga a calibração", + "touch_check": "Teste de toque GT911", + "hold": "Mantenha cada toque um momento", + "crosshair": "Toque na cruz\nPonto {point}/5 - toque {tap}/3", + "gently": "Toque suave, um pouco mais", + "same": "Toque 3 vezes na mesma cruz", + "rejected": "Medição rejeitada; tente de novo", + "save_failed": "Falha ao guardar; tente de novo" + }, "ha": { "on": "Ligado", "off": "Desligado", + "unavailable": "Indisponível", "climate": { "off": "Desligado", "heat": "Aquecer", @@ -201,7 +381,6 @@ "window_on": "Aberto", "window_off": "Fechada" }, - "unavailable": "Indisponível", "button": { "activate": "Ativar", "run": "Executar", diff --git a/tools/i18n.py b/tools/i18n.py index 2f6e054..fe75518 100644 --- a/tools/i18n.py +++ b/tools/i18n.py @@ -109,6 +109,11 @@ def check(): plural = ' | ' in source if plural and forms and len(text.split('|')) not in (1, forms): problems.append(f'{code}: {key} needs {forms} forms separated by " | "') + if not plural and '|' in text: + problems.append(f'{code}: {key} has a | that isn\'t a plural form') + # The editor's vue-i18n reads { } and @ as instructions: only placeholders and its {'x'} literals are allowed. + if key.startswith('editor.') and re.search(r"[{}@]", re.sub(r"\{'[^']*'\}", '', PLACEHOLDER.sub('', text))): + problems.append(f'{code}: {key} has {{, }} or @ outside a placeholder; the editor would misread it') if key.startswith('screen.') and drawable: shown = PLACEHOLDER.sub('', text).replace('|', '') unknown = sorted(set(shown) - drawable - {'\n'})