"synced" indicator (#3512)
What changed, and why it matters
This commit is a user-interface change that adds a brief 'Synced' indicator when a wallet finishes synchronizing. It does not change how funds, keys, or network connections are handled, and it does not fix or introduce any security issue visible in the diff.
No security action required; treat as a normal UI/UX improvement.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch turns the previously empty sync-status label into a localized ‘Synced’ message, shows a green checkmark and border for three seconds after the wallet reaches SyncedSyncStatus, and adds a timer to hide the indicator. It is purely presentational: no cryptography, networking, storage, or permission code is modified.
Changed components
lib/core/sync_status_title.dartlib/new-ui/widgets/coins_page/top_bar_widget/chain_icon.dartlib/new-ui/widgets/coins_page/top_bar_widget/sync_bar.dartlib/new-ui/widgets/coins_page/top_bar_widget/top_bar.dartlocalization ARB filesInspect captured patch +134 / −38
diff --git a/lib/core/sync_status_title.dart b/lib/core/sync_status_title.dart
index b013bab1..d2988d07 100644
--- a/lib/core/sync_status_title.dart
+++ b/lib/core/sync_status_title.dart
@@ -42,7 +42,7 @@ String syncStatusTitle(SyncStatus syncStatus, SyncStatusDisplayMode syncStatusDi
}
if (syncStatus is SyncedSyncStatus) {
- return "";
+ return S.current.sync_synced;
}
if (syncStatus is FailedSyncStatus) {
diff --git a/lib/new-ui/widgets/coins_page/top_bar_widget/chain_icon.dart b/lib/new-ui/widgets/coins_page/top_bar_widget/chain_icon.dart
index 3fe2ebd7..ec3607a2 100644
--- a/lib/new-ui/widgets/coins_page/top_bar_widget/chain_icon.dart
+++ b/lib/new-ui/widgets/coins_page/top_bar_widget/chain_icon.dart
@@ -10,18 +10,20 @@ class ChainIcon extends StatelessWidget {
{super.key,
required this.iconPath,
required this.dashboardViewModel,
- required this.isSyncHeavy});
+ required this.isSyncHeavy,
+ required this.showSyncedMessage});
final String iconPath;
final bool isSyncHeavy;
final DashboardViewModel dashboardViewModel;
+ final bool showSyncedMessage;
@override
Widget build(BuildContext context) {
return Observer(
builder: (_) {
final progress = dashboardViewModel.status.progress();
- final done = !isSyncHeavy || progress >= 1;
+ final done = !showSyncedMessage && (!isSyncHeavy || progress >= 1);
return Stack(
children: [
@@ -30,10 +32,10 @@ class ChainIcon extends StatelessWidget {
opacity: done ? 0 : 1,
// Faded out means "nothing to report", so it must leave the tree too.
child: ExcludeSemantics(
- excluding: done,
+ excluding: done || showSyncedMessage,
child: CircularProgressIndicator(
value: progress,
- color: Color(0xFFFFB84E),
+ color: showSyncedMessage ? Color(0xFFFF12A439) : Color(0xFFFFB84E),
strokeWidth: 2,
semanticsLabel: S.of(context).synchronizing,
semanticsValue: "${(progress * 100).round()}%",
diff --git a/lib/new-ui/widgets/coins_page/top_bar_widget/sync_bar.dart b/lib/new-ui/widgets/coins_page/top_bar_widget/sync_bar.dart
index 97ba0232..f38f72b0 100644
--- a/lib/new-ui/widgets/coins_page/top_bar_widget/sync_bar.dart
+++ b/lib/new-ui/widgets/coins_page/top_bar_widget/sync_bar.dart
@@ -1,21 +1,26 @@
import 'package:cake_wallet/core/sync_status_title.dart';
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/generated/i18n.dart';
-import 'package:cake_wallet/new-ui/widgets/coins_page/top_bar_widget/pulsing_dot.dart';
import 'package:cake_wallet/src/screens/settings/manage_nodes_page.dart';
import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
import 'package:cw_core/sync_status.dart';
+import "package:flutter/cupertino.dart";
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
-import 'package:flutter_svg/flutter_svg.dart';
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
class SyncBar extends StatelessWidget {
- SyncBar({super.key, required this.dashboardViewModel, required this.isSyncHeavy});
+ SyncBar({
+ super.key,
+ required this.dashboardViewModel,
+ required this.isSyncHeavy,
+ required this.showSyncedMessage,
+ });
final DashboardViewModel dashboardViewModel;
final bool isSyncHeavy;
+ final bool showSyncedMessage;
static const failStatuses = [
FailedSyncStatus,
@@ -37,9 +42,10 @@ class SyncBar extends StatelessWidget {
ConnectedSyncStatus,
];
+ static const syncedColor = Color(0xFF12A439);
+
@override
- Widget build(BuildContext context) {
- return Observer(
+ Widget build(BuildContext context) => Observer(
builder: (_) {
final status = dashboardViewModel.status;
final Widget? icon = _getIcon(context, status.runtimeType);
@@ -106,7 +112,6 @@ class SyncBar extends StatelessWidget {
);
},
);
- }
void _openNodeManagement(BuildContext context) =>
CupertinoScaffold.showCupertinoModalBottomSheet(
@@ -130,8 +135,9 @@ class SyncBar extends StatelessWidget {
width: 20,
height: 20,
),
- if (_showDot()) PulsingDot(),
- ],
+ if (_showDot()) const CupertinoActivityIndicator(radius: 8),
+ if(_showLightSyncCheck()) const Icon(Icons.check, color: syncedColor, size: 18),
+ ],
);
final label = _joinLabels([
@@ -144,6 +150,9 @@ class SyncBar extends StatelessWidget {
return Semantics(label: label, child: ExcludeSemantics(child: row));
}
+ bool get _isShowingSyncedMessage =>
+ showSyncedMessage && dashboardViewModel.status.runtimeType == SyncedSyncStatus;
+
String _statusSemanticsLabel(BuildContext context, SyncStatus status) {
final isFailure = failStatuses.contains(status.runtimeType);
@@ -166,7 +175,7 @@ class SyncBar extends StatelessWidget {
}
Border? _getBorder(BuildContext context, Type status) {
- if (progressStatuses.contains(status)) {
+ if (progressStatuses.contains(status) || _isShowingSyncedMessage) {
return Border.all(color: Theme.of(context).colorScheme.surfaceContainerHigh, width: 1);
}
@@ -174,19 +183,26 @@ class SyncBar extends StatelessWidget {
}
TextStyle? _getTextStyle(BuildContext context, Type status) {
+ final Color color;
if (failStatuses.contains(status)) {
- return TextStyle(
- fontSize: 12, fontWeight: FontWeight.w400, color: Theme.of(context).colorScheme.error);
+ color = Theme.of(context).colorScheme.error;
+ } else if (status == SyncedSyncStatus) {
+ color = syncedColor;
} else {
- return TextStyle(
- fontSize: 12,
- fontWeight: FontWeight.w400,
- color: Theme.of(context).colorScheme.onSurfaceVariant);
+ color = Theme.of(context).colorScheme.onSurfaceVariant;
}
+
+ return TextStyle(
+ fontSize: 12, fontWeight: FontWeight.w400, color: color);
}
Widget? _getIcon(BuildContext context, Type status) {
- if (status == LostConnectionSyncStatus || status == FailedSyncStatus) {
+
+ if(status == SyncedSyncStatus) {
+ return Icon(Icons.check, color: syncedColor, size: 12);
+ }
+
+ if (status == LostConnectionSyncStatus) {
return CakeImageWidget(
imageUrl: "assets/new-ui/offline.svg",
colorFilter: ColorFilter.mode(Theme.of(context).colorScheme.error, BlendMode.srcIn),
@@ -228,11 +244,14 @@ class SyncBar extends StatelessWidget {
}
bool _showFullBar() {
- if (dashboardViewModel.status.runtimeType == SyncedSyncStatus) return false;
+ if (dashboardViewModel.status.runtimeType == SyncedSyncStatus)
+ return isSyncHeavy && _isShowingSyncedMessage;
return isSyncHeavy || failStatuses.contains(dashboardViewModel.status.runtimeType);
}
- bool _showDot() {
- return !isSyncHeavy && progressStatuses.contains(dashboardViewModel.status.runtimeType);
- }
+ bool _showDot() =>
+ !isSyncHeavy && progressStatuses.contains(dashboardViewModel.status.runtimeType);
+
+ bool _showLightSyncCheck() =>
+ !isSyncHeavy && _isShowingSyncedMessage;
}
diff --git a/lib/new-ui/widgets/coins_page/top_bar_widget/top_bar.dart b/lib/new-ui/widgets/coins_page/top_bar_widget/top_bar.dart
index 71627f9d..21035c25 100644
--- a/lib/new-ui/widgets/coins_page/top_bar_widget/top_bar.dart
+++ b/lib/new-ui/widgets/coins_page/top_bar_widget/top_bar.dart
@@ -1,3 +1,4 @@
+import 'dart:async';
import 'dart:io';
import 'package:cake_wallet/generated/i18n.dart';
@@ -6,11 +7,13 @@ import 'package:cake_wallet/new-ui/widgets/coins_page/top_bar_widget/lightning_s
import 'package:cake_wallet/new-ui/widgets/coins_page/top_bar_widget/sync_bar.dart';
import 'package:cake_wallet/new-ui/widgets/modern_button.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
+import 'package:cw_core/sync_status.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
+import 'package:mobx/mobx.dart';
-class TopBar extends StatelessWidget {
+class TopBar extends StatefulWidget {
const TopBar({
super.key,
required this.lightningMode,
@@ -25,33 +28,76 @@ class TopBar extends StatelessWidget {
final DashboardViewModel dashboardViewModel;
@override
- Widget build(BuildContext context) {
- return Padding(
+ State<TopBar> createState() => _TopBarState();
+}
+
+class _TopBarState extends State<TopBar> {
+ static const syncedMessageDuration = Duration(seconds: 3);
+
+ bool showSyncedMessage = false;
+ Timer? syncedMessageTimer;
+ late final ReactionDisposer? _statusReactionDisposer;
+
+ @override
+ void initState() {
+ super.initState();
+
+ _statusReactionDisposer = reaction(
+ (_) => widget.dashboardViewModel.status.runtimeType,
+ (status) {
+ syncedMessageTimer?.cancel();
+
+ if (status == SyncedSyncStatus) {
+ if(mounted) {
+ setState(() => showSyncedMessage = true);
+ }
+ syncedMessageTimer =
+ Timer(syncedMessageDuration, () => setState(() => showSyncedMessage = false));
+ } else {
+ if(mounted) {
+ setState(() => showSyncedMessage = false);
+ }
+ }
+ },
+ );
+ }
+
+ @override
+ void dispose() {
+ syncedMessageTimer?.cancel();
+ _statusReactionDisposer?.reaction.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) => Padding(
padding: EdgeInsets.only(
bottom: 10, left: 18, right: 18, top: 10 + _additionalTopPadding(context)),
child: Observer(
builder: (_) => Row(
spacing: 12,
children: [
- (dashboardViewModel.hasLightning)
+ (widget.dashboardViewModel.hasLightning)
? LightningSwitcher(
- lightningMode: lightningMode,
- onLightningSwitchPress: onLightningSwitchPress,
+ lightningMode: widget.lightningMode,
+ onLightningSwitchPress: widget.onLightningSwitchPress,
)
: ChainIcon(
- iconPath: dashboardViewModel.wallet.currency.flatIconPath ?? "",
- dashboardViewModel: dashboardViewModel,
- isSyncHeavy: dashboardViewModel.isSyncHeavy),
+ iconPath: widget.dashboardViewModel.wallet.currency.flatIconPath ?? "",
+ dashboardViewModel: widget.dashboardViewModel,
+ isSyncHeavy: widget.dashboardViewModel.isSyncHeavy,
+ showSyncedMessage: showSyncedMessage),
SyncBar(
- dashboardViewModel: dashboardViewModel,
- isSyncHeavy: dashboardViewModel.isSyncHeavy,
+ dashboardViewModel: widget.dashboardViewModel,
+ isSyncHeavy: widget.dashboardViewModel.isSyncHeavy,
+ showSyncedMessage: showSyncedMessage,
),
ModernButton.svg(
iconColor: Theme.of(context).colorScheme.primary,
size: 36,
onPressed: () {
HapticFeedback.mediumImpact();
- onSettingsButtonPress();
+ widget.onSettingsButtonPress();
},
svgPath: "assets/new-ui/top-settings.svg",
semanticLabel: S.of(context).settings_title,
@@ -60,7 +106,6 @@ class TopBar extends StatelessWidget {
),
),
);
- }
//FIXME remove after this gets fixed flutter-side
double _additionalTopPadding(BuildContext context) {
diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb
index fa26c3e9..b83e1f5b 100644
--- a/res/values/strings_ar.arb
+++ b/res/values/strings_ar.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "جارٍ المزامنة",
"sync_status_timed_out": "انتهت المهلة",
"sync_status_unsupported": "عقدة غير مدعومة",
+ "sync_synced": "تمت المزامنة",
"sync_syncing": "جارٍ المزامنة",
"sync_timed_out": "انتهت مهلة المزامنة",
"sync_unsupported_node": "عقدة غير مدعومة",
diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb
index c818c866..b7631c07 100644
--- a/res/values/strings_bg.arb
+++ b/res/values/strings_bg.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "СИНХРОНИЗИРАНЕ",
"sync_status_timed_out": "ИЗТЕЧЕ ВРЕМЕТО",
"sync_status_unsupported": "НЕПОДДЪРЖАН ВЪЗЕЛ",
+ "sync_synced": "Синхронизирано",
"sync_syncing": "Синхронизиране",
"sync_timed_out": "Времето за синхронизиране изтече",
"sync_unsupported_node": "Неподдържан възел",
diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb
index 1961102c..43d226cb 100644
--- a/res/values/strings_cs.arb
+++ b/res/values/strings_cs.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "SYNCHRONIZUJE SE",
"sync_status_timed_out": "VYPRŠEL ČAS",
"sync_status_unsupported": "NEPODPOROVANÝ UZEL",
+ "sync_synced": "Synchronizováno",
"sync_syncing": "Synchronizace",
"sync_timed_out": "Vypršel časový limit synchronizace",
"sync_unsupported_node": "Nepodporovaný uzel",
diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb
index 95489828..10ee6a3c 100644
--- a/res/values/strings_de.arb
+++ b/res/values/strings_de.arb
@@ -1217,6 +1217,7 @@
"sync_status_syncronizing": "SYNCHRONISIEREN",
"sync_status_timed_out": "ZEITÜBERSCHREITUNG",
"sync_status_unsupported": "NICHT UNTERSTÜTZTER NODE",
+ "sync_synced": "Synchronisiert",
"sync_syncing": "Synchronisiere",
"sync_timed_out": "Synchronisierung abgelaufen",
"sync_unsupported_node": "Nicht unterstützter Node",
diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb
index aa974809..46084e45 100644
--- a/res/values/strings_en.arb
+++ b/res/values/strings_en.arb
@@ -1214,6 +1214,7 @@
"sync_status_syncronizing": "SYNCHRONIZING",
"sync_status_timed_out": "TIMED OUT",
"sync_status_unsupported": "UNSUPPORTED NODE",
+ "sync_synced": "Synced",
"sync_syncing": "Syncing",
"sync_timed_out": "Sync Timed Out",
"sync_unsupported_node": "Unsupported node",
diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb
index 1f678f33..122335d2 100644
--- a/res/values/strings_es.arb
+++ b/res/values/strings_es.arb
@@ -1183,6 +1183,7 @@
"sync_status_syncronizing": "SINCRONIZANDO",
"sync_status_timed_out": "TIEMPO DE ESPERA AGOTADO",
"sync_status_unsupported": "NODO NO COMPATIBLE",
+ "sync_synced": "Sincronizado",
"sync_syncing": "Sincronizando",
"sync_timed_out": "Tiempo de espera de sincronización agotado",
"sync_unsupported_node": "Nodo no compatible",
diff --git a/res/values/strings_fa.arb b/res/values/strings_fa.arb
index 268b4821..b607a56f 100644
--- a/res/values/strings_fa.arb
+++ b/res/values/strings_fa.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "در حال همگامسازی",
"sync_status_timed_out": "اتمام زمان",
"sync_status_unsupported": "نود پشتیبانینشده",
+ "sync_synced": "همگام سازی شد",
"sync_syncing": "در حال همگامسازی",
"sync_timed_out": "مهلت همگامسازی به پایان رسید",
"sync_unsupported_node": "گره پشتیبانینشده",
diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb
index 01c14e0e..f0287971 100644
--- a/res/values/strings_fr.arb
+++ b/res/values/strings_fr.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "SYNCHRONISATION",
"sync_status_timed_out": "DÉLAI DÉPASSÉ",
"sync_status_unsupported": "NŒUD NON PRIS EN CHARGE",
+ "sync_synced": "Synchronisé",
"sync_syncing": "Synchronisation en cours",
"sync_timed_out": "Délai de synchronisation dépassé",
"sync_unsupported_node": "Nœud non pris en charge",
diff --git a/res/values/strings_gn.arb b/res/values/strings_gn.arb
index e170211e..7c44ed63 100644
--- a/res/values/strings_gn.arb
+++ b/res/values/strings_gn.arb
@@ -1187,6 +1187,7 @@
"sync_status_syncronizing": "Oñembojuehehína",
"sync_status_timed_out": "Ohasáma",
"sync_status_unsupported": "NODO NOÑEMONEĨRIVA",
+ "sync_synced": "Oñembojoaju",
"sync_syncing": "Oñembojuehe",
"sync_timed_out": "Sincronización ohasáma aravo",
"sync_unsupported_node": "Nodo ndojehechaukáiva",
diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb
index 9ae47ffc..6b3c7ec7 100644
--- a/res/values/strings_ha.arb
+++ b/res/values/strings_ha.arb
@@ -1183,6 +1183,7 @@
"sync_status_syncronizing": "ANA DAIDAITAWA",
"sync_status_timed_out": "LOKACI YA WUCE",
"sync_status_unsupported": "NODE MARA GOYON BAYA",
+ "sync_synced": "An daidaita",
"sync_syncing": "Ana aiki tare",
"sync_timed_out": "Lokacin aiki tare ya ƙare",
"sync_unsupported_node": "Node da ba a tallafa ba",
diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb
index 01e260fe..79c2d2ce 100644
--- a/res/values/strings_hi.arb
+++ b/res/values/strings_hi.arb
@@ -1183,6 +1183,7 @@
"sync_status_syncronizing": "सिंक्रनाइज़ हो रहा है",
"sync_status_timed_out": "समय समाप्त",
"sync_status_unsupported": "असमर्थित नोड",
+ "sync_synced": "सिंक किया गया",
"sync_syncing": "सिंक हो रहा है",
"sync_timed_out": "सिंक का समय समाप्त हो गया",
"sync_unsupported_node": "असमर्थित नोड",
diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb
index 895333a7..ae02df50 100644
--- a/res/values/strings_hr.arb
+++ b/res/values/strings_hr.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "SINKRONIZIRANJE",
"sync_status_timed_out": "ISTEKLO VRIJEME",
"sync_status_unsupported": "NEPODRŽANI ČVOR",
+ "sync_synced": "Sinkronizirano",
"sync_syncing": "Sinkroniziranje",
"sync_timed_out": "Sinkronizacija je istekla",
"sync_unsupported_node": "Nepodržani čvor",
diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb
index a5658ff0..344bf1a2 100644
--- a/res/values/strings_hy.arb
+++ b/res/values/strings_hy.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "ՀԱՄԱԺԱՄԱՆԱԿԵՑՎՈՒՄ Է",
"sync_status_timed_out": "ԺԱՄԱՆԱԿԸ ՍՊԱՌՎԵՑ",
"sync_status_unsupported": "ՉԱՋԱԿՑՎՈՂ ՀԱՆԳՈՒՅՑ",
+ "sync_synced": "Համաժամեցված է",
"sync_syncing": "Համաժամեցում",
"sync_timed_out": "Համաժամացման ժամանակը սպառվել է",
"sync_unsupported_node": "Չաջակցվող հանգույց",
diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb
index b8be9a73..5909cb84 100644
--- a/res/values/strings_id.arb
+++ b/res/values/strings_id.arb
@@ -1184,6 +1184,7 @@
"sync_status_syncronizing": "MENYINKRONKAN",
"sync_status_timed_out": "WAKTU HABIS",
"sync_status_unsupported": "NODE TIDAK DIDUKUNG",
+ "sync_synced": "Disinkronkan",
"sync_syncing": "Menyinkronkan",
"sync_timed_out": "Sinkronisasi Habis Waktu",
"sync_unsupported_node": "Node tidak didukung",
diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb
index 820edc59..f8028e12 100644
--- a/res/values/strings_it.arb
+++ b/res/values/strings_it.arb
@@ -1182,6 +1182,7 @@
"sync_status_syncronizing": "SINCRONIZZAZIONE IN CORSO",
"sync_status_timed_out": "TEMPO SCADUTO",
"sync_status_unsupported": "NODO NON SUPPORTATO",
+ "sync_synced": "Sincronizzato",
"sync_syncing": "Sincronizzazione in corso",
"sync_timed_out": "Sincronizzazione scaduta",
"sync_unsupported_node": "Nodo non supportato",
diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb
index 57f46412..8d8e5075 100644
--- a/res/values/strings_ja.arb
+++ b/res/values/strings_ja.arb
@@ -1182,6 +1182,7 @@
"sync_status_syncronizing": "同期中",
"sync_status_timed_out": "タイムアウト",
"sync_status_unsupported": "未対応のノード",
+ "sync_synced": "同期済み",
"sync_syncing": "同期中",
"sync_timed_out": "同期がタイムアウトしました",
"sync_unsupported_node": "未対応のノード",
diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb
index f57f301f..393bf17e 100644
--- a/res/values/strings_ko.arb
+++ b/res/values/strings_ko.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "동기화 중",
"sync_status_timed_out": "시간 초과",
"sync_status_unsupported": "지원되지 않는 노드",
+ "sync_synced": "동기화됨",
"sync_syncing": "동기화 중",
"sync_timed_out": "동기화 시간이 초과되었습니다",
"sync_unsupported_node": "지원되지 않는 노드",
diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb
index 682846d4..92a5b090 100644
--- a/res/values/strings_my.arb
+++ b/res/values/strings_my.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "ထပ်တူချိန်ညှိနေသည်",
"sync_status_timed_out": "အချိန်ကုန်သွားသည်",
"sync_status_unsupported": "မထောက်ပံ့သော Node",
+ "sync_synced": "ထပ်တူပြုထားသည်။",
"sync_syncing": "စင့်ခ်လုပ်နေသည်",
"sync_timed_out": "စင့်ခ်ချိန်ကုန်သွားပါပြီ",
"sync_unsupported_node": "မပံ့ပိုးထားသော node",
diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb
index 333e3002..715a2a74 100644
--- a/res/values/strings_nl.arb
+++ b/res/values/strings_nl.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "SYNCHRONISEREN",
"sync_status_timed_out": "TIME-OUT",
"sync_status_unsupported": "NIET-ONDERSTEUNDE NODE",
+ "sync_synced": "Gesynchroniseerd",
"sync_syncing": "Synchroniseren",
"sync_timed_out": "Synchronisatie time-out",
"sync_unsupported_node": "Niet-ondersteunde node",
diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb
index 2cc48b0d..5a308be2 100644
--- a/res/values/strings_pl.arb
+++ b/res/values/strings_pl.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "SYNCHRONIZOWANIE",
"sync_status_timed_out": "PRZEKROCZONO LIMIT CZASU",
"sync_status_unsupported": "NIEOBSŁUGIWANY WĘZEŁ",
+ "sync_synced": "Zsynchronizowane",
"sync_syncing": "Synchronizowanie",
"sync_timed_out": "Przekroczono limit czasu synchronizacji",
"sync_unsupported_node": "Nieobsługiwany węzeł",
diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb
index 081c372b..2f7abc9f 100644
--- a/res/values/strings_pt.arb
+++ b/res/values/strings_pt.arb
@@ -1183,6 +1183,7 @@
"sync_status_syncronizing": "SINCRONIZANDO",
"sync_status_timed_out": "TEMPO ESGOTADO",
"sync_status_unsupported": "NÓ NÃO SUPORTADO",
+ "sync_synced": "Sincronizado",
"sync_syncing": "Sincronizando",
"sync_timed_out": "Tempo limite da sincronização esgotado",
"sync_unsupported_node": "Nó não suportado",
diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb
index ee94d226..89e569e1 100644
--- a/res/values/strings_ru.arb
+++ b/res/values/strings_ru.arb
@@ -1182,6 +1182,7 @@
"sync_status_syncronizing": "СИНХРОНИЗАЦИЯ",
"sync_status_timed_out": "ИСТЕКЛО ВРЕМЯ ОЖИДАНИЯ",
"sync_status_unsupported": "НЕПОДДЕРЖИВАЕМЫЙ УЗЕЛ",
+ "sync_synced": "Синхронизировано",
"sync_syncing": "Синхронизация",
"sync_timed_out": "Время ожидания синхронизации истекло",
"sync_unsupported_node": "Неподдерживаемый узел",
diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb
index 9baf7582..d4071a3a 100644
--- a/res/values/strings_th.arb
+++ b/res/values/strings_th.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "กำลังซิงโครไนซ์",
"sync_status_timed_out": "หมดเวลา",
"sync_status_unsupported": "โหนดที่ไม่รองรับ",
+ "sync_synced": "ซิงค์แล้ว",
"sync_syncing": "กำลังซิงค์",
"sync_timed_out": "การซิงค์หมดเวลา",
"sync_unsupported_node": "โหนดที่ไม่รองรับ",
diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb
index 311e762d..b9bfb13d 100644
--- a/res/values/strings_tl.arb
+++ b/res/values/strings_tl.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "NAGSI-SYNC",
"sync_status_timed_out": "NAG-TIMEOUT",
"sync_status_unsupported": "HINDI SUPORTADONG NODE",
+ "sync_synced": "Naka-sync",
"sync_syncing": "Nagsi-sync",
"sync_timed_out": "Nag-time out ang Sync",
"sync_unsupported_node": "Hindi suportadong node",
diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb
index 88debbd7..e9372470 100644
--- a/res/values/strings_tr.arb
+++ b/res/values/strings_tr.arb
@@ -1181,6 +1181,7 @@
"sync_status_syncronizing": "SENKRONİZE EDİLİYOR",
"sync_status_timed_out": "ZAMAN AŞIMINA UĞRADI",
"sync_status_unsupported": "DESTEKLENMEYEN DÜĞÜM",
+ "sync_synced": "Senkronize edildi",
"sync_syncing": "Senkronize ediliyor",
"sync_timed_out": "Senkronizasyon zaman aşımına uğradı",
"sync_unsupported_node": "Desteklenmeyen düğüm",
diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb
index 88ba2241..2ebd27fd 100644
--- a/res/values/strings_uk.arb
+++ b/res/values/strings_uk.arb
@@ -1182,6 +1182,7 @@
"sync_status_syncronizing": "СИНХРОНІЗУЄТЬСЯ",
"sync_status_timed_out": "ЧАС ВИЙШОВ",
"sync_status_unsupported": "НЕПІДТРИМУВАНИЙ ВУЗОЛ",
+ "sync_synced": "Синхронізовано",
"sync_syncing": "Синхронізація",
"sync_timed_out": "Час очікування синхронізації вичерпано",
"sync_unsupported_node": "Непідтримуваний вузол",
diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb
index b583f5ec..6f63b736 100644
--- a/res/values/strings_ur.arb
+++ b/res/values/strings_ur.arb
@@ -1183,6 +1183,7 @@
"sync_status_syncronizing": "ہم آہنگ ہو رہا ہے",
"sync_status_timed_out": "وقت ختم ہو گیا",
"sync_status_unsupported": "غیر معاون نوڈ",
+ "sync_synced": "مطابقت پذیر",
"sync_syncing": "ہم آہنگ ہو رہا ہے",
"sync_timed_out": "سنک کا وقت ختم ہو گیا",
"sync_unsupported_node": "غیر معاون نوڈ",
diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb
index 75a581b8..19039464 100644
--- a/res/values/strings_vi.arb
+++ b/res/values/strings_vi.arb
@@ -1182,6 +1182,7 @@
"sync_status_syncronizing": "ĐANG ĐỒNG BỘ HÓA",
"sync_status_timed_out": "HẾT THỜI GIAN",
"sync_status_unsupported": "NÚT KHÔNG ĐƯỢC HỖ TRỢ",
+ "sync_synced": "Đã đồng bộ hóa",
"sync_syncing": "Đang đồng bộ",
"sync_timed_out": "Đồng bộ hóa đã hết thời gian",
"sync_unsupported_node": "Nút không được hỗ trợ",
diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb
index 44a159e9..d08ab701 100644
--- a/res/values/strings_yo.arb
+++ b/res/values/strings_yo.arb
@@ -1182,6 +1182,7 @@
"sync_status_syncronizing": "Ń ṢÀMÚDỌ̀GBÀ",
"sync_status_timed_out": "AKOKO TI PARI",
"sync_status_unsupported": "NÓÒDÙ TI KÒ NI ÀTÌLẸ́YÌN",
+ "sync_synced": "Amuṣiṣẹpọ",
"sync_syncing": "Ń ṣàtúnṣe",
"sync_timed_out": "Akoko amuṣiṣẹpọ ti parí",
"sync_unsupported_node": "Node tí kò ní ìtìlẹ́yìn",
diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb
index b8c0fa0e..c12e808b 100644
--- a/res/values/strings_zh.arb
+++ b/res/values/strings_zh.arb
@@ -1182,6 +1182,7 @@
"sync_status_syncronizing": "同步中",
"sync_status_timed_out": "超时",
"sync_status_unsupported": "不受支持的节点",
+ "sync_synced": "已同步",
"sync_syncing": "同步中",
"sync_timed_out": "同步超时",
"sync_unsupported_node": "不受支持的节点",
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.