v1.7.15 — i18n audit, splash min 3s, decimal precision, demo GIF, README fixes
- Complete i18n audit: 25+ new translation keys (en/it/de) — vacuum toast,
TTS voices, timer steps, product notes, error prefixes, form placeholders,
barcode hints, recipe/cooking ingredient labels, unit variants
- pz/conf unit labels now use t('units.pz') / t('units.conf') throughout
- Splash screen: minimum 3-second display (_splashStart recorded at parse
time, fade delayed by remaining ms if app loads faster)
- Quantity decimal precision: qtyNum in recipe/cooking buttons and conf
fallback display capped to 1 decimal (was showing 7+ from raw AI output)
- Recipe/cooking buttons: removed Italian fallback strings from t() calls
- README: translated remaining Italian phrases; added demo.gif to Screenshots
- CHANGELOG: updated 1.7.15 entry with all session changes
- assets/img/demo.gif: EverShelf.gif processed at 2x speed (~36s)
This commit is contained in:
+55
-14
@@ -20,6 +20,8 @@
|
||||
"add": "✅ Hinzufügen",
|
||||
"delete": "Löschen",
|
||||
"edit": "✏️ Bearbeiten",
|
||||
"use": "Verwenden",
|
||||
"edit_item": "Bearbeiten",
|
||||
"search": "🔍 Suchen",
|
||||
"go": "✅ Los",
|
||||
"toggle_password": "👁️ Anzeigen/Ausblenden",
|
||||
@@ -29,7 +31,12 @@
|
||||
"restart": "↺ Neustart",
|
||||
"reset_default": "↺ Standard wiederherstellen",
|
||||
"save_info": "💾 Info speichern",
|
||||
"retry": "🔄 Erneut versuchen"
|
||||
"retry": "🔄 Erneut versuchen",
|
||||
"yes_short": "Ja",
|
||||
"no_short": "Nein"
|
||||
},
|
||||
"form": {
|
||||
"select_placeholder": "-- Auswählen --"
|
||||
},
|
||||
"locations": {
|
||||
"dispensa": "Vorratskammer",
|
||||
@@ -64,7 +71,9 @@
|
||||
"pieces": "Stück",
|
||||
"grams": "Gramm",
|
||||
"box": "Packung",
|
||||
"boxes": "Packungen"
|
||||
"boxes": "Packungen",
|
||||
"millilitres": "Milliliter",
|
||||
"from": "von"
|
||||
},
|
||||
"shopping_sections": {
|
||||
"frutta_verdura": "Obst & Gemüse",
|
||||
@@ -216,7 +225,7 @@
|
||||
"throw_btn": "🗑️ ENTSORGEN",
|
||||
"throw_sub": "wegwerfen",
|
||||
"edit_sub": "Ablauf, Ort…",
|
||||
"create_recipe_btn": "Rezept damit erstellen"
|
||||
"create_recipe_btn": "Rezept"
|
||||
},
|
||||
"add": {
|
||||
"title": "Zum Vorrat hinzufügen",
|
||||
@@ -241,7 +250,9 @@
|
||||
"scan_expiry_title": "📷 Ablaufdatum scannen",
|
||||
"product_added": "✅ {name} hinzugefügt!{qty}",
|
||||
"suffix_freezer_vacuum": "(Tiefkühler + vakuumversiegelt)",
|
||||
"history_badge_tip": "Durchschnitt aus {n} früheren Einträgen"
|
||||
"history_badge_tip": "Durchschnitt aus {n} früheren Einträgen",
|
||||
"vacuum_question": "Vakuumiert?",
|
||||
"vacuum_saved": "🔒 Als vakuumiert gespeichert"
|
||||
},
|
||||
"use": {
|
||||
"title": "Verwenden / Verbrauchen",
|
||||
@@ -313,7 +324,13 @@
|
||||
"edit_info": "✏️ Informationen bearbeiten",
|
||||
"modify_details": "BEARBEITEN\nAblauf, Ort…",
|
||||
"already_in_pantry": "📋 Bereits im Vorratsschrank",
|
||||
"no_barcode": "Kein Barcode"
|
||||
"no_barcode": "Kein Barcode",
|
||||
"unknown_product": "Unbekanntes Produkt",
|
||||
"edit_name_brand": "Name/Marke bearbeiten",
|
||||
"weight_label": "Gewicht",
|
||||
"origin_label": "Herkunft",
|
||||
"labels_label": "Etiketten",
|
||||
"select_variant": "Genaue Variante auswählen oder KI-Daten nutzen:"
|
||||
},
|
||||
"products": {
|
||||
"title": "📦 Alle Produkte",
|
||||
@@ -503,7 +520,8 @@
|
||||
"transfer_to_recipes": "Zu Rezepten hinzufügen",
|
||||
"transferring": "Übertrage...",
|
||||
"transferred": "Zu Rezepten hinzugefügt!",
|
||||
"open_recipe": "Rezept öffnen"
|
||||
"open_recipe": "Rezept öffnen",
|
||||
"quick_recipe_prompt": "Schlage mir ein schnelles Rezept FÜR EINE PERSON vor, das die Produkte mit dem nächsten Ablaufdatum verwendet! Ignoriere Tiefkühlprodukte, konzentriere dich auf Kühlschrank und Vorratsschrank."
|
||||
},
|
||||
"cooking": {
|
||||
"close": "Schließen",
|
||||
@@ -520,7 +538,8 @@
|
||||
"timer_warning_tts": "Achtung! {label}: noch 10 Sekunden!",
|
||||
"recipe_done_tts": "Rezept abgeschlossen! Guten Appetit!",
|
||||
"expires_chip": "läuft ab {date}",
|
||||
"finish": "✅ Fertig"
|
||||
"finish": "✅ Fertig",
|
||||
"step_fallback": "Schritt {n}"
|
||||
},
|
||||
"settings": {
|
||||
"title": "⚙️ Einstellungen",
|
||||
@@ -631,7 +650,11 @@
|
||||
"hint": "Wenn der Browser den Fehler \"Verbindung nicht sicher\" (ERR_CERT_AUTHORITY_INVALID) zeigt, installiere das CA-Zertifikat auf dem Gerät.",
|
||||
"download_btn": "📥 CA-Zertifikat herunterladen",
|
||||
"token_title": "🔑 Einstellungs-Token",
|
||||
"token_label": "Zugriffstoken"
|
||||
"token_label": "Zugriffstoken",
|
||||
"token_hint": "Falls `SETTINGS_TOKEN` in der Server-`.env` konfiguriert ist, gib hier den Token ein, bevor du die Einstellungen speicherst. Leer lassen, wenn nicht konfiguriert.",
|
||||
"token_placeholder": "(leer = kein Schutz)",
|
||||
"token_required_hint": "🔒 Dieser Server benötigt einen Token zum Speichern der Einstellungen.",
|
||||
"cert_instructions": "<strong>Anleitung für Chrome (Android):</strong><br>1. Zertifikat oben herunterladen<br>2. Gehe zu <em>Einstellungen → Sicherheit & Datenschutz → Weitere Sicherheitseinstellungen → Vom Gerätespeicher installieren</em><br>3. Wähle die heruntergeladene <em>EverShelf_CA.crt</em> Datei<br>4. Wähle \"CA\" und bestätige<br>5. Chrome neu starten<br><br><strong>Anleitung für Chrome (PC):</strong><br>1. Zertifikat oben herunterladen<br>2. Gehe zu <em>chrome://settings/certificates</em> (oder Einstellungen → Datenschutz und Sicherheit → Sicherheit → Zertifikate verwalten)<br>3. Tab \"Zertifizierungsstellen\" → Importieren → Datei auswählen<br>4. Häkchen bei \"Dieser Zertifizierungsstelle für die Identifikation von Webseiten vertrauen\"<br>5. Chrome neu starten"
|
||||
},
|
||||
"tts": {
|
||||
"title": "🔊 Sprache & TTS",
|
||||
@@ -658,7 +681,14 @@
|
||||
"extra_fields_label": "➕ Zusätzliche Felder (JSON)",
|
||||
"extra_fields_placeholder": "{\"entity_id\": \"media_player.living_room\"}",
|
||||
"extra_fields_hint": "Zusätzliche Felder im Payload, im JSON-Format. Leer lassen wenn nicht benötigt.",
|
||||
"test_btn": "🔊 Testansage senden"
|
||||
"test_btn": "🔊 Testansage senden",
|
||||
"voices_loading": "Stimmen werden geladen…",
|
||||
"voice_not_supported": "Stimme vom Browser nicht unterstützt",
|
||||
"voices_none": "Keine Stimmen auf diesem Gerät verfügbar",
|
||||
"voices_hint": "Verfügbare Stimmen hängen vom Betriebssystem und Browser ab. Auf macOS/iOS ist die Stimme Paola (Italienisch) verfügbar. Drücken Sie ↺ wenn die Liste nicht lädt.",
|
||||
"url_missing": "⚠️ Endpunkt-URL fehlt.",
|
||||
"test_sending": "⏳ Wird gesendet…",
|
||||
"test_ok": "✅ Antwort {code} — prüfe ob der Lautsprecher gesprochen hat."
|
||||
},
|
||||
"language": {
|
||||
"title": "🌐 Sprache",
|
||||
@@ -676,7 +706,8 @@
|
||||
"timeout_10": "10 Minuten",
|
||||
"timeout_15": "15 Minuten",
|
||||
"timeout_30": "30 Minuten",
|
||||
"timeout_60": "1 Stunde"
|
||||
"timeout_60": "1 Stunde",
|
||||
"start_after": "⏱️ Starten nach"
|
||||
},
|
||||
"scale": {
|
||||
"title": "⚖️ Smart-Waage",
|
||||
@@ -691,7 +722,11 @@
|
||||
"download_hint": "Android-App als Brücke zwischen BLE-Waage und EverShelf.",
|
||||
"download_sub": "Quellcode: evershelf-scale-gateway/ im Projektstamm",
|
||||
"live_weight": "Echtzeit-Gewicht",
|
||||
"auto_reconnect": "🔁 Verbindung: automatisch"
|
||||
"auto_reconnect": "🔁 Verbindung: automatisch",
|
||||
"kiosk_title": "📡 BLE-Waage im Kiosk integriert",
|
||||
"kiosk_hint": "Die Waage wird direkt vom internen BLE-Gateway des Kiosks verwaltet. Um ein neues Gerät zu koppeln, verwende den Konfigurationsassistenten.",
|
||||
"kiosk_reconfigure": "🔄 BLE-Waage neu konfigurieren",
|
||||
"ble_protocols": "<p style=\"margin:0 0 6px;font-weight:600\">🔌 Unterstützte BLE-Protokolle:</p><ul style=\"margin:0 0 0 16px;padding:0;font-size:0.8rem\"><li>Bluetooth SIG Weight Scale (0x181D)</li><li>Bluetooth SIG Body Composition (0x181B) — Gewicht, Fett, BMI</li><li>Xiaomi Mi Body Composition Scale 2</li><li>Generisch — automatische Heuristik für 100+ Modelle</li></ul>"
|
||||
},
|
||||
"kiosk": {
|
||||
"hint": "Verwandeln Sie ein Android-Tablet in ein EverShelf-Panel mit integriertem BLE-Waagen-Gateway.",
|
||||
@@ -838,7 +873,10 @@
|
||||
"select_items": "Wähle mindestens ein Produkt aus",
|
||||
"server_offline": "Serververbindung unterbrochen",
|
||||
"server_restored": "Serververbindung wiederhergestellt",
|
||||
"server_retry": "Erneut versuchen"
|
||||
"server_retry": "Erneut versuchen",
|
||||
"unknown": "Unbekannter Fehler",
|
||||
"prefix": "Fehler",
|
||||
"no_inventory_entry": "Kein Inventareintrag gefunden"
|
||||
},
|
||||
"confirm": {
|
||||
"remove_item": "Möchtest du dieses Produkt wirklich aus dem Bestand entfernen?",
|
||||
@@ -854,7 +892,9 @@
|
||||
"edit": {
|
||||
"title": "{name} bearbeiten",
|
||||
"unknown_hint": "Produktname und Informationen eingeben",
|
||||
"label_name": "🏷️ Produktname"
|
||||
"label_name": "🏷️ Produktname",
|
||||
"choose_location_title": "Welchen Ort?",
|
||||
"choose_location_hint": "Wähle den zu bearbeitenden Ort:"
|
||||
},
|
||||
"screensaver": {
|
||||
"recipe_btn": "Rezepte",
|
||||
@@ -951,7 +991,8 @@
|
||||
"thing_rest": "den Rest",
|
||||
"stay_btn": "Nein, bleibt in {location}",
|
||||
"moved_toast": "📦 Offene Packung bewegt nach {location}",
|
||||
"vacuum_restore": "🫙 Vakuum wiederherstellen"
|
||||
"vacuum_restore": "🫙 Vakuum wiederherstellen",
|
||||
"vacuum_seal_rest": "🔒 Rest vakuumieren"
|
||||
},
|
||||
"nova": {
|
||||
"1": "Unverarbeitet",
|
||||
|
||||
+57
-15
@@ -20,6 +20,8 @@
|
||||
"add": "✅ Add",
|
||||
"delete": "Delete",
|
||||
"edit": "✏️ Edit",
|
||||
"use": "Use",
|
||||
"edit_item": "Edit",
|
||||
"search": "🔍 Search",
|
||||
"go": "✅ Go",
|
||||
"toggle_password": "👁️ Show/Hide",
|
||||
@@ -29,7 +31,12 @@
|
||||
"restart": "↺ Restart",
|
||||
"reset_default": "↺ Reset to default",
|
||||
"save_info": "💾 Save information",
|
||||
"retry": "🔄 Retry"
|
||||
"retry": "🔄 Retry",
|
||||
"yes_short": "Yes",
|
||||
"no_short": "No"
|
||||
},
|
||||
"form": {
|
||||
"select_placeholder": "-- Select --"
|
||||
},
|
||||
"locations": {
|
||||
"dispensa": "Pantry",
|
||||
@@ -64,7 +71,9 @@
|
||||
"pieces": "Pieces",
|
||||
"grams": "Grams",
|
||||
"box": "Package",
|
||||
"boxes": "Packages"
|
||||
"boxes": "Packages",
|
||||
"millilitres": "Millilitres",
|
||||
"from": "of"
|
||||
},
|
||||
"shopping_sections": {
|
||||
"frutta_verdura": "Fruits & Vegetables",
|
||||
@@ -216,7 +225,7 @@
|
||||
"throw_btn": "🗑️ DISCARD",
|
||||
"throw_sub": "throw away",
|
||||
"edit_sub": "expiry, location…",
|
||||
"create_recipe_btn": "Create a recipe with this"
|
||||
"create_recipe_btn": "Recipe"
|
||||
},
|
||||
"add": {
|
||||
"title": "Add to Pantry",
|
||||
@@ -241,7 +250,9 @@
|
||||
"scan_expiry_title": "📷 Scan Expiry Date",
|
||||
"product_added": "✅ {name} added!{qty}",
|
||||
"suffix_freezer_vacuum": "(freezer + vacuum sealed)",
|
||||
"history_badge_tip": "Average from {n} previous entries"
|
||||
"history_badge_tip": "Average from {n} previous entries",
|
||||
"vacuum_question": "Vacuum sealed?",
|
||||
"vacuum_saved": "🔒 Vacuum sealed!"
|
||||
},
|
||||
"use": {
|
||||
"title": "Use / Consume",
|
||||
@@ -313,7 +324,13 @@
|
||||
"edit_info": "✏️ Edit information",
|
||||
"modify_details": "EDIT\nexpiry, location…",
|
||||
"already_in_pantry": "📋 Already in pantry",
|
||||
"no_barcode": "No barcode"
|
||||
"no_barcode": "No barcode",
|
||||
"unknown_product": "Unrecognized product",
|
||||
"edit_name_brand": "Edit name/brand",
|
||||
"weight_label": "Weight",
|
||||
"origin_label": "Origin",
|
||||
"labels_label": "Labels",
|
||||
"select_variant": "Select the exact variant or use AI data:"
|
||||
},
|
||||
"products": {
|
||||
"title": "📦 All Products",
|
||||
@@ -483,7 +500,8 @@
|
||||
"undo_success": "↩ Operation undone for {name}",
|
||||
"already_undone": "Operation already undone",
|
||||
"too_old": "Cannot undo operations older than 24 hours",
|
||||
"undo_error": "Error during undo"
|
||||
"undo_error": "Error during undo",
|
||||
"recipe_prefix": "Recipe"
|
||||
},
|
||||
"chat": {
|
||||
"title": "Gemini Chef",
|
||||
@@ -503,7 +521,8 @@
|
||||
"transfer_to_recipes": "Transfer to Recipes",
|
||||
"transferring": "Transferring...",
|
||||
"transferred": "Added to Recipes!",
|
||||
"open_recipe": "Open recipe"
|
||||
"open_recipe": "Open recipe",
|
||||
"quick_recipe_prompt": "Suggest a quick recipe FOR ONE PERSON using the products that expire first! Ignore freezer items, focus on fridge and pantry."
|
||||
},
|
||||
"cooking": {
|
||||
"close": "Close",
|
||||
@@ -520,7 +539,8 @@
|
||||
"timer_warning_tts": "Heads up! {label}: 10 seconds left!",
|
||||
"recipe_done_tts": "Recipe complete! Enjoy your meal!",
|
||||
"expires_chip": "exp. {date}",
|
||||
"finish": "✅ Finish"
|
||||
"finish": "✅ Finish",
|
||||
"step_fallback": "Step {n}"
|
||||
},
|
||||
"settings": {
|
||||
"title": "⚙️ Settings",
|
||||
@@ -631,7 +651,11 @@
|
||||
"hint": "If the browser shows the error \"Your connection is not private\" (ERR_CERT_AUTHORITY_INVALID), you need to install the CA certificate on the device.",
|
||||
"download_btn": "📥 Download CA Certificate",
|
||||
"token_title": "🔑 Settings Token",
|
||||
"token_label": "Access token"
|
||||
"token_label": "Access token",
|
||||
"token_hint": "If `SETTINGS_TOKEN` is configured in the server's `.env`, enter the token here before saving settings. Leave empty if not configured.",
|
||||
"token_placeholder": "(empty = no protection)",
|
||||
"token_required_hint": "🔒 This server requires a token to save settings.",
|
||||
"cert_instructions": "<strong>Instructions for Chrome (Android):</strong><br>1. Download the certificate above<br>2. Go to <em>Settings → Security & Privacy → More security settings → Install from device storage</em><br>3. Select the downloaded <em>EverShelf_CA.crt</em> file<br>4. Choose \"CA\" and confirm<br>5. Restart Chrome<br><br><strong>Instructions for Chrome (PC):</strong><br>1. Download the certificate above<br>2. Go to <em>chrome://settings/certificates</em> (or Settings → Privacy and security → Security → Manage certificates)<br>3. Tab \"Authorities\" → Import → select the file<br>4. Check \"Trust this certificate for identifying websites\"<br>5. Restart Chrome"
|
||||
},
|
||||
"tts": {
|
||||
"title": "🔊 Voice & TTS",
|
||||
@@ -658,7 +682,14 @@
|
||||
"extra_fields_label": "➕ Extra fields (JSON)",
|
||||
"extra_fields_placeholder": "{\"entity_id\": \"media_player.living_room\"}",
|
||||
"extra_fields_hint": "Additional fields to include in the payload, in JSON format. Leave empty if not needed.",
|
||||
"test_btn": "🔊 Send Test Voice"
|
||||
"test_btn": "🔊 Send Test Voice",
|
||||
"voices_loading": "Loading voices…",
|
||||
"voice_not_supported": "Voice not supported by this browser",
|
||||
"voices_none": "No voices available on this device",
|
||||
"voices_hint": "Available voices depend on the OS and browser. On macOS/iOS the Paola (Italian) voice is available. Press ↺ if the list does not load.",
|
||||
"url_missing": "⚠️ Endpoint URL missing.",
|
||||
"test_sending": "⏳ Sending…",
|
||||
"test_ok": "✅ Response {code} — check that the speaker has spoken."
|
||||
},
|
||||
"language": {
|
||||
"title": "🌐 Language",
|
||||
@@ -676,7 +707,8 @@
|
||||
"timeout_10": "10 minutes",
|
||||
"timeout_15": "15 minutes",
|
||||
"timeout_30": "30 minutes",
|
||||
"timeout_60": "1 hour"
|
||||
"timeout_60": "1 hour",
|
||||
"start_after": "⏱️ Start after"
|
||||
},
|
||||
"scale": {
|
||||
"title": "⚖️ Smart Scale",
|
||||
@@ -691,7 +723,11 @@
|
||||
"download_hint": "Android app that bridges your BLE scale and EverShelf.",
|
||||
"download_sub": "Source: evershelf-scale-gateway/ in the project root",
|
||||
"live_weight": "real-time weight",
|
||||
"auto_reconnect": "🔁 Reconnect: automatic"
|
||||
"auto_reconnect": "🔁 Reconnect: automatic",
|
||||
"kiosk_title": "📡 BLE Scale integrated in Kiosk",
|
||||
"kiosk_hint": "The scale is directly managed by the internal BLE Gateway of the kiosk. To pair a new device, use the configuration wizard.",
|
||||
"kiosk_reconfigure": "🔄 Reconfigure BLE Scale",
|
||||
"ble_protocols": "<p style=\"margin:0 0 6px;font-weight:600\">🔌 Supported BLE protocols:</p><ul style=\"margin:0 0 0 16px;padding:0;font-size:0.8rem\"><li>Bluetooth SIG Weight Scale (0x181D)</li><li>Bluetooth SIG Body Composition (0x181B) — weight, fat, BMI</li><li>Xiaomi Mi Body Composition Scale 2</li><li>Generic — automatic heuristic for 100+ models</li></ul>"
|
||||
},
|
||||
"kiosk": {
|
||||
"hint": "Turn an Android tablet into an always-on EverShelf panel with built-in BLE scale gateway.",
|
||||
@@ -838,7 +874,10 @@
|
||||
"select_items": "Select at least one product",
|
||||
"server_offline": "Server connection lost",
|
||||
"server_restored": "Server connection restored",
|
||||
"server_retry": "Retry"
|
||||
"server_retry": "Retry",
|
||||
"unknown": "Unknown error",
|
||||
"prefix": "Error",
|
||||
"no_inventory_entry": "No inventory entry found"
|
||||
},
|
||||
"confirm": {
|
||||
"remove_item": "Do you really want to remove this product from inventory?",
|
||||
@@ -854,7 +893,9 @@
|
||||
"edit": {
|
||||
"title": "Edit {name}",
|
||||
"unknown_hint": "Enter the product name and information",
|
||||
"label_name": "🏷️ Product name"
|
||||
"label_name": "🏷️ Product name",
|
||||
"choose_location_title": "Which location?",
|
||||
"choose_location_hint": "Choose the location to edit:"
|
||||
},
|
||||
"screensaver": {
|
||||
"recipe_btn": "Recipes",
|
||||
@@ -951,7 +992,8 @@
|
||||
"thing_rest": "rest",
|
||||
"stay_btn": "No, stay in {location}",
|
||||
"moved_toast": "📦 Opened package moved to {location}",
|
||||
"vacuum_restore": "🫙 Restore vacuum sealed"
|
||||
"vacuum_restore": "🫙 Restore vacuum sealed",
|
||||
"vacuum_seal_rest": "🔒 Vacuum seal the rest"
|
||||
},
|
||||
"nova": {
|
||||
"1": "Unprocessed",
|
||||
|
||||
+57
-15
@@ -20,6 +20,8 @@
|
||||
"add": "✅ Aggiungi",
|
||||
"delete": "Elimina",
|
||||
"edit": "✏️ Modifica",
|
||||
"use": "Usa",
|
||||
"edit_item": "Modifica",
|
||||
"search": "🔍 Cerca",
|
||||
"go": "✅ Vai",
|
||||
"toggle_password": "👁️ Mostra/Nascondi",
|
||||
@@ -29,7 +31,12 @@
|
||||
"restart": "↺ Ricomincia",
|
||||
"reset_default": "↺ Ripristina default",
|
||||
"save_info": "💾 Salva informazioni",
|
||||
"retry": "🔄 Riprova"
|
||||
"retry": "🔄 Riprova",
|
||||
"yes_short": "Sì",
|
||||
"no_short": "No"
|
||||
},
|
||||
"form": {
|
||||
"select_placeholder": "-- Seleziona --"
|
||||
},
|
||||
"locations": {
|
||||
"dispensa": "Dispensa",
|
||||
@@ -64,7 +71,9 @@
|
||||
"pieces": "Pezzi",
|
||||
"grams": "Grammi",
|
||||
"box": "Confezione",
|
||||
"boxes": "Confezioni"
|
||||
"boxes": "Confezioni",
|
||||
"millilitres": "Millilitri",
|
||||
"from": "da"
|
||||
},
|
||||
"shopping_sections": {
|
||||
"frutta_verdura": "Frutta & Verdura",
|
||||
@@ -216,7 +225,7 @@
|
||||
"throw_btn": "🗑️ BUTTA",
|
||||
"throw_sub": "butta il prodotto",
|
||||
"edit_sub": "scadenza, luogo…",
|
||||
"create_recipe_btn": "Crea una ricetta con questo"
|
||||
"create_recipe_btn": "Ricetta"
|
||||
},
|
||||
"add": {
|
||||
"title": "Aggiungi alla Dispensa",
|
||||
@@ -241,7 +250,9 @@
|
||||
"scan_expiry_title": "📷 Scansiona Data Scadenza",
|
||||
"product_added": "✅ {name} aggiunto!{qty}",
|
||||
"suffix_freezer_vacuum": "(freezer + sotto vuoto)",
|
||||
"history_badge_tip": "Media da {n} inserimenti precedenti"
|
||||
"history_badge_tip": "Media da {n} inserimenti precedenti",
|
||||
"vacuum_question": "Messo sotto vuoto?",
|
||||
"vacuum_saved": "🔒 Sotto vuoto registrato"
|
||||
},
|
||||
"use": {
|
||||
"title": "Usa / Consuma",
|
||||
@@ -313,7 +324,13 @@
|
||||
"edit_info": "✏️ Modifica informazioni",
|
||||
"modify_details": "MODIFICA\nscadenza, luogo…",
|
||||
"already_in_pantry": "📋 Già in dispensa",
|
||||
"no_barcode": "Senza barcode"
|
||||
"no_barcode": "Senza barcode",
|
||||
"unknown_product": "Prodotto non riconosciuto",
|
||||
"edit_name_brand": "Modifica nome/marca",
|
||||
"weight_label": "Peso",
|
||||
"origin_label": "Origine",
|
||||
"labels_label": "Etichette",
|
||||
"select_variant": "Seleziona la variante esatta o usa i dati AI:"
|
||||
},
|
||||
"products": {
|
||||
"title": "📦 Tutti i Prodotti",
|
||||
@@ -483,7 +500,8 @@
|
||||
"undo_success": "↩ Operazione annullata per {name}",
|
||||
"already_undone": "Operazione già annullata",
|
||||
"too_old": "Non è possibile annullare operazioni più vecchie di 24 ore",
|
||||
"undo_error": "Errore durante l'annullamento"
|
||||
"undo_error": "Errore durante l'annullamento",
|
||||
"recipe_prefix": "Ricetta"
|
||||
},
|
||||
"chat": {
|
||||
"title": "Gemini Chef",
|
||||
@@ -503,7 +521,8 @@
|
||||
"transfer_to_recipes": "Trasferisci a Ricette",
|
||||
"transferring": "Trasferimento in corso...",
|
||||
"transferred": "Aggiunta alle Ricette!",
|
||||
"open_recipe": "Apri la ricetta"
|
||||
"open_recipe": "Apri la ricetta",
|
||||
"quick_recipe_prompt": "Suggeriscimi una ricetta veloce PER UNA PERSONA usando i prodotti che scadono prima! Ignora i prodotti in freezer, concentrati su frigo e dispensa."
|
||||
},
|
||||
"cooking": {
|
||||
"close": "Chiudi",
|
||||
@@ -520,7 +539,8 @@
|
||||
"timer_warning_tts": "Attenzione! {label}: mancano 10 secondi!",
|
||||
"recipe_done_tts": "Ricetta completata! Buon appetito!",
|
||||
"expires_chip": "scade {date}",
|
||||
"finish": "✅ Fine"
|
||||
"finish": "✅ Fine",
|
||||
"step_fallback": "Passo {n}"
|
||||
},
|
||||
"settings": {
|
||||
"title": "⚙️ Configurazione",
|
||||
@@ -631,7 +651,11 @@
|
||||
"hint": "Se il browser mostra l'errore \"La connessione non è privata\" (ERR_CERT_AUTHORITY_INVALID), devi installare il certificato CA nel dispositivo.",
|
||||
"download_btn": "📥 Scarica Certificato CA",
|
||||
"token_title": "🔑 Token Impostazioni",
|
||||
"token_label": "Token di accesso"
|
||||
"token_label": "Token di accesso",
|
||||
"token_hint": "Se `SETTINGS_TOKEN` è configurato nel `.env` server, inserisci qui il token prima di salvare le impostazioni. Lascia vuoto se non configurato.",
|
||||
"token_placeholder": "(vuoto = nessuna protezione)",
|
||||
"token_required_hint": "🔒 Questo server richiede un token per salvare le impostazioni.",
|
||||
"cert_instructions": "<strong>Istruzioni per Chrome (Android):</strong><br>1. Scarica il certificato qui sopra<br>2. Vai in <em>Impostazioni → Sicurezza e privacy → Altre impostazioni di sicurezza → Installa da archivio dispositivo</em><br>3. Seleziona il file <em>EverShelf_CA.crt</em> scaricato<br>4. Scegli \"CA\" e conferma<br>5. Riavvia Chrome<br><br><strong>Istruzioni per Chrome (PC):</strong><br>1. Scarica il certificato qui sopra<br>2. Vai in <em>chrome://settings/certificates</em> (o Impostazioni → Privacy e sicurezza → Sicurezza → Gestisci certificati)<br>3. Tab \"Autorità\" → Importa → seleziona il file<br>4. Spunta \"Considera attendibile per identificare siti web\"<br>5. Riavvia Chrome"
|
||||
},
|
||||
"tts": {
|
||||
"title": "🔊 Voce & TTS",
|
||||
@@ -658,7 +682,14 @@
|
||||
"extra_fields_label": "➕ Campi extra (JSON)",
|
||||
"extra_fields_placeholder": "{\"entity_id\": \"media_player.living_room\"}",
|
||||
"extra_fields_hint": "Campi aggiuntivi da includere nel payload, in formato JSON. Lascia vuoto se non necessario.",
|
||||
"test_btn": "🔊 Invia Test Vocale"
|
||||
"test_btn": "🔊 Invia Test Vocale",
|
||||
"voices_loading": "Caricamento voci…",
|
||||
"voice_not_supported": "Voce non supportata dal browser",
|
||||
"voices_none": "Nessuna voce disponibile su questo dispositivo",
|
||||
"voices_hint": "Le voci disponibili dipendono dal sistema operativo e dal browser. Su macOS/iOS è disponibile la voce Paola (italiano). Premi ↺ se la lista non si carica.",
|
||||
"url_missing": "⚠️ URL endpoint mancante.",
|
||||
"test_sending": "⏳ Invio in corso…",
|
||||
"test_ok": "✅ Risposta {code} — controlla che l'altoparlante abbia parlato."
|
||||
},
|
||||
"language": {
|
||||
"title": "🌐 Lingua / Language",
|
||||
@@ -676,7 +707,8 @@
|
||||
"timeout_10": "10 minuti",
|
||||
"timeout_15": "15 minuti",
|
||||
"timeout_30": "30 minuti",
|
||||
"timeout_60": "1 ora"
|
||||
"timeout_60": "1 ora",
|
||||
"start_after": "⏱️ Avvia dopo"
|
||||
},
|
||||
"scale": {
|
||||
"title": "⚖️ Bilancia Smart",
|
||||
@@ -691,7 +723,11 @@
|
||||
"download_hint": "App Android che fa da ponte tra la bilancia BLE e questo sito.",
|
||||
"download_sub": "Sorgente: evershelf-scale-gateway/ nella root del progetto",
|
||||
"live_weight": "peso in tempo reale",
|
||||
"auto_reconnect": "🔁 Riconnessione: automatica"
|
||||
"auto_reconnect": "🔁 Riconnessione: automatica",
|
||||
"kiosk_title": "📡 Bilancia BLE integrata nel Kiosk",
|
||||
"kiosk_hint": "La bilancia è gestita direttamente dal Gateway BLE interno al kiosk. Per abbinare un nuovo dispositivo usa il wizard di configurazione.",
|
||||
"kiosk_reconfigure": "🔄 Riconfigura bilancia BLE",
|
||||
"ble_protocols": "<p style=\"margin:0 0 6px;font-weight:600\">🔌 Protocolli BLE supportati:</p><ul style=\"margin:0 0 0 16px;padding:0;font-size:0.8rem\"><li>Bluetooth SIG Weight Scale (0x181D)</li><li>Bluetooth SIG Body Composition (0x181B) — peso, grasso, BMI</li><li>Xiaomi Mi Body Composition Scale 2</li><li>Generico — heuristica automatica su 100+ modelli</li></ul>"
|
||||
},
|
||||
"kiosk": {
|
||||
"hint": "Trasforma un tablet Android in un pannello EverShelf sempre acceso, con bilancia BLE integrata.",
|
||||
@@ -838,7 +874,10 @@
|
||||
"select_items": "Seleziona almeno un prodotto",
|
||||
"server_offline": "Connessione al server persa",
|
||||
"server_restored": "Connessione al server ripristinata",
|
||||
"server_retry": "Riprova"
|
||||
"server_retry": "Riprova",
|
||||
"unknown": "Errore sconosciuto",
|
||||
"prefix": "Errore",
|
||||
"no_inventory_entry": "Nessuna voce di inventario trovata"
|
||||
},
|
||||
"confirm": {
|
||||
"remove_item": "Vuoi davvero rimuovere questo prodotto dall'inventario?",
|
||||
@@ -854,7 +893,9 @@
|
||||
"edit": {
|
||||
"title": "Modifica {name}",
|
||||
"unknown_hint": "Inserisci il nome e le informazioni del prodotto",
|
||||
"label_name": "🏷️ Nome prodotto"
|
||||
"label_name": "🏷️ Nome prodotto",
|
||||
"choose_location_title": "Quale modifica?",
|
||||
"choose_location_hint": "Scegli la posizione da modificare:"
|
||||
},
|
||||
"screensaver": {
|
||||
"recipe_btn": "Ricette",
|
||||
@@ -951,7 +992,8 @@
|
||||
"thing_rest": "il resto",
|
||||
"stay_btn": "No, resta in {location}",
|
||||
"moved_toast": "📦 Confezione aperta spostata in {location}",
|
||||
"vacuum_restore": "🫙 Torna sotto vuoto"
|
||||
"vacuum_restore": "🫙 Torna sotto vuoto",
|
||||
"vacuum_seal_rest": "🔒 Metti sotto vuoto il resto"
|
||||
},
|
||||
"nova": {
|
||||
"1": "Non trasformato",
|
||||
|
||||
Reference in New Issue
Block a user