diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 43bd69f..544042a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -2593,5 +2593,11 @@ "type": "String" } } - } + }, + "block_settingsTitle": "Blocked", + "block_settingsSubtitle": "Users you've blocked", + "block_none": "No blocked users", + "block_keysSection": "Blocked contacts", + "block_namesSection": "Blocked names", + "block_namesHint": "Name-only blocks (channel senders) — each upgrades to a full block once we learn their key." } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 6f6159a..b93dce7 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -7833,6 +7833,42 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Blocked \"{name}\" across all channels — name only until we learn their key'** String block_blockedNameOnly(String name); + + /// No description provided for @block_settingsTitle. + /// + /// In en, this message translates to: + /// **'Blocked'** + String get block_settingsTitle; + + /// No description provided for @block_settingsSubtitle. + /// + /// In en, this message translates to: + /// **'Users you\'ve blocked'** + String get block_settingsSubtitle; + + /// No description provided for @block_none. + /// + /// In en, this message translates to: + /// **'No blocked users'** + String get block_none; + + /// No description provided for @block_keysSection. + /// + /// In en, this message translates to: + /// **'Blocked contacts'** + String get block_keysSection; + + /// No description provided for @block_namesSection. + /// + /// In en, this message translates to: + /// **'Blocked names'** + String get block_namesSection; + + /// No description provided for @block_namesHint. + /// + /// In en, this message translates to: + /// **'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'** + String get block_namesHint; } class _AppLocalizationsDelegate diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index f8f4d63..72c112a 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -4588,4 +4588,23 @@ class AppLocalizationsBg extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 20055c1..ba6254b 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -4606,4 +4606,23 @@ class AppLocalizationsDe extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 895eac1..91542b9 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -4510,4 +4510,23 @@ class AppLocalizationsEn extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index da11197..44b1947 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -4593,4 +4593,23 @@ class AppLocalizationsEs extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index acd8410..a6ff879 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -4622,4 +4622,23 @@ class AppLocalizationsFr extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_hu.dart b/lib/l10n/app_localizations_hu.dart index c995403..9b9df38 100644 --- a/lib/l10n/app_localizations_hu.dart +++ b/lib/l10n/app_localizations_hu.dart @@ -4609,4 +4609,23 @@ class AppLocalizationsHu extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index 968f490..dbfa675 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -4598,4 +4598,23 @@ class AppLocalizationsIt extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 9687aeb..49331ac 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -4363,4 +4363,23 @@ class AppLocalizationsJa extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index df32a5c..a1715b1 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -4364,4 +4364,23 @@ class AppLocalizationsKo extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 9d5e7e8..1ca42ba 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -4573,4 +4573,23 @@ class AppLocalizationsNl extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index 9c055e0..76be17e 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -4610,4 +4610,23 @@ class AppLocalizationsPl extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 1e28ea7..20f77ac 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -4586,4 +4586,23 @@ class AppLocalizationsPt extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 3f6e588..9f54ec1 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -4604,4 +4604,23 @@ class AppLocalizationsRu extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index b6b4108..244f862 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -4569,4 +4569,23 @@ class AppLocalizationsSk extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index 3212241..3b95d56 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -4567,4 +4567,23 @@ class AppLocalizationsSl extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index 9f94121..3087ff1 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -4542,4 +4542,23 @@ class AppLocalizationsSv extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index b1f6fa9..7fdeb17 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -4605,4 +4605,23 @@ class AppLocalizationsUk extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 784f2ec..048af15 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -4237,4 +4237,23 @@ class AppLocalizationsZh extends AppLocalizations { String block_blockedNameOnly(String name) { return 'Blocked \"$name\" across all channels — name only until we learn their key'; } + + @override + String get block_settingsTitle => 'Blocked'; + + @override + String get block_settingsSubtitle => 'Users you\'ve blocked'; + + @override + String get block_none => 'No blocked users'; + + @override + String get block_keysSection => 'Blocked contacts'; + + @override + String get block_namesSection => 'Blocked names'; + + @override + String get block_namesHint => + 'Name-only blocks (channel senders) — each upgrades to a full block once we learn their key.'; } diff --git a/lib/screens/settings/blocked_view.dart b/lib/screens/settings/blocked_view.dart new file mode 100644 index 0000000..1990857 --- /dev/null +++ b/lib/screens/settings/blocked_view.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../../connector/meshcore_connector.dart'; +import '../../l10n/l10n.dart'; +import '../../services/block_service.dart'; + +/// Embeddable view (no Scaffold) for the Blocked settings pane. +/// +/// Lists blocked public keys (with the contact name when resolvable) and +/// name-only channel blocks, each with an Unblock action. App-local; the +/// firmware-offload indicator is added by Epic B. +class BlockedView extends StatelessWidget { + const BlockedView({super.key}); + + @override + Widget build(BuildContext context) { + return Consumer2( + builder: (context, block, connector, child) { + final keys = block.blockedKeys.toList()..sort(); + final names = block.blockedNames.keys.toList()..sort(); + if (keys.isEmpty && names.isEmpty) { + return Center(child: Text(context.l10n.block_none)); + } + return ListView( + padding: const EdgeInsets.all(16), + children: [ + if (keys.isNotEmpty) ...[ + _sectionHeader(context.l10n.block_keysSection), + ...keys.map((k) => _keyTile(context, block, connector, k)), + const SizedBox(height: 16), + ], + if (names.isNotEmpty) ...[ + _sectionHeader(context.l10n.block_namesSection), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + child: Text( + context.l10n.block_namesHint, + style: TextStyle(fontSize: 12, color: Colors.grey[600]), + ), + ), + ...names.map((n) => _nameTile(context, block, n)), + ], + ], + ); + }, + ); + } + + Widget _sectionHeader(String text) => Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 8, 8), + child: Text( + text, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ); + + String? _nameForKey(MeshCoreConnector connector, String keyHex) { + for (final c in connector.contacts) { + if (c.publicKeyHex == keyHex) return c.name; + } + for (final c in connector.discoveredContacts) { + if (c.publicKeyHex == keyHex) return c.name; + } + return null; + } + + Widget _keyTile( + BuildContext context, + BlockService block, + MeshCoreConnector connector, + String keyHex, + ) { + final name = _nameForKey(connector, keyHex); + final shortKey = + '${keyHex.substring(0, 8)}…${keyHex.substring(keyHex.length - 8)}'; + return ListTile( + leading: Icon(Icons.block, color: Colors.red.shade700), + title: Text(name ?? shortKey), + subtitle: name != null ? Text(shortKey) : null, + trailing: TextButton( + onPressed: () => block.unblock(keyHex), + child: Text(context.l10n.block_unblock), + ), + ); + } + + Widget _nameTile(BuildContext context, BlockService block, String name) { + return ListTile( + leading: Icon(Icons.block, color: Colors.red.shade700), + title: Text(name), + trailing: TextButton( + onPressed: () => block.unblockName(name), + child: Text(context.l10n.block_unblock), + ), + ); + } +} diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 49dafbe..d8fc905 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -17,6 +17,7 @@ import 'settings/settings_shell.dart'; import 'settings/app_settings_view.dart'; import 'settings/message_settings_view.dart'; import 'settings/observer_settings_view.dart'; +import 'settings/blocked_view.dart'; import 'app_debug_log_screen.dart'; import 'ble_debug_log_screen.dart'; import 'topology_debug_screen.dart'; @@ -108,6 +109,12 @@ class _SettingsScreenState extends State { subtitle: l10n.settings_privacySubtitle, builder: _privacyPane, ), + SettingsCategory( + icon: Icons.block, + title: l10n.block_settingsTitle, + subtitle: l10n.block_settingsSubtitle, + builder: _blockedPane, + ), SettingsCategory( icon: Icons.contacts_outlined, title: l10n.contacts_title, @@ -153,6 +160,8 @@ class _SettingsScreenState extends State { Widget _observerPane(BuildContext context) => const ObserverSettingsView(); + Widget _blockedPane(BuildContext context) => const BlockedView(); + Widget _radioRangePane(BuildContext context) { final l10n = context.l10n; final connector = context.watch(); diff --git a/untranslated.json b/untranslated.json index 7d689db..69bc284 100644 --- a/untranslated.json +++ b/untranslated.json @@ -26,7 +26,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "de": [ @@ -56,7 +62,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "es": [ @@ -86,7 +98,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "fr": [ @@ -116,7 +134,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "hu": [ @@ -146,7 +170,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "it": [ @@ -176,7 +206,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "ja": [ @@ -206,7 +242,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "ko": [ @@ -236,7 +278,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "nl": [ @@ -266,7 +314,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "pl": [ @@ -296,7 +350,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "pt": [ @@ -326,7 +386,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "ru": [ @@ -356,7 +422,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "sk": [ @@ -386,7 +458,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "sl": [ @@ -416,7 +494,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "sv": [ @@ -446,7 +530,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "uk": [ @@ -476,7 +566,13 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ], "zh": [ @@ -506,6 +602,12 @@ "block_sender", "block_blocked", "block_unblocked", - "block_blockedNameOnly" + "block_blockedNameOnly", + "block_settingsTitle", + "block_settingsSubtitle", + "block_none", + "block_keysSection", + "block_namesSection", + "block_namesHint" ] }