synced with last dev, added profiles for cyr2lat replacement dictionaries

This commit is contained in:
HDDen
2026-04-25 01:30:55 +03:00
parent 7a4ac9ae9b
commit f56c28a27d
45 changed files with 1547 additions and 394 deletions
+89
View File
@@ -285,10 +285,12 @@ class MeshCoreConnector extends ChangeNotifier {
List<Channel> _cachedChannels = [];
final Map<int, bool> _channelSmazEnabled = {};
final Map<int, bool> _channelCyr2LatEnabled = {};
final Map<int, String?> _channelCyr2LatProfileId = {};
bool _lastSentWasCliCommand =
false; // Track if last sent message was a CLI command
final Map<String, bool> _contactSmazEnabled = {};
final Map<String, bool> _contactCyr2LatEnabled = {};
final Map<String, String?> _contactCyr2LatProfileId = {};
final Set<String> _knownContactKeys = {};
final Map<String, int> _contactUnreadCount = {};
final Map<String, RepeaterBatterySnapshot> _repeaterBatterySnapshots = {};
@@ -611,10 +613,12 @@ class MeshCoreConnector extends ChangeNotifier {
}
bool isChannelCyr2LatEnabled(int channelIndex) {
_ensureChannelCyr2LatSettingLoaded(channelIndex);
return _channelCyr2LatEnabled[channelIndex] ?? false;
}
bool isContactCyr2LatEnabled(String contactKeyHex) {
_ensureContactCyr2LatSettingLoaded(contactKeyHex);
return _contactCyr2LatEnabled[contactKeyHex] ?? false;
}
@@ -4483,6 +4487,63 @@ class MeshCoreConnector extends ChangeNotifier {
});
}
void _ensureContactCyr2LatProfileLoaded(String contactKeyHex) {
if (_contactCyr2LatProfileId.containsKey(contactKeyHex)) return;
_contactSettingsStore.loadCyr2LatProfileId(contactKeyHex).then((profileId) {
if (_contactCyr2LatProfileId[contactKeyHex] == profileId) return;
_contactCyr2LatProfileId[contactKeyHex] = profileId;
notifyListeners();
});
}
void _ensureChannelCyr2LatSettingLoaded(int channelIndex) {
if (_channelCyr2LatEnabled.containsKey(channelIndex)) return;
_channelSettingsStore.loadCyr2LatEnabled(channelIndex).then((enabled) {
if (_channelCyr2LatEnabled[channelIndex] == enabled) return;
_channelCyr2LatEnabled[channelIndex] = enabled;
notifyListeners();
});
}
void _ensureChannelCyr2LatProfileLoaded(int channelIndex) {
if (_channelCyr2LatProfileId.containsKey(channelIndex)) return;
_channelSettingsStore.loadCyr2LatProfileId(channelIndex).then((profileId) {
if (_channelCyr2LatProfileId[channelIndex] == profileId) return;
_channelCyr2LatProfileId[channelIndex] = profileId;
notifyListeners();
});
}
String? getChannelCyr2LatProfileId(int channelIndex) {
_ensureChannelCyr2LatProfileLoaded(channelIndex);
return _channelCyr2LatProfileId[channelIndex];
}
Future<void> setChannelCyr2LatProfileId(
int channelIndex,
String? profileId,
) async {
if (_channelCyr2LatProfileId[channelIndex] == profileId) return;
_channelCyr2LatProfileId[channelIndex] = profileId;
await _channelSettingsStore.saveCyr2LatProfileId(channelIndex, profileId);
notifyListeners();
}
String? getContactCyr2LatProfileId(String contactKeyHex) {
_ensureContactCyr2LatProfileLoaded(contactKeyHex);
return _contactCyr2LatProfileId[contactKeyHex];
}
Future<void> setContactCyr2LatProfileId(
String contactKeyHex,
String? profileId,
) async {
if (_contactCyr2LatProfileId[contactKeyHex] == profileId) return;
_contactCyr2LatProfileId[contactKeyHex] = profileId;
await _contactSettingsStore.saveCyr2LatProfileId(contactKeyHex, profileId);
notifyListeners();
}
/// Prepares contact outbound text by applying SMAZ encoding if enabled.
/// This should be used to transform text before computing ACK hashes.
String prepareContactOutboundText(Contact contact, String text) {
@@ -4495,6 +4556,20 @@ class MeshCoreConnector extends ChangeNotifier {
if (isContactSmazEnabled(contact.publicKeyHex)) {
return Smaz.encodeIfSmaller(text);
} else if (isContactCyr2LatEnabled(contact.publicKeyHex)) {
final profileId = getContactCyr2LatProfileId(contact.publicKeyHex);
final profile = profileId != null && _appSettingsService != null
? _appSettingsService!.getCyr2LatProfileById(profileId)
: null;
if (profile != null) {
Cyr2Lat.setCharMap(profile.charMap);
} else {
// Use global profile
final globalProfile = _appSettingsService
?.getSelectedCyr2LatProfile();
if (globalProfile != null) {
Cyr2Lat.setCharMap(globalProfile.charMap);
}
}
return Cyr2Lat.encode(text);
}
}
@@ -4509,6 +4584,20 @@ class MeshCoreConnector extends ChangeNotifier {
if (isChannelSmazEnabled(channelIndex)) {
return Smaz.encodeIfSmaller(text);
} else if (isChannelCyr2LatEnabled(channelIndex)) {
final profileId = getChannelCyr2LatProfileId(channelIndex);
final profile = profileId != null && _appSettingsService != null
? _appSettingsService!.getCyr2LatProfileById(profileId)
: null;
if (profile != null) {
Cyr2Lat.setCharMap(profile.charMap);
} else {
// Use global profile
final globalProfile = _appSettingsService
?.getSelectedCyr2LatProfile();
if (globalProfile != null) {
Cyr2Lat.setCharMap(globalProfile.charMap);
}
}
return Cyr2Lat.encode(text);
}
}
+9 -3
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Списък със замествания",
"channels_cyr2latSettingsDscr": "Редактиране на JSON конфигурацията за заместване на символи",
"channels_cyr2latSettingsDialogHint": "JSON карта за замествания",
"channels_cyr2latSettingsDialogSuccess": "Списъкът със замествания е актуализиран",
"channels_cyr2latSettingsDialogWrongJSON": "Неправилен JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Възстановяване на първоначалните настройки",
"channels_cyr2latSettingsDialogResetted": "Настройките за заместване на Cyr2Lat са възстановени към първоначалните",
"settings_cyr2latProfileAdd": "Добавяне на профил Cyr2Lat",
"settings_cyr2latProfileName": "Име на профила",
"settings_cyr2latProfileNameEmpty": "Името на профила не може да бъде празно",
"settings_cyr2latProfileAdded": "Профилът е добавен успешно",
"settings_cyr2latProfileUpdated": "Профилът е актуализиран успешно",
"settings_cyr2latProfileEdit": "Редактиране на Cyr2Lat профил",
"settings_cyr2latProfileDelete": "Изтриване на профил Cyr2Lat",
"settings_cyr2latProfileDeleted": "Профилът беше изтрит успешно",
"settings_cyr2latProfileDeleteDscr": "Сигурен ли сте, че искате да изтриете профила \"{name}\"?",
"channels_channelUpdated": "Каналът \"{name}\" е актуализиран",
"@channels_channelUpdated": {
"placeholders": {
+9 -3
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Ersetzungsliste",
"channels_cyr2latSettingsDscr": "JSON-Konfiguration für die Zeichenersetzung bearbeiten",
"channels_cyr2latSettingsDialogHint": "JSON-Ersetzungstabelle",
"channels_cyr2latSettingsDialogSuccess": "Ersetzungsliste aktualisiert",
"channels_cyr2latSettingsDialogWrongJSON": "Ungültiges JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Auf Standard zurücksetzen",
"channels_cyr2latSettingsDialogResetted": "Die Cyr2Lat-Ersetzungseinstellungen wurden auf die Standardeinstellungen zurückgesetzt",
"settings_cyr2latProfileAdd": "Cyr2Lat-Profil hinzufügen",
"settings_cyr2latProfileName": "Profilname",
"settings_cyr2latProfileNameEmpty": "Der Profilname darf nicht leer sein",
"settings_cyr2latProfileAdded": "Profil erfolgreich hinzugefügt",
"settings_cyr2latProfileUpdated": "Profil erfolgreich aktualisiert",
"settings_cyr2latProfileEdit": "Cyr2Lat-Profil bearbeiten",
"settings_cyr2latProfileDelete": "Cyr2Lat-Profil löschen",
"settings_cyr2latProfileDeleted": "Profil erfolgreich gelöscht",
"settings_cyr2latProfileDeleteDscr": "Möchten Sie das Profil \"{name}\" wirklich löschen?",
"channels_channelUpdated": "Kanal \"{name}\" aktualisiert",
"@channels_channelUpdated": {
"placeholders": {
+16 -3
View File
@@ -579,15 +579,12 @@
"channels_cyr2latSettingsSubheading": "List of replacements",
"channels_cyr2latSettingsDscr": "Edit the JSON configuration of character replacement",
"channels_cyr2latSettingsDialogHint": "JSON replacement map",
"channels_cyr2latSettingsDialogSuccess": "The list of replacements has been updated",
"channels_cyr2latSettingsDialogWrongJSON": "Invalid JSON: {error}",
"@channels_cyr2latSettingsDialogWrongJSON": {
"placeholders": {
"error": {}
}
},
"channels_cyr2latSettingsDialogReset": "Reset to default",
"channels_cyr2latSettingsDialogResetted": "Cyr2Lat replacement settings reset to default",
"channels_channelUpdated": "Channel \"{name}\" updated",
"@channels_channelUpdated": {
"placeholders": {
@@ -596,6 +593,22 @@
}
}
},
"settings_cyr2latProfileAdd": "Add Cyr2Lat Profile",
"settings_cyr2latProfileName": "Profile Name",
"settings_cyr2latProfileNameEmpty": "Profile name cannot be empty",
"settings_cyr2latProfileAdded": "Profile added successfully",
"settings_cyr2latProfileUpdated": "Profile updated successfully",
"settings_cyr2latProfileEdit": "Edit Cyr2Lat Profile",
"settings_cyr2latProfileDelete": "Delete Cyr2Lat Profile",
"settings_cyr2latProfileDeleted": "Profile deleted successfully",
"settings_cyr2latProfileDeleteDscr": "Are you sure you want to delete the profile \"{name}\"?",
"@settings_cyr2latProfileDeleteDscr": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"channels_publicChannelAdded": "Public channel added",
"channels_sortBy": "Sort by",
"channels_sortManual": "Manual",
+18 -5
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Lista de sustituciones",
"channels_cyr2latSettingsDscr": "Editar la configuración JSON de sustitución de caracteres",
"channels_cyr2latSettingsDialogHint": "Mapa JSON de sustituciones",
"channels_cyr2latSettingsDialogSuccess": "Lista de sustituciones actualizada",
"channels_cyr2latSettingsDialogWrongJSON": "JSON incorrecto: {error}",
"channels_cyr2latSettingsDialogReset": "Restablecer valores predeterminados",
"channels_cyr2latSettingsDialogResetted": "La configuración de sustituciones de Cyr2Lat se ha restablecido a los valores predeterminados",
"settings_cyr2latProfileAdd": "Añadir perfil Cyr2Lat",
"settings_cyr2latProfileName": "Nombre del perfil",
"settings_cyr2latProfileNameEmpty": "El nombre del perfil no puede estar vacío",
"settings_cyr2latProfileAdded": "Perfil añadido correctamente",
"settings_cyr2latProfileUpdated": "Perfil actualizado correctamente",
"settings_cyr2latProfileEdit": "Editar perfil Cyr2Lat",
"settings_cyr2latProfileDelete": "Eliminar perfil Cyr2Lat",
"settings_cyr2latProfileDeleted": "Perfil eliminado correctamente",
"settings_cyr2latProfileDeleteDscr": "¿Está seguro de que desea eliminar el perfil \"{name}\"?",
"channels_channelUpdated": "Canal \"{name}\" actualizado",
"@channels_channelUpdated": {
"placeholders": {
@@ -1960,6 +1966,13 @@
"contact_teleBaseSubtitle": "Permitir el intercambio de nivel de batería y telemetría básica",
"contact_teleEnv": "Entorno de Telemetría",
"contact_teleEnvSubtitle": "Permitir el intercambio de datos de sensores de entorno",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_initialRouteWeight": "Peso inicial de la ruta",
"appSettings_maxRouteWeight": "Peso máximo permitido para la ruta",
"appSettings_initialRouteWeightSubtitle": "Peso inicial para rutas recién descubiertas",
@@ -1972,6 +1985,7 @@
"appSettings_maxMessageRetriesSubtitle": "Número de intentos de reintento antes de marcar un mensaje como fallido.",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Modo de telemetría actualizado",
"settings_multiAck": "Multi-ACKs: {value}",
"map_showOverlaps": "Superposiciones de tecla repetidora",
"map_runTraceWithReturnPath": "Volver atrás por el mismo camino.",
"@radioStats_noiseFloor": {
@@ -2103,6 +2117,5 @@
"repeater_guest": "Información sobre repetidores",
"chat_sendMessage": "Enviar mensaje",
"repeater_guestTools": "Herramientas para invitados",
"room_guest": "Información del servidor",
"settings_multiAck": "Múltiples respuestas de confirmación"
"room_guest": "Información del servidor"
}
+18 -5
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading" : "Liste des remplacements",
"channels_cyr2latSettingsDscr" : "Modifier la configuration JSON des remplacements de caractères",
"channels_cyr2latSettingsDialogHint": "Tableau de remplacement JSON",
"channels_cyr2latSettingsDialogSuccess": "Liste de remplacement mise à jour",
"channels_cyr2latSettingsDialogWrongJSON": "JSON incorrect : {error}",
"channels_cyr2latSettingsDialogReset": "Réinitialiser les paramètres par défaut",
"channels_cyr2latSettingsDialogResetted": "Les paramètres de remplacement Cyr2Lat ont été réinitialisés aux valeurs par défaut",
"settings_cyr2latProfileAdd" : "Ajouter un profil Cyr2Lat",
"settings_cyr2latProfileName" : "Nom du profil",
"settings_cyr2latProfileNameEmpty" : "Le nom du profil ne peut pas être vide",
"settings_cyr2latProfileAdded": "Profil ajouté avec succès",
"settings_cyr2latProfileUpdated": "Profil mis à jour avec succès",
"settings_cyr2latProfileEdit": "Modifier le profil Cyr2Lat",
"settings_cyr2latProfileDelete" : "Supprimer le profil Cyr2Lat",
"settings_cyr2latProfileDeleted" : "Profil supprimé avec succès",
"settings_cyr2latProfileDeleteDscr" : "Êtes-vous sûr de vouloir supprimer le profil \"{name}\"?",
"channels_channelUpdated": "Le canal \"{name}\" a été mis à jour",
"@channels_channelUpdated": {
"placeholders": {
@@ -1932,6 +1938,13 @@
"contact_lastSeen": "Dernière fois vu",
"contact_clearChat": "Effacer la conversation",
"contact_teleBaseSubtitle": "Autoriser le partage du niveau de batterie et de la télémétrie de base",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_maxRouteWeightSubtitle": "Poids maximal qu'un itinéraire peut accumuler grâce à des livraisons réussies.",
"appSettings_initialRouteWeight": "Poids initial de l'itinéraire",
"appSettings_maxRouteWeight": "Poids maximal autorisé pour le trajet",
@@ -1943,6 +1956,7 @@
"appSettings_maxMessageRetries": "Nombre maximal de tentatives de récupération de messages",
"appSettings_maxMessageRetriesSubtitle": "Nombre de tentatives de relance avant de marquer un message comme ayant échoué.",
"path_routeWeight": "{weight}/{max}",
"settings_multiAck": "Multi-ACKs : {value}",
"settings_telemetryModeUpdated": "Le mode télémétrie a été mis à jour",
"map_showOverlaps": "Chevauchement de la touche répétitive",
"map_runTraceWithReturnPath": "Revenir sur le même chemin.",
@@ -2075,6 +2089,5 @@
"repeater_guestTools": "Outils pour les invités",
"chat_sendMessage": "Envoyer un message",
"room_guest": "Informations sur le serveur",
"repeater_guest": "Informations sur les répéteurs",
"settings_multiAck": "Plusieurs accusés de réception"
"repeater_guest": "Informations sur les répéteurs"
}
+18 -5
View File
@@ -554,10 +554,16 @@
"channels_cyr2latSettingsSubheading": "Helyettesítési lista",
"channels_cyr2latSettingsDscr": "A karakterhelyettesítési JSON-konfiguráció szerkesztése",
"channels_cyr2latSettingsDialogHint": "JSON-csere táblázat",
"channels_cyr2latSettingsDialogSuccess": "A csere lista frissítve",
"channels_cyr2latSettingsDialogWrongJSON": "Hibás JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Alapértelmezett értékekre állítás",
"channels_cyr2latSettingsDialogResetted": "A Cyr2Lat helyettesítési beállítások alapértelmezett értékekre lettek állítva",
"settings_cyr2latProfileAdd": "Cyr2Lat-profil hozzáadása",
"settings_cyr2latProfileName": "Profil neve",
"settings_cyr2latProfileNameEmpty": "A profil neve nem lehet üres",
"settings_cyr2latProfileAdded": "A profil hozzáadása sikeres",
"settings_cyr2latProfileUpdated": "A profil frissítése sikeres",
"settings_cyr2latProfileEdit": "Cyr2Lat profil szerkesztése",
"settings_cyr2latProfileDelete": "Cyr2Lat profil törlése",
"settings_cyr2latProfileDeleted": "A profil törlése sikeresen megtörtént",
"settings_cyr2latProfileDeleteDscr": "Biztosan törölni szeretné a \"{name}\" profilt?",
"channels_channelUpdated": "A {name} csatorna frissítve",
"@channels_channelUpdated": {
"placeholders": {
@@ -2022,6 +2028,13 @@
"radioStats_stripWaiting": "Rádió adatok begyűjtése…",
"radioStats_settingsTile": "Rádió statisztikák",
"radioStats_settingsSubtitle": "Háttérzaj, RSSI, zaj-sűrűség, és a használat időtartama",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settings_denyAll": "Elutasítom",
"settings_privacySettingsDescription": "Válassza ki, hogy az eszközének melyik információkat oszt meg másokkal.",
"settings_privacySubtitle": "Ellenőrizd, hogy milyen információkat osztanak meg.",
@@ -2033,6 +2046,7 @@
"settings_telemetryEnvironmentMode": "Adatkapcsolati környezeti mód",
"settings_advertLocation": "Reklám megjelenési hely",
"settings_advertLocationSubtitle": "A hirdetés tartalmazza a helyszínt.",
"settings_multiAck": "Többszöri visszaigazolások: {value}",
"settings_telemetryModeUpdated": "A telemetriamód frissítve",
"contact_info": "Kapcsolattartási információk",
"contact_settings": "Kapcsolat beállítások",
@@ -2113,6 +2127,5 @@
"repeater_guestTools": "Vendégek számára elérhető eszközök",
"room_guest": "Szoba szerver információk",
"chat_sendMessage": "Üzenet küldése",
"repeater_guest": "Adatok a repeaterről",
"settings_multiAck": "Többszörös visszaigazolások"
"repeater_guest": "Adatok a repeaterről"
}
+18 -5
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Elenco delle sostituzioni",
"channels_cyr2latSettingsDscr": "Modifica la configurazione JSON delle sostituzioni dei caratteri",
"channels_cyr2latSettingsDialogHint": "Mappa JSON delle sostituzioni",
"channels_cyr2latSettingsDialogSuccess": "Elenco delle sostituzioni aggiornato",
"channels_cyr2latSettingsDialogWrongJSON": "JSON non corretto: {error}",
"channels_cyr2latSettingsDialogReset": "Ripristina impostazioni predefinite",
"channels_cyr2latSettingsDialogResetted": "Le impostazioni di sostituzione Cyr2Lat sono state ripristinate alle impostazioni predefinite",
"settings_cyr2latProfileAdd": "Aggiungi profilo Cyr2Lat",
"settings_cyr2latProfileName": "Nome profilo",
"settings_cyr2latProfileNameEmpty": "Il nome del profilo non può essere vuoto",
"settings_cyr2latProfileAdded": "Profilo aggiunto con successo",
"settings_cyr2latProfileUpdated": "Profilo aggiornato con successo",
"settings_cyr2latProfileEdit": "Modifica profilo Cyr2Lat",
"settings_cyr2latProfileDelete": "Elimina profilo Cyr2Lat",
"settings_cyr2latProfileDeleted": "Profilo eliminato con successo",
"settings_cyr2latProfileDeleteDscr": "Sei sicuro di voler eliminare il profilo \"{name}\"?",
"channels_channelUpdated": "Canale \"{name}\" aggiornato",
"@channels_channelUpdated": {
"placeholders": {
@@ -1932,6 +1938,13 @@
"contact_teleBaseSubtitle": "Consenti la condivisione del livello della batteria e della telemetria di base",
"contact_teleEnvSubtitle": "Consenti la condivisione dei dati del sensore ambientale",
"contact_teleEnv": "Ambiente di telemetria",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_initialRouteWeight": "Peso iniziale del percorso",
"appSettings_initialRouteWeightSubtitle": "Peso di partenza per nuovi percorsi",
"appSettings_maxRouteWeightSubtitle": "Il peso massimo che un percorso può accumulare grazie a consegne di successo.",
@@ -1944,6 +1957,7 @@
"appSettings_maxMessageRetriesSubtitle": "Numero di tentativi di riprova prima di considerare un messaggio come fallito.",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Modalità telemetria aggiornata",
"settings_multiAck": "Multi-ACKs: {value}",
"map_showOverlaps": "Sovrapposizioni della chiave ripetitore",
"map_runTraceWithReturnPath": "Tornare indietro sullo stesso percorso",
"@radioStats_noiseFloor": {
@@ -2075,6 +2089,5 @@
"repeater_guest": "Informazioni sul ripetitore",
"repeater_guestTools": "Strumenti per gli ospiti",
"chat_sendMessage": "Invia messaggio",
"room_guest": "Informazioni sul server",
"settings_multiAck": "ACK multipli"
"room_guest": "Informazioni sul server"
}
+18 -5
View File
@@ -554,10 +554,16 @@
"channels_cyr2latSettingsSubheading": "置換リスト",
"channels_cyr2latSettingsDscr": "文字置換のJSON設定を編集する",
"channels_cyr2latSettingsDialogHint": "JSON置換マップ",
"channels_cyr2latSettingsDialogSuccess": "置換リストが更新されました",
"channels_cyr2latSettingsDialogWrongJSON": "不正なJSON: {error}",
"channels_cyr2latSettingsDialogReset": "初期設定に戻す",
"channels_cyr2latSettingsDialogResetted": "cyr2latの置換設定が初期設定に戻されました",
"settings_cyr2latProfileAdd": "Cyr2Latプロファイルの追加",
"settings_cyr2latProfileName": "プロファイル名",
"settings_cyr2latProfileNameEmpty": "プロファイル名は空にできません",
"settings_cyr2latProfileAdded": "プロファイルが正常に追加されました",
"settings_cyr2latProfileUpdated": "プロファイルの更新に成功しました",
"settings_cyr2latProfileEdit": "Cyr2Latプロファイルを編集",
"settings_cyr2latProfileDelete": "Cyr2Latプロファイルを削除",
"settings_cyr2latProfileDeleted": "プロファイルの削除に成功しました",
"settings_cyr2latProfileDeleteDscr": "プロファイル \"{name}\" を削除してもよろしいですか?",
"channels_channelUpdated": "チャンネル「{name}」が更新されました",
"@channels_channelUpdated": {
"placeholders": {
@@ -2022,6 +2028,13 @@
"radioStats_stripWaiting": "ラジオの統計情報を取得中…",
"radioStats_settingsTile": "ラジオの統計",
"radioStats_settingsSubtitle": "ノイズレベル、RSSI、SNR、および通信時間",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settings_privacy": "プライバシー設定",
"settings_privacySubtitle": "共有する情報の内容を管理する。",
"settings_denyAll": "すべてを否定",
@@ -2033,6 +2046,7 @@
"settings_telemetryEnvironmentMode": "テレメトリ環境モード",
"settings_advertLocation": "広告掲載場所",
"settings_advertLocationSubtitle": "広告に場所を記載してください。",
"settings_multiAck": "複数のACK{value}",
"settings_telemetryModeUpdated": "テレメトリモードが更新されました",
"contact_info": "連絡先",
"contact_settings": "連絡設定",
@@ -2113,6 +2127,5 @@
"room_guest": "ルームサーバーに関する情報",
"chat_sendMessage": "メッセージを送信する",
"repeater_guest": "繰り返し送信に関する情報",
"repeater_guestTools": "ゲスト向けツール",
"settings_multiAck": "複数のACK(応答)"
"repeater_guestTools": "ゲスト向けツール"
}
+18 -5
View File
@@ -554,10 +554,16 @@
"channels_cyr2latSettingsSubheading": "변환 목록",
"channels_cyr2latSettingsDscr": "문자 변환 JSON 구성 편집",
"channels_cyr2latSettingsDialogHint": "JSON 변환 맵",
"channels_cyr2latSettingsDialogSuccess": "변환 목록이 업데이트되었습니다",
"channels_cyr2latSettingsDialogWrongJSON": "잘못된 JSON: {error}",
"channels_cyr2latSettingsDialogReset": "초기값으로 초기화",
"channels_cyr2latSettingsDialogResetted": "Cyr2Lat 변환 설정이 초기값으로 초기화되었습니다",
"settings_cyr2latProfileAdd": "Cyr2Lat 프로필 추가",
"settings_cyr2latProfileName": "프로필 이름",
"settings_cyr2latProfileNameEmpty": "프로필 이름은 비워둘 수 없습니다",
"settings_cyr2latProfileAdded": "프로필이 성공적으로 추가되었습니다",
"settings_cyr2latProfileUpdated": "프로필이 성공적으로 업데이트되었습니다",
"settings_cyr2latProfileEdit": "Cyr2Lat 프로필 편집",
"settings_cyr2latProfileDelete": "Cyr2Lat 프로필 삭제",
"settings_cyr2latProfileDeleted": "프로필이 성공적으로 삭제되었습니다",
"settings_cyr2latProfileDeleteDscr": "\"{name}\" 프로필을 삭제하시겠습니까?",
"channels_channelUpdated": "채널 \"{name}\"이 업데이트되었습니다.",
"@channels_channelUpdated": {
"placeholders": {
@@ -2022,6 +2028,13 @@
"radioStats_stripWaiting": "라디오 통계 가져오기…",
"radioStats_settingsTile": "라디오 통계",
"radioStats_settingsSubtitle": "잡음 수준, RSSI, 신호 대 잡음비, 통신 시간",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settings_privacy": "개인 정보 설정",
"settings_privacySubtitle": "어떤 정보를 공유할지 통제하세요.",
"settings_privacySettingsDescription": "어떤 정보를 기기가 다른 사람들과 공유할지 선택하세요.",
@@ -2033,6 +2046,7 @@
"settings_telemetryEnvironmentMode": "텔레메트리 환경 모드",
"settings_advertLocation": "광고 위치",
"settings_advertLocationSubtitle": "광고에 위치 정보를 포함하세요.",
"settings_multiAck": "다중 ACK: {value}",
"settings_telemetryModeUpdated": "텔레메트리 모드 업데이트 완료",
"contact_info": "연락처",
"contact_settings": "연락처 설정",
@@ -2113,6 +2127,5 @@
"repeater_guestTools": "손님용 도구",
"chat_sendMessage": "메시지를 보내기",
"repeater_guest": "반복 장비 정보",
"room_guest": "서버 정보",
"settings_multiAck": "다중 ACK"
"room_guest": "서버 정보"
}
+56 -20
View File
@@ -901,8 +901,8 @@ abstract class AppLocalizations {
/// No description provided for @settings_multiAck.
///
/// In en, this message translates to:
/// **'Multi-ACKs'**
String get settings_multiAck;
/// **'Multi-ACKs: {value}'**
String settings_multiAck(String value);
/// No description provided for @settings_telemetryModeUpdated.
///
@@ -2212,36 +2212,72 @@ abstract class AppLocalizations {
/// **'JSON replacement map'**
String get channels_cyr2latSettingsDialogHint;
/// No description provided for @channels_cyr2latSettingsDialogSuccess.
///
/// In en, this message translates to:
/// **'The list of replacements has been updated'**
String get channels_cyr2latSettingsDialogSuccess;
/// No description provided for @channels_cyr2latSettingsDialogWrongJSON.
///
/// In en, this message translates to:
/// **'Invalid JSON: {error}'**
String channels_cyr2latSettingsDialogWrongJSON(Object error);
/// No description provided for @channels_cyr2latSettingsDialogReset.
///
/// In en, this message translates to:
/// **'Reset to default'**
String get channels_cyr2latSettingsDialogReset;
/// No description provided for @channels_cyr2latSettingsDialogResetted.
///
/// In en, this message translates to:
/// **'Cyr2Lat replacement settings reset to default'**
String get channels_cyr2latSettingsDialogResetted;
/// No description provided for @channels_channelUpdated.
///
/// In en, this message translates to:
/// **'Channel \"{name}\" updated'**
String channels_channelUpdated(String name);
/// No description provided for @settings_cyr2latProfileAdd.
///
/// In en, this message translates to:
/// **'Add Cyr2Lat Profile'**
String get settings_cyr2latProfileAdd;
/// No description provided for @settings_cyr2latProfileName.
///
/// In en, this message translates to:
/// **'Profile Name'**
String get settings_cyr2latProfileName;
/// No description provided for @settings_cyr2latProfileNameEmpty.
///
/// In en, this message translates to:
/// **'Profile name cannot be empty'**
String get settings_cyr2latProfileNameEmpty;
/// No description provided for @settings_cyr2latProfileAdded.
///
/// In en, this message translates to:
/// **'Profile added successfully'**
String get settings_cyr2latProfileAdded;
/// No description provided for @settings_cyr2latProfileUpdated.
///
/// In en, this message translates to:
/// **'Profile updated successfully'**
String get settings_cyr2latProfileUpdated;
/// No description provided for @settings_cyr2latProfileEdit.
///
/// In en, this message translates to:
/// **'Edit Cyr2Lat Profile'**
String get settings_cyr2latProfileEdit;
/// No description provided for @settings_cyr2latProfileDelete.
///
/// In en, this message translates to:
/// **'Delete Cyr2Lat Profile'**
String get settings_cyr2latProfileDelete;
/// No description provided for @settings_cyr2latProfileDeleted.
///
/// In en, this message translates to:
/// **'Profile deleted successfully'**
String get settings_cyr2latProfileDeleted;
/// No description provided for @settings_cyr2latProfileDeleteDscr.
///
/// In en, this message translates to:
/// **'Are you sure you want to delete the profile \"{name}\"?'**
String settings_cyr2latProfileDeleteDscr(String name);
/// No description provided for @channels_publicChannelAdded.
///
/// In en, this message translates to:
+34 -13
View File
@@ -437,7 +437,9 @@ class AppLocalizationsBg extends AppLocalizations {
'Включи местоположение в обявата';
@override
String get settings_multiAck => 'Множество потвърждения';
String settings_multiAck(String value) {
return 'Мулти-потвърди: $value';
}
@override
String get settings_telemetryModeUpdated => 'Режим на телеметрията е обновен';
@@ -1192,28 +1194,47 @@ class AppLocalizationsBg extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON карта за замествания';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Списъкът със замествания е актуализиран';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Неправилен JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Възстановяване на първоначалните настройки';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Настройките за заместване на Cyr2Lat са възстановени към първоначалните';
@override
String channels_channelUpdated(String name) {
return 'Каналът \"$name\" е актуализиран';
}
@override
String get settings_cyr2latProfileAdd => 'Добавяне на профил Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Име на профила';
@override
String get settings_cyr2latProfileNameEmpty =>
'Името на профила не може да бъде празно';
@override
String get settings_cyr2latProfileAdded => 'Профилът е добавен успешно';
@override
String get settings_cyr2latProfileUpdated =>
'Профилът е актуализиран успешно';
@override
String get settings_cyr2latProfileEdit => 'Редактиране на Cyr2Lat профил';
@override
String get settings_cyr2latProfileDelete => 'Изтриване на профил Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Профилът беше изтрит успешно';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Сигурен ли сте, че искате да изтриете профила \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Публичен канал добавен';
+34 -12
View File
@@ -435,7 +435,9 @@ class AppLocalizationsDe extends AppLocalizations {
'Ort in der Anzeige einbeziehen';
@override
String get settings_multiAck => 'Mehrere Bestätigungen';
String settings_multiAck(String value) {
return 'Mehrfach-Bestätigungen: $value';
}
@override
String get settings_telemetryModeUpdated => 'Telemetriemodus aktualisiert';
@@ -1188,27 +1190,47 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON-Ersetzungstabelle';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Ersetzungsliste aktualisiert';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Ungültiges JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset => 'Auf Standard zurücksetzen';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Die Cyr2Lat-Ersetzungseinstellungen wurden auf die Standardeinstellungen zurückgesetzt';
@override
String channels_channelUpdated(String name) {
return 'Kanal \"$name\" aktualisiert';
}
@override
String get settings_cyr2latProfileAdd => 'Cyr2Lat-Profil hinzufügen';
@override
String get settings_cyr2latProfileName => 'Profilname';
@override
String get settings_cyr2latProfileNameEmpty =>
'Der Profilname darf nicht leer sein';
@override
String get settings_cyr2latProfileAdded => 'Profil erfolgreich hinzugefügt';
@override
String get settings_cyr2latProfileUpdated =>
'Profil erfolgreich aktualisiert';
@override
String get settings_cyr2latProfileEdit => 'Cyr2Lat-Profil bearbeiten';
@override
String get settings_cyr2latProfileDelete => 'Cyr2Lat-Profil löschen';
@override
String get settings_cyr2latProfileDeleted => 'Profil erfolgreich gelöscht';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Möchten Sie das Profil \"$name\" wirklich löschen?';
}
@override
String get channels_publicChannelAdded => 'Öffentlicher Kanal hinzugefügt';
+32 -12
View File
@@ -427,7 +427,9 @@ class AppLocalizationsEn extends AppLocalizations {
String get settings_advertLocationSubtitle => 'Include location in advert.';
@override
String get settings_multiAck => 'Multi-ACKs';
String settings_multiAck(String value) {
return 'Multi-ACKs: $value';
}
@override
String get settings_telemetryModeUpdated => 'Telemetry mode updated';
@@ -1168,27 +1170,45 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON replacement map';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'The list of replacements has been updated';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Invalid JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset => 'Reset to default';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Cyr2Lat replacement settings reset to default';
@override
String channels_channelUpdated(String name) {
return 'Channel \"$name\" updated';
}
@override
String get settings_cyr2latProfileAdd => 'Add Cyr2Lat Profile';
@override
String get settings_cyr2latProfileName => 'Profile Name';
@override
String get settings_cyr2latProfileNameEmpty => 'Profile name cannot be empty';
@override
String get settings_cyr2latProfileAdded => 'Profile added successfully';
@override
String get settings_cyr2latProfileUpdated => 'Profile updated successfully';
@override
String get settings_cyr2latProfileEdit => 'Edit Cyr2Lat Profile';
@override
String get settings_cyr2latProfileDelete => 'Delete Cyr2Lat Profile';
@override
String get settings_cyr2latProfileDeleted => 'Profile deleted successfully';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Are you sure you want to delete the profile \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Public channel added';
+34 -13
View File
@@ -434,7 +434,9 @@ class AppLocalizationsEs extends AppLocalizations {
String get settings_advertLocationSubtitle => 'Incluir ubicación en anuncio';
@override
String get settings_multiAck => 'Múltiples respuestas de confirmación';
String settings_multiAck(String value) {
return 'Multi-ACKs: $value';
}
@override
String get settings_telemetryModeUpdated => 'Modo de telemetría actualizado';
@@ -1190,28 +1192,47 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'Mapa JSON de sustituciones';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Lista de sustituciones actualizada';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'JSON incorrecto: $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Restablecer valores predeterminados';
@override
String get channels_cyr2latSettingsDialogResetted =>
'La configuración de sustituciones de Cyr2Lat se ha restablecido a los valores predeterminados';
@override
String channels_channelUpdated(String name) {
return 'Canal \"$name\" actualizado';
}
@override
String get settings_cyr2latProfileAdd => 'Añadir perfil Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Nombre del perfil';
@override
String get settings_cyr2latProfileNameEmpty =>
'El nombre del perfil no puede estar vacío';
@override
String get settings_cyr2latProfileAdded => 'Perfil añadido correctamente';
@override
String get settings_cyr2latProfileUpdated =>
'Perfil actualizado correctamente';
@override
String get settings_cyr2latProfileEdit => 'Editar perfil Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Eliminar perfil Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Perfil eliminado correctamente';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return '¿Está seguro de que desea eliminar el perfil \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Canal público añadido';
+33 -13
View File
@@ -438,7 +438,9 @@ class AppLocalizationsFr extends AppLocalizations {
'Inclure l\'emplacement dans l\'annonce';
@override
String get settings_multiAck => 'Plusieurs accusés de réception';
String settings_multiAck(String value) {
return 'Multi-ACKs : $value';
}
@override
String get settings_telemetryModeUpdated =>
@@ -1196,28 +1198,46 @@ class AppLocalizationsFr extends AppLocalizations {
String get channels_cyr2latSettingsDialogHint =>
'Tableau de remplacement JSON';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Liste de remplacement mise à jour';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'JSON incorrect : $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Réinitialiser les paramètres par défaut';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Les paramètres de remplacement Cyr2Lat ont été réinitialisés aux valeurs par défaut';
@override
String channels_channelUpdated(String name) {
return 'Le canal \"$name\" a été mis à jour';
}
@override
String get settings_cyr2latProfileAdd => 'Ajouter un profil Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Nom du profil';
@override
String get settings_cyr2latProfileNameEmpty =>
'Le nom du profil ne peut pas être vide';
@override
String get settings_cyr2latProfileAdded => 'Profil ajouté avec succès';
@override
String get settings_cyr2latProfileUpdated => 'Profil mis à jour avec succès';
@override
String get settings_cyr2latProfileEdit => 'Modifier le profil Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Supprimer le profil Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Profil supprimé avec succès';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Êtes-vous sûr de vouloir supprimer le profil \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Le canal public a été ajouté';
+33 -12
View File
@@ -437,7 +437,9 @@ class AppLocalizationsHu extends AppLocalizations {
'A hirdetés tartalmazza a helyszínt.';
@override
String get settings_multiAck => 'Többszörös visszaigazolások';
String settings_multiAck(String value) {
return 'Többszöri visszaigazolások: $value';
}
@override
String get settings_telemetryModeUpdated => 'A telemetriamód frissítve';
@@ -1195,27 +1197,46 @@ class AppLocalizationsHu extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON-csere táblázat';
@override
String get channels_cyr2latSettingsDialogSuccess => 'A csere lista frissítve';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Hibás JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Alapértelmezett értékekre állítás';
@override
String get channels_cyr2latSettingsDialogResetted =>
'A Cyr2Lat helyettesítési beállítások alapértelmezett értékekre lettek állítva';
@override
String channels_channelUpdated(String name) {
return 'A $name csatorna frissítve';
}
@override
String get settings_cyr2latProfileAdd => 'Cyr2Lat-profil hozzáadása';
@override
String get settings_cyr2latProfileName => 'Profil neve';
@override
String get settings_cyr2latProfileNameEmpty => 'A profil neve nem lehet üres';
@override
String get settings_cyr2latProfileAdded => 'A profil hozzáadása sikeres';
@override
String get settings_cyr2latProfileUpdated => 'A profil frissítése sikeres';
@override
String get settings_cyr2latProfileEdit => 'Cyr2Lat profil szerkesztése';
@override
String get settings_cyr2latProfileDelete => 'Cyr2Lat profil törlése';
@override
String get settings_cyr2latProfileDeleted =>
'A profil törlése sikeresen megtörtént';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Biztosan törölni szeretné a \"$name\" profilt?';
}
@override
String get channels_publicChannelAdded => 'A nyilvános csatorna hozzáadva';
+34 -13
View File
@@ -437,7 +437,9 @@ class AppLocalizationsIt extends AppLocalizations {
'Includi la posizione nell\'annuncio';
@override
String get settings_multiAck => 'ACK multipli';
String settings_multiAck(String value) {
return 'Multi-ACKs: $value';
}
@override
String get settings_telemetryModeUpdated => 'Modalità telemetria aggiornata';
@@ -1192,28 +1194,47 @@ class AppLocalizationsIt extends AppLocalizations {
String get channels_cyr2latSettingsDialogHint =>
'Mappa JSON delle sostituzioni';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Elenco delle sostituzioni aggiornato';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'JSON non corretto: $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Ripristina impostazioni predefinite';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Le impostazioni di sostituzione Cyr2Lat sono state ripristinate alle impostazioni predefinite';
@override
String channels_channelUpdated(String name) {
return 'Canale \"$name\" aggiornato';
}
@override
String get settings_cyr2latProfileAdd => 'Aggiungi profilo Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Nome profilo';
@override
String get settings_cyr2latProfileNameEmpty =>
'Il nome del profilo non può essere vuoto';
@override
String get settings_cyr2latProfileAdded => 'Profilo aggiunto con successo';
@override
String get settings_cyr2latProfileUpdated =>
'Profilo aggiornato con successo';
@override
String get settings_cyr2latProfileEdit => 'Modifica profilo Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Elimina profilo Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Profilo eliminato con successo';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Sei sicuro di voler eliminare il profilo \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Canale pubblico aggiunto';
+32 -11
View File
@@ -414,7 +414,9 @@ class AppLocalizationsJa extends AppLocalizations {
String get settings_advertLocationSubtitle => '広告に場所を記載してください。';
@override
String get settings_multiAck => '複数のACK(応答)';
String settings_multiAck(String value) {
return '複数のACK$value';
}
@override
String get settings_telemetryModeUpdated => 'テレメトリモードが更新されました';
@@ -1133,26 +1135,45 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON置換マップ';
@override
String get channels_cyr2latSettingsDialogSuccess => '置換リストが更新されました';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return '不正なJSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset => '初期設定に戻す';
@override
String get channels_cyr2latSettingsDialogResetted =>
'cyr2latの置換設定が初期設定に戻されました';
@override
String channels_channelUpdated(String name) {
return 'チャンネル「$name」が更新されました';
}
@override
String get settings_cyr2latProfileAdd => 'Cyr2Latプロファイルの追加';
@override
String get settings_cyr2latProfileName => 'プロファイル名';
@override
String get settings_cyr2latProfileNameEmpty => 'プロファイル名は空にできません';
@override
String get settings_cyr2latProfileAdded => 'プロファイルが正常に追加されました';
@override
String get settings_cyr2latProfileUpdated => 'プロファイルの更新に成功しました';
@override
String get settings_cyr2latProfileEdit => 'Cyr2Latプロファイルを編集';
@override
String get settings_cyr2latProfileDelete => 'Cyr2Latプロファイルを削除';
@override
String get settings_cyr2latProfileDeleted => 'プロファイルの削除に成功しました';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'プロファイル \"$name\" を削除してもよろしいですか?';
}
@override
String get channels_publicChannelAdded => 'パブリックチャンネルが追加されました';
+32 -11
View File
@@ -414,7 +414,9 @@ class AppLocalizationsKo extends AppLocalizations {
String get settings_advertLocationSubtitle => '광고에 위치 정보를 포함하세요.';
@override
String get settings_multiAck => '다중 ACK';
String settings_multiAck(String value) {
return '다중 ACK: $value';
}
@override
String get settings_telemetryModeUpdated => '텔레메트리 모드 업데이트 완료';
@@ -1128,26 +1130,45 @@ class AppLocalizationsKo extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON 변환 맵';
@override
String get channels_cyr2latSettingsDialogSuccess => '변환 목록이 업데이트되었습니다';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return '잘못된 JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset => '초기값으로 초기화';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Cyr2Lat 변환 설정이 초기값으로 초기화되었습니다';
@override
String channels_channelUpdated(String name) {
return '채널 \"$name\"이 업데이트되었습니다.';
}
@override
String get settings_cyr2latProfileAdd => 'Cyr2Lat 프로필 추가';
@override
String get settings_cyr2latProfileName => '프로필 이름';
@override
String get settings_cyr2latProfileNameEmpty => '프로필 이름은 비워둘 수 없습니다';
@override
String get settings_cyr2latProfileAdded => '프로필이 성공적으로 추가되었습니다';
@override
String get settings_cyr2latProfileUpdated => '프로필이 성공적으로 업데이트되었습니다';
@override
String get settings_cyr2latProfileEdit => 'Cyr2Lat 프로필 편집';
@override
String get settings_cyr2latProfileDelete => 'Cyr2Lat 프로필 삭제';
@override
String get settings_cyr2latProfileDeleted => '프로필이 성공적으로 삭제되었습니다';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return '\"$name\" 프로필을 삭제하시겠습니까?';
}
@override
String get channels_publicChannelAdded => '공개 채널 추가';
+33 -13
View File
@@ -432,7 +432,9 @@ class AppLocalizationsNl extends AppLocalizations {
'Locatie opnemen in advertentie';
@override
String get settings_multiAck => 'Meerdere bevestigingen';
String settings_multiAck(String value) {
return 'Multi-ACKs: $value';
}
@override
String get settings_telemetryModeUpdated => 'Telemetrie-modus bijgewerkt';
@@ -1179,28 +1181,46 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON-vervangingskaart';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Lijst met vervangingen bijgewerkt';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Onjuiste JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Terugzetten naar standaard';
@override
String get channels_cyr2latSettingsDialogResetted =>
'De instellingen voor Cyr2Lat-vervangingen zijn teruggezet naar de standaardinstellingen';
@override
String channels_channelUpdated(String name) {
return 'Kanaal \"$name\" is bijgewerkt';
}
@override
String get settings_cyr2latProfileAdd => 'Cyr2Lat-profiel toevoegen';
@override
String get settings_cyr2latProfileName => 'Profielnaam';
@override
String get settings_cyr2latProfileNameEmpty =>
'Profielnaam mag niet leeg zijn';
@override
String get settings_cyr2latProfileAdded => 'Profiel succesvol toegevoegd';
@override
String get settings_cyr2latProfileUpdated => 'Profiel succesvol bijgewerkt';
@override
String get settings_cyr2latProfileEdit => 'Cyr2Lat-profiel bewerken';
@override
String get settings_cyr2latProfileDelete => 'Cyr2Lat-profiel verwijderen';
@override
String get settings_cyr2latProfileDeleted => 'Profiel succesvol verwijderd';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Weet u zeker dat u het profiel \"$name\" wilt verwijderen?';
}
@override
String get channels_publicChannelAdded => 'Open kanaal toegevoegd';
+35 -13
View File
@@ -439,7 +439,9 @@ class AppLocalizationsPl extends AppLocalizations {
'Uwzględnij lokalizację w ogłoszeniu';
@override
String get settings_multiAck => 'Wielokrotne potwierdzenia odbioru';
String settings_multiAck(String value) {
return 'Wielokrotne ACK: $value';
}
@override
String get settings_telemetryModeUpdated =>
@@ -1199,28 +1201,48 @@ class AppLocalizationsPl extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'Mapa zamian JSON';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Lista zamian zaktualizowana';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Nieprawidłowy JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Przywróć ustawienia domyślne';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Ustawienia zamiany Cyr2Lat zostały przywrócone do wartości domyślnych';
@override
String channels_channelUpdated(String name) {
return 'Kanał \"$name\" został zaktualizowany';
}
@override
String get settings_cyr2latProfileAdd => 'Dodaj profil Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Nazwa profilu';
@override
String get settings_cyr2latProfileNameEmpty =>
'Nazwa profilu nie może być pusta';
@override
String get settings_cyr2latProfileAdded => 'Profil dodano pomyślnie';
@override
String get settings_cyr2latProfileUpdated =>
'Profil został pomyślnie zaktualizowany';
@override
String get settings_cyr2latProfileEdit => 'Edytuj profil Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Usuń profil Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted =>
'Profil został pomyślnie usunięty';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Czy na pewno chcesz usunąć profil \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Kanał publiczny dodany';
+33 -13
View File
@@ -436,7 +436,9 @@ class AppLocalizationsPt extends AppLocalizations {
'Incluir localização no anúncio';
@override
String get settings_multiAck => 'Multi-ACKs';
String settings_multiAck(String value) {
return 'Multi-ACKs: $value';
}
@override
String get settings_telemetryModeUpdated => 'Modo de telemetria atualizado';
@@ -1190,28 +1192,46 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'Mapa de substituições JSON';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Lista de substituições atualizada';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'JSON incorreto: $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Redefinir para os valores iniciais';
@override
String get channels_cyr2latSettingsDialogResetted =>
'As configurações de substituição Cyr2Lat foram redefinidas para os valores iniciais';
@override
String channels_channelUpdated(String name) {
return 'Canal \"$name\" atualizado';
}
@override
String get settings_cyr2latProfileAdd => 'Adicionar perfil Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Nome do perfil';
@override
String get settings_cyr2latProfileNameEmpty =>
'O nome do perfil não pode estar vazio';
@override
String get settings_cyr2latProfileAdded => 'Perfil adicionado com sucesso';
@override
String get settings_cyr2latProfileUpdated => 'Perfil atualizado com sucesso';
@override
String get settings_cyr2latProfileEdit => 'Editar perfil Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Eliminar perfil Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Perfil eliminado com sucesso';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Tem a certeza de que deseja eliminar o perfil \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Canal público adicionado';
+33 -11
View File
@@ -436,7 +436,9 @@ class AppLocalizationsRu extends AppLocalizations {
'Включить местоположение в объявление';
@override
String get settings_multiAck => 'Несколько подтверждений';
String settings_multiAck(String value) {
return 'Мульти-ACK: $value';
}
@override
String get settings_telemetryModeUpdated => 'Режим телеметрии обновлен';
@@ -1190,26 +1192,46 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON-карта замен';
@override
String get channels_cyr2latSettingsDialogSuccess => 'Список замен обновлён';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Некорректный JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset => 'Сбросить к начальным';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Настройки замен Cyr2Lat сброшены к начальным';
@override
String channels_channelUpdated(String name) {
return 'Канал \"$name\" обновлён';
}
@override
String get settings_cyr2latProfileAdd => 'Добавить профиль Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Название профиля';
@override
String get settings_cyr2latProfileNameEmpty =>
'Название профиля не может быть пустым';
@override
String get settings_cyr2latProfileAdded => 'Профиль добавлен';
@override
String get settings_cyr2latProfileUpdated => 'Профиль успешно обновлен';
@override
String get settings_cyr2latProfileEdit => 'Редактировать профиль Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Удалить профиль Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Профиль успешно удален';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Вы действительно хотите удалить профиль \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Публичный канал добавлен';
+34 -13
View File
@@ -430,7 +430,9 @@ class AppLocalizationsSk extends AppLocalizations {
String get settings_advertLocationSubtitle => 'Zahrnúť polohu do inzerátu';
@override
String get settings_multiAck => 'Viaceré ACK';
String settings_multiAck(String value) {
return 'Viaceré ACK: $value';
}
@override
String get settings_telemetryModeUpdated =>
@@ -1179,28 +1181,47 @@ class AppLocalizationsSk extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON mapa nahradení';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Zoznam nahradení bol aktualizovaný';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Nesprávny JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset =>
'Obnoviť predvolené nastavenia';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Nastavenia nahradzovania Cyr2Lat boli obnovené na predvolené';
@override
String channels_channelUpdated(String name) {
return 'Kanál \"$name\" bol aktualizovaný';
}
@override
String get settings_cyr2latProfileAdd => 'Pridať profil Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Názov profilu';
@override
String get settings_cyr2latProfileNameEmpty =>
'Názov profilu nesmie byť prázdny';
@override
String get settings_cyr2latProfileAdded => 'Profil bol úspešne pridaný';
@override
String get settings_cyr2latProfileUpdated =>
'Profil bol úspešne aktualizovaný';
@override
String get settings_cyr2latProfileEdit => 'Upraviť profil Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Odstrániť profil Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Profil bol úspešne odstránený';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Naozaj chcete odstrániť profil \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Veľký kanál pridaný';
+34 -12
View File
@@ -430,7 +430,9 @@ class AppLocalizationsSl extends AppLocalizations {
String get settings_advertLocationSubtitle => 'Vključi lokacijo v oglas.';
@override
String get settings_multiAck => 'Več potrdil';
String settings_multiAck(String value) {
return 'Večkratni potrditvi: $value';
}
@override
String get settings_telemetryModeUpdated => 'Način telemetrije posodobljen';
@@ -1177,27 +1179,47 @@ class AppLocalizationsSl extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON-tabela zamenjav';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Seznam zamenjav je posodobljen';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Nepravilen JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset => 'Ponastavi na privzete';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Nastavitve zamenjav Cyr2Lat so ponastavljene na privzete';
@override
String channels_channelUpdated(String name) {
return 'Kanal $name je bil posodobljen';
}
@override
String get settings_cyr2latProfileAdd => 'Dodaj profil Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Ime profila';
@override
String get settings_cyr2latProfileNameEmpty =>
'Ime profila ne sme biti prazno';
@override
String get settings_cyr2latProfileAdded => 'Profil je bil uspešno dodan';
@override
String get settings_cyr2latProfileUpdated =>
'Profil je bil uspešno posodobljen';
@override
String get settings_cyr2latProfileEdit => 'Uredi profil Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Izbriši profil Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Profil je bil uspešno izbrisan';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Ali res želite izbrisati profil \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'javna skupnost dodana';
+33 -12
View File
@@ -428,7 +428,9 @@ class AppLocalizationsSv extends AppLocalizations {
String get settings_advertLocationSubtitle => 'Inkludera plats i annonsen';
@override
String get settings_multiAck => 'Flera bekräftelser';
String settings_multiAck(String value) {
return 'Multi-ACKs: $value';
}
@override
String get settings_telemetryModeUpdated => 'Telemetri-läge uppdaterat';
@@ -1169,27 +1171,46 @@ class AppLocalizationsSv extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON-ersättningskarta';
@override
String get channels_cyr2latSettingsDialogSuccess =>
'Ersättningslistan har uppdaterats';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Felaktig JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset => 'Återställ till standard';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Inställningarna för Cyr2Lat-ersättningar har återställts till standard';
@override
String channels_channelUpdated(String name) {
return 'Kanalen \"$name\" har uppdaterats';
}
@override
String get settings_cyr2latProfileAdd => 'Lägg till Cyr2Lat-profil';
@override
String get settings_cyr2latProfileName => 'Profilnamn';
@override
String get settings_cyr2latProfileNameEmpty =>
'Profilnamnet får inte vara tomt';
@override
String get settings_cyr2latProfileAdded => 'Profilen har lagts till';
@override
String get settings_cyr2latProfileUpdated => 'Profilen har uppdaterats';
@override
String get settings_cyr2latProfileEdit => 'Redigera Cyr2Lat-profil';
@override
String get settings_cyr2latProfileDelete => 'Ta bort Cyr2Lat-profil';
@override
String get settings_cyr2latProfileDeleted => 'Profilen har tagits bort';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Är du säker på att du vill ta bort profilen \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Allmänt kanal tillagd';
+33 -11
View File
@@ -432,7 +432,9 @@ class AppLocalizationsUk extends AppLocalizations {
'Включити місце розташування в оголошення';
@override
String get settings_multiAck => 'Багато підтверджень';
String settings_multiAck(String value) {
return 'Багатократне підтвердження: $value';
}
@override
String get settings_telemetryModeUpdated => 'Режим телеметрії оновлено';
@@ -1184,26 +1186,46 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON-карта замін';
@override
String get channels_cyr2latSettingsDialogSuccess => 'Список замін оновлено';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'Некоректний JSON: $error';
}
@override
String get channels_cyr2latSettingsDialogReset => 'Скинути до початкових';
@override
String get channels_cyr2latSettingsDialogResetted =>
'Налаштування замін Cyr2Lat скинуто до початкових';
@override
String channels_channelUpdated(String name) {
return 'Канал «$name» оновлено';
}
@override
String get settings_cyr2latProfileAdd => 'Додати профіль Cyr2Lat';
@override
String get settings_cyr2latProfileName => 'Назва профілю';
@override
String get settings_cyr2latProfileNameEmpty =>
'Назва профілю не може бути порожньою';
@override
String get settings_cyr2latProfileAdded => 'Профіль успішно додано';
@override
String get settings_cyr2latProfileUpdated => 'Профіль успішно оновлено';
@override
String get settings_cyr2latProfileEdit => 'Редагувати профіль Cyr2Lat';
@override
String get settings_cyr2latProfileDelete => 'Видалити профіль Cyr2Lat';
@override
String get settings_cyr2latProfileDeleted => 'Профіль успішно видалено';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return 'Ви впевнені, що хочете видалити профіль \"$name\"?';
}
@override
String get channels_publicChannelAdded => 'Публічний канал додано';
+32 -10
View File
@@ -408,7 +408,9 @@ class AppLocalizationsZh extends AppLocalizations {
String get settings_advertLocationSubtitle => '在广告中包含位置';
@override
String get settings_multiAck => '多重ACK';
String settings_multiAck(String value) {
return '多重ACK$value';
}
@override
String get settings_telemetryModeUpdated => '遥测模式已更新';
@@ -1115,25 +1117,45 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get channels_cyr2latSettingsDialogHint => 'JSON 替換映射表';
@override
String get channels_cyr2latSettingsDialogSuccess => '替換清單已更新';
@override
String channels_cyr2latSettingsDialogWrongJSON(Object error) {
return 'JSON 格式錯誤:$error';
}
@override
String get channels_cyr2latSettingsDialogReset => '還原為預設值';
@override
String get channels_cyr2latSettingsDialogResetted => 'Cyr2Lat 替換設定已還原為預設值';
@override
String channels_channelUpdated(String name) {
return '频道 \"$name\" 已更新';
}
@override
String get settings_cyr2latProfileAdd => '新增 Cyr2Lat 設定檔';
@override
String get settings_cyr2latProfileName => '設定檔名稱';
@override
String get settings_cyr2latProfileNameEmpty => '設定檔名稱不能為空';
@override
String get settings_cyr2latProfileAdded => '設定檔已成功新增';
@override
String get settings_cyr2latProfileUpdated => '設定檔已成功更新';
@override
String get settings_cyr2latProfileEdit => '編輯 Cyr2Lat 設定檔';
@override
String get settings_cyr2latProfileDelete => '刪除 Cyr2Lat 設定檔';
@override
String get settings_cyr2latProfileDeleted => '設定檔已成功刪除';
@override
String settings_cyr2latProfileDeleteDscr(String name) {
return '您確定要刪除設定檔 \"$name\" 嗎?';
}
@override
String get channels_publicChannelAdded => '已添加公共频道';
+18 -5
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Lijst met vervangingen",
"channels_cyr2latSettingsDscr": "Bewerk de JSON-configuratie voor tekenvervanging",
"channels_cyr2latSettingsDialogHint": "JSON-vervangingskaart",
"channels_cyr2latSettingsDialogSuccess": "Lijst met vervangingen bijgewerkt",
"channels_cyr2latSettingsDialogWrongJSON": "Onjuiste JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Terugzetten naar standaard",
"channels_cyr2latSettingsDialogResetted": "De instellingen voor Cyr2Lat-vervangingen zijn teruggezet naar de standaardinstellingen",
"settings_cyr2latProfileAdd": "Cyr2Lat-profiel toevoegen",
"settings_cyr2latProfileName": "Profielnaam",
"settings_cyr2latProfileNameEmpty": "Profielnaam mag niet leeg zijn",
"settings_cyr2latProfileAdded": "Profiel succesvol toegevoegd",
"settings_cyr2latProfileUpdated": "Profiel succesvol bijgewerkt",
"settings_cyr2latProfileEdit": "Cyr2Lat-profiel bewerken",
"settings_cyr2latProfileDelete": "Cyr2Lat-profiel verwijderen",
"settings_cyr2latProfileDeleted": "Profiel succesvol verwijderd",
"settings_cyr2latProfileDeleteDscr": "Weet u zeker dat u het profiel \"{name}\" wilt verwijderen?",
"channels_channelUpdated": "Kanaal \"{name}\" is bijgewerkt",
"@channels_channelUpdated": {
"placeholders": {
@@ -1932,6 +1938,13 @@
"contact_lastSeen": "Laatst gezien",
"contact_clearChat": "Chat leegmaken",
"contact_teleBaseSubtitle": "Sta delen van batterij niveau en basis telemetrie toe",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_maxRouteWeightSubtitle": "Het maximale gewicht dat een route kan bereiken door succesvolle leveringen.",
"appSettings_initialRouteWeight": "เริ่มต้น gewicht van de route",
"appSettings_maxRouteWeight": "Maximale gewicht voor de route",
@@ -1944,6 +1957,7 @@
"appSettings_maxMessageRetriesSubtitle": "Aantal pogingen om een bericht opnieuw te versturen voordat het als mislukt wordt gemarkeerd",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Telemetrie-modus bijgewerkt",
"settings_multiAck": "Multi-ACKs: {value}",
"map_showOverlaps": "Herhalingssleutel overlapt",
"map_runTraceWithReturnPath": "Terugkeren op hetzelfde pad.",
"@radioStats_noiseFloor": {
@@ -2075,6 +2089,5 @@
"repeater_guestTools": "Gastenfuncties",
"room_guest": "Informatie over de server",
"chat_sendMessage": "Verzend bericht",
"repeater_guest": "Informatie over herhalingsapparatuur",
"settings_multiAck": "Meerdere bevestigingen"
"repeater_guest": "Informatie over herhalingsapparatuur"
}
+18 -5
View File
@@ -404,10 +404,16 @@
"channels_cyr2latSettingsSubheading": "Lista zamian",
"channels_cyr2latSettingsDscr": "Edytuj konfigurację JSON zamiany znaków",
"channels_cyr2latSettingsDialogHint": "Mapa zamian JSON",
"channels_cyr2latSettingsDialogSuccess": "Lista zamian zaktualizowana",
"channels_cyr2latSettingsDialogWrongJSON": "Nieprawidłowy JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Przywróć ustawienia domyślne",
"channels_cyr2latSettingsDialogResetted": "Ustawienia zamiany Cyr2Lat zostały przywrócone do wartości domyślnych",
"settings_cyr2latProfileAdd": "Dodaj profil Cyr2Lat",
"settings_cyr2latProfileName": "Nazwa profilu",
"settings_cyr2latProfileNameEmpty": "Nazwa profilu nie może być pusta",
"settings_cyr2latProfileAdded": "Profil dodano pomyślnie",
"settings_cyr2latProfileUpdated": "Profil został pomyślnie zaktualizowany",
"settings_cyr2latProfileEdit": "Edytuj profil Cyr2Lat",
"settings_cyr2latProfileDelete": "Usuń profil Cyr2Lat",
"settings_cyr2latProfileDeleted": "Profil został pomyślnie usunięty",
"settings_cyr2latProfileDeleteDscr": "Czy na pewno chcesz usunąć profil \"{name}\"?",
"channels_channelUpdated": "Kanał \"{name}\" został zaktualizowany",
"@channels_channelUpdated": {
"placeholders": {
@@ -1970,6 +1976,13 @@
"contact_settings": "Ustawienia kontaktowe",
"contact_lastSeen": "Ostatnio widziany",
"contact_teleBaseSubtitle": "Pozwól na udostępnianie poziomu naładowania baterii i podstawowych danych telemetrycznych",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_initialRouteWeight": "Początkowa waga trasy",
"appSettings_maxRouteWeight": "Maksymalny dopuszczalny ciężar pojazdu",
"appSettings_initialRouteWeightSubtitle": "Początkowa waga dla nowych, odkrytych ścieżek",
@@ -1982,6 +1995,7 @@
"appSettings_maxMessageRetriesSubtitle": "Liczba prób ponownego wysłania wiadomości przed oznaczaniem jej jako nieudanej",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Tryb telemetryczny zaktualizowany",
"settings_multiAck": "Wielokrotne ACK: {value}",
"map_showOverlaps": "Nakładające się klucze przekaźników",
"map_runTraceWithReturnPath": "Wróć tą samą ścieżką",
"@radioStats_noiseFloor": {
@@ -2113,6 +2127,5 @@
"chat_sendMessage": "Wyślij wiadomość",
"repeater_guestTools": "Narzędzia dla gości",
"repeater_guest": "Informacje dotyczące urządzenia powtarzającego",
"room_guest": "Informacje o serwerze",
"settings_multiAck": "Wielokrotne potwierdzenia odbioru"
"room_guest": "Informacje o serwerze"
}
+17 -4
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Lista de substituições",
"channels_cyr2latSettingsDscr": "Editar a configuração JSON de substituição de caracteres",
"channels_cyr2latSettingsDialogHint": "Mapa de substituições JSON",
"channels_cyr2latSettingsDialogSuccess": "Lista de substituições atualizada",
"channels_cyr2latSettingsDialogWrongJSON": "JSON incorreto: {error}",
"channels_cyr2latSettingsDialogReset": "Redefinir para os valores iniciais",
"channels_cyr2latSettingsDialogResetted": "As configurações de substituição Cyr2Lat foram redefinidas para os valores iniciais",
"settings_cyr2latProfileAdd": "Adicionar perfil Cyr2Lat",
"settings_cyr2latProfileName": "Nome do perfil",
"settings_cyr2latProfileNameEmpty": "O nome do perfil não pode estar vazio",
"settings_cyr2latProfileAdded": "Perfil adicionado com sucesso",
"settings_cyr2latProfileUpdated": "Perfil atualizado com sucesso",
"settings_cyr2latProfileEdit": "Editar perfil Cyr2Lat",
"settings_cyr2latProfileDelete": "Eliminar perfil Cyr2Lat",
"settings_cyr2latProfileDeleted": "Perfil eliminado com sucesso",
"settings_cyr2latProfileDeleteDscr": "Tem a certeza de que deseja eliminar o perfil \"{name}\"?",
"channels_channelUpdated": "Canal \"{name}\" atualizado",
"@channels_channelUpdated": {
"placeholders": {
@@ -1932,6 +1938,13 @@
"contact_telemetry": "Telemetria",
"contact_settings": "Configurações de Contato",
"contact_teleBaseSubtitle": "Permitir compartilhamento do nível da bateria e telemetria básica",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_initialRouteWeight": "Peso Inicial da Rota",
"appSettings_maxRouteWeight": "Peso Máximo da Rota",
"appSettings_maxRouteWeightSubtitle": "Peso máximo que um determinado percurso pode acumular com entregas bem-sucedidas.",
@@ -1944,7 +1957,7 @@
"appSettings_maxMessageRetriesSubtitle": "Número de tentativas de reenvio antes de classificar uma mensagem como falha.",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Modo de telemetria atualizado",
"settings_multiAck": "Multi-ACKs",
"settings_multiAck": "Multi-ACKs: {value}",
"map_showOverlaps": "Sobreposições da Chave Repeater",
"map_runTraceWithReturnPath": "Retornar ao mesmo caminho.",
"@radioStats_noiseFloor": {
+18 -5
View File
@@ -258,10 +258,16 @@
"channels_cyr2latSettingsSubheading": "Список замен",
"channels_cyr2latSettingsDscr": "Редактировать JSON-конфигурацию замены символов",
"channels_cyr2latSettingsDialogHint": "JSON-карта замен",
"channels_cyr2latSettingsDialogSuccess": "Список замен обновлён",
"channels_cyr2latSettingsDialogWrongJSON": "Некорректный JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Сбросить к начальным",
"channels_cyr2latSettingsDialogResetted": "Настройки замен Cyr2Lat сброшены к начальным",
"settings_cyr2latProfileAdd": "Добавить профиль Cyr2Lat",
"settings_cyr2latProfileName": "Название профиля",
"settings_cyr2latProfileNameEmpty": "Название профиля не может быть пустым",
"settings_cyr2latProfileAdded": "Профиль добавлен",
"settings_cyr2latProfileUpdated": "Профиль успешно обновлен",
"settings_cyr2latProfileEdit": "Редактировать профиль Cyr2Lat",
"settings_cyr2latProfileDelete": "Удалить профиль Cyr2Lat",
"settings_cyr2latProfileDeleted": "Профиль успешно удален",
"settings_cyr2latProfileDeleteDscr": "Вы действительно хотите удалить профиль \"{name}\"?",
"channels_channelUpdated": "Канал \"{name}\" обновлён",
"channels_publicChannelAdded": "Публичный канал добавлен",
"channels_sortBy": "Сортировка",
@@ -1172,6 +1178,13 @@
"contact_clearChat": "Очистить чат",
"contact_lastSeen": "Последний раз видели",
"contact_teleBaseSubtitle": "Разрешить обмен уровнем заряда батареи и базовой телеметрией",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_maxRouteWeight": "Максимальный допустимый вес маршрута",
"appSettings_maxRouteWeightSubtitle": "Максимальный вес, который может быть перевезён по определённому маршруту при успешных доставках.",
"appSettings_initialRouteWeightSubtitle": "Начальный вес для новых, только что открытых маршрутов",
@@ -1184,6 +1197,7 @@
"appSettings_maxMessageRetriesSubtitle": "Количество попыток повторной отправки сообщения перед тем, как пометить его как неудачное.",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Режим телеметрии обновлен",
"settings_multiAck": "Мульти-ACK: {value}",
"map_showOverlaps": "Перекрытия ключа повтора",
"map_runTraceWithReturnPath": "Вернуться обратно по тому же пути",
"@radioStats_noiseFloor": {
@@ -1315,6 +1329,5 @@
"chat_sendMessage": "Отправить сообщение",
"repeater_guest": "Информация о ретрансляторе",
"room_guest": "Информация о сервере",
"repeater_guestTools": "Инструменты для гостей",
"settings_multiAck": "Несколько подтверждений"
"repeater_guestTools": "Инструменты для гостей"
}
+17 -4
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Zoznam nahradení",
"channels_cyr2latSettingsDscr": "Upravte konfiguráciu JSON pre nahradenie znakov",
"channels_cyr2latSettingsDialogHint": "JSON mapa nahradení",
"channels_cyr2latSettingsDialogSuccess": "Zoznam nahradení bol aktualizovaný",
"channels_cyr2latSettingsDialogWrongJSON": "Nesprávny JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Obnoviť predvolené nastavenia",
"channels_cyr2latSettingsDialogResetted": "Nastavenia nahradzovania Cyr2Lat boli obnovené na predvolené",
"settings_cyr2latProfileAdd": "Pridať profil Cyr2Lat",
"settings_cyr2latProfileName": "Názov profilu",
"settings_cyr2latProfileNameEmpty": "Názov profilu nesmie byť prázdny",
"settings_cyr2latProfileAdded": "Profil bol úspešne pridaný",
"settings_cyr2latProfileUpdated": "Profil bol úspešne aktualizovaný",
"settings_cyr2latProfileEdit": "Upraviť profil Cyr2Lat",
"settings_cyr2latProfileDelete": "Odstrániť profil Cyr2Lat",
"settings_cyr2latProfileDeleted": "Profil bol úspešne odstránený",
"settings_cyr2latProfileDeleteDscr": "Naozaj chcete odstrániť profil \"{name}\"?",
"channels_channelUpdated": "Kanál \"{name}\" bol aktualizovaný",
"@channels_channelUpdated": {
"placeholders": {
@@ -1932,6 +1938,13 @@
"contact_lastSeen": "Naposledy videný",
"contact_teleBase": "Báza telemetrie",
"contact_teleEnvSubtitle": "Povoliť zdieľanie údajov senzorov prostredia",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_maxRouteWeightSubtitle": "Maximálna hmotnosť, ktorú môže trás prenášať vďaka úspešným zásielkam.",
"appSettings_initialRouteWeightSubtitle": "Počiatočná váha pre nové, objavené cesty",
"appSettings_initialRouteWeight": "Počiatočná váha trasy",
@@ -1944,7 +1957,7 @@
"appSettings_maxMessageRetriesSubtitle": "Počet pokusov o odošleť pred označením správy ako neúspešnej",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Režim telemetrie bol aktualizovaný",
"settings_multiAck": "Viaceré ACK",
"settings_multiAck": "Viaceré ACK: {value}",
"map_showOverlaps": "Prekrývanie opakovača kľúča",
"map_runTraceWithReturnPath": "Vráťte sa späť po tej istej ceste.",
"@radioStats_noiseFloor": {
+18 -5
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Seznam zamenjav",
"channels_cyr2latSettingsDscr": "Uredi JSON-konfiguracijo zamenjav znakov",
"channels_cyr2latSettingsDialogHint": "JSON-tabela zamenjav",
"channels_cyr2latSettingsDialogSuccess": "Seznam zamenjav je posodobljen",
"channels_cyr2latSettingsDialogWrongJSON": "Nepravilen JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Ponastavi na privzete",
"channels_cyr2latSettingsDialogResetted": "Nastavitve zamenjav Cyr2Lat so ponastavljene na privzete",
"settings_cyr2latProfileAdd": "Dodaj profil Cyr2Lat",
"settings_cyr2latProfileName": "Ime profila",
"settings_cyr2latProfileNameEmpty": "Ime profila ne sme biti prazno",
"settings_cyr2latProfileAdded": "Profil je bil uspešno dodan",
"settings_cyr2latProfileUpdated": "Profil je bil uspešno posodobljen",
"settings_cyr2latProfileEdit": "Uredi profil Cyr2Lat",
"settings_cyr2latProfileDelete": "Izbriši profil Cyr2Lat",
"settings_cyr2latProfileDeleted": "Profil je bil uspešno izbrisan",
"settings_cyr2latProfileDeleteDscr": "Ali res želite izbrisati profil \"{name}\"?",
"channels_channelUpdated": "Kanal {name} je bil posodobljen",
"@channels_channelUpdated": {
"placeholders": {
@@ -1932,6 +1938,13 @@
"contact_teleEnv": "Okolje telemetrije",
"contact_teleEnvSubtitle": "Dovoli deljenje podatkov okoljskih senzorjev",
"contact_teleLocSubtitle": "Dovoli deljenje podatkov o lokaciji",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_maxRouteWeightSubtitle": "Največja teža, ki jo lahko pot doseže s uspešnimi dostavnami.",
"appSettings_initialRouteWeight": "Izvirna teža poti",
"appSettings_initialRouteWeightSubtitle": "Izguba teže za nove, odkriti poti",
@@ -1943,6 +1956,7 @@
"appSettings_maxMessageRetries": "Najve število poskusov pošiljanja sporočil",
"appSettings_maxMessageRetriesSubtitle": "Število poskusov ponovnega poslanja, preden se sporočilo označuje kot neuspešno",
"path_routeWeight": "{weight}/{max}",
"settings_multiAck": "Večkratni potrditvi: {value}",
"settings_telemetryModeUpdated": "Način telemetrije posodobljen",
"map_showOverlaps": "Prekrivanje ključa ponovnega predvajanja",
"map_runTraceWithReturnPath": "Vrni se nazaj po isti poti.",
@@ -2075,6 +2089,5 @@
"repeater_guest": "Informacije o ponovljalniku",
"chat_sendMessage": "Pošlji sporočilo",
"room_guest": "Informacije o strežniku",
"repeater_guestTools": "Naložila za goste",
"settings_multiAck": "Več potrdil"
"repeater_guestTools": "Naložila za goste"
}
+18 -5
View File
@@ -394,10 +394,16 @@
"channels_cyr2latSettingsSubheading": "Ersättningslista",
"channels_cyr2latSettingsDscr": "Redigera JSON-konfigurationen för teckenersättning",
"channels_cyr2latSettingsDialogHint": "JSON-ersättningskarta",
"channels_cyr2latSettingsDialogSuccess": "Ersättningslistan har uppdaterats",
"channels_cyr2latSettingsDialogWrongJSON": "Felaktig JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Återställ till standard",
"channels_cyr2latSettingsDialogResetted": "Inställningarna för Cyr2Lat-ersättningar har återställts till standard",
"settings_cyr2latProfileAdd": "Lägg till Cyr2Lat-profil",
"settings_cyr2latProfileName": "Profilnamn",
"settings_cyr2latProfileNameEmpty": "Profilnamnet får inte vara tomt",
"settings_cyr2latProfileAdded": "Profilen har lagts till",
"settings_cyr2latProfileUpdated": "Profilen har uppdaterats",
"settings_cyr2latProfileEdit": "Redigera Cyr2Lat-profil",
"settings_cyr2latProfileDelete": "Ta bort Cyr2Lat-profil",
"settings_cyr2latProfileDeleted": "Profilen har tagits bort",
"settings_cyr2latProfileDeleteDscr": "Är du säker på att du vill ta bort profilen \"{name}\"?",
"channels_channelUpdated": "Kanalen \"{name}\" har uppdaterats",
"@channels_channelUpdated": {
"placeholders": {
@@ -1932,6 +1938,13 @@
"contact_teleBaseSubtitle": "Tillåt delning av batterinivå och grundläggande telemetri",
"contact_teleLoc": "Telemetridata plats",
"contact_teleLocSubtitle": "Tillåt delning av platsdata",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_initialRouteWeightSubtitle": "Initial vikt för nyligen upptäckta vägar",
"appSettings_maxRouteWeight": "Maximalt tillåtet vikt för rutten",
"appSettings_maxRouteWeightSubtitle": "Maximal vikt som en leveransväg kan ackumulera från framgångsrika leveranser.",
@@ -1944,6 +1957,7 @@
"appSettings_maxMessageRetriesSubtitle": "Antal försök att skicka om ett meddelande innan det markeras som misslyckat.",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Telemetri-läge uppdaterat",
"settings_multiAck": "Multi-ACKs: {value}",
"map_showOverlaps": "Repeater-nyckelöverlappningar",
"map_runTraceWithReturnPath": "Gå tillbaka på samma väg",
"@radioStats_noiseFloor": {
@@ -2075,6 +2089,5 @@
"repeater_guest": "Information om repetorer",
"chat_sendMessage": "Skicka meddelande",
"repeater_guestTools": "Gästverktyg",
"room_guest": "Information om servern",
"settings_multiAck": "Flera bekräftelser"
"room_guest": "Information om servern"
}
+18 -5
View File
@@ -395,10 +395,16 @@
"channels_cyr2latSettingsSubheading": "Список замін",
"channels_cyr2latSettingsDscr": "Редагувати JSON-конфігурацію заміни символів",
"channels_cyr2latSettingsDialogHint": "JSON-карта замін",
"channels_cyr2latSettingsDialogSuccess": "Список замін оновлено",
"channels_cyr2latSettingsDialogWrongJSON": "Некоректний JSON: {error}",
"channels_cyr2latSettingsDialogReset": "Скинути до початкових",
"channels_cyr2latSettingsDialogResetted": "Налаштування замін Cyr2Lat скинуто до початкових",
"settings_cyr2latProfileAdd": "Додати профіль Cyr2Lat",
"settings_cyr2latProfileName": "Назва профілю",
"settings_cyr2latProfileNameEmpty": "Назва профілю не може бути порожньою",
"settings_cyr2latProfileAdded": "Профіль успішно додано",
"settings_cyr2latProfileUpdated": "Профіль успішно оновлено",
"settings_cyr2latProfileEdit": "Редагувати профіль Cyr2Lat",
"settings_cyr2latProfileDelete": "Видалити профіль Cyr2Lat",
"settings_cyr2latProfileDeleted": "Профіль успішно видалено",
"settings_cyr2latProfileDeleteDscr": "Ви впевнені, що хочете видалити профіль \"{name}\"?",
"channels_channelUpdated": "Канал «{name}» оновлено",
"@channels_channelUpdated": {
"placeholders": {
@@ -1932,6 +1938,13 @@
"contact_lastSeen": "Останній раз бачили",
"contact_teleEnv": "Середовище телеметрії",
"contact_teleEnvSubtitle": "Дозволити спільний доступ до даних датчиків середовища",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_initialRouteWeight": "Початкова вартість маршруту",
"appSettings_initialRouteWeightSubtitle": "Початкова вага для нових відкритих шляхів",
"appSettings_maxRouteWeight": "Максимальна вага маршруту",
@@ -1944,6 +1957,7 @@
"appSettings_maxMessageRetriesSubtitle": "Кількість спроб повторного відправлення повідомлення перед тим, як позначити його як невдале",
"path_routeWeight": "{weight}/{max}",
"settings_telemetryModeUpdated": "Режим телеметрії оновлено",
"settings_multiAck": "Багатократне підтвердження: {value}",
"map_showOverlaps": "Перекриття ключа повторювача",
"map_runTraceWithReturnPath": "Повернутися назад тим же шляхом",
"@radioStats_noiseFloor": {
@@ -2075,6 +2089,5 @@
"repeater_guestTools": "Інструменти для гостей",
"repeater_guest": "Інформація про ретранслятор",
"room_guest": "Інформація про сервер кімнати",
"chat_sendMessage": "Надіслати повідомлення",
"settings_multiAck": "Багато підтверджень"
"chat_sendMessage": "Надіслати повідомлення"
}
+17 -4
View File
@@ -409,10 +409,16 @@
"channels_cyr2latSettingsSubheading": "替換清單",
"channels_cyr2latSettingsDscr": "編輯 JSON 字元替換設定檔",
"channels_cyr2latSettingsDialogHint": "JSON 替換映射表",
"channels_cyr2latSettingsDialogSuccess": "替換清單已更新",
"channels_cyr2latSettingsDialogWrongJSON": "JSON 格式錯誤:{error}",
"channels_cyr2latSettingsDialogReset": "還原為預設值",
"channels_cyr2latSettingsDialogResetted": "Cyr2Lat 替換設定已還原為預設值",
"settings_cyr2latProfileAdd": "新增 Cyr2Lat 設定檔",
"settings_cyr2latProfileName": "設定檔名稱",
"settings_cyr2latProfileNameEmpty": "設定檔名稱不能為空",
"settings_cyr2latProfileAdded": "設定檔已成功新增",
"settings_cyr2latProfileUpdated": "設定檔已成功更新",
"settings_cyr2latProfileEdit": "編輯 Cyr2Lat 設定檔",
"settings_cyr2latProfileDelete": "刪除 Cyr2Lat 設定檔",
"settings_cyr2latProfileDeleted": "設定檔已成功刪除",
"settings_cyr2latProfileDeleteDscr": "您確定要刪除設定檔 \"{name}\" 嗎?",
"channels_channelUpdated": "频道 \"{name}\" 已更新",
"@channels_channelUpdated": {
"placeholders": {
@@ -1937,6 +1943,13 @@
"contact_settings": "联系人设置",
"contact_teleLocSubtitle": "允许共享位置数据",
"contact_telemetry": "遥测数据",
"@settings_multiAck": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"appSettings_maxRouteWeight": "最大路径重量",
"appSettings_initialRouteWeightSubtitle": "新发现路径的初始重量",
"appSettings_initialRouteWeight": "初始路线权重",
@@ -1948,7 +1961,7 @@
"appSettings_maxMessageRetries": "最大消息重试次数",
"appSettings_maxMessageRetriesSubtitle": "在将消息标记为失败之前,允许尝试的次数",
"path_routeWeight": "{weight}/{max}",
"settings_multiAck": "多重ACK",
"settings_multiAck": "多重ACK{value}",
"settings_telemetryModeUpdated": "遥测模式已更新",
"map_showOverlaps": "重复键重叠",
"map_runTraceWithReturnPath": "沿着相同的路径返回",
+96 -8
View File
@@ -38,6 +38,42 @@ const Map<String, String> defaultCyr2LatCharMap = {
'х': 'x',
};
class Cyr2LatProfile {
final String id;
final String name;
final Map<String, String> charMap;
Cyr2LatProfile({required this.id, required this.name, required this.charMap});
Map<String, dynamic> toJson() {
return {'id': id, 'name': name, 'char_map': charMap};
}
factory Cyr2LatProfile.fromJson(Map<String, dynamic> json) {
return Cyr2LatProfile(
id: json['id'] as String,
name: json['name'] as String,
charMap:
(json['char_map'] as Map?)?.map(
(key, value) => MapEntry(key.toString(), value.toString()),
) ??
{},
);
}
Cyr2LatProfile copyWith({
String? id,
String? name,
Map<String, String>? charMap,
}) {
return Cyr2LatProfile(
id: id ?? this.id,
name: name ?? this.name,
charMap: charMap ?? this.charMap,
);
}
}
class AppSettings {
static const Object _unset = Object();
@@ -82,7 +118,16 @@ class AppSettings {
final String? translationModelSourceUrl;
final String? translationSelectedModelId;
final List<TranslationModelRecord> translationDownloadedModels;
final Map<String, String> cyr2latCharMap;
final List<Cyr2LatProfile> cyr2latProfiles;
final String selectedCyr2latProfileId;
Map<String, String> get cyr2latCharMap {
final profile = cyr2latProfiles.firstWhere(
(p) => p.id == selectedCyr2latProfileId,
orElse: () => cyr2latProfiles.first,
);
return profile.charMap;
}
AppSettings({
this.clearPathOnMaxRetry = false,
@@ -126,12 +171,22 @@ class AppSettings {
this.translationModelSourceUrl,
this.translationSelectedModelId,
List<TranslationModelRecord>? translationDownloadedModels,
Map<String, String>? cyr2latCharMap,
List<Cyr2LatProfile>? cyr2latProfiles,
String? selectedCyr2latProfileId,
}) : batteryChemistryByDeviceId = batteryChemistryByDeviceId ?? {},
batteryChemistryByRepeaterId = batteryChemistryByRepeaterId ?? {},
mutedChannels = mutedChannels ?? {},
translationDownloadedModels = translationDownloadedModels ?? const [],
cyr2latCharMap = cyr2latCharMap ?? defaultCyr2LatCharMap;
cyr2latProfiles =
cyr2latProfiles ??
[
Cyr2LatProfile(
id: 'default',
name: 'Default',
charMap: defaultCyr2LatCharMap,
),
],
selectedCyr2latProfileId = selectedCyr2latProfileId ?? 'default';
Map<String, dynamic> toJson() {
return {
@@ -178,7 +233,10 @@ class AppSettings {
'translation_downloaded_models': translationDownloadedModels
.map((model) => model.toJson())
.toList(),
'cyr2lat_char_map': cyr2latCharMap,
'cyr2lat_profiles': cyr2latProfiles
.map((profile) => profile.toJson())
.toList(),
'selected_cyr2lat_profile_id': selectedCyr2latProfileId,
};
}
@@ -266,11 +324,38 @@ class AppSettings {
)
.toList() ??
const [],
cyr2latCharMap:
cyr2latProfiles:
(json['cyr2lat_profiles'] as List<dynamic>?)
?.map(
(entry) => Cyr2LatProfile.fromJson(
Map<String, dynamic>.from(entry as Map),
),
)
.toList() ??
// Backward compatibility: if old cyr2lat_char_map exists, create a profile from it
(json['cyr2lat_char_map'] != null
? [
Cyr2LatProfile(
id: 'migrated',
name: 'Migrated Profile',
charMap:
(json['cyr2lat_char_map'] as Map?)?.map(
(key, value) => MapEntry(key.toString(), value.toString()),
(key, value) =>
MapEntry(key.toString(), value.toString()),
) ??
defaultCyr2LatCharMap,
),
]
: [
Cyr2LatProfile(
id: 'default',
name: 'Default',
charMap: defaultCyr2LatCharMap,
),
]),
selectedCyr2latProfileId:
json['selected_cyr2lat_profile_id'] as String? ??
(json['cyr2lat_char_map'] != null ? 'migrated' : 'default'),
);
}
@@ -316,7 +401,8 @@ class AppSettings {
Object? translationModelSourceUrl = _unset,
Object? translationSelectedModelId = _unset,
List<TranslationModelRecord>? translationDownloadedModels,
Map<String, String>? cyr2latCharMap,
List<Cyr2LatProfile>? cyr2latProfiles,
String? selectedCyr2latProfileId,
}) {
return AppSettings(
clearPathOnMaxRetry: clearPathOnMaxRetry ?? this.clearPathOnMaxRetry,
@@ -380,7 +466,9 @@ class AppSettings {
: translationSelectedModelId as String?,
translationDownloadedModels:
translationDownloadedModels ?? this.translationDownloadedModels,
cyr2latCharMap: cyr2latCharMap ?? this.cyr2latCharMap,
cyr2latProfiles: cyr2latProfiles ?? this.cyr2latProfiles,
selectedCyr2latProfileId:
selectedCyr2latProfileId ?? this.selectedCyr2latProfileId,
);
}
}
+214 -32
View File
@@ -1262,6 +1262,7 @@ class AppSettingsScreen extends StatelessWidget {
BuildContext context,
AppSettingsService settingsService,
) {
final selectedProfile = settingsService.getSelectedCyr2LatProfile();
return Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -1273,42 +1274,110 @@ class AppSettingsScreen extends StatelessWidget {
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
),
ListTile(
leading: const Icon(Icons.translate),
title: Text(context.l10n.channels_cyr2latSettingsSubheading),
subtitle: Text(context.l10n.channels_cyr2latSettingsDscr),
trailing: const Icon(Icons.chevron_right),
onTap: () => _showCyr2LatDialog(context, settingsService),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),
child: DropdownButtonFormField<String>(
initialValue: settingsService.settings.selectedCyr2latProfileId,
decoration: InputDecoration(
labelText: context.l10n.channels_cyr2latSettingsSubheading,
border: const OutlineInputBorder(),
),
items: settingsService.settings.cyr2latProfiles.map((profile) {
return DropdownMenuItem(
value: profile.id,
child: Text(profile.name),
);
}).toList(),
onChanged: (value) {
if (value != null) {
settingsService.setSelectedCyr2LatProfile(value);
}
},
),
),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Row(
children: [
Expanded(
child: OutlinedButton.icon(
onPressed: () =>
_showAddCyr2LatProfileDialog(context, settingsService),
icon: const Icon(Icons.add),
label: Text(context.l10n.common_add),
),
),
const SizedBox(width: 8),
Expanded(
child: OutlinedButton.icon(
onPressed: () => _showEditCyr2LatProfileDialog(
context,
settingsService,
selectedProfile,
),
icon: const Icon(Icons.edit),
label: Text(context.l10n.common_edit),
),
),
const SizedBox(width: 8),
Expanded(
child: OutlinedButton.icon(
onPressed:
settingsService.settings.cyr2latProfiles.length > 1
? () => _showDeleteCyr2LatProfileDialog(
context,
settingsService,
selectedProfile,
)
: null,
icon: const Icon(Icons.delete),
label: Text(context.l10n.common_delete),
),
),
],
),
),
],
),
);
}
void _showCyr2LatDialog(
void _showAddCyr2LatProfileDialog(
BuildContext context,
AppSettingsService settingsService,
) {
final controller = TextEditingController(
text: const JsonEncoder.withIndent(
' ',
).convert(settingsService.settings.cyr2latCharMap),
final nameController = TextEditingController();
final jsonController = TextEditingController(
text: const JsonEncoder.withIndent(' ').convert(defaultCyr2LatCharMap),
);
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text(context.l10n.channels_cyr2latSettingsDscr),
title: Text(context.l10n.settings_cyr2latProfileAdd),
content: SingleChildScrollView(
child: TextField(
controller: controller,
maxLines: 20,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
controller: nameController,
decoration: InputDecoration(
labelText: context.l10n.settings_cyr2latProfileName,
border: const OutlineInputBorder(),
hintText: context.l10n.channels_cyr2latSettingsDialogHint,
),
),
const SizedBox(height: 16),
TextField(
controller: jsonController,
maxLines: 15,
decoration: InputDecoration(
labelText: context.l10n.channels_cyr2latSettingsDialogHint,
border: const OutlineInputBorder(),
hintText: context.l10n.channels_cyr2latSettingsDscr,
),
),
],
),
),
actions: [
TextButton(
@@ -1316,23 +1385,31 @@ class AppSettingsScreen extends StatelessWidget {
child: Text(context.l10n.common_cancel),
),
TextButton(
onPressed: () {
onPressed: () async {
if (nameController.text.isEmpty) {
showDismissibleSnackBar(
context,
content: Text(context.l10n.settings_cyr2latProfileNameEmpty),
);
return;
}
try {
final json =
jsonDecode(controller.text) as Map<String, dynamic>;
jsonDecode(jsonController.text) as Map<String, dynamic>;
final map = json.map(
(key, value) => MapEntry(key, value.toString()),
);
final newSettings = settingsService.settings.copyWith(
cyr2latCharMap: map,
final profile = Cyr2LatProfile(
id: DateTime.now().millisecondsSinceEpoch.toString(),
name: nameController.text,
charMap: map,
);
settingsService.updateSettings(newSettings);
await settingsService.addCyr2LatProfile(profile);
if (!context.mounted) return;
Navigator.pop(context);
showDismissibleSnackBar(
context,
content: Text(
context.l10n.channels_cyr2latSettingsDialogSuccess,
),
content: Text(context.l10n.settings_cyr2latProfileAdded),
);
} catch (e) {
showDismissibleSnackBar(
@@ -1347,21 +1424,126 @@ class AppSettingsScreen extends StatelessWidget {
},
child: Text(context.l10n.common_save),
),
TextButton(
onPressed: () {
final newSettings = settingsService.settings.copyWith(
cyr2latCharMap: defaultCyr2LatCharMap,
],
),
);
settingsService.updateSettings(newSettings);
}
void _showEditCyr2LatProfileDialog(
BuildContext context,
AppSettingsService settingsService,
Cyr2LatProfile profile,
) {
final nameController = TextEditingController(text: profile.name);
final jsonController = TextEditingController(
text: const JsonEncoder.withIndent(' ').convert(profile.charMap),
);
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text(context.l10n.settings_cyr2latProfileEdit),
content: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
controller: nameController,
decoration: InputDecoration(
labelText: context.l10n.settings_cyr2latProfileName,
border: const OutlineInputBorder(),
),
),
const SizedBox(height: 16),
TextField(
controller: jsonController,
maxLines: 15,
decoration: InputDecoration(
labelText: context.l10n.channels_cyr2latSettingsDialogHint,
border: const OutlineInputBorder(),
hintText: context.l10n.channels_cyr2latSettingsDscr,
),
),
],
),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(context.l10n.common_cancel),
),
TextButton(
onPressed: () async {
if (nameController.text.isEmpty) {
showDismissibleSnackBar(
context,
content: Text(context.l10n.settings_cyr2latProfileNameEmpty),
);
return;
}
try {
final json =
jsonDecode(jsonController.text) as Map<String, dynamic>;
final map = json.map(
(key, value) => MapEntry(key, value.toString()),
);
final updatedProfile = profile.copyWith(
name: nameController.text,
charMap: map,
);
await settingsService.updateCyr2LatProfile(updatedProfile);
if (!context.mounted) return;
Navigator.pop(context);
showDismissibleSnackBar(
context,
content: Text(context.l10n.settings_cyr2latProfileUpdated),
);
} catch (e) {
showDismissibleSnackBar(
context,
content: Text(
context.l10n.channels_cyr2latSettingsDialogResetted,
context.l10n.channels_cyr2latSettingsDialogWrongJSON(
e.toString(),
),
),
);
}
},
child: Text(context.l10n.channels_cyr2latSettingsDialogReset),
child: Text(context.l10n.common_save),
),
],
),
);
}
void _showDeleteCyr2LatProfileDialog(
BuildContext context,
AppSettingsService settingsService,
Cyr2LatProfile profile,
) {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text(context.l10n.settings_cyr2latProfileDelete),
content: Text(
context.l10n.settings_cyr2latProfileDeleteDscr(profile.name),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(context.l10n.common_cancel),
),
TextButton(
onPressed: () async {
await settingsService.removeCyr2LatProfile(profile.id);
if (!context.mounted) return;
Navigator.pop(context);
showDismissibleSnackBar(
context,
content: Text(context.l10n.settings_cyr2latProfileDeleted),
);
},
child: Text(context.l10n.common_delete),
),
],
),
+36
View File
@@ -1401,10 +1401,17 @@ class _ChannelsScreenState extends State<ChannelsScreen>
MeshCoreConnector connector,
Channel channel,
) {
final appSettingsService = Provider.of<AppSettingsService>(
context,
listen: false,
);
final nameController = TextEditingController(text: channel.name);
final pskController = TextEditingController(text: channel.pskHex);
bool smazEnabled = connector.isChannelSmazEnabled(channel.index);
bool cyr2latEnabled = connector.isChannelCyr2LatEnabled(channel.index);
String? selectedCyr2LatProfileId = connector.getChannelCyr2LatProfileId(
channel.index,
);
showDialog(
context: context,
@@ -1471,6 +1478,31 @@ class _ChannelsScreenState extends State<ChannelsScreen>
}
}),
),
if (cyr2latEnabled) ...[
Padding(
padding: const EdgeInsets.fromLTRB(0, 8, 0, 8),
child: DropdownButtonFormField<String>(
initialValue: selectedCyr2LatProfileId,
decoration: InputDecoration(
labelText: dialogContext
.l10n
.channels_cyr2latSettingsSubheading,
border: const OutlineInputBorder(),
),
items: appSettingsService.settings.cyr2latProfiles.map((
profile,
) {
return DropdownMenuItem(
value: profile.id,
child: Text(profile.name),
);
}).toList(),
onChanged: (value) => setState(() {
selectedCyr2LatProfileId = value;
}),
),
),
],
],
),
),
@@ -1506,6 +1538,10 @@ class _ChannelsScreenState extends State<ChannelsScreen>
channel.index,
cyr2latEnabled,
);
await connector.setChannelCyr2LatProfileId(
channel.index,
selectedCyr2LatProfileId,
);
if (!context.mounted) return;
showDismissibleSnackBar(
context,
+37
View File
@@ -1211,6 +1211,10 @@ class _ChatScreenState extends State<ChatScreen> {
void _showContactSettings(BuildContext context) {
final connector = Provider.of<MeshCoreConnector>(context, listen: false);
final appSettingsService = Provider.of<AppSettingsService>(
context,
listen: false,
);
connector.ensureContactSmazSettingLoaded(widget.contact.publicKeyHex);
connector.ensureContactCyr2LatSettingLoaded(widget.contact.publicKeyHex);
final contact = widget.contact;
@@ -1218,6 +1222,9 @@ class _ChatScreenState extends State<ChatScreen> {
bool cyr2latEnabled = connector.isContactCyr2LatEnabled(
contact.publicKeyHex,
);
String? selectedCyr2LatProfileId = connector.getContactCyr2LatProfileId(
contact.publicKeyHex,
);
bool teleBaseEnabled = contact.teleBaseEnabled;
bool teleLocEnabled = contact.teleLocEnabled;
bool teleEnvEnabled = contact.teleEnvEnabled;
@@ -1283,6 +1290,36 @@ class _ChatScreenState extends State<ChatScreen> {
});
},
),
if (cyr2latEnabled) ...[
Padding(
padding: const EdgeInsets.fromLTRB(0, 8, 0, 8),
child: DropdownButtonFormField<String>(
initialValue: selectedCyr2LatProfileId,
decoration: InputDecoration(
labelText:
context.l10n.channels_cyr2latSettingsSubheading,
border: const OutlineInputBorder(),
),
items: appSettingsService.settings.cyr2latProfiles.map((
profile,
) {
return DropdownMenuItem(
value: profile.id,
child: Text(profile.name),
);
}).toList(),
onChanged: (value) {
connector.setContactCyr2LatProfileId(
contact.publicKeyHex,
value,
);
setDialogState(() {
selectedCyr2LatProfileId = value;
});
},
),
),
],
const Divider(height: 8),
SwitchListTile(
contentPadding: EdgeInsets.zero,
+52
View File
@@ -260,4 +260,56 @@ class AppSettingsService extends ChangeNotifier {
_settings.copyWith(translationDownloadedModels: value),
);
}
Cyr2LatProfile getSelectedCyr2LatProfile() {
return _settings.cyr2latProfiles.firstWhere(
(p) => p.id == _settings.selectedCyr2latProfileId,
orElse: () => _settings.cyr2latProfiles.first,
);
}
Cyr2LatProfile? getCyr2LatProfileById(String profileId) {
return _settings.cyr2latProfiles.cast<Cyr2LatProfile?>().firstWhere(
(p) => p?.id == profileId,
orElse: () => null,
);
}
Future<void> setSelectedCyr2LatProfile(String profileId) async {
await updateSettings(
_settings.copyWith(selectedCyr2latProfileId: profileId),
);
}
Future<void> addCyr2LatProfile(Cyr2LatProfile profile) async {
final updated = List<Cyr2LatProfile>.from(_settings.cyr2latProfiles)
..add(profile);
await updateSettings(_settings.copyWith(cyr2latProfiles: updated));
}
Future<void> updateCyr2LatProfile(Cyr2LatProfile updatedProfile) async {
final updated = _settings.cyr2latProfiles
.map((p) => p.id == updatedProfile.id ? updatedProfile : p)
.toList();
await updateSettings(_settings.copyWith(cyr2latProfiles: updated));
}
Future<void> removeCyr2LatProfile(String profileId) async {
if (_settings.cyr2latProfiles.length <= 1) {
return; // Don't remove the last profile
}
final updated = _settings.cyr2latProfiles
.where((p) => p.id != profileId)
.toList();
var newSelectedId = _settings.selectedCyr2latProfileId;
if (newSelectedId == profileId) {
newSelectedId = updated.first.id;
}
await updateSettings(
_settings.copyWith(
cyr2latProfiles: updated,
selectedCyr2latProfileId: newSelectedId,
),
);
}
}
+29 -14
View File
@@ -58,20 +58,7 @@ class ChannelSettingsStore {
}
final prefs = PrefsManager.instance;
final key = '$keyForCyr2Lat$channelIndex';
final oldKey = '$_cyr2latKeyPrefix$channelIndex';
bool? enabled = prefs.getBool(key);
if (enabled == null) {
// Attempt migration from legacy unscoped key on first load
enabled = prefs.getBool(oldKey);
prefs.remove(oldKey);
if (enabled != null) {
appLogger.info(
'Migrating channel Cyr2Lat settings from legacy key $oldKey to scoped key $key',
);
await prefs.setBool(key, enabled);
}
}
return enabled ?? false;
return prefs.getBool(key) ?? false;
}
Future<void> saveCyr2LatEnabled(int channelIndex, bool enabled) async {
@@ -85,4 +72,32 @@ class ChannelSettingsStore {
final key = '$keyForCyr2Lat$channelIndex';
await prefs.setBool(key, enabled);
}
Future<String?> loadCyr2LatProfileId(int channelIndex) async {
if (publicKeyHex.isEmpty) {
appLogger.warn(
'Public key hex is not set. Cannot load channel settings.',
);
return null;
}
final prefs = PrefsManager.instance;
final key = '${keyForCyr2Lat}profile_$channelIndex';
return prefs.getString(key);
}
Future<void> saveCyr2LatProfileId(int channelIndex, String? profileId) async {
if (publicKeyHex.isEmpty) {
appLogger.warn(
'Public key hex is not set. Cannot save channel settings.',
);
return;
}
final prefs = PrefsManager.instance;
final key = '${keyForCyr2Lat}profile_$channelIndex';
if (profileId == null) {
await prefs.remove(key);
} else {
await prefs.setString(key, profileId);
}
}
}
+31 -13
View File
@@ -58,19 +58,6 @@ class ContactSettingsStore {
}
final prefs = PrefsManager.instance;
final key = '$keyForCyr2Lat$contactKeyHex';
final oldKey = '$_cyr2latKeyPrefix$contactKeyHex';
bool? enabled = prefs.getBool(key);
if (enabled == null) {
// Attempt migration from legacy unscoped key on first load
enabled = prefs.getBool(oldKey);
prefs.remove(oldKey);
if (enabled != null) {
appLogger.info(
'Migrating contact Cyr2Lat settings from legacy key $oldKey to scoped key $key',
);
await prefs.setBool(key, enabled);
}
}
return prefs.getBool(key) ?? false;
}
@@ -85,4 +72,35 @@ class ContactSettingsStore {
final key = '$keyForCyr2Lat$contactKeyHex';
await prefs.setBool(key, enabled);
}
Future<String?> loadCyr2LatProfileId(String contactKeyHex) async {
if (publicKeyHex.isEmpty) {
appLogger.warn(
'Public key hex is not set. Cannot load contact settings.',
);
return null;
}
final prefs = PrefsManager.instance;
final key = '${keyForCyr2Lat}profile_$contactKeyHex';
return prefs.getString(key);
}
Future<void> saveCyr2LatProfileId(
String contactKeyHex,
String? profileId,
) async {
if (publicKeyHex.isEmpty) {
appLogger.warn(
'Public key hex is not set. Cannot save contact settings.',
);
return;
}
final prefs = PrefsManager.instance;
final key = '${keyForCyr2Lat}profile_$contactKeyHex';
if (profileId == null) {
await prefs.remove(key);
} else {
await prefs.setString(key, profileId);
}
}
}