Skip to content

Commit b068248

Browse files
alphabtCopilot
andauthored
Add privacy-respecting device sync (#66)
* Add privacy-respecting device sync Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Address device sync review feedback Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Preserve hardened switch styling Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Filter missing-config removal echoes Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Validate synced theme contrast Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Sync only persisted local snapshots Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Simplify sync envelope validation Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Handle unawaited save rejections Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Use JSON state snapshots for compatibility Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent ddb73e6 commit b068248

66 files changed

Lines changed: 5483 additions & 18 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/_locales/am/messages.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,50 @@
451451
"message": "የሰዓት ሰቅ ፈልግ",
452452
"description": "Placeholder for the searchable time-zone field."
453453
},
454+
"sectionDeviceSync": {
455+
"message": "የመሣሪያ ማመሳሰል",
456+
"description": "Settings section heading for device sync."
457+
},
458+
"syncPreferences": {
459+
"message": "ምርጫዎችን በመሣሪያዎች መካከል አመሳስል",
460+
"description": "Label for preference sync switch."
461+
},
462+
"syncPreferencesHint": {
463+
"message": "ገጽታዎን፣ የቁጥር አጻጻፍዎን፣ የማሰላሰያ መስመርዎን፣ ቋንቋዎን እና የቆጣሪ ሁነታዎን በአሳሽ መለያዎ በኩል ያመሳስላል።",
464+
"description": "Explains which preferences sync and that the browser account carries them."
465+
},
466+
"syncProfile": {
467+
"message": "የልደት ቀን እና የሕይወት ዕድሜ ግምት ዝርዝሮችንም አመሳስል",
468+
"description": "Label for the additional personal profile sync switch."
469+
},
470+
"syncProfileHint": {
471+
"message": "የልደት ቀንዎን እና ሰዓትዎን፣ የትውልድ ጊዜ ሰቅዎን፣ በውልደት ጊዜ የነበረውን ጾታዎን፣ እንዲሁም የተመረጠውን የሕይወት ዕድሜ ግምት የውሂብ ምንጭ ወይም ብጁ ዓመታትንም ያመሳስላል። ይህ መረጃ የበለጠ ግላዊ ነው።",
472+
"description": "Explains the personal profile fields included in optional sync."
473+
},
474+
"syncStatusOff": {
475+
"message": "ጠፍቷል",
476+
"description": "Status when device sync is disabled."
477+
},
478+
"syncStatusSyncing": {
479+
"message": "በማመሳሰል ላይ…",
480+
"description": "Status while device sync is reading or writing."
481+
},
482+
"syncStatusSynced": {
483+
"message": "ተመሳስሏል",
484+
"description": "Status after device sync succeeds."
485+
},
486+
"syncStatusError": {
487+
"message": "በዚህ መሣሪያ ላይ ተቀምጧል። ማመሳሰሉን ማዘመን አልተቻለም።",
488+
"description": "Status when local save succeeded but device sync failed."
489+
},
490+
"syncStatusUnavailable": {
491+
"message": "የመሣሪያ ማመሳሰል በዚህ አሳሽ ውስጥ አይገኝም።",
492+
"description": "Status when browser sync storage is unavailable."
493+
},
494+
"retrySync": {
495+
"message": "ማመሳሰልን እንደገና ሞክር",
496+
"description": "Button label to retry a failed sync operation."
497+
},
454498
"noTimeZones": {
455499
"message": "የሚዛመድ የሰዓት ሰቅ የለም",
456500
"description": "Empty result shown when no time zones match the search."

src/_locales/ar/messages.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,50 @@
451451
"message": "البحث في المناطق الزمنية",
452452
"description": "Placeholder for the searchable time-zone field."
453453
},
454+
"sectionDeviceSync": {
455+
"message": "مزامنة الأجهزة",
456+
"description": "Settings section heading for device sync."
457+
},
458+
"syncPreferences": {
459+
"message": "مزامنة التفضيلات بين الأجهزة",
460+
"description": "Label for preference sync switch."
461+
},
462+
"syncPreferencesHint": {
463+
"message": "يزامن السمة ونمط الأرقام وسطر التأمل واللغة ووضع العدّاد من خلال حسابك في المتصفح.",
464+
"description": "Explains which preferences sync and that the browser account carries them."
465+
},
466+
"syncProfile": {
467+
"message": "مزامنة تفاصيل تاريخ الميلاد ومتوسط العمر المتوقع أيضًا",
468+
"description": "Label for the additional personal profile sync switch."
469+
},
470+
"syncProfileHint": {
471+
"message": "يزامن أيضًا تاريخ ووقت ميلادك ومنطقتك الزمنية عند الميلاد والجنس عند الولادة ومصدر بيانات متوسط العمر المتوقع المحدد أو عدد السنوات المخصص. هذه المعلومات أكثر خصوصية.",
472+
"description": "Explains the personal profile fields included in optional sync."
473+
},
474+
"syncStatusOff": {
475+
"message": "متوقفة",
476+
"description": "Status when device sync is disabled."
477+
},
478+
"syncStatusSyncing": {
479+
"message": "جارٍ التزامن…",
480+
"description": "Status while device sync is reading or writing."
481+
},
482+
"syncStatusSynced": {
483+
"message": "تمت المزامنة",
484+
"description": "Status after device sync succeeds."
485+
},
486+
"syncStatusError": {
487+
"message": "تم الحفظ على هذا الجهاز. تعذر تحديث المزامنة.",
488+
"description": "Status when local save succeeded but device sync failed."
489+
},
490+
"syncStatusUnavailable": {
491+
"message": "مزامنة الأجهزة غير متاحة في هذا المتصفح.",
492+
"description": "Status when browser sync storage is unavailable."
493+
},
494+
"retrySync": {
495+
"message": "إعادة محاولة المزامنة",
496+
"description": "Button label to retry a failed sync operation."
497+
},
454498
"noTimeZones": {
455499
"message": "لا توجد مناطق زمنية مطابقة",
456500
"description": "Empty result shown when no time zones match the search."

src/_locales/bg/messages.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,50 @@
451451
"message": "Търсене на часови зони",
452452
"description": "Placeholder for the searchable time-zone field."
453453
},
454+
"sectionDeviceSync": {
455+
"message": "Синхронизиране между устройства",
456+
"description": "Settings section heading for device sync."
457+
},
458+
"syncPreferences": {
459+
"message": "Синхронизиране на предпочитанията между устройства",
460+
"description": "Label for preference sync switch."
461+
},
462+
"syncPreferencesHint": {
463+
"message": "Синхронизира темата, стила на цифрите, реда за размисъл, езика и режима на брояча чрез профила ви в браузъра.",
464+
"description": "Explains which preferences sync and that the browser account carries them."
465+
},
466+
"syncProfile": {
467+
"message": "Синхронизиране и на рождения ден и данните за очакваната продължителност на живота",
468+
"description": "Label for the additional personal profile sync switch."
469+
},
470+
"syncProfileHint": {
471+
"message": "Синхронизира също датата и часа на раждане, часовата зона на раждане, пола при раждане и избрания източник на данни за очакваната продължителност на живота или персонализирания брой години. Тази информация е по-лична.",
472+
"description": "Explains the personal profile fields included in optional sync."
473+
},
474+
"syncStatusOff": {
475+
"message": "Изключено",
476+
"description": "Status when device sync is disabled."
477+
},
478+
"syncStatusSyncing": {
479+
"message": "Синхронизиране…",
480+
"description": "Status while device sync is reading or writing."
481+
},
482+
"syncStatusSynced": {
483+
"message": "Синхронизирано",
484+
"description": "Status after device sync succeeds."
485+
},
486+
"syncStatusError": {
487+
"message": "Запазено на това устройство. Синхронизирането не можа да се актуализира.",
488+
"description": "Status when local save succeeded but device sync failed."
489+
},
490+
"syncStatusUnavailable": {
491+
"message": "Синхронизирането между устройства не е налично в този браузър.",
492+
"description": "Status when browser sync storage is unavailable."
493+
},
494+
"retrySync": {
495+
"message": "Повторен опит за синхронизиране",
496+
"description": "Button label to retry a failed sync operation."
497+
},
454498
"noTimeZones": {
455499
"message": "Няма съвпадащи часови зони",
456500
"description": "Empty result shown when no time zones match the search."

src/_locales/bn/messages.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,50 @@
451451
"message": "সময় অঞ্চল খুঁজুন",
452452
"description": "Placeholder for the searchable time-zone field."
453453
},
454+
"sectionDeviceSync": {
455+
"message": "ডিভাইস সিঙ্ক",
456+
"description": "Settings section heading for device sync."
457+
},
458+
"syncPreferences": {
459+
"message": "ডিভাইসগুলোর মধ্যে পছন্দসমূহ সিঙ্ক করুন",
460+
"description": "Label for preference sync switch."
461+
},
462+
"syncPreferencesHint": {
463+
"message": "আপনার ব্রাউজার অ্যাকাউন্টের মাধ্যমে থিম, সংখ্যার ধরন, প্রতিফলনের পঙ্‌ক্তি, ভাষা ও কাউন্টার মোড সিঙ্ক করে।",
464+
"description": "Explains which preferences sync and that the browser account carries them."
465+
},
466+
"syncProfile": {
467+
"message": "জন্মদিন ও প্রত্যাশিত আয়ুর বিবরণও সিঙ্ক করুন",
468+
"description": "Label for the additional personal profile sync switch."
469+
},
470+
"syncProfileHint": {
471+
"message": "আপনার জন্মতারিখ ও সময়, জন্মকালীন সময় অঞ্চল, জন্মের সময় নির্ধারিত লিঙ্গ এবং নির্বাচিত প্রত্যাশিত আয়ুর ডেটা উৎস বা নিজস্ব বছরের সংখ্যাও সিঙ্ক করে। এই তথ্য আরও ব্যক্তিগত।",
472+
"description": "Explains the personal profile fields included in optional sync."
473+
},
474+
"syncStatusOff": {
475+
"message": "বন্ধ",
476+
"description": "Status when device sync is disabled."
477+
},
478+
"syncStatusSyncing": {
479+
"message": "সিঙ্ক হচ্ছে…",
480+
"description": "Status while device sync is reading or writing."
481+
},
482+
"syncStatusSynced": {
483+
"message": "সিঙ্ক হয়েছে",
484+
"description": "Status after device sync succeeds."
485+
},
486+
"syncStatusError": {
487+
"message": "এই ডিভাইসে সংরক্ষিত হয়েছে। সিঙ্ক আপডেট করা যায়নি।",
488+
"description": "Status when local save succeeded but device sync failed."
489+
},
490+
"syncStatusUnavailable": {
491+
"message": "এই ব্রাউজারে ডিভাইস সিঙ্ক পাওয়া যায় না।",
492+
"description": "Status when browser sync storage is unavailable."
493+
},
494+
"retrySync": {
495+
"message": "আবার সিঙ্ক করার চেষ্টা করুন",
496+
"description": "Button label to retry a failed sync operation."
497+
},
454498
"noTimeZones": {
455499
"message": "কোনো মিলে যাওয়া সময় অঞ্চল নেই",
456500
"description": "Empty result shown when no time zones match the search."

src/_locales/ca/messages.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,50 @@
451451
"message": "Cerca zones horàries",
452452
"description": "Placeholder for the searchable time-zone field."
453453
},
454+
"sectionDeviceSync": {
455+
"message": "Sincronització entre dispositius",
456+
"description": "Settings section heading for device sync."
457+
},
458+
"syncPreferences": {
459+
"message": "Sincronitza les preferències entre dispositius",
460+
"description": "Label for preference sync switch."
461+
},
462+
"syncPreferencesHint": {
463+
"message": "Sincronitza el tema, l’estil dels números, la frase de reflexió, l’idioma i el mode del comptador mitjançant el compte del navegador.",
464+
"description": "Explains which preferences sync and that the browser account carries them."
465+
},
466+
"syncProfile": {
467+
"message": "Sincronitza també les dades de l’aniversari i l’esperança de vida",
468+
"description": "Label for the additional personal profile sync switch."
469+
},
470+
"syncProfileHint": {
471+
"message": "També sincronitza la data i l’hora de naixement, el fus horari de naixement, el sexe en néixer i la font de dades d’esperança de vida seleccionada o els anys personalitzats. Aquesta informació és més personal.",
472+
"description": "Explains the personal profile fields included in optional sync."
473+
},
474+
"syncStatusOff": {
475+
"message": "Desactivada",
476+
"description": "Status when device sync is disabled."
477+
},
478+
"syncStatusSyncing": {
479+
"message": "Sincronitzant…",
480+
"description": "Status while device sync is reading or writing."
481+
},
482+
"syncStatusSynced": {
483+
"message": "Sincronitzat",
484+
"description": "Status after device sync succeeds."
485+
},
486+
"syncStatusError": {
487+
"message": "S’ha desat en aquest dispositiu. No s’ha pogut actualitzar la sincronització.",
488+
"description": "Status when local save succeeded but device sync failed."
489+
},
490+
"syncStatusUnavailable": {
491+
"message": "La sincronització entre dispositius no està disponible en aquest navegador.",
492+
"description": "Status when browser sync storage is unavailable."
493+
},
494+
"retrySync": {
495+
"message": "Torna a provar la sincronització",
496+
"description": "Button label to retry a failed sync operation."
497+
},
454498
"noTimeZones": {
455499
"message": "No hi ha cap zona horària coincident",
456500
"description": "Empty result shown when no time zones match the search."

src/_locales/cs/messages.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,50 @@
451451
"message": "Hledat časová pásma",
452452
"description": "Placeholder for the searchable time-zone field."
453453
},
454+
"sectionDeviceSync": {
455+
"message": "Synchronizace zařízení",
456+
"description": "Settings section heading for device sync."
457+
},
458+
"syncPreferences": {
459+
"message": "Synchronizovat předvolby mezi zařízeními",
460+
"description": "Label for preference sync switch."
461+
},
462+
"syncPreferencesHint": {
463+
"message": "Synchronizuje motiv, styl číslic, řádek k zamyšlení, jazyk a režim počítadla prostřednictvím účtu prohlížeče.",
464+
"description": "Explains which preferences sync and that the browser account carries them."
465+
},
466+
"syncProfile": {
467+
"message": "Synchronizovat také narozeniny a údaje o délce života",
468+
"description": "Label for the additional personal profile sync switch."
469+
},
470+
"syncProfileHint": {
471+
"message": "Synchronizuje také datum a čas narození, časové pásmo narození, pohlaví při narození a vybraný zdroj údajů o očekávané délce života nebo vlastní počet let. Tyto informace jsou osobnější.",
472+
"description": "Explains the personal profile fields included in optional sync."
473+
},
474+
"syncStatusOff": {
475+
"message": "Vypnuto",
476+
"description": "Status when device sync is disabled."
477+
},
478+
"syncStatusSyncing": {
479+
"message": "Synchronizace…",
480+
"description": "Status while device sync is reading or writing."
481+
},
482+
"syncStatusSynced": {
483+
"message": "Synchronizováno",
484+
"description": "Status after device sync succeeds."
485+
},
486+
"syncStatusError": {
487+
"message": "Uloženo v tomto zařízení. Synchronizaci se nepodařilo aktualizovat.",
488+
"description": "Status when local save succeeded but device sync failed."
489+
},
490+
"syncStatusUnavailable": {
491+
"message": "Synchronizace zařízení není v tomto prohlížeči dostupná.",
492+
"description": "Status when browser sync storage is unavailable."
493+
},
494+
"retrySync": {
495+
"message": "Opakovat synchronizaci",
496+
"description": "Button label to retry a failed sync operation."
497+
},
454498
"noTimeZones": {
455499
"message": "Žádná odpovídající časová pásma",
456500
"description": "Empty result shown when no time zones match the search."

src/_locales/da/messages.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,50 @@
451451
"message": "Søg efter tidszoner",
452452
"description": "Placeholder for the searchable time-zone field."
453453
},
454+
"sectionDeviceSync": {
455+
"message": "Enhedssynkronisering",
456+
"description": "Settings section heading for device sync."
457+
},
458+
"syncPreferences": {
459+
"message": "Synkroniser indstillinger på tværs af enheder",
460+
"description": "Label for preference sync switch."
461+
},
462+
"syncPreferencesHint": {
463+
"message": "Synkroniserer dit tema, din talstil, refleksionslinje, dit sprog og din tællertilstand via din browserkonto.",
464+
"description": "Explains which preferences sync and that the browser account carries them."
465+
},
466+
"syncProfile": {
467+
"message": "Synkroniser også fødselsdag og oplysninger om forventet levetid",
468+
"description": "Label for the additional personal profile sync switch."
469+
},
470+
"syncProfileHint": {
471+
"message": "Synkroniserer også din fødselsdato og dit fødselstidspunkt, fødselstidszone, køn ved fødslen og den valgte datakilde for forventet levetid eller et brugerdefineret antal år. Disse oplysninger er mere personlige.",
472+
"description": "Explains the personal profile fields included in optional sync."
473+
},
474+
"syncStatusOff": {
475+
"message": "Fra",
476+
"description": "Status when device sync is disabled."
477+
},
478+
"syncStatusSyncing": {
479+
"message": "Synkroniserer…",
480+
"description": "Status while device sync is reading or writing."
481+
},
482+
"syncStatusSynced": {
483+
"message": "Synkroniseret",
484+
"description": "Status after device sync succeeds."
485+
},
486+
"syncStatusError": {
487+
"message": "Gemt på denne enhed. Synkroniseringen kunne ikke opdateres.",
488+
"description": "Status when local save succeeded but device sync failed."
489+
},
490+
"syncStatusUnavailable": {
491+
"message": "Enhedssynkronisering er ikke tilgængelig i denne browser.",
492+
"description": "Status when browser sync storage is unavailable."
493+
},
494+
"retrySync": {
495+
"message": "Prøv at synkronisere igen",
496+
"description": "Button label to retry a failed sync operation."
497+
},
454498
"noTimeZones": {
455499
"message": "Ingen matchende tidszoner",
456500
"description": "Empty result shown when no time zones match the search."

0 commit comments

Comments
 (0)