diff --git a/flutter/lib/common/widgets/address_book.dart b/flutter/lib/common/widgets/address_book.dart index 78bd20ef0..ae07c1498 100644 --- a/flutter/lib/common/widgets/address_book.dart +++ b/flutter/lib/common/widgets/address_book.dart @@ -1,5 +1,6 @@ import 'dart:math'; +import 'package:bot_toast/bot_toast.dart'; import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:dynamic_layouts/dynamic_layouts.dart'; import 'package:flutter/material.dart'; @@ -316,13 +317,14 @@ class _AddressBookState extends State { Widget _buildTags() { return Obx(() { - final List tags; + List tags; if (gFFI.abModel.sortTags.value) { tags = gFFI.abModel.currentAbTags.toList(); tags.sort(); } else { - tags = gFFI.abModel.currentAbTags; + tags = gFFI.abModel.currentAbTags.toList(); } + tags = [kUntagged, ...tags].toList(); final editPermission = gFFI.abModel.current.canWrite(); tagBuilder(String e) { return AddressBookTag( @@ -669,6 +671,14 @@ class _AddressBookState extends State { } else { final tags = field.trim().split(RegExp(r"[\s,;\n]+")); field = tags.join(','); + for (var t in [kUntagged, translate(kUntagged)]) { + if (tags.contains(t)) { + BotToast.showText( + contentColor: Colors.red, text: 'Tag name cannot be "$t"'); + isInProgress = false; + return; + } + } gFFI.abModel.addTags(tags); // final currentPeers } @@ -741,12 +751,14 @@ class AddressBookTag extends StatelessWidget { } const double radius = 8; + final isUnTagged = name == kUntagged; + final showAction = showActionMenu && !isUnTagged; return GestureDetector( onTap: onTap, - onTapDown: showActionMenu ? setPosition : null, - onSecondaryTapDown: showActionMenu ? setPosition : null, - onSecondaryTap: showActionMenu ? () => _showMenu(context, pos) : null, - onLongPress: showActionMenu ? () => _showMenu(context, pos) : null, + onTapDown: showAction ? setPosition : null, + onSecondaryTapDown: showAction ? setPosition : null, + onSecondaryTap: showAction ? () => _showMenu(context, pos) : null, + onLongPress: showAction ? () => _showMenu(context, pos) : null, child: Obx(() => Container( decoration: BoxDecoration( color: tags.contains(name) @@ -758,17 +770,18 @@ class AddressBookTag extends StatelessWidget { child: IntrinsicWidth( child: Row( children: [ - Container( - width: radius, - height: radius, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: tags.contains(name) - ? Colors.white - : gFFI.abModel.getCurrentAbTagColor(name)), - ).marginOnly(right: radius / 2), + if (!isUnTagged) + Container( + width: radius, + height: radius, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: tags.contains(name) + ? Colors.white + : gFFI.abModel.getCurrentAbTagColor(name)), + ).marginOnly(right: radius / 2), Expanded( - child: Text(name, + child: Text(isUnTagged ? translate(name) : name, style: TextStyle( overflow: TextOverflow.ellipsis, color: tags.contains(name) ? Colors.white : null)), diff --git a/flutter/lib/common/widgets/peers_view.dart b/flutter/lib/common/widgets/peers_view.dart index 7f1685021..e14e198bd 100644 --- a/flutter/lib/common/widgets/peers_view.dart +++ b/flutter/lib/common/widgets/peers_view.dart @@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/desktop/widgets/scroll_wrapper.dart'; +import 'package:flutter_hbb/models/ab_model.dart'; import 'package:flutter_hbb/models/peer_tab_model.dart'; import 'package:flutter_hbb/models/state_model.dart'; import 'package:get/get.dart'; @@ -532,15 +533,22 @@ class AddressBookPeersView extends BasePeersView { if (selectedTags.isEmpty) { return true; } + // The result of a no-tag union with normal tags, still allows normal tags to perform union or intersection operations. + final selectedNormalTags = + selectedTags.where((tag) => tag != kUntagged).toList(); + if (selectedTags.contains(kUntagged)) { + if (idents.isEmpty) return true; + if (selectedNormalTags.isEmpty) return false; + } if (gFFI.abModel.filterByIntersection.value) { - for (final tag in selectedTags) { + for (final tag in selectedNormalTags) { if (!idents.contains(tag)) { return false; } } return true; } else { - for (final tag in selectedTags) { + for (final tag in selectedNormalTags) { if (idents.contains(tag)) { return true; } diff --git a/flutter/lib/models/ab_model.dart b/flutter/lib/models/ab_model.dart index 0da84e0f2..613ec1ed3 100644 --- a/flutter/lib/models/ab_model.dart +++ b/flutter/lib/models/ab_model.dart @@ -33,6 +33,8 @@ bool filterAbTagByIntersection() { const _personalAddressBookName = "My address book"; const _legacyAddressBookName = "Legacy address book"; +const kUntagged = "Untagged"; + enum ForcePullAb { listAndCurrent, current, @@ -424,6 +426,7 @@ class AbModel { // #region tags Future addTags(List tagList) async { + tagList.removeWhere((e) => e == kUntagged); final ret = await current.addTags(tagList, {}); await pullNonLegacyAfterChange(); _saveCache(); diff --git a/src/lang/ar.rs b/src/lang/ar.rs index 039ad4b11..1b20ebc4a 100644 --- a/src/lang/ar.rs +++ b/src/lang/ar.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/be.rs b/src/lang/be.rs index 26281c26b..7c0819837 100644 --- a/src/lang/be.rs +++ b/src/lang/be.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/bg.rs b/src/lang/bg.rs index 46126056c..3c1d202ee 100644 --- a/src/lang/bg.rs +++ b/src/lang/bg.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ca.rs b/src/lang/ca.rs index d680b66a5..120200b35 100644 --- a/src/lang/ca.rs +++ b/src/lang/ca.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/cn.rs b/src/lang/cn.rs index d15c1b6ba..901b4cdb9 100644 --- a/src/lang/cn.rs +++ b/src/lang/cn.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "上传文件"), ("Clipboard is synchronized", "剪贴板已同步"), ("Update client clipboard", "更新客户端的粘贴板"), + ("Untagged", "无标签"), ].iter().cloned().collect(); } diff --git a/src/lang/cs.rs b/src/lang/cs.rs index c4ff80c7e..25046cbcb 100644 --- a/src/lang/cs.rs +++ b/src/lang/cs.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/da.rs b/src/lang/da.rs index 905f31739..fa3e6f100 100644 --- a/src/lang/da.rs +++ b/src/lang/da.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/de.rs b/src/lang/de.rs index ba91471c9..482b45bfc 100644 --- a/src/lang/de.rs +++ b/src/lang/de.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "Dateien hochladen"), ("Clipboard is synchronized", "Zwischenablage ist synchronisiert"), ("Update client clipboard", "Client-Zwischenablage aktualisieren"), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/el.rs b/src/lang/el.rs index 73a306c7c..57984b728 100644 --- a/src/lang/el.rs +++ b/src/lang/el.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eo.rs b/src/lang/eo.rs index 83747f03c..5fe2c8d3a 100644 --- a/src/lang/eo.rs +++ b/src/lang/eo.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/es.rs b/src/lang/es.rs index ee0ffe569..4b84b1c0f 100644 --- a/src/lang/es.rs +++ b/src/lang/es.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "Subir archivos"), ("Clipboard is synchronized", "Portapapeles sincronizado"), ("Update client clipboard", "Actualizar portapapeles del cliente"), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/et.rs b/src/lang/et.rs index 9f67c1226..931a3da2d 100644 --- a/src/lang/et.rs +++ b/src/lang/et.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/eu.rs b/src/lang/eu.rs index 93f5a60b4..e191a74f0 100644 --- a/src/lang/eu.rs +++ b/src/lang/eu.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fa.rs b/src/lang/fa.rs index 33c6b7427..051859f60 100644 --- a/src/lang/fa.rs +++ b/src/lang/fa.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/fr.rs b/src/lang/fr.rs index 8c8332ad1..9366c6a19 100644 --- a/src/lang/fr.rs +++ b/src/lang/fr.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/he.rs b/src/lang/he.rs index 400b5156b..39cd98fc4 100644 --- a/src/lang/he.rs +++ b/src/lang/he.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hr.rs b/src/lang/hr.rs index d6389480a..d3163ae03 100644 --- a/src/lang/hr.rs +++ b/src/lang/hr.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/hu.rs b/src/lang/hu.rs index fc58fe5a6..c348db1d1 100644 --- a/src/lang/hu.rs +++ b/src/lang/hu.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "Fájlok feltöltése"), ("Clipboard is synchronized", "A vágólap szinkronizálva van"), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/id.rs b/src/lang/id.rs index b488f5740..d52c11a38 100644 --- a/src/lang/id.rs +++ b/src/lang/id.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/it.rs b/src/lang/it.rs index b5a191f09..5bec55f4f 100644 --- a/src/lang/it.rs +++ b/src/lang/it.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "File upload"), ("Clipboard is synchronized", "Gli appunti sono sincronizzati"), ("Update client clipboard", "Aggiorna appunti client"), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ja.rs b/src/lang/ja.rs index 1d0f3b7ea..14c06e0d5 100644 --- a/src/lang/ja.rs +++ b/src/lang/ja.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ko.rs b/src/lang/ko.rs index f266f2536..527813d09 100644 --- a/src/lang/ko.rs +++ b/src/lang/ko.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "파일 업로드"), ("Clipboard is synchronized", "클립보드가 동기화됨"), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/kz.rs b/src/lang/kz.rs index 46733ce71..f9ee96ca2 100644 --- a/src/lang/kz.rs +++ b/src/lang/kz.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lt.rs b/src/lang/lt.rs index 723b46a30..31522364c 100644 --- a/src/lang/lt.rs +++ b/src/lang/lt.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/lv.rs b/src/lang/lv.rs index 0439a45e6..166830c16 100644 --- a/src/lang/lv.rs +++ b/src/lang/lv.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "Augšupielādēt failus"), ("Clipboard is synchronized", "Starpliktuve ir sinhronizēta"), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nb.rs b/src/lang/nb.rs index c9f3ce243..00ee513b1 100644 --- a/src/lang/nb.rs +++ b/src/lang/nb.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/nl.rs b/src/lang/nl.rs index 78c6f77b7..f1c7ba97f 100644 --- a/src/lang/nl.rs +++ b/src/lang/nl.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "Bestanden uploaden"), ("Clipboard is synchronized", "Klembord is gesynchroniseerd"), ("Update client clipboard", "Klembord van client bijwerken"), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pl.rs b/src/lang/pl.rs index b6cc5318a..872fd5bf7 100644 --- a/src/lang/pl.rs +++ b/src/lang/pl.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "Wyślij pliki"), ("Clipboard is synchronized", "Schowek jest zsynchronizowany"), ("Update client clipboard", "Uaktualnij schowek klienta"), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/pt_PT.rs b/src/lang/pt_PT.rs index 3fe795187..ad3a5f831 100644 --- a/src/lang/pt_PT.rs +++ b/src/lang/pt_PT.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ptbr.rs b/src/lang/ptbr.rs index f382b7aba..466952c02 100644 --- a/src/lang/ptbr.rs +++ b/src/lang/ptbr.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ro.rs b/src/lang/ro.rs index 7aaef0e01..830a26a49 100644 --- a/src/lang/ro.rs +++ b/src/lang/ro.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/ru.rs b/src/lang/ru.rs index bcc5ed996..582fdf6dc 100644 --- a/src/lang/ru.rs +++ b/src/lang/ru.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "Загрузить файлы"), ("Clipboard is synchronized", "Буфер обмена синхронизирован"), ("Update client clipboard", "Обновить буфер обмена клиента"), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sk.rs b/src/lang/sk.rs index 50ba1aeb0..d6bd0f711 100644 --- a/src/lang/sk.rs +++ b/src/lang/sk.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sl.rs b/src/lang/sl.rs index 4e52bbe40..3fbf30ba3 100755 --- a/src/lang/sl.rs +++ b/src/lang/sl.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sq.rs b/src/lang/sq.rs index abab6acd8..b68e6a1e0 100644 --- a/src/lang/sq.rs +++ b/src/lang/sq.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sr.rs b/src/lang/sr.rs index 96bf3e1e0..9def539e5 100644 --- a/src/lang/sr.rs +++ b/src/lang/sr.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/sv.rs b/src/lang/sv.rs index 69806fa7f..af00b788e 100644 --- a/src/lang/sv.rs +++ b/src/lang/sv.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/template.rs b/src/lang/template.rs index 1b0cf69e4..ce3e99abd 100644 --- a/src/lang/template.rs +++ b/src/lang/template.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/th.rs b/src/lang/th.rs index a657201e9..09fde8671 100644 --- a/src/lang/th.rs +++ b/src/lang/th.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tr.rs b/src/lang/tr.rs index 1b7b783d3..b7f9750f1 100644 --- a/src/lang/tr.rs +++ b/src/lang/tr.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/tw.rs b/src/lang/tw.rs index fb9259ef9..e99ee8d36 100644 --- a/src/lang/tw.rs +++ b/src/lang/tw.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "上傳檔案"), ("Clipboard is synchronized", "剪貼簿已同步"), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/uk.rs b/src/lang/uk.rs index ad8343050..6b5ec4381 100644 --- a/src/lang/uk.rs +++ b/src/lang/uk.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", "Надіслати файли"), ("Clipboard is synchronized", "Буфер обміну синхронізовано"), ("Update client clipboard", "Оновити буфер обміну клієнта"), + ("Untagged", ""), ].iter().cloned().collect(); } diff --git a/src/lang/vn.rs b/src/lang/vn.rs index 0d4751cd4..1970e17ca 100644 --- a/src/lang/vn.rs +++ b/src/lang/vn.rs @@ -654,5 +654,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = ("Upload files", ""), ("Clipboard is synchronized", ""), ("Update client clipboard", ""), + ("Untagged", ""), ].iter().cloned().collect(); }