@unisim/sdk 0.160.0 → 0.162.0
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/android/src/main/AndroidManifest.xml +1 -1
- package/dist/AccountLimits.d.ts.map +1 -1
- package/dist/AccountLimits.js +11 -1
- package/dist/AccountLimits.js.map +1 -1
- package/dist/AdvancedMenu.d.ts +2 -2
- package/dist/AdvancedMenu.d.ts.map +1 -1
- package/dist/AdvancedMenu.js +8 -2
- package/dist/AdvancedMenu.js.map +1 -1
- package/dist/PreferencesDialog.d.ts +18 -1
- package/dist/PreferencesDialog.d.ts.map +1 -1
- package/dist/PreferencesDialog.js +38 -7
- package/dist/PreferencesDialog.js.map +1 -1
- package/dist/UniversalAppsNavBar.d.ts +9 -1
- package/dist/UniversalAppsNavBar.d.ts.map +1 -1
- package/dist/UniversalAppsNavBar.js +2 -2
- package/dist/UniversalAppsNavBar.js.map +1 -1
- package/dist/UniversalNavBar.d.ts +9 -1
- package/dist/UniversalNavBar.d.ts.map +1 -1
- package/dist/UniversalNavBar.js +3 -1
- package/dist/UniversalNavBar.js.map +1 -1
- package/dist/UserCountLine.d.ts.map +1 -1
- package/dist/UserCountLine.js +2 -1
- package/dist/UserCountLine.js.map +1 -1
- package/dist/UserProfile.d.ts +9 -1
- package/dist/UserProfile.d.ts.map +1 -1
- package/dist/UserProfile.js +3 -3
- package/dist/UserProfile.js.map +1 -1
- package/dist/folderDrop.d.ts +73 -0
- package/dist/folderDrop.d.ts.map +1 -0
- package/dist/folderDrop.js +145 -0
- package/dist/folderDrop.js.map +1 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +80 -40
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/presence.d.ts +11 -7
- package/dist/presence.d.ts.map +1 -1
- package/dist/presence.js +15 -5
- package/dist/presence.js.map +1 -1
- package/dist/productNames.d.ts +7 -0
- package/dist/productNames.d.ts.map +1 -1
- package/dist/productNames.js +11 -0
- package/dist/productNames.js.map +1 -1
- package/dist/useFileDrop.d.ts +27 -1
- package/dist/useFileDrop.d.ts.map +1 -1
- package/dist/useFileDrop.js +35 -5
- package/dist/useFileDrop.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folders dropped on (or picked through) a `useFileDrop` zone with `folders`
|
|
3
|
+
* on — walked down to their files, each one carrying where it sat.
|
|
4
|
+
*
|
|
5
|
+
* The WHERE rides on the file itself, as `webkitRelativePath`: the same field
|
|
6
|
+
* the browser fills in for an `<input webkitdirectory>` pick, in the same shape
|
|
7
|
+
* (`"Holiday/Day 1/IMG_0001.jpg"` — top folder first, file name last, no
|
|
8
|
+
* leading slash). So a dropped folder and a picked folder look identical to the
|
|
9
|
+
* app, and the app reads one field for both. A loose file keeps the browser's
|
|
10
|
+
* own empty string, which is how "not from a folder" is told apart.
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ `webkitRelativePath` is a read-only getter on `File.prototype`. Assigning
|
|
13
|
+
* to it does nothing; `Object.defineProperty` on the instance is what shadows
|
|
14
|
+
* it, and that works in Chromium, WebKit and Gecko alike.
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ Hidden entries (a name starting with `.`) are left out at every depth —
|
|
17
|
+
* `.DS_Store`, `.git/`, `._IMG_0001.jpg` from a FAT-formatted card. Nobody
|
|
18
|
+
* dropping "my photos" meant those, and a folder with a `.git` inside is
|
|
19
|
+
* thousands of files the app would otherwise have to wade through and report.
|
|
20
|
+
*/
|
|
21
|
+
function hidden(name) {
|
|
22
|
+
return name.startsWith('.');
|
|
23
|
+
}
|
|
24
|
+
function withPath(file, path) {
|
|
25
|
+
Object.defineProperty(file, 'webkitRelativePath', { value: path, configurable: true });
|
|
26
|
+
return file;
|
|
27
|
+
}
|
|
28
|
+
function readFile(entry) {
|
|
29
|
+
return new Promise((ok, fail) => entry.file(ok, fail));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Every child of a directory.
|
|
33
|
+
*
|
|
34
|
+
* ⚠️ `readEntries` hands back at most 100 at a time (Chromium) and has to be
|
|
35
|
+
* called AGAIN until it returns an empty batch. One call is the classic bug:
|
|
36
|
+
* a folder of 250 photos silently arrives as 100.
|
|
37
|
+
*/
|
|
38
|
+
async function readAll(dir) {
|
|
39
|
+
const reader = dir.createReader();
|
|
40
|
+
const all = [];
|
|
41
|
+
for (;;) {
|
|
42
|
+
const batch = await new Promise((ok, fail) => reader.readEntries(ok, fail));
|
|
43
|
+
if (batch.length === 0)
|
|
44
|
+
return all;
|
|
45
|
+
all.push(...batch);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function walk(entry, out) {
|
|
49
|
+
if (hidden(entry.name))
|
|
50
|
+
return;
|
|
51
|
+
if (entry.isFile) {
|
|
52
|
+
// A file that will not read — gone since the drag started, or no
|
|
53
|
+
// permission — is left out rather than failing the whole drop.
|
|
54
|
+
try {
|
|
55
|
+
out.push(withPath(await readFile(entry), entry.fullPath.replace(/^\/+/, '')));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* skipped */
|
|
59
|
+
}
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (entry.isDirectory) {
|
|
63
|
+
const children = await readAll(entry).catch(() => []);
|
|
64
|
+
// Sorted by name so the order is the one a file manager shows, not
|
|
65
|
+
// whatever order the disk happened to return.
|
|
66
|
+
children.sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));
|
|
67
|
+
for (const child of children)
|
|
68
|
+
await walk(child, out);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Does this drop hold a folder? Must be asked DURING the drop event.
|
|
73
|
+
*
|
|
74
|
+
* Returns the entries to walk, or `null` when every item is a plain file — in
|
|
75
|
+
* which case the caller keeps using `dataTransfer.files` exactly as before, so
|
|
76
|
+
* a drop with no folder in it behaves precisely as it did before `folders`
|
|
77
|
+
* existed.
|
|
78
|
+
*
|
|
79
|
+
* ⚠️ Synchronous on purpose. `dataTransfer.items` is emptied the moment the
|
|
80
|
+
* drop handler returns; anything that awaits before calling
|
|
81
|
+
* `webkitGetAsEntry()` gets nothing back.
|
|
82
|
+
*/
|
|
83
|
+
export function folderEntries(items) {
|
|
84
|
+
if (!items)
|
|
85
|
+
return null;
|
|
86
|
+
const entries = [];
|
|
87
|
+
let anyFolder = false;
|
|
88
|
+
for (let i = 0; i < items.length; i += 1) {
|
|
89
|
+
const item = items[i];
|
|
90
|
+
if (!item || item.kind !== 'file')
|
|
91
|
+
continue;
|
|
92
|
+
const entry = item.webkitGetAsEntry?.() ?? null;
|
|
93
|
+
if (!entry)
|
|
94
|
+
continue;
|
|
95
|
+
if (entry.isDirectory)
|
|
96
|
+
anyFolder = true;
|
|
97
|
+
entries.push(entry);
|
|
98
|
+
}
|
|
99
|
+
return anyFolder ? entries : null;
|
|
100
|
+
}
|
|
101
|
+
/** Walk the entries `folderEntries` returned, in order, into files. */
|
|
102
|
+
export async function filesFromEntries(entries) {
|
|
103
|
+
const out = [];
|
|
104
|
+
for (const entry of entries)
|
|
105
|
+
await walk(entry, out);
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The folder a file sat in, as `"Holiday/Day 1/"` — trailing slash, ready to
|
|
110
|
+
* put in front of a name. Empty for a file that was not dropped or picked as
|
|
111
|
+
* part of a folder.
|
|
112
|
+
*/
|
|
113
|
+
export function relativeFolderOf(file) {
|
|
114
|
+
const path = file.webkitRelativePath ?? '';
|
|
115
|
+
const cut = path.lastIndexOf('/');
|
|
116
|
+
return cut === -1 ? '' : path.slice(0, cut + 1);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Hidden files out of an `<input webkitdirectory>` pick — the same rule the
|
|
120
|
+
* drop walk applies, so the two routes hand the app the same set.
|
|
121
|
+
*/
|
|
122
|
+
export function withoutHidden(files) {
|
|
123
|
+
return files.filter((f) => !(f.webkitRelativePath || f.name).split('/').some(hidden));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Can this browser pick a whole folder through the file dialog?
|
|
127
|
+
*
|
|
128
|
+
* ⚠️ Phones are ruled out by hand: iOS and Android WebViews expose
|
|
129
|
+
* `webkitdirectory` on the input but open the ordinary picker (or nothing), so
|
|
130
|
+
* feature detection alone would offer a button that cannot do what it says.
|
|
131
|
+
*/
|
|
132
|
+
export function canPickFolder() {
|
|
133
|
+
if (typeof document === 'undefined' || typeof navigator === 'undefined')
|
|
134
|
+
return false;
|
|
135
|
+
if (!('webkitdirectory' in document.createElement('input')))
|
|
136
|
+
return false;
|
|
137
|
+
const ua = navigator.userAgent;
|
|
138
|
+
if (/Android|iPhone|iPad|iPod/i.test(ua))
|
|
139
|
+
return false;
|
|
140
|
+
// iPadOS reports itself as a Mac; the touch points give it away.
|
|
141
|
+
if (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)
|
|
142
|
+
return false;
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=folderDrop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folderDrop.js","sourceRoot":"","sources":["../src/folderDrop.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AA6BA,eAAO,MAAM,mBAAmB,0EAA2E,CAAA;AAE3G,MAAM,MAAM,QAAQ,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AAEzD,eAAO,MAAM,gBAAgB,EAAE,QAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AA6BA,eAAO,MAAM,mBAAmB,0EAA2E,CAAA;AAE3G,MAAM,MAAM,QAAQ,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAA;AAEzD,eAAO,MAAM,gBAAgB,EAAE,QAAe,CAAA;AAg0D9C,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,QAAQ,CAGrF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAUhF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAS3E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,EAC9C,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,CAAC,GAAG,SAAS,CAUf"}
|
package/dist/i18n.js
CHANGED
|
@@ -219,6 +219,11 @@ const en = {
|
|
|
219
219
|
// name and `{value}` a language's endonym or a translated scheme name.
|
|
220
220
|
'prefs.app_preferences': 'Tune this app',
|
|
221
221
|
'prefs.full_settings': 'All {app} settings',
|
|
222
|
+
'prefs.reset_defaults': "Reset to defaults",
|
|
223
|
+
'prefs.reset_confirm': "Reset all of {app}’s settings to the defaults?",
|
|
224
|
+
'prefs.reset_yes': "Reset",
|
|
225
|
+
'prefs.reset_cancel': "Cancel",
|
|
226
|
+
'prefs.reset_done': "Defaults restored",
|
|
222
227
|
'prefs.global_preferences': 'Global Tuning',
|
|
223
228
|
'prefs.language': 'Language',
|
|
224
229
|
'prefs.color_scheme': 'Colour scheme',
|
|
@@ -234,10 +239,10 @@ const en = {
|
|
|
234
239
|
'prefs.this_app': 'This app',
|
|
235
240
|
'prefs.close': 'Close',
|
|
236
241
|
// "There are X total users (Y live)" (0.145.0), under the navbar menu.
|
|
237
|
-
'users.count_one': "
|
|
238
|
-
'users.count_other': "
|
|
239
|
-
'users.suite_one': "
|
|
240
|
-
'users.suite_other': "
|
|
242
|
+
'users.count_one': "{total} {app} user ({live} live)",
|
|
243
|
+
'users.count_other': "{total} {app} users ({live} live)",
|
|
244
|
+
'users.suite_one': "{total} UNI·SIM User ({live} live)",
|
|
245
|
+
'users.suite_other': "{total} UNI·SIM Users ({live} live)",
|
|
241
246
|
// The breakdown behind the suite figure — one row per app, on a long
|
|
242
247
|
// press (0.154.0). Names of apps are NOT here: they are brand identity and
|
|
243
248
|
// come from the switcher catalogue in every language (productNames.ts).
|
|
@@ -270,7 +275,7 @@ const en = {
|
|
|
270
275
|
'users.how_native': "In an installed app — Windows, Android, iOS — opening the app is that first interaction.",
|
|
271
276
|
'users.how_live': "“Live” means used in the last two minutes.",
|
|
272
277
|
'users.how_ids': "“Universal IDs” counts the accounts people have created. Using an app as a guest does not create one.",
|
|
273
|
-
'users.how_split': "Web and native say where each person was last seen. Anyone
|
|
278
|
+
'users.how_split': "Web and native say where each person was last seen. Anyone we can’t place yet is counted as web, so the two always add up to the total.",
|
|
274
279
|
};
|
|
275
280
|
// en-gb defers to en for chrome wording — spelling differences for this set
|
|
276
281
|
// of strings are minimal, but locale-aware date formatting picks up "en-gb"
|
|
@@ -453,6 +458,11 @@ const fr = {
|
|
|
453
458
|
'about.the_team': 'l’équipe UNI·SIM',
|
|
454
459
|
'prefs.app_preferences': 'Régler cette application',
|
|
455
460
|
'prefs.full_settings': 'Tous les réglages de {app}',
|
|
461
|
+
'prefs.reset_defaults': "Rétablir les réglages par défaut",
|
|
462
|
+
'prefs.reset_confirm': "Rétablir tous les réglages de {app} par défaut ?",
|
|
463
|
+
'prefs.reset_yes': "Rétablir",
|
|
464
|
+
'prefs.reset_cancel': "Annuler",
|
|
465
|
+
'prefs.reset_done': "Réglages par défaut rétablis",
|
|
456
466
|
'prefs.global_preferences': 'Réglages globaux',
|
|
457
467
|
'prefs.language': 'Langue',
|
|
458
468
|
'prefs.color_scheme': 'Thème de couleurs',
|
|
@@ -468,10 +478,10 @@ const fr = {
|
|
|
468
478
|
'prefs.this_app': 'Cette application',
|
|
469
479
|
'prefs.close': 'Fermer',
|
|
470
480
|
// "There are X total users (Y live)" (0.145.0), under the navbar menu.
|
|
471
|
-
'users.count_one': "
|
|
472
|
-
'users.count_other': "
|
|
473
|
-
'users.suite_one': "
|
|
474
|
-
'users.suite_other': "
|
|
481
|
+
'users.count_one': "{total} utilisateur de {app} ({live} en ligne)",
|
|
482
|
+
'users.count_other': "{total} utilisateurs de {app} ({live} en ligne)",
|
|
483
|
+
'users.suite_one': "{total} utilisateur UNI·SIM ({live} en ligne)",
|
|
484
|
+
'users.suite_other': "{total} utilisateurs UNI·SIM ({live} en ligne)",
|
|
475
485
|
'users.breakdown_hint': "Appuyez longuement pour voir les utilisateurs de chaque application",
|
|
476
486
|
'users.breakdown_title': "Utilisateurs par application",
|
|
477
487
|
'users.part_total': "{n} utilisateurs",
|
|
@@ -489,7 +499,7 @@ const fr = {
|
|
|
489
499
|
'users.how_native': "Dans une application installée — Windows, Android, iOS — l’ouverture de l’application tient lieu de première interaction.",
|
|
490
500
|
'users.how_live': "« En ligne » signifie utilisé dans les deux dernières minutes.",
|
|
491
501
|
'users.how_ids': "« Universal IDs » compte les comptes créés. Utiliser une application en invité n’en crée pas.",
|
|
492
|
-
'users.how_split': "Web et appli indiquent où chaque personne a été vue en dernier.
|
|
502
|
+
'users.how_split': "Web et appli indiquent où chaque personne a été vue en dernier. Une personne dont on ne le sait pas encore est comptée sur le web : le cumul est donc toujours égal au total.",
|
|
493
503
|
};
|
|
494
504
|
const es = {
|
|
495
505
|
'nav.for': 'para',
|
|
@@ -668,6 +678,11 @@ const es = {
|
|
|
668
678
|
'about.the_team': 'el equipo UNI·SIM',
|
|
669
679
|
'prefs.app_preferences': 'Ajustar esta app',
|
|
670
680
|
'prefs.full_settings': 'Todos los ajustes de {app}',
|
|
681
|
+
'prefs.reset_defaults': "Restablecer valores predeterminados",
|
|
682
|
+
'prefs.reset_confirm': "¿Restablecer todos los ajustes de {app} a los valores predeterminados?",
|
|
683
|
+
'prefs.reset_yes': "Restablecer",
|
|
684
|
+
'prefs.reset_cancel': "Cancelar",
|
|
685
|
+
'prefs.reset_done': "Valores predeterminados restablecidos",
|
|
671
686
|
'prefs.global_preferences': 'Ajustes globales',
|
|
672
687
|
'prefs.language': 'Idioma',
|
|
673
688
|
'prefs.color_scheme': 'Esquema de colores',
|
|
@@ -683,10 +698,10 @@ const es = {
|
|
|
683
698
|
'prefs.this_app': 'Esta aplicación',
|
|
684
699
|
'prefs.close': 'Cerrar',
|
|
685
700
|
// "There are X total users (Y live)" (0.145.0), under the navbar menu.
|
|
686
|
-
'users.count_one': "
|
|
687
|
-
'users.count_other': "
|
|
688
|
-
'users.suite_one': "
|
|
689
|
-
'users.suite_other': "
|
|
701
|
+
'users.count_one': "{total} usuario de {app} ({live} en línea)",
|
|
702
|
+
'users.count_other': "{total} usuarios de {app} ({live} en línea)",
|
|
703
|
+
'users.suite_one': "{total} usuario de UNI·SIM ({live} en línea)",
|
|
704
|
+
'users.suite_other': "{total} usuarios de UNI·SIM ({live} en línea)",
|
|
690
705
|
'users.breakdown_hint': "Mantén pulsado para ver los usuarios de cada aplicación",
|
|
691
706
|
'users.breakdown_title': "Usuarios por aplicación",
|
|
692
707
|
'users.part_total': "{n} usuarios",
|
|
@@ -704,7 +719,7 @@ const es = {
|
|
|
704
719
|
'users.how_native': "En una app instalada —Windows, Android, iOS— abrir la app ya es esa primera interacción.",
|
|
705
720
|
'users.how_live': "«En línea» significa usado en los últimos dos minutos.",
|
|
706
721
|
'users.how_ids': "«Universal IDs» cuenta las cuentas que se han creado. Usar una aplicación como invitado no crea ninguna.",
|
|
707
|
-
'users.how_split': "Web y app indican dónde se vio a cada persona por última vez.
|
|
722
|
+
'users.how_split': "Web y app indican dónde se vio a cada persona por última vez. Si aún no se sabe, se cuenta como web, así que la suma siempre coincide con el total.",
|
|
708
723
|
};
|
|
709
724
|
const it = {
|
|
710
725
|
'nav.for': 'per',
|
|
@@ -883,6 +898,11 @@ const it = {
|
|
|
883
898
|
'about.the_team': 'il team UNI·SIM',
|
|
884
899
|
'prefs.app_preferences': 'Regola questa app',
|
|
885
900
|
'prefs.full_settings': 'Tutte le impostazioni di {app}',
|
|
901
|
+
'prefs.reset_defaults': "Ripristina impostazioni predefinite",
|
|
902
|
+
'prefs.reset_confirm': "Ripristinare tutte le impostazioni di {app} ai valori predefiniti?",
|
|
903
|
+
'prefs.reset_yes': "Ripristina",
|
|
904
|
+
'prefs.reset_cancel': "Annulla",
|
|
905
|
+
'prefs.reset_done': "Impostazioni predefinite ripristinate",
|
|
886
906
|
'prefs.global_preferences': 'Regolazioni globali',
|
|
887
907
|
'prefs.language': 'Lingua',
|
|
888
908
|
'prefs.color_scheme': 'Combinazione di colori',
|
|
@@ -898,10 +918,10 @@ const it = {
|
|
|
898
918
|
'prefs.this_app': 'Questa app',
|
|
899
919
|
'prefs.close': 'Chiudi',
|
|
900
920
|
// "There are X total users (Y live)" (0.145.0), under the navbar menu.
|
|
901
|
-
'users.count_one': "
|
|
902
|
-
'users.count_other': "
|
|
903
|
-
'users.suite_one': "
|
|
904
|
-
'users.suite_other': "
|
|
921
|
+
'users.count_one': "{total} utente di {app} ({live} online)",
|
|
922
|
+
'users.count_other': "{total} utenti di {app} ({live} online)",
|
|
923
|
+
'users.suite_one': "{total} utente UNI·SIM ({live} online)",
|
|
924
|
+
'users.suite_other': "{total} utenti UNI·SIM ({live} online)",
|
|
905
925
|
'users.breakdown_hint': "Tieni premuto per vedere gli utenti di ogni app",
|
|
906
926
|
'users.breakdown_title': "Utenti per app",
|
|
907
927
|
'users.part_total': "{n} utenti",
|
|
@@ -919,7 +939,7 @@ const it = {
|
|
|
919
939
|
'users.how_native': "In un’app installata — Windows, Android, iOS — aprire l’app è già quella prima interazione.",
|
|
920
940
|
'users.how_live': "«Online» significa usato negli ultimi due minuti.",
|
|
921
941
|
'users.how_ids': "«Universal IDs» conta gli account creati. Usare un’app come ospite non ne crea uno.",
|
|
922
|
-
'users.how_split': "Web e app dicono dove ogni persona è stata vista l’ultima volta.
|
|
942
|
+
'users.how_split': "Web e app dicono dove ogni persona è stata vista l’ultima volta. Se non si sa ancora, viene contata come web, quindi la somma corrisponde sempre al totale.",
|
|
923
943
|
};
|
|
924
944
|
const de = {
|
|
925
945
|
'nav.for': 'für',
|
|
@@ -1098,6 +1118,11 @@ const de = {
|
|
|
1098
1118
|
'about.the_team': 'dem UNI·SIM-Team',
|
|
1099
1119
|
'prefs.app_preferences': 'Diese App anpassen',
|
|
1100
1120
|
'prefs.full_settings': 'Alle Einstellungen von {app}',
|
|
1121
|
+
'prefs.reset_defaults': "Auf Standard zurücksetzen",
|
|
1122
|
+
'prefs.reset_confirm': "Alle Einstellungen von {app} auf den Standard zurücksetzen?",
|
|
1123
|
+
'prefs.reset_yes': "Zurücksetzen",
|
|
1124
|
+
'prefs.reset_cancel': "Abbrechen",
|
|
1125
|
+
'prefs.reset_done': "Standard wiederhergestellt",
|
|
1101
1126
|
'prefs.global_preferences': 'Globale Anpassungen',
|
|
1102
1127
|
'prefs.language': 'Sprache',
|
|
1103
1128
|
'prefs.color_scheme': 'Farbschema',
|
|
@@ -1113,10 +1138,10 @@ const de = {
|
|
|
1113
1138
|
'prefs.this_app': 'Diese App',
|
|
1114
1139
|
'prefs.close': 'Schließen',
|
|
1115
1140
|
// "There are X total users (Y live)" (0.145.0), under the navbar menu.
|
|
1116
|
-
'users.count_one': "
|
|
1117
|
-
'users.count_other': "
|
|
1118
|
-
'users.suite_one': "
|
|
1119
|
-
'users.suite_other': "
|
|
1141
|
+
'users.count_one': "{total} Nutzer von {app} ({live} gerade aktiv)",
|
|
1142
|
+
'users.count_other': "{total} Nutzer von {app} ({live} gerade aktiv)",
|
|
1143
|
+
'users.suite_one': "{total} UNI·SIM-Nutzer ({live} gerade aktiv)",
|
|
1144
|
+
'users.suite_other': "{total} UNI·SIM-Nutzer ({live} gerade aktiv)",
|
|
1120
1145
|
'users.breakdown_hint': "Gedrückt halten, um die Nutzer jeder App zu sehen",
|
|
1121
1146
|
'users.breakdown_title': "Nutzer pro App",
|
|
1122
1147
|
'users.part_total': "{n} Nutzer",
|
|
@@ -1134,7 +1159,7 @@ const de = {
|
|
|
1134
1159
|
'users.how_native': "In einer installierten App — Windows, Android, iOS — ist das Öffnen der App genau diese erste Interaktion.",
|
|
1135
1160
|
'users.how_live': "„Gerade aktiv“ heißt: in den letzten zwei Minuten genutzt.",
|
|
1136
1161
|
'users.how_ids': "„Universal IDs“ zählt die erstellten Konten. Wer eine App als Gast nutzt, erstellt keins.",
|
|
1137
|
-
'users.how_split': "Web und App zeigen, wo jede Person zuletzt gesehen wurde.
|
|
1162
|
+
'users.how_split': "Web und App zeigen, wo jede Person zuletzt gesehen wurde. Ist das noch nicht bekannt, zählt sie als Web — die Summe ergibt deshalb immer den Gesamtwert.",
|
|
1138
1163
|
};
|
|
1139
1164
|
// European Portuguese — the SDK's original `pt`, unchanged but for the name.
|
|
1140
1165
|
const ptPT = {
|
|
@@ -1314,6 +1339,11 @@ const ptPT = {
|
|
|
1314
1339
|
'about.the_team': 'a equipa UNI·SIM',
|
|
1315
1340
|
'prefs.app_preferences': 'Ajustar esta aplicação',
|
|
1316
1341
|
'prefs.full_settings': 'Todas as definições de {app}',
|
|
1342
|
+
'prefs.reset_defaults': "Repor predefinições",
|
|
1343
|
+
'prefs.reset_confirm': "Repor todas as definições de {app} para as predefinições?",
|
|
1344
|
+
'prefs.reset_yes': "Repor",
|
|
1345
|
+
'prefs.reset_cancel': "Cancelar",
|
|
1346
|
+
'prefs.reset_done': "Predefinições repostas",
|
|
1317
1347
|
'prefs.global_preferences': 'Ajustes globais',
|
|
1318
1348
|
'prefs.language': 'Idioma',
|
|
1319
1349
|
'prefs.color_scheme': 'Esquema de cores',
|
|
@@ -1329,10 +1359,10 @@ const ptPT = {
|
|
|
1329
1359
|
'prefs.this_app': 'Esta aplicação',
|
|
1330
1360
|
'prefs.close': 'Fechar',
|
|
1331
1361
|
// "There are X total users (Y live)" (0.145.0), under the navbar menu.
|
|
1332
|
-
'users.count_one': "
|
|
1333
|
-
'users.count_other': "
|
|
1334
|
-
'users.suite_one': "
|
|
1335
|
-
'users.suite_other': "
|
|
1362
|
+
'users.count_one': "{total} utilizador de {app} ({live} online)",
|
|
1363
|
+
'users.count_other': "{total} utilizadores de {app} ({live} online)",
|
|
1364
|
+
'users.suite_one': "{total} utilizador UNI·SIM ({live} online)",
|
|
1365
|
+
'users.suite_other': "{total} utilizadores UNI·SIM ({live} online)",
|
|
1336
1366
|
'users.breakdown_hint': "Mantenha premido para ver os utilizadores de cada aplicação",
|
|
1337
1367
|
'users.breakdown_title': "Utilizadores por aplicação",
|
|
1338
1368
|
'users.part_total': "{n} utilizadores",
|
|
@@ -1350,7 +1380,7 @@ const ptPT = {
|
|
|
1350
1380
|
'users.how_native': "Numa aplicação instalada — Windows, Android, iOS — abrir a aplicação é essa primeira interação.",
|
|
1351
1381
|
'users.how_live': "«Online» significa usado nos últimos dois minutos.",
|
|
1352
1382
|
'users.how_ids': "«Universal IDs» conta as contas criadas. Usar uma aplicação como convidado não cria nenhuma.",
|
|
1353
|
-
'users.how_split': "Web e app dizem onde cada pessoa foi vista pela última vez.
|
|
1383
|
+
'users.how_split': "Web e app dizem onde cada pessoa foi vista pela última vez. Se ainda não se souber, conta como web, por isso a soma é sempre igual ao total.",
|
|
1354
1384
|
};
|
|
1355
1385
|
// Brazilian Portuguese — its own read-through, NOT pt-PT with words swapped
|
|
1356
1386
|
// (added 0.141.5). What differs, so the next edit keeps it Brazilian:
|
|
@@ -1544,6 +1574,11 @@ const ptBR = {
|
|
|
1544
1574
|
'about.the_team': 'a equipe UNI·SIM',
|
|
1545
1575
|
'prefs.app_preferences': 'Ajustar este app',
|
|
1546
1576
|
'prefs.full_settings': 'Todas as configurações de {app}',
|
|
1577
|
+
'prefs.reset_defaults': "Restaurar padrões",
|
|
1578
|
+
'prefs.reset_confirm': "Restaurar todas as configurações do {app} para o padrão?",
|
|
1579
|
+
'prefs.reset_yes': "Restaurar",
|
|
1580
|
+
'prefs.reset_cancel': "Cancelar",
|
|
1581
|
+
'prefs.reset_done': "Padrões restaurados",
|
|
1547
1582
|
'prefs.global_preferences': 'Ajustes globais',
|
|
1548
1583
|
'prefs.language': 'Idioma',
|
|
1549
1584
|
'prefs.color_scheme': 'Esquema de cores',
|
|
@@ -1559,10 +1594,10 @@ const ptBR = {
|
|
|
1559
1594
|
'prefs.this_app': 'Este aplicativo',
|
|
1560
1595
|
'prefs.close': 'Fechar',
|
|
1561
1596
|
// "There are X total users (Y live)" (0.145.0), under the navbar menu.
|
|
1562
|
-
'users.count_one': "
|
|
1563
|
-
'users.count_other': "
|
|
1564
|
-
'users.suite_one': "
|
|
1565
|
-
'users.suite_other': "
|
|
1597
|
+
'users.count_one': "{total} usuário de {app} ({live} online)",
|
|
1598
|
+
'users.count_other': "{total} usuários de {app} ({live} online)",
|
|
1599
|
+
'users.suite_one': "{total} usuário UNI·SIM ({live} online)",
|
|
1600
|
+
'users.suite_other': "{total} usuários UNI·SIM ({live} online)",
|
|
1566
1601
|
'users.breakdown_hint': "Toque e segure para ver os usuários de cada app",
|
|
1567
1602
|
'users.breakdown_title': "Usuários por app",
|
|
1568
1603
|
'users.part_total': "{n} usuários",
|
|
@@ -1580,7 +1615,7 @@ const ptBR = {
|
|
|
1580
1615
|
'users.how_native': "Em um app instalado — Windows, Android, iOS — abrir o app já é essa primeira interação.",
|
|
1581
1616
|
'users.how_live': "“Online” significa usado nos últimos dois minutos.",
|
|
1582
1617
|
'users.how_ids': "“Universal IDs” conta as contas criadas. Usar um app como convidado não cria nenhuma.",
|
|
1583
|
-
'users.how_split': "Web e app dizem onde cada pessoa foi vista pela última vez.
|
|
1618
|
+
'users.how_split': "Web e app dizem onde cada pessoa foi vista pela última vez. Se isso ainda não for conhecido, ela conta como web, então a soma é sempre igual ao total.",
|
|
1584
1619
|
};
|
|
1585
1620
|
const tr = {
|
|
1586
1621
|
'nav.for': 'için',
|
|
@@ -1759,6 +1794,11 @@ const tr = {
|
|
|
1759
1794
|
'about.the_team': 'UNI·SIM ekibi',
|
|
1760
1795
|
'prefs.app_preferences': 'Bu uygulamayı ayarla',
|
|
1761
1796
|
'prefs.full_settings': '{app} ayarlarının tümü',
|
|
1797
|
+
'prefs.reset_defaults': "Varsayılanlara sıfırla",
|
|
1798
|
+
'prefs.reset_confirm': "{app} uygulamasının tüm ayarları varsayılanlara sıfırlansın mı?",
|
|
1799
|
+
'prefs.reset_yes': "Sıfırla",
|
|
1800
|
+
'prefs.reset_cancel': "İptal",
|
|
1801
|
+
'prefs.reset_done': "Varsayılanlar geri yüklendi",
|
|
1762
1802
|
'prefs.global_preferences': 'Genel ayarlar',
|
|
1763
1803
|
'prefs.language': 'Dil',
|
|
1764
1804
|
'prefs.color_scheme': 'Renk düzeni',
|
|
@@ -1774,10 +1814,10 @@ const tr = {
|
|
|
1774
1814
|
'prefs.this_app': 'Bu uygulama',
|
|
1775
1815
|
'prefs.close': 'Kapat',
|
|
1776
1816
|
// "There are X total users (Y live)" (0.145.0), under the navbar menu.
|
|
1777
|
-
'users.count_one': "
|
|
1778
|
-
'users.count_other': "
|
|
1779
|
-
'users.suite_one': "
|
|
1780
|
-
'users.suite_other': "
|
|
1817
|
+
'users.count_one': "{total} {app} kullanıcısı ({live} çevrimiçi)",
|
|
1818
|
+
'users.count_other': "{total} {app} kullanıcısı ({live} çevrimiçi)",
|
|
1819
|
+
'users.suite_one': "{total} UNI·SIM kullanıcısı ({live} çevrimiçi)",
|
|
1820
|
+
'users.suite_other': "{total} UNI·SIM kullanıcısı ({live} çevrimiçi)",
|
|
1781
1821
|
'users.breakdown_hint': "Her uygulamanın kullanıcılarını görmek için basılı tutun",
|
|
1782
1822
|
'users.breakdown_title': "Uygulama başına kullanıcı",
|
|
1783
1823
|
'users.part_total': "{n} kullanıcı",
|
|
@@ -1795,7 +1835,7 @@ const tr = {
|
|
|
1795
1835
|
'users.how_native': "Kurulu bir uygulamada — Windows, Android, iOS — uygulamayı açmak zaten o ilk etkileşimdir.",
|
|
1796
1836
|
'users.how_live': "“Çevrimiçi”, son iki dakika içinde kullanıldı demektir.",
|
|
1797
1837
|
'users.how_ids': "“Universal IDs”, oluşturulan hesapları sayar. Bir uygulamayı misafir olarak kullanmak hesap oluşturmaz.",
|
|
1798
|
-
'users.how_split': "Web ve uygulama, her kişinin en son nerede görüldüğünü gösterir.
|
|
1838
|
+
'users.how_split': "Web ve uygulama, her kişinin en son nerede görüldüğünü gösterir. Bu henüz bilinmiyorsa web sayılır; bu yüzden ikisinin toplamı her zaman genel toplama eşittir.",
|
|
1799
1839
|
};
|
|
1800
1840
|
const TRANSLATIONS = {
|
|
1801
1841
|
'en': en,
|