selfstore 1.6.8 → 1.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/widgets.d.ts CHANGED
@@ -18,12 +18,20 @@ declare abstract class FlowWidget extends HTMLElement {
18
18
  protected unsub: (() => void) | null;
19
19
  /** The widget's EN default strings; subclasses provide theirs. */
20
20
  protected abstract defaults(): WidgetLabels;
21
+ /** Translations shipped with the widget, by language subtag ('fr'). A widget
22
+ * without any stays English until the host passes `labels`. */
23
+ protected packs(): Record<string, WidgetLabels>;
21
24
  /** Build the current view into the given container. */
22
25
  protected abstract view(into: HTMLElement): void;
23
26
  constructor();
24
27
  /** Partial override map, merged over the EN defaults (also the i18n hook). */
25
28
  get labels(): WidgetLabels;
26
29
  set labels(map: WidgetLabels);
30
+ /** The shipped translation for the page's language, if the widget has one.
31
+ * An explicit `lang` on the element (or on any ancestor) wins over the
32
+ * document's, which wins over the browser's, so a host that already sets
33
+ * `<html lang>` gets translated copy without writing a single label. */
34
+ private localized;
27
35
  protected t(key: string): string;
28
36
  /** A heading an empty-string label removes: labels = { 'share.title': '' }
29
37
  * hides that heading (the host page already says it) without a fork.
@@ -83,6 +91,7 @@ declare class SelfstoreConnectElement extends FlowWidget {
83
91
  #private;
84
92
  static get observedAttributes(): string[];
85
93
  protected defaults(): WidgetLabels;
94
+ protected packs(): Record<string, WidgetLabels>;
86
95
  /** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
87
96
  get store(): StoreLike | null;
88
97
  set store(v: StoreLike | null);
@@ -169,6 +178,7 @@ declare class SelfstoreShareElement extends FlowWidget {
169
178
  #private;
170
179
  static get observedAttributes(): string[];
171
180
  protected defaults(): WidgetLabels;
181
+ protected packs(): Record<string, WidgetLabels>;
172
182
  /** The app-side transport of links and memberships (see ShareEngine). */
173
183
  get engine(): ShareEngine | null;
174
184
  set engine(v: ShareEngine | null);
@@ -238,6 +248,7 @@ declare class SelfstoreJoinElement extends FlowWidget {
238
248
  #private;
239
249
  static get observedAttributes(): string[];
240
250
  protected defaults(): WidgetLabels;
251
+ protected packs(): Record<string, WidgetLabels>;
241
252
  get engine(): JoinEngine | null;
242
253
  set engine(v: JoinEngine | null);
243
254
  /** The invitation. Also settable as the `link` attribute. */
@@ -268,6 +279,7 @@ declare class SelfstoreStatusElement extends FlowWidget {
268
279
  #private;
269
280
  static get observedAttributes(): string[];
270
281
  protected defaults(): WidgetLabels;
282
+ protected packs(): Record<string, WidgetLabels>;
271
283
  /** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
272
284
  get store(): StoreLike | null;
273
285
  set store(v: StoreLike | null);
@@ -310,6 +322,7 @@ declare class SelfstoreBackupsElement extends FlowWidget {
310
322
  #private;
311
323
  static get observedAttributes(): string[];
312
324
  protected defaults(): WidgetLabels;
325
+ protected packs(): Record<string, WidgetLabels>;
313
326
  /** The headless manager this panel drives (see 'selfstore/backups'). */
314
327
  get manager(): BackupsManager | null;
315
328
  set manager(v: BackupsManager | null);
@@ -447,6 +460,7 @@ declare class SelfstoreGateElement extends FlowWidget {
447
460
  #private;
448
461
  static get observedAttributes(): string[];
449
462
  protected defaults(): WidgetLabels;
463
+ protected packs(): Record<string, WidgetLabels>;
450
464
  /** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
451
465
  get store(): StoreLike | null;
452
466
  set store(v: StoreLike | null);
package/dist/widgets.js CHANGED
@@ -343,6 +343,11 @@ var FlowWidget = class extends HTMLElement {
343
343
  body;
344
344
  overrides = {};
345
345
  unsub = null;
346
+ /** Translations shipped with the widget, by language subtag ('fr'). A widget
347
+ * without any stays English until the host passes `labels`. */
348
+ packs() {
349
+ return {};
350
+ }
346
351
  constructor() {
347
352
  super();
348
353
  this.root = this.attachShadow({ mode: "open" });
@@ -360,8 +365,16 @@ var FlowWidget = class extends HTMLElement {
360
365
  this.overrides = map ?? {};
361
366
  this.rerender();
362
367
  }
368
+ /** The shipped translation for the page's language, if the widget has one.
369
+ * An explicit `lang` on the element (or on any ancestor) wins over the
370
+ * document's, which wins over the browser's, so a host that already sets
371
+ * `<html lang>` gets translated copy without writing a single label. */
372
+ localized() {
373
+ const tag = this.closest("[lang]")?.getAttribute("lang") || document.documentElement.lang || navigator.language || "";
374
+ return this.packs()[tag.slice(0, 2).toLowerCase()] ?? {};
375
+ }
363
376
  t(key) {
364
- return this.overrides[key] ?? this.defaults()[key] ?? key;
377
+ return this.overrides[key] ?? this.localized()[key] ?? this.defaults()[key] ?? key;
365
378
  }
366
379
  /** A heading an empty-string label removes: labels = { 'share.title': '' }
367
380
  * hides that heading (the host page already says it) without a fork.
@@ -374,7 +387,7 @@ var FlowWidget = class extends HTMLElement {
374
387
  * ('error.targetUnavailable', ...), with a generic fallback. */
375
388
  errorText(labelKey) {
376
389
  if (labelKey) {
377
- const specific = this.overrides[labelKey] ?? this.defaults()[labelKey];
390
+ const specific = this.overrides[labelKey] ?? this.localized()[labelKey] ?? this.defaults()[labelKey];
378
391
  if (specific) return specific;
379
392
  }
380
393
  return this.t("error.generic");
@@ -470,6 +483,66 @@ var EN = {
470
483
  "error.decryptFailed": "This backup could not be opened with that password.",
471
484
  "error.badFormat": "This file does not look like a readable backup."
472
485
  };
486
+ var FR = {
487
+ "connect.title": "O\xF9 enregistrer vos donn\xE9es ?",
488
+ "connect.recommended": "Recommand\xE9",
489
+ "connect.drive": "Google Drive",
490
+ "connect.drive.sub": "Disponible sur tous vos appareils",
491
+ "connect.file": "Un fichier sur cet appareil",
492
+ "connect.file.sub": "Hors ligne, le fichier reste chez vous",
493
+ "connect.file.new": "Nouvelle sauvegarde",
494
+ "connect.file.open": "Ouvrir un fichier existant",
495
+ "connect.webdav": "Mon serveur (WebDAV)",
496
+ "connect.webdav.sub": "Nextcloud, ownCloud, le v\xF4tre",
497
+ "connect.s3": "Mon bucket (S3)",
498
+ "connect.s3.sub": "Amazon S3, R2, B2, MinIO",
499
+ "connect.server": "Mon serveur",
500
+ "connect.server.sub": "WebDAV ou un bucket S3 que vous contr\xF4lez",
501
+ "connect.tab.webdav": "WebDAV",
502
+ "connect.tab.s3": "S3",
503
+ "connect.s3.endpoint": "URL du point d'acc\xE8s",
504
+ "connect.s3.region": "R\xE9gion",
505
+ "connect.s3.bucket": "Bucket",
506
+ "connect.s3.key": "Chemin du fichier",
507
+ "connect.s3.accessKeyId": "Identifiant de la cl\xE9 d'acc\xE8s",
508
+ "connect.s3.secret": "Cl\xE9 secr\xE8te",
509
+ "connect.s3.submit": "Connecter",
510
+ "connect.connecting": "Connexion en cours...",
511
+ "connect.connecting.drive": "Autorisez l'acc\xE8s dans la fen\xEAtre Google.",
512
+ "connect.cancel": "Annuler",
513
+ "connect.retry": "R\xE9essayer",
514
+ "connect.password.title": "Cette sauvegarde est prot\xE9g\xE9e",
515
+ "connect.password.hint": "Entrez son mot de passe pour l\u2019ouvrir.",
516
+ "connect.password.placeholder": "Mot de passe",
517
+ "connect.password.wrong": "Mot de passe incorrect. R\xE9essayez.",
518
+ "connect.password.submit": "Ouvrir",
519
+ "connect.password.show": "Afficher le mot de passe",
520
+ "connect.password.hide": "Masquer le mot de passe",
521
+ "connect.password.forgot": "Mot de passe oubli\xE9 ?",
522
+ "connect.password.forgot.warn": "Sans le mot de passe, cette sauvegarde ne peut pas \xEAtre ouverte. Vous pouvez repartir d\u2019une sauvegarde vide : l\u2019ancienne sera perdue d\xE9finitivement.",
523
+ "connect.password.forgot.confirm": "Remplacer la sauvegarde",
524
+ "connect.password.forgot.back": "Retour",
525
+ "connect.conflict.title": "Cette destination contient d\xE9j\xE0 une sauvegarde",
526
+ "connect.conflict.merge": "Tout garder",
527
+ "connect.conflict.merge.sub": "R\xE9unir la sauvegarde et les donn\xE9es de cet appareil",
528
+ "connect.conflict.resume": "Utiliser la sauvegarde",
529
+ "connect.conflict.resume.sub": "Cet appareil adopte la sauvegarde existante",
530
+ "connect.conflict.replace": "Remplacer la sauvegarde",
531
+ "connect.conflict.replace.sub": "Les donn\xE9es de cet appareil \xE9crasent la sauvegarde",
532
+ "connect.webdav.url": "URL du serveur",
533
+ "connect.webdav.user": "Identifiant",
534
+ "connect.webdav.password": "Mot de passe",
535
+ "connect.webdav.submit": "Connecter",
536
+ "connect.webdav.signup": "Cr\xE9er un compte",
537
+ "connect.webdav.help.more": "Comment faire ?",
538
+ "connect.done": "Connect\xE9. Vos donn\xE9es sont enregistr\xE9es.",
539
+ "connect.done.manual": "Mode fichier : exportez apr\xE8s chaque changement.",
540
+ "error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez.",
541
+ "error.targetUnavailable": "La destination ne r\xE9pond pas. R\xE9essayez dans un instant.",
542
+ "error.authExpired": "Acc\xE8s expir\xE9 : reconnectez-vous pour continuer.",
543
+ "error.decryptFailed": "Cette sauvegarde n'a pas pu \xEAtre ouverte avec ce mot de passe.",
544
+ "error.badFormat": "Ce fichier ne ressemble pas \xE0 une sauvegarde lisible."
545
+ };
473
546
  var EYE_SHOW = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3-8 10-8 10 8 10 8-3 8-10 8-10-8-10-8Z"/><circle cx="12" cy="12" r="3"/></svg>';
474
547
  var EYE_HIDE = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 10 8 10 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><path d="M6.61 6.61A18.45 18.45 0 0 0 2 12s3 8 10 8a9.12 9.12 0 0 0 5.39-1.61"/><line x1="2" y1="2" x2="22" y2="22"/></svg>';
475
548
  function eyeIcon(visible) {
@@ -508,6 +581,9 @@ var SelfstoreConnectElement = class extends FlowWidget {
508
581
  defaults() {
509
582
  return EN;
510
583
  }
584
+ packs() {
585
+ return { fr: FR };
586
+ }
511
587
  /** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
512
588
  get store() {
513
589
  return this.#store;
@@ -1181,6 +1257,26 @@ var EN2 = {
1181
1257
  "error.generic": "That did not work. Check the connection and try again.",
1182
1258
  "error.targetUnavailable": "The share service did not answer. Try again in a moment."
1183
1259
  };
1260
+ var FR2 = {
1261
+ "share.title": "Partage",
1262
+ "share.create.read": "Cr\xE9er un lien de lecture",
1263
+ "share.create.write": "Cr\xE9er un lien de modification",
1264
+ "share.creating": "Cr\xE9ation...",
1265
+ "share.level.read": "Peut consulter",
1266
+ "share.level.write": "Peut modifier",
1267
+ "share.copy": "Copier",
1268
+ "share.copied": "Copi\xE9",
1269
+ "share.revoke": "R\xE9voquer",
1270
+ "share.members": "Personnes ayant acc\xE8s",
1271
+ "share.member.you": "vous",
1272
+ "share.member.owner": "propri\xE9taire",
1273
+ "share.remove": "Retirer",
1274
+ "share.stop": "Arr\xEAter le partage",
1275
+ "share.empty": "Personne d'autre n'a acc\xE8s pour le moment.",
1276
+ "share.stale": "Connexion instable : cette vue est peut-\xEAtre en retard.",
1277
+ "error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez.",
1278
+ "error.targetUnavailable": "Le service de partage ne r\xE9pond pas. R\xE9essayez dans un instant."
1279
+ };
1184
1280
  var isOff = (v) => v != null && ["off", "false", "no", "0"].includes(v.trim().toLowerCase());
1185
1281
  var SelfstoreShareElement = class extends FlowWidget {
1186
1282
  static get observedAttributes() {
@@ -1201,6 +1297,9 @@ var SelfstoreShareElement = class extends FlowWidget {
1201
1297
  defaults() {
1202
1298
  return EN2;
1203
1299
  }
1300
+ packs() {
1301
+ return { fr: FR2 };
1302
+ }
1204
1303
  /** The app-side transport of links and memberships (see ShareEngine). */
1205
1304
  get engine() {
1206
1305
  return this.#engine;
@@ -1494,6 +1593,22 @@ var EN3 = {
1494
1593
  "error.generic": "That did not work. Check the connection and try again.",
1495
1594
  "error.targetUnavailable": "The invitation could not be read. Try again in a moment."
1496
1595
  };
1596
+ var FR3 = {
1597
+ "join.previewing": "Lecture de l'invitation...",
1598
+ "join.title": "Vous \xEAtes invit\xE9",
1599
+ "join.from": "Partag\xE9 par {from}",
1600
+ "join.level.read": "Vous pourrez consulter.",
1601
+ "join.level.write": "Vous pourrez consulter et modifier.",
1602
+ "join.accept": "Rejoindre",
1603
+ "join.joining": "Connexion en cours...",
1604
+ "join.joined": "C'est fait. Les donn\xE9es partag\xE9es se synchronisent sur cet appareil.",
1605
+ "join.mismatch": "Cet appareil suit d\xE9j\xE0 un autre partage. Quittez-le d'abord, ou utilisez un autre profil.",
1606
+ "join.noInvite": "Cette invitation a d\xE9j\xE0 servi, ou elle vise un autre compte.",
1607
+ "join.switchAccount": "Utiliser un autre compte",
1608
+ "join.retry": "R\xE9essayer",
1609
+ "error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez.",
1610
+ "error.targetUnavailable": "L'invitation n'a pas pu \xEAtre lue. R\xE9essayez dans un instant."
1611
+ };
1497
1612
  var SelfstoreJoinElement = class extends FlowWidget {
1498
1613
  static get observedAttributes() {
1499
1614
  return ["link", "variant"];
@@ -1506,6 +1621,9 @@ var SelfstoreJoinElement = class extends FlowWidget {
1506
1621
  defaults() {
1507
1622
  return EN3;
1508
1623
  }
1624
+ packs() {
1625
+ return { fr: FR3 };
1626
+ }
1509
1627
  get engine() {
1510
1628
  return this.#engine;
1511
1629
  }
@@ -1717,6 +1835,19 @@ var EN4 = {
1717
1835
  "status.action.reconnect": "Reconnect",
1718
1836
  "status.action.unlock": "Unlock"
1719
1837
  };
1838
+ var FR4 = {
1839
+ "status.ephemeral": "Rien n'est enregistr\xE9",
1840
+ "status.cacheOnly": "Sur cet appareil seulement",
1841
+ "status.saving": "Enregistrement...",
1842
+ "status.saved": "Sauvegarde \xE0 jour",
1843
+ "status.needsAttention": "Acc\xE8s \xE0 retrouver",
1844
+ "status.locked": "Sauvegarde verrouill\xE9e",
1845
+ "status.pendingDownload": "Modifications \xE0 exporter",
1846
+ "status.action.choose-destination": "Choisir une sauvegarde",
1847
+ "status.action.download": "Exporter",
1848
+ "status.action.reconnect": "Retrouver l'acc\xE8s",
1849
+ "status.action.unlock": "D\xE9verrouiller"
1850
+ };
1720
1851
  var SelfstoreStatusElement = class extends FlowWidget {
1721
1852
  static get observedAttributes() {
1722
1853
  return ["variant"];
@@ -1727,6 +1858,9 @@ var SelfstoreStatusElement = class extends FlowWidget {
1727
1858
  defaults() {
1728
1859
  return EN4;
1729
1860
  }
1861
+ packs() {
1862
+ return { fr: FR4 };
1863
+ }
1730
1864
  /** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
1731
1865
  get store() {
1732
1866
  return this.#store;
@@ -1885,6 +2019,63 @@ var EN5 = {
1885
2019
  "backups.replica.s3.secret": "Secret access key",
1886
2020
  "error.generic": "That did not work. Check the connection and try again."
1887
2021
  };
2022
+ var FR5 = {
2023
+ "backups.mine.heading": "Sauvegardes",
2024
+ "backups.mine.personal": "Sauvegarde principale",
2025
+ "backups.active": "Active",
2026
+ "backups.pill.encrypted": "Chiffr\xE9e",
2027
+ "backups.pill.plain": "Non chiffr\xE9e",
2028
+ "backups.pill.shared": "Partag\xE9e",
2029
+ "backups.pill.private": "Non partag\xE9e",
2030
+ "backups.modified": "modifi\xE9e {when}",
2031
+ "backups.replaceHint": "L'ouvrir remplace les donn\xE9es de cet appareil.",
2032
+ "backups.loading": "Ouverture...",
2033
+ "backups.menu": "Actions",
2034
+ "backups.open": "Ouvrir",
2035
+ "backups.encrypt": "Chiffrer",
2036
+ "backups.share": "Partager",
2037
+ "backups.rename": "Renommer",
2038
+ "backups.delete": "Supprimer",
2039
+ "backups.new": "+ Nouvelle sauvegarde",
2040
+ "backups.newTitle": "Nouvelle sauvegarde",
2041
+ "backups.startsBlank": "Elle d\xE9marre vide.",
2042
+ "backups.namePh": "Son nom",
2043
+ "backups.willBe": "Fichier : {file}",
2044
+ "backups.taken": "Ce nom est d\xE9j\xE0 pris.",
2045
+ "backups.create": "Cr\xE9er",
2046
+ "backups.renameTitle": "Renommer cette sauvegarde",
2047
+ "backups.pwHint": "Cette sauvegarde est prot\xE9g\xE9e : entrez son mot de passe.",
2048
+ "backups.pwShow": "Afficher le mot de passe",
2049
+ "backups.pwHide": "Masquer le mot de passe",
2050
+ "backups.cancel": "Annuler",
2051
+ "backups.shared.heading": "Partag\xE9es avec moi",
2052
+ "backups.shared.by": "Partag\xE9e par {who}",
2053
+ "backups.shared.leave": "Quitter",
2054
+ "backups.replica.add": "Seconde sauvegarde",
2055
+ "backups.replica.title": "Seconde sauvegarde",
2056
+ "backups.replica.intro": "Le m\xEAme fichier chiffr\xE9, \xE9crit aussi \xE0 un second endroit. Si l\u2019un tombe, l\u2019autre reste.",
2057
+ "backups.replica.dest.drive": "Google Drive",
2058
+ "backups.replica.dest.file": "Un fichier sur cet appareil",
2059
+ "backups.replica.dest.webdav": "Un serveur WebDAV",
2060
+ "backups.replica.dest.s3": "Un bucket S3",
2061
+ "backups.replica.card": "Seconde sauvegarde - {label}",
2062
+ "backups.replica.uptodate": "\xC0 jour, {when}",
2063
+ "backups.replica.pending": "Premi\xE8re copie au prochain enregistrement",
2064
+ "backups.replica.error": "Injoignable - nouvel essai au prochain enregistrement",
2065
+ "backups.replica.remove": "Retirer",
2066
+ "backups.replica.save": "Ajouter la copie",
2067
+ "backups.replica.webdav.url": "URL du fichier sur le serveur (https://hote:8443/dav/fichier.zip)",
2068
+ "backups.replica.webdav.help": "L'URL compl\xE8te du fichier de sauvegarde, port personnalis\xE9 compris. Le serveur doit autoriser cette application \xE0 le joindre (CORS) : certains h\xE9bergeurs ne le font pas et ne se connecteront pas depuis un navigateur.",
2069
+ "backups.replica.webdav.user": "Identifiant",
2070
+ "backups.replica.webdav.password": "Mot de passe",
2071
+ "backups.replica.s3.endpoint": "URL du point d'acc\xE8s",
2072
+ "backups.replica.s3.region": "R\xE9gion",
2073
+ "backups.replica.s3.bucket": "Bucket",
2074
+ "backups.replica.s3.key": "Chemin du fichier",
2075
+ "backups.replica.s3.accessKeyId": "Identifiant de la cl\xE9 d'acc\xE8s",
2076
+ "backups.replica.s3.secret": "Cl\xE9 secr\xE8te",
2077
+ "error.generic": "Cela n'a pas fonctionn\xE9. V\xE9rifiez la connexion et r\xE9essayez."
2078
+ };
1888
2079
  var isOff2 = (v) => v != null && ["off", "false", "no", "0"].includes(v.trim().toLowerCase());
1889
2080
  var EYE_OPEN = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>';
1890
2081
  var EYE_SHUT = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m3 3 18 18"/><path d="M10.6 5.1A10.9 10.9 0 0 1 12 5c6.5 0 10 7 10 7a17.4 17.4 0 0 1-3.4 4.4M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a10.7 10.7 0 0 0 5.4-1.4"/></svg>';
@@ -1939,6 +2130,9 @@ var SelfstoreBackupsElement = class extends FlowWidget {
1939
2130
  defaults() {
1940
2131
  return EN5;
1941
2132
  }
2133
+ packs() {
2134
+ return { fr: FR5 };
2135
+ }
1942
2136
  /** The headless manager this panel drives (see 'selfstore/backups'). */
1943
2137
  get manager() {
1944
2138
  return this.#manager;
@@ -2958,6 +3152,13 @@ var EN6 = {
2958
3152
  "gate.defer": "Later - keep it in this browser only",
2959
3153
  "gate.defer.note": "Data kept only in this browser is lost if its storage is cleared."
2960
3154
  };
3155
+ var FR6 = {
3156
+ "gate.title": "O\xF9 enregistrer vos donn\xE9es ?",
3157
+ "gate.hint": "Elles sont chiffr\xE9es sur cet appareil. Choisissez une sauvegarde : tout y sera enregistr\xE9 automatiquement.",
3158
+ "gate.fine": "",
3159
+ "gate.defer": "Plus tard - garder sur cet appareil seulement",
3160
+ "gate.defer.note": "Sans sauvegarde, les donn\xE9es disparaissent si le stockage de cet appareil est vid\xE9."
3161
+ };
2961
3162
  var GATE_STYLES = `
2962
3163
  :host { display: contents; }
2963
3164
  [part~='gate'] {
@@ -3017,6 +3218,9 @@ var SelfstoreGateElement = class extends FlowWidget {
3017
3218
  defaults() {
3018
3219
  return EN6;
3019
3220
  }
3221
+ packs() {
3222
+ return { fr: FR6 };
3223
+ }
3020
3224
  /** The simple store (anything exposing `flowHost`), or a hand-built FlowHost. */
3021
3225
  get store() {
3022
3226
  return this.#store;