@@ -48,6 +51,8 @@
private void HandleConnectivityChanged(object? sender, EventArgs args) =>
InvokeAsync(StateHasChanged);
+ private string Text(UiTextKey key) => Localizer[key.ToString()];
+
public void Dispose()
{
Connectivity.Changed -= HandleConnectivityChanged;
diff --git a/src/PrompterOne.Shared/Diagnostics/Services/BrowserConnectivityService.cs b/src/PrompterOne.Shared/Diagnostics/Services/BrowserConnectivityService.cs
index 3782e13..3b6ab96 100644
--- a/src/PrompterOne.Shared/Diagnostics/Services/BrowserConnectivityService.cs
+++ b/src/PrompterOne.Shared/Diagnostics/Services/BrowserConnectivityService.cs
@@ -1,19 +1,20 @@
+using Microsoft.Extensions.Localization;
using Microsoft.JSInterop;
+using PrompterOne.Shared.Localization;
namespace PrompterOne.Shared.Services.Diagnostics;
-public sealed class BrowserConnectivityService(IJSRuntime jsRuntime) : IDisposable, IAsyncDisposable
+public sealed class BrowserConnectivityService(
+ IJSRuntime jsRuntime,
+ IStringLocalizer localizer) : IDisposable, IAsyncDisposable
{
- private const string ConnectivityOfflineMessage = "PrompterOne is offline. Live routing, cloud sync, and remote publishing will resume when the browser reconnects.";
- private const string ConnectivityOfflineTitle = "Connection lost";
- private const string ConnectivityOnlineMessage = "The browser connection is back. Continue working or reload if anything still looks stale.";
- private const string ConnectivityOnlineTitle = "Connection restored";
private const string EvaluateMethodName = "eval";
private const string OnlineExpression = "navigator.onLine";
private const int OnlineAutoHideDelayMilliseconds = 2400;
private const int PollIntervalMilliseconds = 1000;
private readonly IJSRuntime _jsRuntime = jsRuntime;
+ private readonly IStringLocalizer _localizer = localizer;
private readonly SemaphoreSlim _startGate = new(1, 1);
private CancellationTokenSource? _hideCts;
@@ -131,8 +132,8 @@ private async Task ProbeAsync(CancellationToken cancellationToken)
UpdateState(
isVisible: true,
state: ConnectivityStateValues.Offline,
- title: ConnectivityOfflineTitle,
- message: ConnectivityOfflineMessage);
+ title: Text(UiTextKey.DiagnosticsConnectivityOfflineTitle),
+ message: Text(UiTextKey.DiagnosticsConnectivityOfflineMessage));
return;
}
@@ -142,8 +143,8 @@ private async Task ProbeAsync(CancellationToken cancellationToken)
UpdateState(
isVisible: true,
state: ConnectivityStateValues.Online,
- title: ConnectivityOnlineTitle,
- message: ConnectivityOnlineMessage);
+ title: Text(UiTextKey.DiagnosticsConnectivityOnlineTitle),
+ message: Text(UiTextKey.DiagnosticsConnectivityOnlineMessage));
ScheduleHide();
}
@@ -212,6 +213,8 @@ private void UpdateState(bool isVisible, string state, string title, string mess
Changed?.Invoke(this, EventArgs.Empty);
}
+ private string Text(UiTextKey key) => _localizer[key.ToString()];
+
private static class ConnectivityStateValues
{
public const string Offline = "offline";
diff --git a/src/PrompterOne.Shared/Localization/AppCulturePreferenceService.cs b/src/PrompterOne.Shared/Localization/AppCulturePreferenceService.cs
new file mode 100644
index 0000000..02bb26d
--- /dev/null
+++ b/src/PrompterOne.Shared/Localization/AppCulturePreferenceService.cs
@@ -0,0 +1,167 @@
+using System.Globalization;
+using System.Text.Json;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.JSInterop;
+using PrompterOne.Core.Abstractions;
+using PrompterOne.Core.Localization;
+using PrompterOne.Shared.Services;
+using PrompterOne.Shared.Settings.Models;
+
+namespace PrompterOne.Shared.Localization;
+
+public sealed class AppCulturePreferenceService(
+ IJSRuntime jsRuntime,
+ IUserSettingsStore settingsStore,
+ ILogger? logger = null)
+{
+ private const string ApplyDocumentLanguageFailureMessage = "Failed to apply the browser document language.";
+ private const string InitializeFailureMessage = "Failed to initialize the browser culture preference.";
+ private const string LoadBrowserLanguagesFailureMessage = "Failed to read browser languages.";
+
+ private readonly IJSRuntime _jsRuntime = jsRuntime;
+ private readonly ILogger _logger = logger ?? NullLogger.Instance;
+ private readonly IUserSettingsStore _settingsStore = settingsStore;
+
+ private bool _initialized;
+
+ public async Task InitializeAsync(CancellationToken cancellationToken = default)
+ {
+ if (_initialized)
+ {
+ return;
+ }
+
+ _initialized = true;
+
+ try
+ {
+ var preferences = await _settingsStore.LoadAsync(
+ SettingsPagePreferences.StorageKey,
+ cancellationToken)
+ ?? SettingsPagePreferences.Default;
+ var storedPreferenceCulture = NormalizeStoredCulture(preferences.LanguageCulture);
+ var legacyCulture = await LoadLegacyCultureAsync(cancellationToken);
+ var browserCultures = await LoadBrowserCulturesAsync(cancellationToken);
+
+ var preferredCulture = !string.IsNullOrWhiteSpace(storedPreferenceCulture)
+ ? AppCultureCatalog.ResolveSupportedCulture(storedPreferenceCulture)
+ : !string.IsNullOrWhiteSpace(legacyCulture)
+ ? AppCultureCatalog.ResolveSupportedCulture(legacyCulture)
+ : AppCultureCatalog.ResolvePreferredCulture(browserCultures);
+
+ ApplyCulture(preferredCulture);
+ await ApplyDocumentLanguageAsync(preferredCulture, cancellationToken);
+ await MigrateLegacyCultureAsync(preferences, storedPreferenceCulture, legacyCulture, cancellationToken);
+ }
+ catch (Exception exception)
+ {
+ _initialized = false;
+ _logger.LogError(exception, InitializeFailureMessage);
+ throw;
+ }
+ }
+
+ private async Task ApplyDocumentLanguageAsync(string cultureName, CancellationToken cancellationToken)
+ {
+ try
+ {
+ await _jsRuntime.InvokeVoidAsync(
+ BrowserCultureInteropMethodNames.SetDocumentLanguage,
+ cancellationToken,
+ cultureName);
+ }
+ catch (Exception exception)
+ {
+ _logger.LogError(exception, ApplyDocumentLanguageFailureMessage);
+ throw;
+ }
+ }
+
+ private static void ApplyCulture(string cultureName)
+ {
+ var culture = CultureInfo.GetCultureInfo(cultureName);
+ CultureInfo.CurrentCulture = culture;
+ CultureInfo.CurrentUICulture = culture;
+ CultureInfo.DefaultThreadCurrentCulture = culture;
+ CultureInfo.DefaultThreadCurrentUICulture = culture;
+ }
+
+ private async Task> LoadBrowserCulturesAsync(CancellationToken cancellationToken)
+ {
+ try
+ {
+ return await _jsRuntime.InvokeAsync(
+ BrowserCultureInteropMethodNames.GetBrowserLanguages,
+ cancellationToken)
+ ?? [];
+ }
+ catch (Exception exception)
+ {
+ _logger.LogError(exception, LoadBrowserLanguagesFailureMessage);
+ throw;
+ }
+ }
+
+ private async Task LoadLegacyCultureAsync(CancellationToken cancellationToken)
+ {
+ var storedCulture = await _jsRuntime.InvokeAsync(
+ BrowserStorageMethodNames.LoadStorageValue,
+ cancellationToken,
+ BrowserStorageKeys.CultureSetting);
+
+ return NormalizeStoredCulture(storedCulture);
+ }
+
+ private async Task MigrateLegacyCultureAsync(
+ SettingsPagePreferences preferences,
+ string? storedPreferenceCulture,
+ string? legacyCulture,
+ CancellationToken cancellationToken)
+ {
+ if (string.IsNullOrWhiteSpace(legacyCulture))
+ {
+ return;
+ }
+
+ if (!string.IsNullOrWhiteSpace(storedPreferenceCulture))
+ {
+ await RemoveLegacyCultureAsync(cancellationToken);
+ return;
+ }
+
+ var migratedCulture = AppCultureCatalog.ResolveSupportedCulture(legacyCulture);
+ var updatedPreferences = preferences with
+ {
+ LanguageCulture = migratedCulture
+ };
+
+ await _settingsStore.SaveAsync(SettingsPagePreferences.StorageKey, updatedPreferences, cancellationToken);
+ await RemoveLegacyCultureAsync(cancellationToken);
+ }
+
+ private Task RemoveLegacyCultureAsync(CancellationToken cancellationToken)
+ {
+ return _jsRuntime.InvokeVoidAsync(
+ BrowserStorageMethodNames.RemoveStorageValue,
+ cancellationToken,
+ BrowserStorageKeys.CultureSetting).AsTask();
+ }
+
+ private static string? NormalizeStoredCulture(string? storedCulture)
+ {
+ if (string.IsNullOrWhiteSpace(storedCulture))
+ {
+ return null;
+ }
+
+ try
+ {
+ return JsonSerializer.Deserialize(storedCulture) ?? storedCulture;
+ }
+ catch (JsonException)
+ {
+ return storedCulture;
+ }
+ }
+}
diff --git a/src/PrompterOne.Shared/Localization/BrowserCultureInteropMethodNames.cs b/src/PrompterOne.Shared/Localization/BrowserCultureInteropMethodNames.cs
new file mode 100644
index 0000000..d6c8cdd
--- /dev/null
+++ b/src/PrompterOne.Shared/Localization/BrowserCultureInteropMethodNames.cs
@@ -0,0 +1,7 @@
+namespace PrompterOne.Shared.Localization;
+
+internal static class BrowserCultureInteropMethodNames
+{
+ public const string GetBrowserLanguages = "prompterOneCulture.getBrowserLanguages";
+ public const string SetDocumentLanguage = "prompterOneCulture.setDocumentLanguage";
+}
diff --git a/src/PrompterOne.Shared/Localization/SharedResource.de.resx b/src/PrompterOne.Shared/Localization/SharedResource.de.resx
new file mode 100644
index 0000000..6d4044f
--- /dev/null
+++ b/src/PrompterOne.Shared/Localization/SharedResource.de.resx
@@ -0,0 +1,291 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Schließen
+
+
+ Erneut versuchen
+
+
+ Bibliothek
+
+
+ Unerwarteter Fehler
+
+
+ PrompterOne hat einen unerwarteten Fehler festgestellt. Versuchen Sie diesen Bildschirm erneut oder kehren Sie zur Bibliothek zurück.
+
+
+ Aktion fehlgeschlagen
+
+
+ Alle Skripte
+
+
+ Zuletzt verwendet
+
+
+ Favoriten
+
+
+ Ordner
+
+
+ Neuer Ordner
+
+
+ Einstellungen
+
+
+ Sortieren nach
+
+
+ Name
+
+
+ Datum
+
+
+ Dauer
+
+
+ WPM
+
+
+ Ordner erstellen
+
+
+ Organisieren Sie Skripte in verschachtelten Sammlungen, ohne das Bibliotheksraster zu verändern.
+
+
+ Suchen...
+
+
+ Neues Skript
+
+
+ Lernen
+
+
+ Lesen
+
+
+ Live gehen
+
+
+ Einstellungen
+
+
+ LIVE-ROUTING
+
+
+ Aktivieren Sie Ziele für den aktuellen Program-Feed, während Teleprompter und RSVP in separaten Tabs bereit bleiben.
+
+
+ Name
+
+
+ Übergeordnet
+
+
+ Oberste Ebene
+
+
+ Abbrechen
+
+
+ Erstellen
+
+
+ Roadshows
+
+
+ Verbindung
+
+
+ Jetzt erneut versuchen
+
+
+ Verbindung verloren
+
+
+ PrompterOne ist offline. Live-Routing, Cloud-Synchronisierung und Remote-Veröffentlichung werden fortgesetzt, sobald der Browser wieder verbunden ist.
+
+
+ Verbindung wiederhergestellt
+
+
+ Die Browserverbindung ist wieder da. Arbeiten Sie weiter oder laden Sie neu, falls noch etwas veraltet wirkt.
+
+
+ Aufnahme aktiv
+
+
+ Stream aktiv
+
+
+ Bereit
+
+
+ Live
+
+
+ REC
+
+
+ Live + REC
+
+
+ Einstellungen
+
+
+ Cloud-Sync
+
+
+ Dateispeicher
+
+
+ Kameras
+
+
+ Mikrofone
+
+
+ Streaming
+
+
+ Aufnahme
+
+
+ KI-Anbieter
+
+
+ Erscheinungsbild
+
+
+ Über
+
+
+ Cloud-Speicher
+
+
+ Konfigurieren Sie hier optionale Cloud-Snapshot-Ziele. Anbieter-Anmeldedaten bleiben im lokalen Speicher dieses Browsers, und nichts wird verbunden, bis Sie gültige echte Zugangsdaten speichern.
+
+
+ Dateispeicher
+
+
+ PrompterOne ist browserbasiert. Skripte bleiben im Browser-Bibliotheksspeicher, während Aufnahmen und Exporte den browserlokalen Speichercontainer statt fiktiver Desktop-Ordner verwenden.
+
+
+ KI-Anbieter
+
+
+ Speichern Sie KI-Anbieter-Entwürfe lokal in diesem Browser. Laufzeit-Verbindungstests sind noch nicht implementiert, daher bleibt jeder Anbieter getrennt, bis eine echte Integration verfügbar ist.
+
+
+ Aufnahme
+
+
+ Konfigurieren Sie, wie lokale Aufnahmen während Go-Live-Sitzungen gespeichert werden.
+
+
+ Streaming-System
+
+
+ Konfigurieren Sie hier browserseitige Program-Erfassung, lokale Aufnahme, Transportverbindungen und nachgelagerte Ziele, damit Go Live auf den Betrieb der Sitzung fokussiert bleibt.
+
+
+ Erscheinungsbild
+
+
+ Passen Sie das Aussehen der App und des Teleprompter-Lesers an.
+
+
+ Thema
+
+
+ Dunkel · Goldakzent
+
+
+ Hell · Eigener Akzent
+
+
+ System · Eigener Akzent
+
+
+ Farbschema
+
+
+ Akzentfarbe
+
+
+ Sprache
+
+
+ Dunkel
+
+
+ Hell
+
+
+ System
+
+
+ Teleprompter-Anzeige
+
+
+ Schrift · Größe · Spiegeln · Hintergrund
+
+
+ Schrift
+
+
+ Standard-Schriftgröße
+
+
+ Textfarbe
+
+
+ Text spiegeln (horizontal)
+
+
+ Worthervorhebung anzeigen
+
+
+ Oberfläche
+
+
+ Dichte · Animationen · Seitenleiste
+
+
+ UI-Dichte
+
+
+ Kompakt
+
+
+ Standard
+
+
+ Großzügig
+
+
+ Bewegung reduzieren
+
+
+ Tastenkürzel-Overlay anzeigen
+
+
diff --git a/src/PrompterOne.Shared/Localization/SharedResource.es.resx b/src/PrompterOne.Shared/Localization/SharedResource.es.resx
index 4e31525..a176129 100644
--- a/src/PrompterOne.Shared/Localization/SharedResource.es.resx
+++ b/src/PrompterOne.Shared/Localization/SharedResource.es.resx
@@ -111,4 +111,181 @@
Roadshows
+
+ Conexión
+
+
+ Reintentar ahora
+
+
+ Conexión perdida
+
+
+ PrompterOne está sin conexión. El ruteo en vivo, la sincronización en la nube y la publicación remota se reanudarán cuando el navegador vuelva a conectarse.
+
+
+ Conexión restablecida
+
+
+ La conexión del navegador ha vuelto. Sigue trabajando o recarga si algo todavía parece desactualizado.
+
+
+ Grabación activa
+
+
+ Emisión activa
+
+
+ Listo
+
+
+ En vivo
+
+
+ REC
+
+
+ En vivo + REC
+
+
+ Configuración
+
+
+ Sincronización en la nube
+
+
+ Almacenamiento de archivos
+
+
+ Cámaras
+
+
+ Micrófonos
+
+
+ Streaming
+
+
+ Grabación
+
+
+ Proveedor de IA
+
+
+ Apariencia
+
+
+ Acerca de
+
+
+ Almacenamiento en la nube
+
+
+ Configura aquí destinos opcionales de instantáneas en la nube. Las credenciales de los proveedores permanecen en el almacenamiento local de este navegador y nada se conecta hasta que guardes credenciales reales válidas.
+
+
+ Almacenamiento de archivos
+
+
+ PrompterOne funciona solo en el navegador. Los guiones permanecen en la biblioteca del navegador, mientras que las grabaciones y exportaciones usan el contenedor de almacenamiento local del navegador en lugar de carpetas falsas de escritorio.
+
+
+ Proveedor de IA
+
+
+ Guarda borradores de proveedores de IA localmente en este navegador. Las pruebas de conexión en tiempo de ejecución aún no están implementadas, así que cada proveedor permanece desconectado hasta que exista una integración real.
+
+
+ Grabación
+
+
+ Configura cómo se guardan las grabaciones locales durante las sesiones de Go Live.
+
+
+ Sistema de streaming
+
+
+ Configura aquí la captura del programa en el navegador, la grabación local, las conexiones de transporte y los destinos posteriores para que Go Live siga centrado en operar la sesión.
+
+
+ Apariencia
+
+
+ Personaliza el aspecto de la aplicación y del lector del teleprompter.
+
+
+ Tema
+
+
+ Oscuro · Acento dorado
+
+
+ Claro · Acento personalizado
+
+
+ Sistema · Acento personalizado
+
+
+ Esquema de color
+
+
+ Color de acento
+
+
+ Idioma
+
+
+ Oscuro
+
+
+ Claro
+
+
+ Sistema
+
+
+ Pantalla del teleprompter
+
+
+ Fuente · Tamaño · Espejo · Fondo
+
+
+ Fuente
+
+
+ Tamaño de fuente predeterminado
+
+
+ Color del texto
+
+
+ Espejar texto (volteo horizontal)
+
+
+ Mostrar resaltado de palabras
+
+
+ Interfaz
+
+
+ Densidad · Animaciones · Barra lateral
+
+
+ Densidad de la interfaz
+
+
+ Compacta
+
+
+ Predeterminada
+
+
+ Espaciosa
+
+
+ Reducir movimiento
+
+
+ Mostrar panel de atajos de teclado
+
diff --git a/src/PrompterOne.Shared/Localization/SharedResource.fr.resx b/src/PrompterOne.Shared/Localization/SharedResource.fr.resx
index 877ca1a..b77420b 100644
--- a/src/PrompterOne.Shared/Localization/SharedResource.fr.resx
+++ b/src/PrompterOne.Shared/Localization/SharedResource.fr.resx
@@ -111,4 +111,181 @@
Roadshows
+
+ Connexion
+
+
+ Réessayer maintenant
+
+
+ Connexion perdue
+
+
+ PrompterOne est hors ligne. Le routage en direct, la synchronisation cloud et la publication distante reprendront lorsque le navigateur se reconnectera.
+
+
+ Connexion rétablie
+
+
+ La connexion du navigateur est revenue. Continuez à travailler ou rechargez si quelque chose semble encore obsolète.
+
+
+ Enregistrement actif
+
+
+ Diffusion active
+
+
+ Prêt
+
+
+ En direct
+
+
+ REC
+
+
+ Direct + REC
+
+
+ Paramètres
+
+
+ Synchronisation cloud
+
+
+ Stockage des fichiers
+
+
+ Caméras
+
+
+ Microphones
+
+
+ Diffusion
+
+
+ Enregistrement
+
+
+ Fournisseur IA
+
+
+ Apparence
+
+
+ À propos
+
+
+ Stockage cloud
+
+
+ Configurez ici des cibles optionnelles de sauvegarde cloud. Les identifiants des fournisseurs restent dans le stockage local de ce navigateur et rien n’est connecté tant que vous n’avez pas enregistré de vrais identifiants valides.
+
+
+ Stockage des fichiers
+
+
+ PrompterOne fonctionne uniquement dans le navigateur. Les scripts restent dans la bibliothèque du navigateur, tandis que les enregistrements et les exports utilisent le conteneur de stockage local du navigateur au lieu de faux dossiers du bureau.
+
+
+ Fournisseur IA
+
+
+ Stockez les brouillons des fournisseurs IA localement dans ce navigateur. Les tests de connexion d’exécution ne sont pas encore implémentés, donc chaque fournisseur reste déconnecté jusqu’à l’arrivée d’une vraie intégration.
+
+
+ Enregistrement
+
+
+ Configurez la manière dont les enregistrements locaux sont sauvegardés pendant les sessions Go Live.
+
+
+ Système de diffusion
+
+
+ Configurez ici la capture programme du navigateur, l’enregistrement local, les connexions de transport et les destinations aval pour que Go Live reste centré sur l’exploitation de la session.
+
+
+ Apparence
+
+
+ Personnalisez l’apparence de l’application et du lecteur du prompteur.
+
+
+ Thème
+
+
+ Sombre · Accent doré
+
+
+ Clair · Accent personnalisé
+
+
+ Système · Accent personnalisé
+
+
+ Mode de couleur
+
+
+ Couleur d’accent
+
+
+ Langue
+
+
+ Sombre
+
+
+ Clair
+
+
+ Système
+
+
+ Affichage du prompteur
+
+
+ Police · Taille · Miroir · Arrière-plan
+
+
+ Police
+
+
+ Taille de police par défaut
+
+
+ Couleur du texte
+
+
+ Miroir du texte (retournement horizontal)
+
+
+ Afficher la mise en évidence des mots
+
+
+ Interface
+
+
+ Densité · Animations · Barre latérale
+
+
+ Densité de l’interface
+
+
+ Compacte
+
+
+ Par défaut
+
+
+ Aérée
+
+
+ Réduire les animations
+
+
+ Afficher le panneau des raccourcis clavier
+
diff --git a/src/PrompterOne.Shared/Localization/SharedResource.it.resx b/src/PrompterOne.Shared/Localization/SharedResource.it.resx
index dda468c..758f31d 100644
--- a/src/PrompterOne.Shared/Localization/SharedResource.it.resx
+++ b/src/PrompterOne.Shared/Localization/SharedResource.it.resx
@@ -111,4 +111,181 @@
Roadshows
+
+ Connessione
+
+
+ Riprova ora
+
+
+ Connessione persa
+
+
+ PrompterOne è offline. Il routing live, la sincronizzazione cloud e la pubblicazione remota riprenderanno quando il browser si riconnetterà.
+
+
+ Connessione ripristinata
+
+
+ La connessione del browser è tornata. Continua a lavorare o ricarica se qualcosa sembra ancora non aggiornato.
+
+
+ Registrazione attiva
+
+
+ Streaming attivo
+
+
+ Pronto
+
+
+ Live
+
+
+ REC
+
+
+ Live + REC
+
+
+ Impostazioni
+
+
+ Sincronizzazione cloud
+
+
+ Archiviazione file
+
+
+ Camere
+
+
+ Microfoni
+
+
+ Streaming
+
+
+ Registrazione
+
+
+ Provider IA
+
+
+ Aspetto
+
+
+ Informazioni
+
+
+ Archiviazione cloud
+
+
+ Configura qui destinazioni facoltative per snapshot cloud. Le credenziali dei provider restano nel local storage di questo browser e nulla viene connesso finché non salvi credenziali reali valide.
+
+
+ Archiviazione file
+
+
+ PrompterOne è solo browser. Gli script restano nella libreria del browser, mentre registrazioni ed esportazioni usano il contenitore di archiviazione locale del browser invece di cartelle desktop fittizie.
+
+
+ Provider IA
+
+
+ Conserva le bozze dei provider IA localmente in questo browser. I test di connessione runtime non sono ancora implementati, quindi ogni provider resta scollegato finché non arriverà una vera integrazione.
+
+
+ Registrazione
+
+
+ Configura come vengono salvate le registrazioni locali durante le sessioni Go Live.
+
+
+ Sistema di streaming
+
+
+ Configura qui la cattura del programma nel browser, la registrazione locale, le connessioni di trasporto e le destinazioni downstream così che Go Live resti focalizzato sull’operatività della sessione.
+
+
+ Aspetto
+
+
+ Personalizza l’aspetto dell’app e del lettore teleprompter.
+
+
+ Tema
+
+
+ Scuro · Accento dorato
+
+
+ Chiaro · Accento personalizzato
+
+
+ Sistema · Accento personalizzato
+
+
+ Schema colori
+
+
+ Colore accento
+
+
+ Lingua
+
+
+ Scuro
+
+
+ Chiaro
+
+
+ Sistema
+
+
+ Schermo teleprompter
+
+
+ Carattere · Dimensione · Specchio · Sfondo
+
+
+ Carattere
+
+
+ Dimensione carattere predefinita
+
+
+ Colore del testo
+
+
+ Specchia testo (flip orizzontale)
+
+
+ Mostra evidenziazione parole
+
+
+ Interfaccia
+
+
+ Densità · Animazioni · Barra laterale
+
+
+ Densità interfaccia
+
+
+ Compatta
+
+
+ Predefinita
+
+
+ Ampia
+
+
+ Riduci movimento
+
+
+ Mostra pannello scorciatoie da tastiera
+
diff --git a/src/PrompterOne.Shared/Localization/SharedResource.pt.resx b/src/PrompterOne.Shared/Localization/SharedResource.pt.resx
index 23529ce..2874af3 100644
--- a/src/PrompterOne.Shared/Localization/SharedResource.pt.resx
+++ b/src/PrompterOne.Shared/Localization/SharedResource.pt.resx
@@ -111,4 +111,181 @@
Roadshows
+
+ Conexão
+
+
+ Tentar agora
+
+
+ Conexão perdida
+
+
+ O PrompterOne está offline. O roteamento ao vivo, a sincronização na nuvem e a publicação remota serão retomados quando o navegador se reconectar.
+
+
+ Conexão restaurada
+
+
+ A conexão do navegador voltou. Continue trabalhando ou recarregue se algo ainda parecer desatualizado.
+
+
+ Gravação ativa
+
+
+ Transmissão ativa
+
+
+ Pronto
+
+
+ Ao vivo
+
+
+ REC
+
+
+ Ao vivo + REC
+
+
+ Configurações
+
+
+ Sincronização na nuvem
+
+
+ Armazenamento de arquivos
+
+
+ Câmeras
+
+
+ Microfones
+
+
+ Streaming
+
+
+ Gravação
+
+
+ Provedor de IA
+
+
+ Aparência
+
+
+ Sobre
+
+
+ Armazenamento em nuvem
+
+
+ Configure aqui destinos opcionais de snapshot em nuvem. As credenciais dos provedores permanecem no armazenamento local deste navegador e nada é conectado até que você salve credenciais reais válidas.
+
+
+ Armazenamento de arquivos
+
+
+ O PrompterOne funciona apenas no navegador. Os roteiros permanecem na biblioteca do navegador, enquanto gravações e exportações usam o contêiner de armazenamento local do navegador em vez de pastas falsas da área de trabalho.
+
+
+ Provedor de IA
+
+
+ Armazene rascunhos de provedores de IA localmente neste navegador. O teste de conexão em tempo de execução ainda não foi implementado, então cada provedor permanece desconectado até que exista uma integração real.
+
+
+ Gravação
+
+
+ Configure como as gravações locais são salvas durante as sessões do Go Live.
+
+
+ Sistema de streaming
+
+
+ Configure aqui a captura do programa no navegador, a gravação local, as conexões de transporte e os destinos downstream para que o Go Live continue focado em operar a sessão.
+
+
+ Aparência
+
+
+ Personalize a aparência do aplicativo e do leitor do teleprompter.
+
+
+ Tema
+
+
+ Escuro · Destaque dourado
+
+
+ Claro · Destaque personalizado
+
+
+ Sistema · Destaque personalizado
+
+
+ Esquema de cores
+
+
+ Cor de destaque
+
+
+ Idioma
+
+
+ Escuro
+
+
+ Claro
+
+
+ Sistema
+
+
+ Exibição do teleprompter
+
+
+ Fonte · Tamanho · Espelho · Fundo
+
+
+ Fonte
+
+
+ Tamanho de fonte padrão
+
+
+ Cor do texto
+
+
+ Espelhar texto (virar horizontalmente)
+
+
+ Mostrar destaque de palavras
+
+
+ Interface
+
+
+ Densidade · Animações · Barra lateral
+
+
+ Densidade da interface
+
+
+ Compacta
+
+
+ Padrão
+
+
+ Espaçosa
+
+
+ Reduzir movimento
+
+
+ Mostrar painel de atalhos do teclado
+
diff --git a/src/PrompterOne.Shared/Localization/SharedResource.resx b/src/PrompterOne.Shared/Localization/SharedResource.resx
index 9a1ca73..2e39924 100644
--- a/src/PrompterOne.Shared/Localization/SharedResource.resx
+++ b/src/PrompterOne.Shared/Localization/SharedResource.resx
@@ -111,4 +111,181 @@
Roadshows
+
+ Connectivity
+
+
+ Retry Now
+
+
+ Connection lost
+
+
+ PrompterOne is offline. Live routing, cloud sync, and remote publishing will resume when the browser reconnects.
+
+
+ Connection restored
+
+
+ The browser connection is back. Continue working or reload if anything still looks stale.
+
+
+ Recording active
+
+
+ Stream active
+
+
+ Ready
+
+
+ Live
+
+
+ Rec
+
+
+ Live + Rec
+
+
+ Settings
+
+
+ Cloud Sync
+
+
+ File Storage
+
+
+ Cameras
+
+
+ Microphones
+
+
+ Streaming
+
+
+ Recording
+
+
+ AI Provider
+
+
+ Appearance
+
+
+ About
+
+
+ Cloud Storage
+
+
+ Configure optional cloud snapshot targets here. Provider credentials stay in this browser local storage, and nothing is connected until you save valid real credentials.
+
+
+ File Storage
+
+
+ PrompterOne is browser-only. Scripts stay in the browser library store, while recordings and exports use the browser-local storage container instead of fake desktop folders.
+
+
+ AI Provider
+
+
+ Store AI provider drafts locally in this browser. Runtime connection testing is not implemented yet, so every provider stays unconnected until a real integration ships.
+
+
+ Recording
+
+
+ Configure how local recordings are saved during Go Live sessions.
+
+
+ Streaming System
+
+
+ Configure browser-owned program capture, local recording, transport connections, and downstream targets here so Go Live stays focused on operating the session.
+
+
+ Appearance
+
+
+ Customize the look and feel of the app and the teleprompter reader.
+
+
+ Theme
+
+
+ Dark · Gold accent
+
+
+ Light · Custom accent
+
+
+ System · Custom accent
+
+
+ Color Scheme
+
+
+ Accent Color
+
+
+ Language
+
+
+ Dark
+
+
+ Light
+
+
+ System
+
+
+ Teleprompter Display
+
+
+ Font · Size · Mirror · Background
+
+
+ Font
+
+
+ Default Font Size
+
+
+ Text Color
+
+
+ Mirror Text (Horizontal Flip)
+
+
+ Show Word Highlight
+
+
+ Interface
+
+
+ Density · Animations · Sidebar
+
+
+ UI Density
+
+
+ Compact
+
+
+ Default
+
+
+ Spacious
+
+
+ Reduce Motion
+
+
+ Show keyboard shortcuts overlay
+
diff --git a/src/PrompterOne.Shared/Localization/SharedResource.uk.resx b/src/PrompterOne.Shared/Localization/SharedResource.uk.resx
index 8ef96dd..444232c 100644
--- a/src/PrompterOne.Shared/Localization/SharedResource.uk.resx
+++ b/src/PrompterOne.Shared/Localization/SharedResource.uk.resx
@@ -111,4 +111,181 @@
Роудшоу
+
+ З’єднання
+
+
+ Спробувати зараз
+
+
+ З’єднання втрачено
+
+
+ PrompterOne офлайн. Маршрутизація ефіру, хмарна синхронізація та віддалена публікація відновляться, щойно браузер знову підключиться.
+
+
+ З’єднання відновлено
+
+
+ З’єднання браузера повернулося. Продовжуйте роботу або перезавантажте сторінку, якщо щось ще виглядає застарілим.
+
+
+ Запис активний
+
+
+ Ефір активний
+
+
+ Готово
+
+
+ Ефір
+
+
+ REC
+
+
+ Ефір + REC
+
+
+ Налаштування
+
+
+ Хмарна синхронізація
+
+
+ Файлове сховище
+
+
+ Камери
+
+
+ Мікрофони
+
+
+ Трансляція
+
+
+ Запис
+
+
+ Провайдер ШІ
+
+
+ Вигляд
+
+
+ Про застосунок
+
+
+ Хмарне сховище
+
+
+ Налаштуйте тут необов’язкові хмарні цілі для знімків. Облікові дані провайдерів залишаються у локальному сховищі цього браузера, і нічого не підключається, доки ви не збережете справжні чинні облікові дані.
+
+
+ Файлове сховище
+
+
+ PrompterOne працює лише в браузері. Сценарії залишаються у бібліотеці браузера, а записи та експорт використовують локальний контейнер сховища браузера замість фіктивних тек робочого столу.
+
+
+ Провайдер ШІ
+
+
+ Зберігайте чернетки провайдерів ШІ локально в цьому браузері. Перевірка з’єднання під час виконання ще не реалізована, тому кожен провайдер залишається від’єднаним, доки не з’явиться справжня інтеграція.
+
+
+ Запис
+
+
+ Налаштуйте, як локальні записи зберігаються під час сесій Go Live.
+
+
+ Система трансляції
+
+
+ Налаштуйте тут браузерне захоплення програмного сигналу, локальний запис, транспортні з’єднання та кінцеві цілі, щоб Go Live залишався зосередженим на керуванні сесією.
+
+
+ Вигляд
+
+
+ Налаштуйте вигляд застосунку та читача телесуфлера.
+
+
+ Тема
+
+
+ Темна · Золотий акцент
+
+
+ Світла · Власний акцент
+
+
+ Системна · Власний акцент
+
+
+ Колірна схема
+
+
+ Акцентний колір
+
+
+ Мова
+
+
+ Темна
+
+
+ Світла
+
+
+ Системна
+
+
+ Вигляд телесуфлера
+
+
+ Шрифт · Розмір · Дзеркало · Тло
+
+
+ Шрифт
+
+
+ Розмір шрифту за замовчуванням
+
+
+ Колір тексту
+
+
+ Дзеркалити текст (горизонтально)
+
+
+ Підсвічувати слова
+
+
+ Інтерфейс
+
+
+ Щільність · Анімації · Бічна панель
+
+
+ Щільність інтерфейсу
+
+
+ Щільна
+
+
+ Стандартна
+
+
+ Простора
+
+
+ Зменшити анімацію
+
+
+ Показувати панель клавіатурних скорочень
+
diff --git a/src/PrompterOne.Shared/Localization/UiTextKey.cs b/src/PrompterOne.Shared/Localization/UiTextKey.cs
index d000296..0a91d7b 100644
--- a/src/PrompterOne.Shared/Localization/UiTextKey.cs
+++ b/src/PrompterOne.Shared/Localization/UiTextKey.cs
@@ -8,6 +8,12 @@ public enum UiTextKey
DiagnosticsFatalTitle,
DiagnosticsFatalMessage,
DiagnosticsRecoverableTitle,
+ DiagnosticsConnectivityEyebrow,
+ DiagnosticsConnectivityRetryNow,
+ DiagnosticsConnectivityOfflineTitle,
+ DiagnosticsConnectivityOfflineMessage,
+ DiagnosticsConnectivityOnlineTitle,
+ DiagnosticsConnectivityOnlineMessage,
LibraryAllScripts,
LibraryRecent,
LibraryFavorites,
@@ -27,8 +33,61 @@ public enum UiTextKey
HeaderRead,
HeaderGoLive,
HeaderSettings,
+ HeaderGoLiveIndicatorRecording,
+ HeaderGoLiveIndicatorStreaming,
+ HeaderGoLiveIndicatorReady,
+ HeaderGoLiveWidgetLive,
+ HeaderGoLiveWidgetRecording,
+ HeaderGoLiveWidgetLiveRecording,
GoLiveHeroEyebrow,
GoLiveHeroDescription,
+ SettingsTitle,
+ SettingsNavCloud,
+ SettingsNavFiles,
+ SettingsNavCameras,
+ SettingsNavMicrophones,
+ SettingsNavStreaming,
+ SettingsNavRecording,
+ SettingsNavAi,
+ SettingsNavAppearance,
+ SettingsNavAbout,
+ SettingsCloudSectionTitle,
+ SettingsCloudSectionDescription,
+ SettingsFilesSectionTitle,
+ SettingsFilesSectionDescription,
+ SettingsAiSectionTitle,
+ SettingsAiSectionDescription,
+ SettingsRecordingSectionTitle,
+ SettingsRecordingSectionDescription,
+ SettingsStreamingSectionTitle,
+ SettingsStreamingSectionDescription,
+ SettingsAppearanceSectionTitle,
+ SettingsAppearanceSectionDescription,
+ SettingsAppearanceThemeTitle,
+ SettingsAppearanceThemeSubtitleDark,
+ SettingsAppearanceThemeSubtitleLight,
+ SettingsAppearanceThemeSubtitleSystem,
+ SettingsAppearanceColorSchemeLabel,
+ SettingsAppearanceAccentColorLabel,
+ SettingsAppearanceLanguageLabel,
+ SettingsAppearanceThemeDark,
+ SettingsAppearanceThemeLight,
+ SettingsAppearanceThemeSystem,
+ SettingsAppearanceTeleprompterTitle,
+ SettingsAppearanceTeleprompterSubtitle,
+ SettingsAppearanceFontLabel,
+ SettingsAppearanceDefaultFontSizeLabel,
+ SettingsAppearanceTextColorLabel,
+ SettingsAppearanceMirrorTextLabel,
+ SettingsAppearanceShowWordHighlightLabel,
+ SettingsAppearanceInterfaceTitle,
+ SettingsAppearanceInterfaceSubtitle,
+ SettingsAppearanceUiDensityLabel,
+ SettingsAppearanceDensityCompact,
+ SettingsAppearanceDensityDefault,
+ SettingsAppearanceDensitySpacious,
+ SettingsAppearanceReduceMotionLabel,
+ SettingsAppearanceShowShortcutOverlayLabel,
CommonName,
CommonParent,
CommonTopLevel,
diff --git a/src/PrompterOne.Shared/Settings/Components/SettingsAiSection.razor b/src/PrompterOne.Shared/Settings/Components/SettingsAiSection.razor
index 38f6fc4..6835a3c 100644
--- a/src/PrompterOne.Shared/Settings/Components/SettingsAiSection.razor
+++ b/src/PrompterOne.Shared/Settings/Components/SettingsAiSection.razor
@@ -1,14 +1,17 @@
@namespace PrompterOne.Shared.Components.Settings
+@using Microsoft.Extensions.Localization
@using PrompterOne.Shared.Pages
+@using PrompterOne.Shared.Localization
@using PrompterOne.Shared.Settings.Components
@using PrompterOne.Shared.Settings.Models
+@inject IStringLocalizer Localizer
-
@SettingsNavigationText.AiProviderLabel
-
Store AI provider drafts locally in this browser. Runtime connection testing is not implemented yet, so every provider stays unconnected until a real integration ships.