@trismegisto/spine 2.1.2 → 3.0.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/README.md +74 -17
- package/fesm2022/trismegisto-spine-audit.mjs +264 -10
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs +84 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs → trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs} +6 -5
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs → trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs} +9 -8
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs} +4 -4
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs.map → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs → trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs} +123 -27
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs +544 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs +943 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs → trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs} +24 -3
- package/fesm2022/trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs → trismegisto-spine-auto-service-client.usage-CcJANb20.mjs} +15 -6
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CcJANb20.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs +65 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs +81 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs → trismegisto-spine-auto-service-home.component-5_aji1hf.mjs} +5 -4
- package/fesm2022/trismegisto-spine-auto-service-home.component-5_aji1hf.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs +60 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +49 -29
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout.mjs +1698 -156
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +17 -1
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +1157 -85
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-audit.d.ts +180 -5
- package/types/trismegisto-spine-audit.d.ts.map +1 -1
- package/types/trismegisto-spine-auto-service.d.ts +100 -7
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +833 -13
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts +8 -0
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +491 -32
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +0 -48
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +0 -55
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs +0 -357
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs +0 -502
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +0 -54
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { AlertComponent, ButtonComponent, DrawerComponent, IconButtonComponent, IconComponent, MenuButtonComponent, MenuComponent, ModalComponent, SidebarComponent, SidebarGroupComponent, SidebarLinkComponent, SidebarNodeComponent, ToastStackComponent, HermesThemeService, HERMES_THEME_CONFIG, HERMES_SIDEBAR_CONFIG, HERMES_WORKSPACE_PERSISTENCE_CONFIG, provideHermesIcons, HermesShortcutService, HermesI18nService, liveCatalog } from '@trismegisto/angular';
|
|
1
|
+
import { AlertComponent, ButtonComponent, DrawerComponent, IconButtonComponent, IconComponent, MenuButtonComponent, MenuComponent, ModalComponent, SidebarComponent, SidebarGroupComponent, SidebarLinkComponent, SidebarNodeComponent, ToastStackComponent, HermesThemeService, HERMES_THEME_CONFIG, HERMES_SIDEBAR_CONFIG, HERMES_WORKSPACE_PERSISTENCE_CONFIG, provideHermesIcons, HermesShortcutService, HermesI18nService, HermesZoomService, HermesMotionService, liveCatalog } from '@trismegisto/angular';
|
|
2
2
|
import { isPlatformBrowser, DOCUMENT } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { InjectionToken, inject, effect, PLATFORM_ID, Inject, Optional, Injectable, makeEnvironmentProviders, provideAppInitializer, NgZone, signal, computed, untracked, DestroyRef } from '@angular/core';
|
|
5
5
|
import { HERMES_ICONS } from '@trismegisto/icons/catalog';
|
|
6
|
-
import { extendThemeConfig, DEFAULT_THEME_CONFIG, mergeCatalog } from '@trismegisto/primitives';
|
|
6
|
+
import { extendThemeConfig, DEFAULT_THEME_CONFIG, normalizeTextScale, normalizeMotionPreference, mergeCatalog } from '@trismegisto/primitives';
|
|
7
7
|
import { AuthorizationService } from '@orfeu/angular/core';
|
|
8
8
|
|
|
9
9
|
/** `router_id` da tela (nó 'page'), aceitando o argos antigo (que só mandava `route_id`, mesmo valor). */
|
|
@@ -371,15 +371,30 @@ const APP_PACKAGE_INFO = new InjectionToken('APP_PACKAGE_INFO');
|
|
|
371
371
|
const TIME_ZONE_SUFFIX = 'time_zone';
|
|
372
372
|
const LANGUAGE_SUFFIX = 'language';
|
|
373
373
|
const CHARACTER_KEYS_SUFFIX = 'shortcut_character_keys';
|
|
374
|
+
const TEXT_SCALE_SUFFIX = 'text_scale';
|
|
375
|
+
const MOTION_SUFFIX = 'motion';
|
|
376
|
+
const HOUR_CYCLE_SUFFIX = 'hour_cycle';
|
|
377
|
+
const WEEK_START_SUFFIX = 'week_start';
|
|
378
|
+
const IDLE_SUFFIX = 'idle_minutes';
|
|
379
|
+
const START_PAGE_SUFFIX = 'start_page';
|
|
380
|
+
const NOTICES_SUFFIX = 'notices';
|
|
381
|
+
const BROWSER_NOTICES_SUFFIX = 'browser_notices';
|
|
382
|
+
/** Minutos de inatividade oferecidos em "Encerrar por inatividade" (0 = nunca). */
|
|
383
|
+
const SPINE_IDLE_OPTIONS = [0, 5, 15, 30, 60];
|
|
374
384
|
const CHANNEL_BASE = 'spine_preferences';
|
|
375
385
|
/**
|
|
376
386
|
* Preferências do usuário que não são de tema (tema/família/densidade continuam no
|
|
377
|
-
* `HermesThemeService`; modo do menu lateral no `HermesSidebarService`): fuso horário, idioma
|
|
378
|
-
*
|
|
387
|
+
* `HermesThemeService`; modo do menu lateral no `HermesSidebarService`): fuso horário, idioma, relógio de
|
|
388
|
+
* 12/24 h e primeiro dia da semana (`HermesI18nService.setRegionalFormat`), tamanho do texto
|
|
389
|
+
* (`HermesZoomService.setTextScale`), movimento (`HermesMotionService.setPreference`) e o interruptor dos
|
|
390
|
+
* atalhos de tecla única (WCAG 2.1.4) do `HermesShortcutService`.
|
|
379
391
|
*
|
|
380
|
-
*
|
|
381
|
-
*
|
|
382
|
-
*
|
|
392
|
+
* Também guarda as preferências dos recursos opcionais (`SpineFeatures`): minutos de inatividade, tela inicial,
|
|
393
|
+
* tipos de aviso ligados e o aviso do navegador.
|
|
394
|
+
*
|
|
395
|
+
* Vive no navegador (localStorage, sincronizado entre abas). Com `SpineFeatures.accountPreferences`, o
|
|
396
|
+
* `SpineAccountPreferencesService` (`@trismegisto/spine/layout`) espelha estes valores na conta do Argos e os aplica
|
|
397
|
+
* pelos mesmos `set*` no login: quem lê `timeZone()` não precisa saber de onde o valor veio.
|
|
383
398
|
*/
|
|
384
399
|
class SpinePreferencesService {
|
|
385
400
|
constructor() {
|
|
@@ -389,8 +404,14 @@ class SpinePreferencesService {
|
|
|
389
404
|
this.timeZoneKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${TIME_ZONE_SUFFIX}`;
|
|
390
405
|
this.languageKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${LANGUAGE_SUFFIX}`;
|
|
391
406
|
this.characterKeysKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${CHARACTER_KEYS_SUFFIX}`;
|
|
407
|
+
this.textScaleKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${TEXT_SCALE_SUFFIX}`;
|
|
408
|
+
this.motionKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${MOTION_SUFFIX}`;
|
|
409
|
+
this.hourCycleKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${HOUR_CYCLE_SUFFIX}`;
|
|
410
|
+
this.weekStartKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${WEEK_START_SUFFIX}`;
|
|
392
411
|
this.shortcuts = inject(HermesShortcutService);
|
|
393
412
|
this.i18n = inject(HermesI18nService);
|
|
413
|
+
this.zoom = inject(HermesZoomService);
|
|
414
|
+
this.motionService = inject(HermesMotionService);
|
|
394
415
|
/** Idioma com que o app subiu (`provideHermesI18n`) — vale quando a pessoa não escolheu nenhum. */
|
|
395
416
|
this.appLanguage = this.i18n.locale();
|
|
396
417
|
this.channel = this.browser && typeof BroadcastChannel !== 'undefined'
|
|
@@ -409,6 +430,27 @@ class SpinePreferencesService {
|
|
|
409
430
|
* sem escolha salva, vale o padrão do `HermesShortcutService` (`provideHermesShortcuts`).
|
|
410
431
|
*/
|
|
411
432
|
this.characterKeys = signal(this.readCharacterKeys(), ...(ngDevMode ? [{ debugName: "characterKeys" }] : /* istanbul ignore next */ []));
|
|
433
|
+
/** Tamanho do texto (1 = 100%; os oferecidos em `HERMES_TEXT_SCALES`). */
|
|
434
|
+
this.textScale = signal(normalizeTextScale(this.read(this.textScaleKey)), ...(ngDevMode ? [{ debugName: "textScale" }] : /* istanbul ignore next */ []));
|
|
435
|
+
/** Movimento: `system` segue o `prefers-reduced-motion`; `reduce` sempre reduz; `full` nunca. */
|
|
436
|
+
this.motion = signal(normalizeMotionPreference(this.read(this.motionKey)), ...(ngDevMode ? [{ debugName: "motion" }] : /* istanbul ignore next */ []));
|
|
437
|
+
/** Relógio: `h23` (24 horas), `h12` (12 horas) ou vazio (o do idioma). */
|
|
438
|
+
this.hourCycle = signal(toHourCycle(this.read(this.hourCycleKey)), ...(ngDevMode ? [{ debugName: "hourCycle" }] : /* istanbul ignore next */ []));
|
|
439
|
+
/** Primeiro dia da semana (0 = domingo, 1 = segunda) ou `null` (o do idioma). */
|
|
440
|
+
this.weekStart = signal(toWeekStart(this.read(this.weekStartKey)), ...(ngDevMode ? [{ debugName: "weekStart" }] : /* istanbul ignore next */ []));
|
|
441
|
+
this.idleKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${IDLE_SUFFIX}`;
|
|
442
|
+
this.startPageKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${START_PAGE_SUFFIX}`;
|
|
443
|
+
this.noticesKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${NOTICES_SUFFIX}`;
|
|
444
|
+
this.browserNoticesKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${BROWSER_NOTICES_SUFFIX}`;
|
|
445
|
+
/** Encerrar a sessão depois de tantos minutos sem uso (0 = nunca). Os limites do app (`SpineFeatures.idleTimeout`)
|
|
446
|
+
* são aplicados por quem usa o valor (`SpineIdleService`), não aqui. */
|
|
447
|
+
this.idleMinutes = signal(toIdleMinutes(this.read(this.idleKey)), ...(ngDevMode ? [{ debugName: "idleMinutes" }] : /* istanbul ignore next */ []));
|
|
448
|
+
/** Tela que abre depois do login. */
|
|
449
|
+
this.startPage = signal(toStartPage(this.read(this.startPageKey)), ...(ngDevMode ? [{ debugName: "startPage" }] : /* istanbul ignore next */ []));
|
|
450
|
+
/** Tipos de aviso que a pessoa ligou/desligou (`id` → ligado); tipo ausente segue o `defaultEnabled` dele. */
|
|
451
|
+
this.noticeTypes = signal(toNoticeTypes(this.read(this.noticesKey)), ...(ngDevMode ? [{ debugName: "noticeTypes" }] : /* istanbul ignore next */ []));
|
|
452
|
+
/** Aviso do navegador (Notification API) quando a aba está em segundo plano. */
|
|
453
|
+
this.browserNotices = signal(this.read(this.browserNoticesKey) === 'on', ...(ngDevMode ? [{ debugName: "browserNotices" }] : /* istanbul ignore next */ []));
|
|
412
454
|
/** Idiomas oferecidos na configuração, cada um com o nome no próprio idioma (padrão de mercado). */
|
|
413
455
|
this.languages = [
|
|
414
456
|
// check-strings: off — cada idioma escrito no próprio idioma (padrão de mercado), igual em todo catálogo.
|
|
@@ -425,11 +467,33 @@ class SpinePreferencesService {
|
|
|
425
467
|
this.applyLanguage(e.data.value ?? '');
|
|
426
468
|
if (e.data?.type === 'CHARACTER_KEYS_CHANGED')
|
|
427
469
|
this.applyCharacterKeys(e.data.value !== false);
|
|
470
|
+
if (e.data?.type === 'TEXT_SCALE_CHANGED')
|
|
471
|
+
this.applyTextScale(normalizeTextScale(e.data.value));
|
|
472
|
+
if (e.data?.type === 'MOTION_CHANGED')
|
|
473
|
+
this.applyMotion(normalizeMotionPreference(e.data.value));
|
|
474
|
+
if (e.data?.type === 'HOUR_CYCLE_CHANGED')
|
|
475
|
+
this.applyRegionalFormat(toHourCycle(e.data.value), this.weekStart());
|
|
476
|
+
if (e.data?.type === 'WEEK_START_CHANGED')
|
|
477
|
+
this.applyRegionalFormat(this.hourCycle(), toWeekStart(e.data.value));
|
|
478
|
+
if (e.data?.type === 'IDLE_CHANGED')
|
|
479
|
+
this.idleMinutes.set(toIdleMinutes(e.data.value));
|
|
480
|
+
if (e.data?.type === 'START_PAGE_CHANGED')
|
|
481
|
+
this.startPage.set(toStartPage(e.data.value));
|
|
482
|
+
if (e.data?.type === 'NOTICES_CHANGED')
|
|
483
|
+
this.noticeTypes.set(toNoticeTypes(JSON.stringify(e.data.value ?? {})));
|
|
484
|
+
if (e.data?.type === 'BROWSER_NOTICES_CHANGED')
|
|
485
|
+
this.browserNotices.set(e.data.value === true);
|
|
428
486
|
});
|
|
429
487
|
}
|
|
430
488
|
// Escolha salva vale desde a primeira tela (o layout injeta este serviço no boot).
|
|
431
489
|
if (this.language())
|
|
432
490
|
this.i18n.setLocale(this.language());
|
|
491
|
+
if (this.textScale() !== 1)
|
|
492
|
+
this.zoom.setTextScale(this.textScale());
|
|
493
|
+
if (this.motion() !== 'system')
|
|
494
|
+
this.motionService.setPreference(this.motion());
|
|
495
|
+
if (this.hourCycle() || this.weekStart() !== null)
|
|
496
|
+
this.applyRegionalFormat(this.hourCycle(), this.weekStart());
|
|
433
497
|
if (this.characterKeys() !== this.shortcuts.characterKeys())
|
|
434
498
|
this.shortcuts.setCharacterKeys(this.characterKeys());
|
|
435
499
|
// O interruptor do hm-shortcut-list fala direto com o HermesShortcutService: a mudança que vier
|
|
@@ -468,6 +532,78 @@ class SpinePreferencesService {
|
|
|
468
532
|
this.language.set(value);
|
|
469
533
|
this.i18n.setLocale(value || this.appLanguage);
|
|
470
534
|
}
|
|
535
|
+
/** Tamanho do texto na hora (1 = 100%), guarda e avisa as outras abas. */
|
|
536
|
+
setTextScale(value) {
|
|
537
|
+
const scale = normalizeTextScale(value);
|
|
538
|
+
this.applyTextScale(scale);
|
|
539
|
+
this.write(this.textScaleKey, scale === 1 ? '' : String(scale));
|
|
540
|
+
this.channel?.postMessage({ type: 'TEXT_SCALE_CHANGED', value: scale });
|
|
541
|
+
}
|
|
542
|
+
applyTextScale(scale) {
|
|
543
|
+
this.textScale.set(scale);
|
|
544
|
+
this.zoom.setTextScale(scale);
|
|
545
|
+
}
|
|
546
|
+
/** Movimento na hora (`system`/`reduce`/`full`), guarda e avisa as outras abas. */
|
|
547
|
+
setMotion(value) {
|
|
548
|
+
const motion = normalizeMotionPreference(value);
|
|
549
|
+
this.applyMotion(motion);
|
|
550
|
+
this.write(this.motionKey, motion === 'system' ? '' : motion);
|
|
551
|
+
this.channel?.postMessage({ type: 'MOTION_CHANGED', value: motion });
|
|
552
|
+
}
|
|
553
|
+
applyMotion(motion) {
|
|
554
|
+
this.motion.set(motion);
|
|
555
|
+
this.motionService.setPreference(motion);
|
|
556
|
+
}
|
|
557
|
+
/** Relógio na hora (`h23`/`h12`; vazio = o do idioma), guarda e avisa as outras abas. */
|
|
558
|
+
setHourCycle(value) {
|
|
559
|
+
const cycle = toHourCycle(value);
|
|
560
|
+
this.applyRegionalFormat(cycle, this.weekStart());
|
|
561
|
+
this.write(this.hourCycleKey, cycle);
|
|
562
|
+
this.channel?.postMessage({ type: 'HOUR_CYCLE_CHANGED', value: cycle });
|
|
563
|
+
}
|
|
564
|
+
/** Primeiro dia da semana na hora (0 = domingo, 1 = segunda; `null` = o do idioma), guarda e avisa. */
|
|
565
|
+
setWeekStart(value) {
|
|
566
|
+
const day = toWeekStart(value);
|
|
567
|
+
this.applyRegionalFormat(this.hourCycle(), day);
|
|
568
|
+
this.write(this.weekStartKey, day === null ? '' : String(day));
|
|
569
|
+
this.channel?.postMessage({ type: 'WEEK_START_CHANGED', value: day });
|
|
570
|
+
}
|
|
571
|
+
applyRegionalFormat(hourCycle, weekStart) {
|
|
572
|
+
this.hourCycle.set(hourCycle);
|
|
573
|
+
this.weekStart.set(weekStart);
|
|
574
|
+
this.i18n.setRegionalFormat({ hourCycle: hourCycle || null, firstDayOfWeek: weekStart });
|
|
575
|
+
}
|
|
576
|
+
/** Minutos sem uso até encerrar a sessão (0 = nunca), guarda e avisa as outras abas. */
|
|
577
|
+
setIdleMinutes(value) {
|
|
578
|
+
const minutes = toIdleMinutes(value);
|
|
579
|
+
this.idleMinutes.set(minutes);
|
|
580
|
+
this.write(this.idleKey, minutes ? String(minutes) : '');
|
|
581
|
+
this.channel?.postMessage({ type: 'IDLE_CHANGED', value: minutes });
|
|
582
|
+
}
|
|
583
|
+
/** Tela inicial depois do login, guarda e avisa as outras abas. */
|
|
584
|
+
setStartPage(value) {
|
|
585
|
+
const page = toStartPage(value);
|
|
586
|
+
this.startPage.set(page);
|
|
587
|
+
this.write(this.startPageKey, page === 'home' ? '' : page);
|
|
588
|
+
this.channel?.postMessage({ type: 'START_PAGE_CHANGED', value: page });
|
|
589
|
+
}
|
|
590
|
+
/** Liga/desliga um tipo de aviso, guarda e avisa as outras abas. */
|
|
591
|
+
setNoticeType(id, enabled) {
|
|
592
|
+
this.setNoticeTypes({ ...this.noticeTypes(), [id]: enabled });
|
|
593
|
+
}
|
|
594
|
+
/** Troca o mapa inteiro de tipos de aviso (restaurar, sincronização com a conta). */
|
|
595
|
+
setNoticeTypes(value) {
|
|
596
|
+
const types = toNoticeTypes(JSON.stringify(value ?? {}));
|
|
597
|
+
this.noticeTypes.set(types);
|
|
598
|
+
this.write(this.noticesKey, Object.keys(types).length ? JSON.stringify(types) : '');
|
|
599
|
+
this.channel?.postMessage({ type: 'NOTICES_CHANGED', value: types });
|
|
600
|
+
}
|
|
601
|
+
/** Liga/desliga o aviso do navegador, guarda e avisa as outras abas (a permissão é pedida por quem chama). */
|
|
602
|
+
setBrowserNotices(enabled) {
|
|
603
|
+
this.browserNotices.set(enabled);
|
|
604
|
+
this.write(this.browserNoticesKey, enabled ? 'on' : '');
|
|
605
|
+
this.channel?.postMessage({ type: 'BROWSER_NOTICES_CHANGED', value: enabled });
|
|
606
|
+
}
|
|
471
607
|
setTimeZone(value) {
|
|
472
608
|
this.timeZone.set(value);
|
|
473
609
|
this.write(this.timeZoneKey, value);
|
|
@@ -511,6 +647,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
|
|
|
511
647
|
type: Injectable,
|
|
512
648
|
args: [{ providedIn: 'root' }]
|
|
513
649
|
}], ctorParameters: () => [] });
|
|
650
|
+
function toIdleMinutes(value) {
|
|
651
|
+
const minutes = Number(value);
|
|
652
|
+
return Number.isInteger(minutes) && minutes > 0 && minutes <= 24 * 60 ? minutes : 0;
|
|
653
|
+
}
|
|
654
|
+
function toStartPage(value) {
|
|
655
|
+
if (value === 'last')
|
|
656
|
+
return 'last';
|
|
657
|
+
if (typeof value === 'string' && value.startsWith('fav:') && value.length > 4 && value.length <= 500)
|
|
658
|
+
return value;
|
|
659
|
+
return 'home';
|
|
660
|
+
}
|
|
661
|
+
/** Texto JSON salvo → mapa `id` → booleano (o resto é descartado). */
|
|
662
|
+
function toNoticeTypes(raw) {
|
|
663
|
+
let parsed;
|
|
664
|
+
try {
|
|
665
|
+
parsed = raw ? JSON.parse(raw) : {};
|
|
666
|
+
}
|
|
667
|
+
catch {
|
|
668
|
+
return {};
|
|
669
|
+
}
|
|
670
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
671
|
+
return {};
|
|
672
|
+
const out = {};
|
|
673
|
+
for (const [id, enabled] of Object.entries(parsed)) {
|
|
674
|
+
if (typeof enabled === 'boolean' && /^[\w.:-]{1,64}$/.test(id))
|
|
675
|
+
out[id] = enabled;
|
|
676
|
+
}
|
|
677
|
+
return out;
|
|
678
|
+
}
|
|
679
|
+
function toHourCycle(value) {
|
|
680
|
+
return value === 'h12' || value === 'h23' ? value : '';
|
|
681
|
+
}
|
|
682
|
+
/** `0`…`6` (número ou texto salvo) → dia da semana; o resto, `null`. */
|
|
683
|
+
function toWeekStart(value) {
|
|
684
|
+
if (value === null || value === undefined || value === '')
|
|
685
|
+
return null;
|
|
686
|
+
const day = Number(value);
|
|
687
|
+
return Number.isInteger(day) && day >= 0 && day <= 6 ? day : null;
|
|
688
|
+
}
|
|
514
689
|
|
|
515
690
|
/**
|
|
516
691
|
* Base da API do argos-admin-server (ex.: `https://exemplo.com.br/argos/admin/api`) —
|
|
@@ -526,9 +701,13 @@ const SPINE_USER_STORAGE_KEYS = {
|
|
|
526
701
|
favorites: 'nav_favorites',
|
|
527
702
|
recents: 'nav_recent',
|
|
528
703
|
recentSearches: 'header_recent_searches',
|
|
704
|
+
/** Última tela visitada, guardada só com a tela inicial "Última tela visitada" (`SpineStartPageService`). */
|
|
705
|
+
lastPage: 'start_last_page',
|
|
529
706
|
};
|
|
530
707
|
/** Históricos (o que a pessoa visitou/buscou): apagados no logout. Favoritos ficam (preferência do usuário). */
|
|
531
708
|
const HISTORY_KEYS = [SPINE_USER_STORAGE_KEYS.recents, SPINE_USER_STORAGE_KEYS.recentSearches];
|
|
709
|
+
// A última tela (`lastPage`) fica no logout de propósito: é ela que a tela inicial "Última tela visitada" abre no
|
|
710
|
+
// próximo login. Só é gravada quando a pessoa escolheu essa opção.
|
|
532
711
|
/**
|
|
533
712
|
* Chaves de `localStorage` do shell por usuário: `<clientId>_<lista>_<sub>`, com o `sub` do token da sessão.
|
|
534
713
|
* Num computador compartilhado, uma pessoa não vê os recentes/buscas/favoritos de quem entrou antes.
|
|
@@ -597,6 +776,34 @@ class SpineUserStorage {
|
|
|
597
776
|
}
|
|
598
777
|
this.notify();
|
|
599
778
|
}
|
|
779
|
+
/**
|
|
780
|
+
* Apaga uma lista do usuário atual (Configurações › Dados do navegador): a chave dele, e também a antiga sem
|
|
781
|
+
* usuário. Quem guarda a lista em memória relê (`onChange`).
|
|
782
|
+
*/
|
|
783
|
+
clear(list) {
|
|
784
|
+
if (!this.browser)
|
|
785
|
+
return;
|
|
786
|
+
try {
|
|
787
|
+
localStorage.removeItem(this.key(list));
|
|
788
|
+
localStorage.removeItem(`${this.ns}_${list}`);
|
|
789
|
+
}
|
|
790
|
+
catch {
|
|
791
|
+
/* storage indisponível */
|
|
792
|
+
}
|
|
793
|
+
this.notify();
|
|
794
|
+
}
|
|
795
|
+
/** Quantos itens a lista do usuário atual tem guardados (0 sem nada ou com valor ilegível). */
|
|
796
|
+
count(list) {
|
|
797
|
+
if (!this.browser)
|
|
798
|
+
return 0;
|
|
799
|
+
try {
|
|
800
|
+
const parsed = JSON.parse(localStorage.getItem(this.key(list)) ?? '[]');
|
|
801
|
+
return Array.isArray(parsed) ? parsed.length : 0;
|
|
802
|
+
}
|
|
803
|
+
catch {
|
|
804
|
+
return 0;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
600
807
|
/** Avisa quando a sessão muda ou o histórico é limpo (quem guarda a lista em memória relê). */
|
|
601
808
|
onChange(listener) {
|
|
602
809
|
this.listeners.add(listener);
|
|
@@ -689,6 +896,18 @@ class SpineQuickAccessService {
|
|
|
689
896
|
const next = current.some((f) => f.id === item.id) ? current.filter((f) => f.id !== item.id) : [...current, item];
|
|
690
897
|
this.commit(this.favoriteList, this.favoritesKey, next);
|
|
691
898
|
}
|
|
899
|
+
/** Troca a lista de favoritos inteira (sincronização com a conta). Itens inválidos ou repetidos são descartados. */
|
|
900
|
+
setFavorites(items) {
|
|
901
|
+
const seen = new Set();
|
|
902
|
+
const next = items.flatMap((entry) => {
|
|
903
|
+
const item = normalize(entry);
|
|
904
|
+
if (!item || seen.has(item.id))
|
|
905
|
+
return [];
|
|
906
|
+
seen.add(item.id);
|
|
907
|
+
return [item];
|
|
908
|
+
});
|
|
909
|
+
this.commit(this.favoriteList, this.favoritesKey, next);
|
|
910
|
+
}
|
|
692
911
|
recordVisit(item) {
|
|
693
912
|
const current = this.recentList();
|
|
694
913
|
const top = current[0];
|
|
@@ -934,7 +1153,7 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
934
1153
|
appearance: 'Aparência',
|
|
935
1154
|
appearanceKeywords: 'visual cores tema layout',
|
|
936
1155
|
theme: 'Tema',
|
|
937
|
-
themeDescription: 'Claro, escuro ou
|
|
1156
|
+
themeDescription: 'Claro, escuro ou o do sistema operacional.',
|
|
938
1157
|
themeKeywords: 'modo escuro dark light noturno',
|
|
939
1158
|
themeLight: 'Claro',
|
|
940
1159
|
themeDark: 'Escuro',
|
|
@@ -943,7 +1162,7 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
943
1162
|
accentDescription: 'Família de cores do cabeçalho, dos botões e dos destaques.',
|
|
944
1163
|
accentKeywords: 'família paleta cor accent',
|
|
945
1164
|
density: 'Densidade',
|
|
946
|
-
densityDescription: 'Compacta
|
|
1165
|
+
densityDescription: 'Compacta mostra mais informação na tela.',
|
|
947
1166
|
densityKeywords: 'espaçamento tamanho compacto',
|
|
948
1167
|
comfortable: 'Confortável',
|
|
949
1168
|
compact: 'Compacta',
|
|
@@ -951,64 +1170,121 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
951
1170
|
fontDescription: 'Família de letra de todo o aplicativo.',
|
|
952
1171
|
fontKeywords: 'tipografia letra texto roboto rubik figtree geist',
|
|
953
1172
|
sidebar: 'Menu lateral',
|
|
954
|
-
sidebarDescription: '
|
|
1173
|
+
sidebarDescription: 'Como o menu lateral abre e fecha.',
|
|
955
1174
|
sidebarKeywords: 'sidebar navegação barra lateral',
|
|
1175
|
+
sidebarHelp: 'Automático: abre ao aproximar o ponteiro. Fixo: fica sempre aberto. Compacto: mostra só os ícones.',
|
|
956
1176
|
sidebarAuto: 'Automático',
|
|
957
1177
|
sidebarFixed: 'Fixo',
|
|
958
1178
|
sidebarCompact: 'Compacto',
|
|
959
1179
|
region: 'Região',
|
|
960
|
-
regionKeywords: 'idioma língua localização horário data',
|
|
1180
|
+
regionKeywords: 'idioma língua localização horário data hora semana',
|
|
961
1181
|
language: 'Idioma',
|
|
962
|
-
languageDescription: '
|
|
1182
|
+
languageDescription: 'Vale na hora, sem recarregar.',
|
|
963
1183
|
languageKeywords: 'língua language idioma tradução inglês espanhol português',
|
|
964
1184
|
languageAuto: 'Padrão do sistema ({language})',
|
|
965
1185
|
timeZone: 'Fuso horário',
|
|
966
1186
|
timeZoneKeywords: 'timezone hora utc gmt',
|
|
967
|
-
timeZoneHint: '
|
|
1187
|
+
timeZoneHint: 'Para datas e horários. Agora: {now}',
|
|
968
1188
|
timeZoneAuto: 'Automático ({zone})',
|
|
1189
|
+
hourCycle: 'Formato de hora',
|
|
1190
|
+
hourCycleHint: 'Agora: {now}',
|
|
1191
|
+
hourCycleKeywords: 'relógio 24h 12h am pm horário',
|
|
1192
|
+
hourCycleAuto: 'Automático',
|
|
1193
|
+
hourCycle24: '24 horas',
|
|
1194
|
+
hourCycle12: '12 horas',
|
|
1195
|
+
weekStart: 'Primeiro dia da semana',
|
|
1196
|
+
weekStartDescription: 'Para calendários e seletores de data.',
|
|
1197
|
+
weekStartKeywords: 'semana calendário domingo segunda',
|
|
1198
|
+
weekStartAuto: 'Automático',
|
|
969
1199
|
shortcuts: 'Atalhos',
|
|
970
1200
|
shortcutsDescription: 'Pressione ? em qualquer tela para ver esta lista.',
|
|
971
|
-
shortcutsKeywords: 'teclado teclas
|
|
1201
|
+
shortcutsKeywords: 'teclado teclas',
|
|
972
1202
|
tour: 'Tour guiado',
|
|
973
|
-
tourDescription: 'Mostra de novo
|
|
1203
|
+
tourDescription: 'Mostra de novo onde fica cada parte da tela.',
|
|
974
1204
|
tourKeywords: 'onboarding ajuda apresentação',
|
|
975
1205
|
replayTour: 'Refazer tour',
|
|
1206
|
+
accessibility: 'Acessibilidade',
|
|
1207
|
+
accessibilityKeywords: 'acessibilidade leitura visão',
|
|
1208
|
+
textSize: 'Tamanho do texto',
|
|
1209
|
+
textSizeDescription: 'Aumenta o texto e os controles de todas as telas.',
|
|
1210
|
+
textSizeKeywords: 'zoom fonte letra maior ampliar',
|
|
1211
|
+
motion: 'Reduzir animações',
|
|
1212
|
+
motionDescription: 'Sistema segue o computador ou o celular.',
|
|
1213
|
+
motionKeywords: 'animação movimento transição reduced motion enjoo tontura',
|
|
1214
|
+
motionSystem: 'Sistema',
|
|
1215
|
+
motionReduce: 'Sempre',
|
|
1216
|
+
motionFull: 'Nunca',
|
|
1217
|
+
help: 'Ajuda',
|
|
1218
|
+
helpKeywords: 'ajuda novidades tour apresentação',
|
|
1219
|
+
news: 'Novidades',
|
|
1220
|
+
newsDescription: 'O que mudou nas últimas versões.',
|
|
1221
|
+
newsKeywords: 'novidades versão lançamento changelog',
|
|
1222
|
+
showNews: 'Ver novidades',
|
|
1223
|
+
browserData: 'Dados do navegador',
|
|
1224
|
+
browserDataDescription: 'Guardados só neste navegador, para a sua conta.',
|
|
1225
|
+
browserDataKeywords: 'privacidade limpar apagar histórico dados',
|
|
1226
|
+
recentPages: 'Páginas recentes',
|
|
1227
|
+
recentPagesKeywords: 'histórico visitadas recentes',
|
|
1228
|
+
recentSearches: 'Buscas recentes',
|
|
1229
|
+
recentSearchesKeywords: 'busca pesquisa histórico',
|
|
1230
|
+
favorites: 'Favoritos',
|
|
1231
|
+
favoritesKeywords: 'favoritos estrela',
|
|
1232
|
+
pagesCount: { zero: 'Nenhuma página guardada', one: '{count} página guardada', other: '{count} páginas guardadas' },
|
|
1233
|
+
searchesCount: { zero: 'Nenhuma busca guardada', one: '{count} busca guardada', other: '{count} buscas guardadas' },
|
|
1234
|
+
clear: 'Limpar',
|
|
1235
|
+
confirmClear: 'Confirmar',
|
|
1236
|
+
cancel: 'Cancelar',
|
|
1237
|
+
recentPagesCleared: 'Páginas recentes apagadas.',
|
|
1238
|
+
recentSearchesCleared: 'Buscas recentes apagadas.',
|
|
1239
|
+
favoritesCleared: 'Favoritos apagados.',
|
|
1240
|
+
restorePreferences: 'Preferências',
|
|
1241
|
+
restorePreferencesDescription: 'Aparência, acessibilidade e formatos voltam ao padrão.',
|
|
1242
|
+
restorePreferencesHelp: 'Voltam ao padrão: tema, cor principal, densidade, fonte, menu lateral, tamanho do texto, animações, formato de hora e primeiro dia da semana. Idioma, fuso horário e atalhos de tecla única ficam como estão.',
|
|
1243
|
+
restorePreferencesKeywords: 'restaurar padrão redefinir reset preferências',
|
|
1244
|
+
restore: 'Restaurar padrão',
|
|
1245
|
+
confirmRestore: 'Confirmar',
|
|
1246
|
+
preferencesRestored: 'Preferências restauradas.',
|
|
976
1247
|
account: 'Conta',
|
|
977
|
-
accountKeywords: 'perfil usuário
|
|
1248
|
+
accountKeywords: 'perfil usuário login nível sair',
|
|
978
1249
|
user: 'Usuário',
|
|
979
1250
|
accessLevel: 'Nível de acesso',
|
|
980
1251
|
accessLevelKeywords: 'crachá badge perfil permissão grupo',
|
|
981
1252
|
session: 'Sessão',
|
|
982
|
-
sessionDescription: '
|
|
1253
|
+
sessionDescription: 'Renovada sozinha enquanto a aplicação estiver aberta.',
|
|
983
1254
|
sessionKeywords: 'expiração token login',
|
|
984
1255
|
sessionUnknown: 'Não informado',
|
|
985
1256
|
sessionExpired: 'Expirada às {time}',
|
|
986
1257
|
sessionExpiresIn: 'Expira em {minutes} min (às {time})',
|
|
987
1258
|
sessionExpiresAt: 'Expira às {time}',
|
|
988
1259
|
accessToken: 'Token de acesso',
|
|
989
|
-
accessTokenDescription: 'Para testar uma API em seu nome.
|
|
1260
|
+
accessTokenDescription: 'Para testar uma API em seu nome. Não compartilhe.',
|
|
990
1261
|
accessTokenKeywords: 'jwt bearer api desenvolvedor',
|
|
991
1262
|
copy: 'Copiar',
|
|
1263
|
+
moreAbout: 'Mais sobre {label}',
|
|
992
1264
|
appTokens: 'Tokens de aplicação',
|
|
993
|
-
appTokensDescription: 'Para usar
|
|
1265
|
+
appTokensDescription: 'Para usar a aplicação fora da interface: um MCP, um script.',
|
|
994
1266
|
appTokensKeywords: 'token app mcp api chave pat x-app-token automação script integração',
|
|
1267
|
+
appTokensHelp: 'O token vale só para esta aplicação, com as permissões do nível de acesso escolhido, e expira em no máximo 1 ano. Envie no cabeçalho x-app-token.',
|
|
995
1268
|
logout: 'Sair',
|
|
996
1269
|
logoutDescription: 'Encerra a sessão neste navegador.',
|
|
997
1270
|
logoutKeywords: 'logout desconectar',
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1271
|
+
mfa: 'MFA',
|
|
1272
|
+
mfaDescription: 'Verificação em duas etapas da sua conta no Argos.',
|
|
1273
|
+
mfaKeywords: 'segurança argos senha autenticação mfa 2fa dois fatores duas etapas verificação',
|
|
1001
1274
|
signedInAccount: 'Conta no Argos',
|
|
1002
1275
|
signedInRealm: 'Realm {realm}',
|
|
1003
1276
|
twoFactor: 'Verificação em duas etapas',
|
|
1004
|
-
twoFactorDescription: '
|
|
1277
|
+
twoFactorDescription: 'Um código além da senha para entrar.',
|
|
1005
1278
|
twoFactorKeywords: 'mfa 2fa totp autenticador authenticator código e-mail método aparelho celular',
|
|
1006
1279
|
recoveryCodes: 'Códigos de recuperação',
|
|
1007
|
-
recoveryCodesDescription: '
|
|
1280
|
+
recoveryCodesDescription: 'Para entrar se você perder o aparelho.',
|
|
1008
1281
|
recoveryCodesKeywords: 'backup recuperação perdi celular aparelho mfa 2fa',
|
|
1009
1282
|
sessions: 'Sessões e dispositivos',
|
|
1010
|
-
sessionsDescription: '
|
|
1283
|
+
sessionsDescription: 'Onde a sua conta está conectada.',
|
|
1011
1284
|
sessionsKeywords: 'dispositivos navegador ip encerrar desconectar sair aparelhos conectados',
|
|
1285
|
+
sessionsSection: 'Sessões',
|
|
1286
|
+
sessionsSectionDescription: 'Esta sessão, os tokens de aplicação e os dispositivos conectados.',
|
|
1287
|
+
sessionsSectionKeywords: 'sessão sessões token tokens dispositivos login segurança',
|
|
1012
1288
|
about: 'Sobre',
|
|
1013
1289
|
aboutKeywords: 'versão build ambiente dependências suporte',
|
|
1014
1290
|
application: 'Aplicação',
|
|
@@ -1026,7 +1302,7 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1026
1302
|
dependenciesDescription: 'Versões declaradas no package.json desta aplicação.',
|
|
1027
1303
|
dependenciesKeywords: 'angular hermes rxjs apollo graphql',
|
|
1028
1304
|
supportInfo: 'Informações para suporte',
|
|
1029
|
-
supportInfoDescription: '
|
|
1305
|
+
supportInfoDescription: 'Versão, ambiente, navegador e preferências, para colar no chamado.',
|
|
1030
1306
|
supportInfoKeywords: 'ajuda chamado diagnóstico',
|
|
1031
1307
|
noSessionToken: 'Nenhum token de sessão disponível.',
|
|
1032
1308
|
tokenCopied: 'Token copiado. Não compartilhe: ele dá acesso à sua conta até expirar.',
|
|
@@ -1108,7 +1384,7 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1108
1384
|
removeHint: 'Você deixa de poder usar este método para entrar.',
|
|
1109
1385
|
removeLastHint: 'Sem nenhum método, os códigos de recuperação também deixam de valer.',
|
|
1110
1386
|
reauthTitle: 'Confirme sua identidade',
|
|
1111
|
-
reauthHint: '
|
|
1387
|
+
reauthHint: 'Por segurança, confirme antes de continuar. Vale por 5 minutos.',
|
|
1112
1388
|
reauthHow: 'Como confirmar',
|
|
1113
1389
|
reauthPassword: 'Senha',
|
|
1114
1390
|
reauthRecoveryCode: 'Código de recuperação',
|
|
@@ -1132,13 +1408,13 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1132
1408
|
sendCode: 'Enviar código',
|
|
1133
1409
|
emailCodeTitle: 'Confirme o e-mail',
|
|
1134
1410
|
emailCodeHint: 'Digite o código de 6 dígitos enviado para {email}.',
|
|
1135
|
-
codesRemaining: { zero: 'Nenhum código disponível
|
|
1136
|
-
codesHint: 'Cada um vale uma vez
|
|
1411
|
+
codesRemaining: { zero: 'Nenhum código disponível', one: '1 código disponível', other: '{count} códigos disponíveis' },
|
|
1412
|
+
codesHint: 'Cada um vale uma vez. Gerar novos invalida os anteriores.',
|
|
1137
1413
|
codesNeedMethod: 'Cadastre um método de verificação para gerar códigos de recuperação.',
|
|
1138
1414
|
generateCodes: 'Gerar códigos',
|
|
1139
1415
|
regenerateCodes: 'Gerar novos códigos',
|
|
1140
1416
|
codesTitle: 'Seus códigos de recuperação',
|
|
1141
|
-
codesShownOnce: 'Guarde
|
|
1417
|
+
codesShownOnce: 'Guarde num lugar seguro: eles não serão mostrados de novo. Cada um vale uma vez.',
|
|
1142
1418
|
copyCodes: 'Copiar',
|
|
1143
1419
|
downloadCodes: 'Baixar .txt',
|
|
1144
1420
|
codesCopied: 'Códigos copiados.',
|
|
@@ -1263,10 +1539,10 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1263
1539
|
tabRoutes: 'Rotas',
|
|
1264
1540
|
tabRouters: 'Roteadores',
|
|
1265
1541
|
tabAccess: 'Acesso',
|
|
1266
|
-
noClients: 'Você
|
|
1542
|
+
noClients: 'Você não administra este app. É preciso (a) estar no grupo de administração do projeto dele e (b) estar logado com o crachá <strong>Administrador</strong> ativo. Troque de crachá no menu do seu perfil, se disponível, ou peça acesso a quem administra o projeto.',
|
|
1267
1543
|
pickClient: 'Selecione o client que deseja administrar',
|
|
1268
1544
|
groupsTitle: 'Grupos',
|
|
1269
|
-
groupsIntro: '
|
|
1545
|
+
groupsIntro: 'Crie, edite e exclua os grupos deste client e gerencie os membros — sem depender do painel central.',
|
|
1270
1546
|
groupsFixed: 'Os 5 grupos abaixo são fixos deste client e não podem ser renomeados, criados ou excluídos — consulte um para gerenciar seus membros.',
|
|
1271
1547
|
pickGroup: 'Selecione um grupo',
|
|
1272
1548
|
noDescription: 'Sem descrição cadastrada.',
|
|
@@ -1352,6 +1628,9 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1352
1628
|
colPage: 'Página',
|
|
1353
1629
|
colBuiltPath: 'Caminho montado',
|
|
1354
1630
|
colVisibility: 'Visibilidade',
|
|
1631
|
+
colAllowedBadges: 'Crachás permitidos',
|
|
1632
|
+
anyBadge: 'Qualquer crachá',
|
|
1633
|
+
allowedBadgesHint: 'Vazio = qualquer crachá. Com um ou mais escolhidos, só os grupos com um desses crachás podem receber acesso a esta tela na aba Acesso.',
|
|
1355
1634
|
routesTitle: 'Rotas',
|
|
1356
1635
|
newRoute: 'Nova rota',
|
|
1357
1636
|
routesCaption: 'Rotas do client',
|
|
@@ -1370,6 +1649,19 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1370
1649
|
pathPlaceholder: 'ex.: dashboard',
|
|
1371
1650
|
pathHint: 'Um trecho só do endereço: letras minúsculas e hífen. O "/" entre níveis é o roteador que monta.',
|
|
1372
1651
|
pathInvalid: 'Use só letras minúsculas (a–z) e hífen, sem "/", espaço, número ou acento, e sem hífen no início ou no fim.',
|
|
1652
|
+
rotateSecret: 'Gerar novo segredo',
|
|
1653
|
+
confirmRotateSecretHeading: 'Gerar um novo segredo?',
|
|
1654
|
+
confirmRotateSecret: 'O segredo atual deixa de funcionar na hora; atualize o APP_SECRET do serviço que usa esta aplicação. Tokens já emitidos valem até expirar (até 1 hora).',
|
|
1655
|
+
rotatedSecretHeading: 'Novo segredo de {name}',
|
|
1656
|
+
rotatedSecretWarning: 'Copie agora: o segredo não será mostrado de novo.',
|
|
1657
|
+
rotatedSecretNote: 'O servidor guarda só um hash do segredo. Ao fechar esta janela não há como consultá-lo; se ele se perder, gere outro.',
|
|
1658
|
+
rotatedSecretLabel: 'Segredo da aplicação {name}',
|
|
1659
|
+
copySecret: 'Copiar',
|
|
1660
|
+
secretCopied: 'Segredo copiado.',
|
|
1661
|
+
rotatedSecretDone: 'Concluir',
|
|
1662
|
+
rotateSecretError: 'Não foi possível gerar o novo segredo. Tente de novo.',
|
|
1663
|
+
rotateSecretNotFound: 'Aplicação não encontrada neste client.',
|
|
1664
|
+
rotateSecretForbidden: 'Você não administra este client.',
|
|
1373
1665
|
confirmDeleteAppHeading: 'Excluir aplicação?',
|
|
1374
1666
|
confirmDeleteApp: 'A aplicação {name} será excluída e a credencial dela para de funcionar. Esta ação não pode ser desfeita.',
|
|
1375
1667
|
confirmDeleteRouteHeading: 'Excluir rota?',
|
|
@@ -1404,6 +1696,89 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1404
1696
|
reorderLoadError: 'Não foi possível carregar o menu. Tente de novo.',
|
|
1405
1697
|
reorderSaveError: 'Não foi possível salvar a ordem. Nada foi perdido: tente de novo.',
|
|
1406
1698
|
reorderSave: 'Salvar ordem',
|
|
1699
|
+
newGroup: 'Novo grupo',
|
|
1700
|
+
editGroup: 'Editar grupo',
|
|
1701
|
+
groupsCaption: 'Grupos do projeto',
|
|
1702
|
+
noGroups: 'Nenhum grupo cadastrado ainda.',
|
|
1703
|
+
colStatus: 'Situação',
|
|
1704
|
+
groupName: 'Nome',
|
|
1705
|
+
groupType: 'Tipo',
|
|
1706
|
+
groupTypePlaceholder: 'Selecione o tipo',
|
|
1707
|
+
groupDescription: 'Descrição (opcional)',
|
|
1708
|
+
openGroup: 'Abrir o grupo {name}',
|
|
1709
|
+
adminGroupTag: 'Administração',
|
|
1710
|
+
adminGroupNote: 'Grupo de administração do projeto: quem está nele administra este app no auto-serviço. É o único do projeto, não pode ser excluído, renomeado, desativado nem mudar de tipo, e não pode ficar sem membros.',
|
|
1711
|
+
adminGroupEditNote: 'Grupo de administração do projeto: só a descrição pode ser alterada.',
|
|
1712
|
+
adminGroupLastMemberWarning: 'O grupo de administração não pode ficar sem membros: inclua outra pessoa ou desfaça uma remoção.',
|
|
1713
|
+
confirmDeleteGroupHeading: 'Excluir grupo?',
|
|
1714
|
+
confirmDeleteGroup: 'O grupo {name} será excluído junto com os membros, os acessos a telas e as permissões em aplicações. Esta ação não pode ser desfeita.',
|
|
1715
|
+
groupSaveError: 'Não foi possível salvar o grupo. Tente de novo.',
|
|
1716
|
+
membersSaveError: 'Não foi possível salvar todas as alterações dos membros. Confira a lista e tente de novo.',
|
|
1717
|
+
appsCaption: 'Aplicações do projeto',
|
|
1718
|
+
noApps: 'Nenhuma aplicação cadastrada ainda.',
|
|
1719
|
+
colGrants: 'Grants',
|
|
1720
|
+
openApp: 'Abrir a aplicação {name}',
|
|
1721
|
+
tabTokens: 'Tokens',
|
|
1722
|
+
tokensCaption: 'Tokens da aplicação',
|
|
1723
|
+
noTokens: 'Nenhum token criado para esta aplicação ainda.',
|
|
1724
|
+
newToken: 'Novo token',
|
|
1725
|
+
colTokenPrefix: 'Início do token',
|
|
1726
|
+
colExpiresAt: 'Expira em',
|
|
1727
|
+
colLastUsed: 'Último uso',
|
|
1728
|
+
tokenExpired: 'Expirado',
|
|
1729
|
+
tokenRevoked: 'Revogado',
|
|
1730
|
+
neverUsed: 'Nunca',
|
|
1731
|
+
revokeToken: 'Revogar',
|
|
1732
|
+
confirmRevokeTokenHeading: 'Revogar token?',
|
|
1733
|
+
confirmRevokeToken: 'O token {name} deixa de funcionar na hora. A revogação não pode ser desfeita.',
|
|
1734
|
+
tokenRevokedDone: 'Token {name} revogado.',
|
|
1735
|
+
tokenRevokeError: 'Não foi possível revogar o token. Tente de novo.',
|
|
1736
|
+
tokensLoadError: 'Não foi possível carregar os tokens da aplicação.',
|
|
1737
|
+
tokenName: 'Nome',
|
|
1738
|
+
tokenDescription: 'Descrição (opcional)',
|
|
1739
|
+
tokenExpiresAt: 'Expira em',
|
|
1740
|
+
tokenExpiresHint: 'De amanhã até 365 dias a partir de hoje.',
|
|
1741
|
+
tokenExpiresInvalid: 'Escolha uma data entre amanhã e 365 dias a partir de hoje.',
|
|
1742
|
+
tokenOperations: 'Operações liberadas ao token',
|
|
1743
|
+
tokenOperationsNote: 'Marque as operações protected que o token pode chamar. As public e private já valem para ele e aparecem marcadas.',
|
|
1744
|
+
freeForAll: 'liberada para todos',
|
|
1745
|
+
freeForAuthenticated: 'liberada para autenticados',
|
|
1746
|
+
freeNoPermission: 'não depende de permissão',
|
|
1747
|
+
createToken: 'Criar token',
|
|
1748
|
+
tokenSaveError: 'Não foi possível criar o token. Tente de novo.',
|
|
1749
|
+
tokenCreatedHeading: 'Token {name} criado',
|
|
1750
|
+
tokenCreatedWarning: 'Copie agora: o token não será mostrado de novo.',
|
|
1751
|
+
tokenCreatedNote: 'Envie no cabeçalho x-api-token. O servidor guarda só um hash do token; se ele se perder, revogue e crie outro.',
|
|
1752
|
+
tokenValueLabel: 'Token {name}',
|
|
1753
|
+
copyToken: 'Copiar',
|
|
1754
|
+
tokenCopied: 'Token copiado.',
|
|
1755
|
+
hierarchyHint: 'De cima para baixo: Navegação só com Header, Menu só com Navegação, Item só com Menu e Submenu só com Item. Limpar um nível limpa os de baixo.',
|
|
1756
|
+
routerSaveError: 'Não foi possível salvar o roteador. Tente de novo.',
|
|
1757
|
+
permissionsSaveError: 'Não foi possível salvar todas as alterações das operações. Reabra o painel e confira.',
|
|
1758
|
+
tokenErrors: {
|
|
1759
|
+
invalidExpiresAt: 'Data de validade inválida. Escolha outra data.',
|
|
1760
|
+
invalidValidity: 'A validade precisa ficar entre amanhã e 365 dias a partir de hoje.',
|
|
1761
|
+
invalidOperationIds: 'Alguma operação escolhida não existe mais nesta aplicação. Reabra o formulário e escolha de novo.',
|
|
1762
|
+
operationNotProtected: 'Só operações protected podem ser liberadas ao token; as public e private já valem para ele.',
|
|
1763
|
+
appNotFound: 'Aplicação não encontrada neste client. Ela pode ter sido excluída.',
|
|
1764
|
+
tokenNotFound: 'Token não encontrado nesta aplicação. Ele pode já ter sido revogado.',
|
|
1765
|
+
},
|
|
1766
|
+
routerErrors: {
|
|
1767
|
+
hierarchyGap: 'A hierarquia tem um nível vazio no meio: cada nível precisa do de cima (Header → Navegação → Menu → Item → Submenu). Preencha o nível que falta ou limpe os de baixo.',
|
|
1768
|
+
invalidAllowedTypes: 'Algum crachá escolhido não existe mais. Revise os crachás permitidos.',
|
|
1769
|
+
},
|
|
1770
|
+
groupErrors: {
|
|
1771
|
+
invalidType: 'Esse tipo de grupo não existe mais. Escolha outro tipo.',
|
|
1772
|
+
adminTypeReserved: 'O tipo Administrador é só do grupo de administração do projeto.',
|
|
1773
|
+
emptyUpdate: 'Nada para salvar: nenhum campo foi alterado.',
|
|
1774
|
+
groupProjectImmutable: 'O grupo não muda de projeto.',
|
|
1775
|
+
groupNameTaken: 'Já existe um grupo com esse nome neste projeto.',
|
|
1776
|
+
adminGroupImmutable: 'O grupo de administração não muda de nome, de tipo nem é desativado.',
|
|
1777
|
+
adminGroupProtected: 'O grupo de administração do projeto não pode ser excluído.',
|
|
1778
|
+
adminGroupLastMember: 'O grupo de administração não pode ficar sem membros.',
|
|
1779
|
+
adminGroupAccessProtected: 'O acesso do grupo de administração a este app não pode ser removido.',
|
|
1780
|
+
groupNotFound: 'Grupo não encontrado neste projeto. Ele pode ter sido excluído.',
|
|
1781
|
+
},
|
|
1407
1782
|
},
|
|
1408
1783
|
autoServiceAudit: {
|
|
1409
1784
|
title: 'Auditoria',
|
|
@@ -1573,6 +1948,132 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1573
1948
|
spansSummary: '{count} spans em {duration}',
|
|
1574
1949
|
spanRow: '{app}, {operation}: {outcome}, começa em +{offset}, dura {duration}',
|
|
1575
1950
|
},
|
|
1951
|
+
loginAttempts: {
|
|
1952
|
+
refresh: 'Atualizar',
|
|
1953
|
+
user: 'Usuário',
|
|
1954
|
+
userPlaceholder: 'Usuário, e-mail ou identificador digitado',
|
|
1955
|
+
period: 'Período',
|
|
1956
|
+
result: 'Resultado',
|
|
1957
|
+
method: 'Método',
|
|
1958
|
+
all: 'Todos',
|
|
1959
|
+
clear: 'Limpar',
|
|
1960
|
+
advancedFilters: 'Filtros avançados',
|
|
1961
|
+
ip: 'IP ou rede',
|
|
1962
|
+
ipPlaceholder: '10.0.0.5 ou 10.0.0.0/8',
|
|
1963
|
+
ipHint: 'IP exato ou rede em notação CIDR.',
|
|
1964
|
+
reason: 'Motivo',
|
|
1965
|
+
caption: 'Tentativas de login',
|
|
1966
|
+
pageItems: 'tentativas',
|
|
1967
|
+
pageSize: 'Tentativas por página',
|
|
1968
|
+
colDate: 'Data/hora',
|
|
1969
|
+
colResult: 'Resultado',
|
|
1970
|
+
colMethod: 'Método',
|
|
1971
|
+
colUser: 'Usuário',
|
|
1972
|
+
colReason: 'Motivo',
|
|
1973
|
+
colIp: 'IP',
|
|
1974
|
+
colRealm: 'Realm',
|
|
1975
|
+
colClient: 'Client',
|
|
1976
|
+
colUserAgent: 'Navegador',
|
|
1977
|
+
filterByIp: 'Filtrar por este IP',
|
|
1978
|
+
filterByUser: 'Filtrar por este usuário',
|
|
1979
|
+
noMatchingUser: 'sem usuário correspondente',
|
|
1980
|
+
methods: { local: 'Senha', mfa: 'MFA', github: 'GitHub', google: 'Google', keycloak: 'Keycloak', entraid: 'Entra ID' },
|
|
1981
|
+
results: { success: 'Sucesso', failure: 'Falha', cancelled: 'Cancelada' },
|
|
1982
|
+
reasons: {
|
|
1983
|
+
bad_password: 'Senha incorreta',
|
|
1984
|
+
unknown_user: 'Usuário inexistente ou inativo',
|
|
1985
|
+
locked: 'Conta bloqueada por tentativas',
|
|
1986
|
+
mfa_failed: 'Código de verificação incorreto',
|
|
1987
|
+
mfa_expired: 'Código de verificação vencido',
|
|
1988
|
+
mfa_not_allowed: 'Método de verificação não permitido',
|
|
1989
|
+
mfa_invalid_method: 'Método de verificação desconhecido',
|
|
1990
|
+
recovery_failed: 'Código de recuperação incorreto ou já usado',
|
|
1991
|
+
recovery_refused: 'Código de recuperação recusado',
|
|
1992
|
+
not_linked: 'Conta externa não vinculada',
|
|
1993
|
+
wrong_realm: 'Usuário de outro realm',
|
|
1994
|
+
},
|
|
1995
|
+
forbiddenAdmin: 'Sua conta não pode consultar as tentativas de login. Peça a um administrador a operação admin:attempts:list.',
|
|
1996
|
+
forbiddenClient: 'Só o grupo de administração do projeto, com o crachá Administrador ativo, vê as tentativas de login desta aplicação.',
|
|
1997
|
+
loadErrorDetail: 'Não foi possível carregar as tentativas: {detail}',
|
|
1998
|
+
loadError: 'Não foi possível carregar as tentativas de login.',
|
|
1999
|
+
},
|
|
2000
|
+
accountFeatures: {
|
|
2001
|
+
aiAgent: 'Conectar um agente de IA',
|
|
2002
|
+
aiAgentDescription: 'Gera o token e a configuração MCP para colar no Claude Code.',
|
|
2003
|
+
aiAgentKeywords: 'ia agente claude mcp assistente llm automação',
|
|
2004
|
+
aiAgentHelp: 'O agente usa um token de aplicação pessoal (x-app-token) com as permissões do nível de acesso escolhido. Revogue em "Tokens de aplicação" quando não precisar mais.',
|
|
2005
|
+
aiAgentStart: 'Conectar agente',
|
|
2006
|
+
aiAgentServers: 'Servidores MCP',
|
|
2007
|
+
aiAgentAccess: 'Acesso do agente',
|
|
2008
|
+
aiAgentReadOnly: 'Só leitura',
|
|
2009
|
+
aiAgentReadWrite: 'Leitura e escrita',
|
|
2010
|
+
aiAgentWriteHint: 'O agente poderá alterar dados em seu nome. Prefira só leitura quando bastar.',
|
|
2011
|
+
aiAgentReadOnlyServer: '{name} (só leitura)',
|
|
2012
|
+
aiAgentTokenName: 'Agente de IA ({date})',
|
|
2013
|
+
aiAgentGenerate: 'Gerar configuração',
|
|
2014
|
+
aiAgentSelectServer: 'Escolha pelo menos um servidor.',
|
|
2015
|
+
aiAgentResult: 'Configuração pronta',
|
|
2016
|
+
aiAgentResultHint: 'Cole em .mcp.json, na raiz do projeto (Claude Code). O token aparece só agora: copie antes de concluir. Vale até {date}.',
|
|
2017
|
+
aiAgentCopy: 'Copiar configuração',
|
|
2018
|
+
aiAgentCopied: 'Configuração copiada. Não compartilhe: ela contém o seu token.',
|
|
2019
|
+
aiAgentDone: 'Concluir',
|
|
2020
|
+
aiAgentCreateError: 'Não foi possível gerar o token do agente.',
|
|
2021
|
+
aiAgentUnavailable: 'Indisponível neste aplicativo: ele não está ligado ao argos-admin.',
|
|
2022
|
+
activity: 'Atividade da conta',
|
|
2023
|
+
activityDescription: 'Entradas e tentativas que falharam nos últimos 90 dias.',
|
|
2024
|
+
activityKeywords: 'login entrada acesso histórico tentativa falha ip navegador segurança',
|
|
2025
|
+
activityFilter: 'Mostrar',
|
|
2026
|
+
activityAll: 'Todas',
|
|
2027
|
+
activityFailures: 'Só falhas',
|
|
2028
|
+
activityDetail: '{date} · IP {ip}',
|
|
2029
|
+
activityApp: 'Aplicativo: {app}',
|
|
2030
|
+
activityEmpty: 'Nada nos últimos 90 dias.',
|
|
2031
|
+
activityMore: 'Carregar mais',
|
|
2032
|
+
activityShowing: '{shown} de {total}',
|
|
2033
|
+
activityLoadError: 'Não foi possível carregar a atividade da conta.',
|
|
2034
|
+
unknownIp: 'desconhecido',
|
|
2035
|
+
unknownApp: 'sem nome',
|
|
2036
|
+
idle: 'Encerrar por inatividade',
|
|
2037
|
+
idleDescription: 'Sai sozinho depois de um tempo sem uso, com um aviso antes.',
|
|
2038
|
+
idleKeywords: 'inatividade ocioso tempo sair automático logout segurança bloqueio',
|
|
2039
|
+
idleNever: 'Nunca',
|
|
2040
|
+
idleOption: '{minutes} min',
|
|
2041
|
+
idleLimitHint: 'Esta aplicação encerra a sessão em no máximo {minutes} min sem uso.',
|
|
2042
|
+
idleWarningHeading: 'A sessão vai ser encerrada',
|
|
2043
|
+
idleWarningText: { one: 'Nenhuma atividade há algum tempo. A sessão termina em {count} segundo.', other: 'Nenhuma atividade há algum tempo. A sessão termina em {count} segundos.' },
|
|
2044
|
+
idleStay: 'Continuar conectado',
|
|
2045
|
+
idleLogout: 'Sair agora',
|
|
2046
|
+
startPage: 'Tela inicial',
|
|
2047
|
+
startPageDescription: 'Onde a aplicação abre depois do login.',
|
|
2048
|
+
startPageKeywords: 'início home abertura login favorito última tela',
|
|
2049
|
+
startHome: 'Início',
|
|
2050
|
+
startLast: 'Última tela visitada',
|
|
2051
|
+
startFavorite: 'Favorito: {name}',
|
|
2052
|
+
startPageHint: 'Marque telas como favoritas para abrir numa delas.',
|
|
2053
|
+
defaultBadge: 'Crachá padrão',
|
|
2054
|
+
defaultBadgeDescription: 'Nível de acesso com que você entra nesta aplicação, em qualquer navegador.',
|
|
2055
|
+
defaultBadgeKeywords: 'crachá badge nível acesso perfil padrão login',
|
|
2056
|
+
defaultBadgeAuto: 'Automático (o de menor nível)',
|
|
2057
|
+
defaultBadgeSaved: 'Crachá padrão salvo. Vale a partir do próximo login.',
|
|
2058
|
+
defaultBadgeError: 'Não foi possível salvar o crachá padrão.',
|
|
2059
|
+
defaultBadgeLoadError: 'Não foi possível carregar os seus crachás.',
|
|
2060
|
+
notices: 'Notificações',
|
|
2061
|
+
noticesDescription: 'Os avisos que esta aplicação mostra.',
|
|
2062
|
+
noticesKeywords: 'notificação aviso alerta navegador push',
|
|
2063
|
+
browserNotices: 'Avisos do navegador',
|
|
2064
|
+
browserNoticesDescription: 'Aviso do sistema quando a aba está em segundo plano.',
|
|
2065
|
+
browserNoticesDenied: 'O navegador bloqueou as notificações deste site. Libere nas configurações do navegador.',
|
|
2066
|
+
browserNoticesUnsupported: 'Este navegador não mostra notificações.',
|
|
2067
|
+
noticeOpen: 'Abrir',
|
|
2068
|
+
sync: 'Preferências na conta',
|
|
2069
|
+
syncDescription: 'Aparência, região, favoritos e as demais preferências acompanham você em qualquer navegador.',
|
|
2070
|
+
syncKeywords: 'sincronizar nuvem conta navegador preferências backup',
|
|
2071
|
+
syncSynced: 'Sincronizado às {time}',
|
|
2072
|
+
syncSaving: 'Salvando…',
|
|
2073
|
+
syncLocal: 'Só neste navegador: a conta não está disponível.',
|
|
2074
|
+
syncError: 'Não foi possível sincronizar. Tente de novo.',
|
|
2075
|
+
syncNow: 'Sincronizar agora',
|
|
2076
|
+
},
|
|
1576
2077
|
};
|
|
1577
2078
|
|
|
1578
2079
|
const SPINE_MESSAGES_EN = {
|
|
@@ -1697,7 +2198,7 @@ const SPINE_MESSAGES_EN = {
|
|
|
1697
2198
|
appearance: 'Appearance',
|
|
1698
2199
|
appearanceKeywords: 'visual colors theme layout',
|
|
1699
2200
|
theme: 'Theme',
|
|
1700
|
-
themeDescription: 'Light, dark or
|
|
2201
|
+
themeDescription: 'Light, dark or the operating system one.',
|
|
1701
2202
|
themeKeywords: 'dark mode light night',
|
|
1702
2203
|
themeLight: 'Light',
|
|
1703
2204
|
themeDark: 'Dark',
|
|
@@ -1706,7 +2207,7 @@ const SPINE_MESSAGES_EN = {
|
|
|
1706
2207
|
accentDescription: 'Color family for the header, buttons and highlights.',
|
|
1707
2208
|
accentKeywords: 'family palette color accent',
|
|
1708
2209
|
density: 'Density',
|
|
1709
|
-
densityDescription: 'Compact
|
|
2210
|
+
densityDescription: 'Compact shows more information on screen.',
|
|
1710
2211
|
densityKeywords: 'spacing size compact',
|
|
1711
2212
|
comfortable: 'Comfortable',
|
|
1712
2213
|
compact: 'Compact',
|
|
@@ -1714,64 +2215,121 @@ const SPINE_MESSAGES_EN = {
|
|
|
1714
2215
|
fontDescription: 'Typeface for the whole application.',
|
|
1715
2216
|
fontKeywords: 'typography typeface text roboto rubik figtree geist',
|
|
1716
2217
|
sidebar: 'Side menu',
|
|
1717
|
-
sidebarDescription: '
|
|
2218
|
+
sidebarDescription: 'How the side menu opens and closes.',
|
|
1718
2219
|
sidebarKeywords: 'sidebar navigation side bar',
|
|
2220
|
+
sidebarHelp: 'Automatic: opens when the pointer approaches. Fixed: always open. Compact: shows only the icons.',
|
|
1719
2221
|
sidebarAuto: 'Automatic',
|
|
1720
2222
|
sidebarFixed: 'Fixed',
|
|
1721
2223
|
sidebarCompact: 'Compact',
|
|
1722
2224
|
region: 'Region',
|
|
1723
|
-
regionKeywords: 'language locale time date',
|
|
2225
|
+
regionKeywords: 'language locale time date hour week',
|
|
1724
2226
|
language: 'Language',
|
|
1725
|
-
languageDescription: '
|
|
2227
|
+
languageDescription: 'Applies immediately, no reload.',
|
|
1726
2228
|
languageKeywords: 'language locale translation english spanish portuguese',
|
|
1727
2229
|
languageAuto: 'System default ({language})',
|
|
1728
2230
|
timeZone: 'Time zone',
|
|
1729
2231
|
timeZoneKeywords: 'timezone hour utc gmt',
|
|
1730
|
-
timeZoneHint: '
|
|
2232
|
+
timeZoneHint: 'For dates and times. Now: {now}',
|
|
1731
2233
|
timeZoneAuto: 'Automatic ({zone})',
|
|
2234
|
+
hourCycle: 'Time format',
|
|
2235
|
+
hourCycleHint: 'Now: {now}',
|
|
2236
|
+
hourCycleKeywords: 'clock 24h 12h am pm hour',
|
|
2237
|
+
hourCycleAuto: 'Automatic',
|
|
2238
|
+
hourCycle24: '24-hour',
|
|
2239
|
+
hourCycle12: '12-hour',
|
|
2240
|
+
weekStart: 'First day of the week',
|
|
2241
|
+
weekStartDescription: 'For calendars and date pickers.',
|
|
2242
|
+
weekStartKeywords: 'week calendar sunday monday',
|
|
2243
|
+
weekStartAuto: 'Automatic',
|
|
1732
2244
|
shortcuts: 'Shortcuts',
|
|
1733
2245
|
shortcutsDescription: 'Press ? on any screen to see this list.',
|
|
1734
|
-
shortcutsKeywords: 'keyboard keys
|
|
2246
|
+
shortcutsKeywords: 'keyboard keys',
|
|
1735
2247
|
tour: 'Guided tour',
|
|
1736
|
-
tourDescription: 'Shows again
|
|
2248
|
+
tourDescription: 'Shows again where each part of the screen is.',
|
|
1737
2249
|
tourKeywords: 'onboarding help introduction',
|
|
1738
2250
|
replayTour: 'Replay tour',
|
|
2251
|
+
accessibility: 'Accessibility',
|
|
2252
|
+
accessibilityKeywords: 'accessibility reading vision',
|
|
2253
|
+
textSize: 'Text size',
|
|
2254
|
+
textSizeDescription: 'Makes text and controls larger on every screen.',
|
|
2255
|
+
textSizeKeywords: 'zoom font letter bigger enlarge',
|
|
2256
|
+
motion: 'Reduce motion',
|
|
2257
|
+
motionDescription: 'System follows your computer or phone.',
|
|
2258
|
+
motionKeywords: 'animation motion transition reduced dizziness',
|
|
2259
|
+
motionSystem: 'System',
|
|
2260
|
+
motionReduce: 'Always',
|
|
2261
|
+
motionFull: 'Never',
|
|
2262
|
+
help: 'Help',
|
|
2263
|
+
helpKeywords: "help what's new tour introduction",
|
|
2264
|
+
news: "What's new",
|
|
2265
|
+
newsDescription: 'What changed in the latest versions.',
|
|
2266
|
+
newsKeywords: 'news version release changelog',
|
|
2267
|
+
showNews: "See what's new",
|
|
2268
|
+
browserData: 'Browser data',
|
|
2269
|
+
browserDataDescription: 'Stored only in this browser, for your account.',
|
|
2270
|
+
browserDataKeywords: 'privacy clear delete history data',
|
|
2271
|
+
recentPages: 'Recent pages',
|
|
2272
|
+
recentPagesKeywords: 'history visited recent',
|
|
2273
|
+
recentSearches: 'Recent searches',
|
|
2274
|
+
recentSearchesKeywords: 'search query history',
|
|
2275
|
+
favorites: 'Favorites',
|
|
2276
|
+
favoritesKeywords: 'favorites star bookmarks',
|
|
2277
|
+
pagesCount: { zero: 'No pages stored', one: '{count} page stored', other: '{count} pages stored' },
|
|
2278
|
+
searchesCount: { zero: 'No searches stored', one: '{count} search stored', other: '{count} searches stored' },
|
|
2279
|
+
clear: 'Clear',
|
|
2280
|
+
confirmClear: 'Confirm',
|
|
2281
|
+
cancel: 'Cancel',
|
|
2282
|
+
recentPagesCleared: 'Recent pages cleared.',
|
|
2283
|
+
recentSearchesCleared: 'Recent searches cleared.',
|
|
2284
|
+
favoritesCleared: 'Favorites cleared.',
|
|
2285
|
+
restorePreferences: 'Preferences',
|
|
2286
|
+
restorePreferencesDescription: 'Appearance, accessibility and formats go back to the defaults.',
|
|
2287
|
+
restorePreferencesHelp: 'Back to the defaults: theme, main color, density, font, side menu, text size, animations, time format and first day of the week. Language, time zone and single-key shortcuts stay as they are.',
|
|
2288
|
+
restorePreferencesKeywords: 'restore default reset preferences',
|
|
2289
|
+
restore: 'Restore defaults',
|
|
2290
|
+
confirmRestore: 'Confirm',
|
|
2291
|
+
preferencesRestored: 'Preferences restored.',
|
|
1739
2292
|
account: 'Account',
|
|
1740
|
-
accountKeywords: 'profile user
|
|
2293
|
+
accountKeywords: 'profile user login level sign out',
|
|
1741
2294
|
user: 'User',
|
|
1742
2295
|
accessLevel: 'Access level',
|
|
1743
2296
|
accessLevelKeywords: 'badge profile permission group',
|
|
1744
2297
|
session: 'Session',
|
|
1745
|
-
sessionDescription: '
|
|
2298
|
+
sessionDescription: 'Renews itself while the application is open.',
|
|
1746
2299
|
sessionKeywords: 'expiration token login',
|
|
1747
2300
|
sessionUnknown: 'Not provided',
|
|
1748
2301
|
sessionExpired: 'Expired at {time}',
|
|
1749
2302
|
sessionExpiresIn: 'Expires in {minutes} min (at {time})',
|
|
1750
2303
|
sessionExpiresAt: 'Expires at {time}',
|
|
1751
2304
|
accessToken: 'Access token',
|
|
1752
|
-
accessTokenDescription:
|
|
2305
|
+
accessTokenDescription: "To test an API on your behalf. Don't share it.",
|
|
1753
2306
|
accessTokenKeywords: 'jwt bearer api developer',
|
|
1754
2307
|
copy: 'Copy',
|
|
2308
|
+
moreAbout: 'More about {label}',
|
|
1755
2309
|
appTokens: 'Application tokens',
|
|
1756
|
-
appTokensDescription: 'To use
|
|
2310
|
+
appTokensDescription: 'To use the application outside the interface: an MCP, a script.',
|
|
1757
2311
|
appTokensKeywords: 'token app mcp api key pat x-app-token automation script integration',
|
|
2312
|
+
appTokensHelp: 'The token is valid only for this application, with the permissions of the chosen access level, and expires in at most 1 year. Send it in the x-app-token header.',
|
|
1758
2313
|
logout: 'Sign out',
|
|
1759
2314
|
logoutDescription: 'Ends the session in this browser.',
|
|
1760
2315
|
logoutKeywords: 'logout disconnect',
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
2316
|
+
mfa: 'MFA',
|
|
2317
|
+
mfaDescription: 'Two-step verification of your Argos account.',
|
|
2318
|
+
mfaKeywords: 'security argos password authentication mfa 2fa two-factor two-step verification',
|
|
1764
2319
|
signedInAccount: 'Argos account',
|
|
1765
2320
|
signedInRealm: 'Realm {realm}',
|
|
1766
2321
|
twoFactor: 'Two-step verification',
|
|
1767
|
-
twoFactorDescription: '
|
|
2322
|
+
twoFactorDescription: 'A code on top of the password to sign in.',
|
|
1768
2323
|
twoFactorKeywords: 'mfa 2fa totp authenticator code email method device phone',
|
|
1769
2324
|
recoveryCodes: 'Recovery codes',
|
|
1770
|
-
recoveryCodesDescription: '
|
|
2325
|
+
recoveryCodesDescription: 'To sign in if you lose your device.',
|
|
1771
2326
|
recoveryCodesKeywords: 'backup recovery lost phone device mfa 2fa',
|
|
1772
2327
|
sessions: 'Sessions and devices',
|
|
1773
|
-
sessionsDescription: '
|
|
2328
|
+
sessionsDescription: 'Where your account is signed in.',
|
|
1774
2329
|
sessionsKeywords: 'devices browser ip end sign out disconnect connected',
|
|
2330
|
+
sessionsSection: 'Sessions',
|
|
2331
|
+
sessionsSectionDescription: 'This session, the application tokens and the signed-in devices.',
|
|
2332
|
+
sessionsSectionKeywords: 'session sessions token tokens devices login security',
|
|
1775
2333
|
about: 'About',
|
|
1776
2334
|
aboutKeywords: 'version build environment dependencies support',
|
|
1777
2335
|
application: 'Application',
|
|
@@ -1789,7 +2347,7 @@ const SPINE_MESSAGES_EN = {
|
|
|
1789
2347
|
dependenciesDescription: "Versions declared in this application's package.json.",
|
|
1790
2348
|
dependenciesKeywords: 'angular hermes rxjs apollo graphql',
|
|
1791
2349
|
supportInfo: 'Support information',
|
|
1792
|
-
supportInfoDescription: '
|
|
2350
|
+
supportInfoDescription: 'Version, environment, browser and preferences, to paste into the ticket.',
|
|
1793
2351
|
supportInfoKeywords: 'help ticket diagnostics',
|
|
1794
2352
|
noSessionToken: 'No session token available.',
|
|
1795
2353
|
tokenCopied: "Token copied. Don't share it: it gives access to your account until it expires.",
|
|
@@ -1871,7 +2429,7 @@ const SPINE_MESSAGES_EN = {
|
|
|
1871
2429
|
removeHint: "You won't be able to use this method to sign in anymore.",
|
|
1872
2430
|
removeLastHint: 'With no method left, the recovery codes stop working too.',
|
|
1873
2431
|
reauthTitle: 'Confirm your identity',
|
|
1874
|
-
reauthHint: '
|
|
2432
|
+
reauthHint: 'For security, confirm before continuing. It lasts 5 minutes.',
|
|
1875
2433
|
reauthHow: 'How to confirm',
|
|
1876
2434
|
reauthPassword: 'Password',
|
|
1877
2435
|
reauthRecoveryCode: 'Recovery code',
|
|
@@ -1895,13 +2453,13 @@ const SPINE_MESSAGES_EN = {
|
|
|
1895
2453
|
sendCode: 'Send code',
|
|
1896
2454
|
emailCodeTitle: 'Confirm the email',
|
|
1897
2455
|
emailCodeHint: 'Enter the 6-digit code sent to {email}.',
|
|
1898
|
-
codesRemaining: { zero: 'No codes available
|
|
1899
|
-
codesHint: 'Each one
|
|
2456
|
+
codesRemaining: { zero: 'No codes available', one: '1 code available', other: '{count} codes available' },
|
|
2457
|
+
codesHint: 'Each one works once. Generating new ones invalidates the previous ones.',
|
|
1900
2458
|
codesNeedMethod: 'Set up a verification method to generate recovery codes.',
|
|
1901
2459
|
generateCodes: 'Generate codes',
|
|
1902
2460
|
regenerateCodes: 'Generate new codes',
|
|
1903
2461
|
codesTitle: 'Your recovery codes',
|
|
1904
|
-
codesShownOnce: "Keep
|
|
2462
|
+
codesShownOnce: "Keep them somewhere safe: they won't be shown again. Each one works once.",
|
|
1905
2463
|
copyCodes: 'Copy',
|
|
1906
2464
|
downloadCodes: 'Download .txt',
|
|
1907
2465
|
codesCopied: 'Codes copied.',
|
|
@@ -2026,10 +2584,10 @@ const SPINE_MESSAGES_EN = {
|
|
|
2026
2584
|
tabRoutes: 'Routes',
|
|
2027
2585
|
tabRouters: 'Routers',
|
|
2028
2586
|
tabAccess: 'Access',
|
|
2029
|
-
noClients: "You don't manage
|
|
2587
|
+
noClients: "You don't manage this app. You need to (a) be in its project's administration group and (b) be signed in with the <strong>Administrator</strong> badge active. Switch badges in your profile menu, if available, or ask whoever manages the project for access.",
|
|
2030
2588
|
pickClient: 'Select the client you want to manage',
|
|
2031
2589
|
groupsTitle: 'Groups',
|
|
2032
|
-
groupsIntro: "
|
|
2590
|
+
groupsIntro: "Create, edit and delete this client's groups and manage their members — without relying on the central panel.",
|
|
2033
2591
|
groupsFixed: "The 5 groups below are fixed for this client and can't be renamed, created or deleted — look one up to manage its members.",
|
|
2034
2592
|
pickGroup: 'Select a group',
|
|
2035
2593
|
noDescription: 'No description provided.',
|
|
@@ -2115,6 +2673,9 @@ const SPINE_MESSAGES_EN = {
|
|
|
2115
2673
|
colPage: 'Page',
|
|
2116
2674
|
colBuiltPath: 'Built path',
|
|
2117
2675
|
colVisibility: 'Visibility',
|
|
2676
|
+
colAllowedBadges: 'Allowed badges',
|
|
2677
|
+
anyBadge: 'Any badge',
|
|
2678
|
+
allowedBadgesHint: 'Empty = any badge. With one or more chosen, only groups with one of those badges can be given access to this screen in the Access tab.',
|
|
2118
2679
|
routesTitle: 'Routes',
|
|
2119
2680
|
newRoute: 'New route',
|
|
2120
2681
|
routesCaption: 'Client routes',
|
|
@@ -2133,6 +2694,19 @@ const SPINE_MESSAGES_EN = {
|
|
|
2133
2694
|
pathPlaceholder: 'e.g.: dashboard',
|
|
2134
2695
|
pathHint: 'A single piece of the address: lowercase letters and hyphens. The router adds the "/" between levels.',
|
|
2135
2696
|
pathInvalid: 'Use only lowercase letters (a–z) and hyphens — no "/", spaces, digits or accents, and no hyphen at the start or end.',
|
|
2697
|
+
rotateSecret: 'Generate new secret',
|
|
2698
|
+
confirmRotateSecretHeading: 'Generate a new secret?',
|
|
2699
|
+
confirmRotateSecret: 'The current secret stops working right away; update the APP_SECRET of the service that uses this application. Tokens already issued stay valid until they expire (up to 1 hour).',
|
|
2700
|
+
rotatedSecretHeading: 'New secret for {name}',
|
|
2701
|
+
rotatedSecretWarning: "Copy it now: the secret won't be shown again.",
|
|
2702
|
+
rotatedSecretNote: 'The server keeps only a hash of the secret. Once this window is closed there is no way to look it up; if it gets lost, generate another one.',
|
|
2703
|
+
rotatedSecretLabel: 'Secret of application {name}',
|
|
2704
|
+
copySecret: 'Copy',
|
|
2705
|
+
secretCopied: 'Secret copied.',
|
|
2706
|
+
rotatedSecretDone: 'Done',
|
|
2707
|
+
rotateSecretError: "Couldn't generate the new secret. Try again.",
|
|
2708
|
+
rotateSecretNotFound: 'Application not found in this client.',
|
|
2709
|
+
rotateSecretForbidden: "You don't manage this client.",
|
|
2136
2710
|
confirmDeleteAppHeading: 'Delete application?',
|
|
2137
2711
|
confirmDeleteApp: 'The application {name} will be deleted and its credential will stop working. This cannot be undone.',
|
|
2138
2712
|
confirmDeleteRouteHeading: 'Delete route?',
|
|
@@ -2167,6 +2741,89 @@ const SPINE_MESSAGES_EN = {
|
|
|
2167
2741
|
reorderLoadError: 'Could not load the menu. Try again.',
|
|
2168
2742
|
reorderSaveError: 'Could not save the order. Nothing was lost: try again.',
|
|
2169
2743
|
reorderSave: 'Save order',
|
|
2744
|
+
newGroup: 'New group',
|
|
2745
|
+
editGroup: 'Edit group',
|
|
2746
|
+
groupsCaption: 'Project groups',
|
|
2747
|
+
noGroups: 'No groups yet.',
|
|
2748
|
+
colStatus: 'Status',
|
|
2749
|
+
groupName: 'Name',
|
|
2750
|
+
groupType: 'Type',
|
|
2751
|
+
groupTypePlaceholder: 'Select the type',
|
|
2752
|
+
groupDescription: 'Description (optional)',
|
|
2753
|
+
openGroup: 'Open the {name} group',
|
|
2754
|
+
adminGroupTag: 'Administration',
|
|
2755
|
+
adminGroupNote: "The project's administration group: its members manage this app in self-service. It is the only one in the project and can't be deleted, renamed, disabled or change type, nor be left without members.",
|
|
2756
|
+
adminGroupEditNote: "The project's administration group: only the description can change.",
|
|
2757
|
+
adminGroupLastMemberWarning: "The administration group can't be left without members: add someone else or undo a removal.",
|
|
2758
|
+
confirmDeleteGroupHeading: 'Delete group?',
|
|
2759
|
+
confirmDeleteGroup: 'The {name} group will be deleted along with its members, screen access and application permissions. This cannot be undone.',
|
|
2760
|
+
groupSaveError: 'Could not save the group. Try again.',
|
|
2761
|
+
membersSaveError: 'Could not save all member changes. Check the list and try again.',
|
|
2762
|
+
appsCaption: 'Project applications',
|
|
2763
|
+
noApps: 'No applications registered yet.',
|
|
2764
|
+
colGrants: 'Grants',
|
|
2765
|
+
openApp: 'Open the application {name}',
|
|
2766
|
+
tabTokens: 'Tokens',
|
|
2767
|
+
tokensCaption: 'Application tokens',
|
|
2768
|
+
noTokens: 'No tokens created for this application yet.',
|
|
2769
|
+
newToken: 'New token',
|
|
2770
|
+
colTokenPrefix: 'Token prefix',
|
|
2771
|
+
colExpiresAt: 'Expires',
|
|
2772
|
+
colLastUsed: 'Last used',
|
|
2773
|
+
tokenExpired: 'Expired',
|
|
2774
|
+
tokenRevoked: 'Revoked',
|
|
2775
|
+
neverUsed: 'Never',
|
|
2776
|
+
revokeToken: 'Revoke',
|
|
2777
|
+
confirmRevokeTokenHeading: 'Revoke token?',
|
|
2778
|
+
confirmRevokeToken: 'The token {name} stops working right away. Revoking cannot be undone.',
|
|
2779
|
+
tokenRevokedDone: 'Token {name} revoked.',
|
|
2780
|
+
tokenRevokeError: 'Could not revoke the token. Try again.',
|
|
2781
|
+
tokensLoadError: 'Could not load the application tokens.',
|
|
2782
|
+
tokenName: 'Name',
|
|
2783
|
+
tokenDescription: 'Description (optional)',
|
|
2784
|
+
tokenExpiresAt: 'Expires on',
|
|
2785
|
+
tokenExpiresHint: 'From tomorrow up to 365 days from today.',
|
|
2786
|
+
tokenExpiresInvalid: 'Pick a date between tomorrow and 365 days from today.',
|
|
2787
|
+
tokenOperations: 'Operations granted to the token',
|
|
2788
|
+
tokenOperationsNote: 'Check the protected operations the token may call. Public and private ones already apply to it and show as checked.',
|
|
2789
|
+
freeForAll: 'open to everyone',
|
|
2790
|
+
freeForAuthenticated: 'open to authenticated callers',
|
|
2791
|
+
freeNoPermission: 'does not depend on permission',
|
|
2792
|
+
createToken: 'Create token',
|
|
2793
|
+
tokenSaveError: 'Could not create the token. Try again.',
|
|
2794
|
+
tokenCreatedHeading: 'Token {name} created',
|
|
2795
|
+
tokenCreatedWarning: 'Copy it now: the token will not be shown again.',
|
|
2796
|
+
tokenCreatedNote: 'Send it in the x-api-token header. The server keeps only a hash of the token; if it is lost, revoke it and create another.',
|
|
2797
|
+
tokenValueLabel: 'Token {name}',
|
|
2798
|
+
copyToken: 'Copy',
|
|
2799
|
+
tokenCopied: 'Token copied.',
|
|
2800
|
+
hierarchyHint: 'Top-down: Navigation only with a Header, Menu only with a Navigation, Item only with a Menu and Submenu only with an Item. Clearing a level clears the ones below.',
|
|
2801
|
+
routerSaveError: 'Could not save the router. Try again.',
|
|
2802
|
+
permissionsSaveError: 'Could not save all operation changes. Reopen the panel and check.',
|
|
2803
|
+
tokenErrors: {
|
|
2804
|
+
invalidExpiresAt: 'Invalid expiration date. Pick another date.',
|
|
2805
|
+
invalidValidity: 'The expiration must be between tomorrow and 365 days from today.',
|
|
2806
|
+
invalidOperationIds: 'Some selected operation no longer exists in this application. Reopen the form and choose again.',
|
|
2807
|
+
operationNotProtected: 'Only protected operations can be granted to the token; public and private ones already apply to it.',
|
|
2808
|
+
appNotFound: 'Application not found in this client. It may have been deleted.',
|
|
2809
|
+
tokenNotFound: 'Token not found in this application. It may have been revoked already.',
|
|
2810
|
+
},
|
|
2811
|
+
routerErrors: {
|
|
2812
|
+
hierarchyGap: 'The hierarchy has an empty level in the middle: each level needs the one above it (Header → Navigation → Menu → Item → Submenu). Fill in the missing level or clear the ones below.',
|
|
2813
|
+
invalidAllowedTypes: 'A chosen badge no longer exists. Review the allowed badges.',
|
|
2814
|
+
},
|
|
2815
|
+
groupErrors: {
|
|
2816
|
+
invalidType: 'That group type no longer exists. Choose another type.',
|
|
2817
|
+
adminTypeReserved: "The Administrator type belongs only to the project's administration group.",
|
|
2818
|
+
emptyUpdate: 'Nothing to save: no field was changed.',
|
|
2819
|
+
groupProjectImmutable: "A group can't move to another project.",
|
|
2820
|
+
groupNameTaken: 'A group with this name already exists in this project.',
|
|
2821
|
+
adminGroupImmutable: "The administration group can't be renamed, change type or be disabled.",
|
|
2822
|
+
adminGroupProtected: "The project's administration group can't be deleted.",
|
|
2823
|
+
adminGroupLastMember: "The administration group can't be left without members.",
|
|
2824
|
+
adminGroupAccessProtected: "The administration group's access to this app can't be removed.",
|
|
2825
|
+
groupNotFound: 'Group not found in this project. It may have been deleted.',
|
|
2826
|
+
},
|
|
2170
2827
|
},
|
|
2171
2828
|
autoServiceAudit: {
|
|
2172
2829
|
title: 'Audit',
|
|
@@ -2336,6 +2993,132 @@ const SPINE_MESSAGES_EN = {
|
|
|
2336
2993
|
spansSummary: '{count} spans in {duration}',
|
|
2337
2994
|
spanRow: '{app}, {operation}: {outcome}, starts at +{offset}, takes {duration}',
|
|
2338
2995
|
},
|
|
2996
|
+
loginAttempts: {
|
|
2997
|
+
refresh: 'Refresh',
|
|
2998
|
+
user: 'User',
|
|
2999
|
+
userPlaceholder: 'User, e-mail or typed identifier',
|
|
3000
|
+
period: 'Period',
|
|
3001
|
+
result: 'Result',
|
|
3002
|
+
method: 'Method',
|
|
3003
|
+
all: 'All',
|
|
3004
|
+
clear: 'Clear',
|
|
3005
|
+
advancedFilters: 'Advanced filters',
|
|
3006
|
+
ip: 'IP or network',
|
|
3007
|
+
ipPlaceholder: '10.0.0.5 or 10.0.0.0/8',
|
|
3008
|
+
ipHint: 'Exact IP or a network in CIDR notation.',
|
|
3009
|
+
reason: 'Reason',
|
|
3010
|
+
caption: 'Login attempts',
|
|
3011
|
+
pageItems: 'attempts',
|
|
3012
|
+
pageSize: 'Attempts per page',
|
|
3013
|
+
colDate: 'Date/time',
|
|
3014
|
+
colResult: 'Result',
|
|
3015
|
+
colMethod: 'Method',
|
|
3016
|
+
colUser: 'User',
|
|
3017
|
+
colReason: 'Reason',
|
|
3018
|
+
colIp: 'IP',
|
|
3019
|
+
colRealm: 'Realm',
|
|
3020
|
+
colClient: 'Client',
|
|
3021
|
+
colUserAgent: 'Browser',
|
|
3022
|
+
filterByIp: 'Filter by this IP',
|
|
3023
|
+
filterByUser: 'Filter by this user',
|
|
3024
|
+
noMatchingUser: 'no matching user',
|
|
3025
|
+
methods: { local: 'Password', mfa: 'MFA', github: 'GitHub', google: 'Google', keycloak: 'Keycloak', entraid: 'Entra ID' },
|
|
3026
|
+
results: { success: 'Success', failure: 'Failure', cancelled: 'Cancelled' },
|
|
3027
|
+
reasons: {
|
|
3028
|
+
bad_password: 'Wrong password',
|
|
3029
|
+
unknown_user: 'Unknown or inactive user',
|
|
3030
|
+
locked: 'Account locked after failed attempts',
|
|
3031
|
+
mfa_failed: 'Wrong verification code',
|
|
3032
|
+
mfa_expired: 'Expired verification code',
|
|
3033
|
+
mfa_not_allowed: 'Verification method not allowed',
|
|
3034
|
+
mfa_invalid_method: 'Unknown verification method',
|
|
3035
|
+
recovery_failed: 'Recovery code wrong or already used',
|
|
3036
|
+
recovery_refused: 'Recovery code refused',
|
|
3037
|
+
not_linked: 'External account not linked',
|
|
3038
|
+
wrong_realm: 'User from another realm',
|
|
3039
|
+
},
|
|
3040
|
+
forbiddenAdmin: 'Your account cannot read login attempts. Ask an administrator for the admin:attempts:list operation.',
|
|
3041
|
+
forbiddenClient: 'Only the project administration group, with the Administrator badge active, sees the login attempts of this application.',
|
|
3042
|
+
loadErrorDetail: 'Could not load the attempts: {detail}',
|
|
3043
|
+
loadError: 'Could not load the login attempts.',
|
|
3044
|
+
},
|
|
3045
|
+
accountFeatures: {
|
|
3046
|
+
aiAgent: 'Connect an AI agent',
|
|
3047
|
+
aiAgentDescription: 'Generates the token and the MCP configuration to paste into Claude Code.',
|
|
3048
|
+
aiAgentKeywords: 'ai agent claude mcp assistant llm automation',
|
|
3049
|
+
aiAgentHelp: 'The agent uses a personal application token (x-app-token) with the permissions of the chosen access level. Revoke it under "Application tokens" when you no longer need it.',
|
|
3050
|
+
aiAgentStart: 'Connect agent',
|
|
3051
|
+
aiAgentServers: 'MCP servers',
|
|
3052
|
+
aiAgentAccess: 'Agent access',
|
|
3053
|
+
aiAgentReadOnly: 'Read only',
|
|
3054
|
+
aiAgentReadWrite: 'Read and write',
|
|
3055
|
+
aiAgentWriteHint: 'The agent will be able to change data on your behalf. Prefer read only when it is enough.',
|
|
3056
|
+
aiAgentReadOnlyServer: '{name} (read only)',
|
|
3057
|
+
aiAgentTokenName: 'AI agent ({date})',
|
|
3058
|
+
aiAgentGenerate: 'Generate configuration',
|
|
3059
|
+
aiAgentSelectServer: 'Choose at least one server.',
|
|
3060
|
+
aiAgentResult: 'Configuration ready',
|
|
3061
|
+
aiAgentResultHint: 'Paste into .mcp.json at the project root (Claude Code). The token is shown only now: copy it before finishing. Valid until {date}.',
|
|
3062
|
+
aiAgentCopy: 'Copy configuration',
|
|
3063
|
+
aiAgentCopied: 'Configuration copied. Do not share it: it contains your token.',
|
|
3064
|
+
aiAgentDone: 'Finish',
|
|
3065
|
+
aiAgentCreateError: 'Could not generate the agent token.',
|
|
3066
|
+
aiAgentUnavailable: 'Unavailable in this application: it is not connected to argos-admin.',
|
|
3067
|
+
activity: 'Account activity',
|
|
3068
|
+
activityDescription: 'Sign-ins and failed attempts in the last 90 days.',
|
|
3069
|
+
activityKeywords: 'login sign-in access history attempt failure ip browser security',
|
|
3070
|
+
activityFilter: 'Show',
|
|
3071
|
+
activityAll: 'All',
|
|
3072
|
+
activityFailures: 'Failures only',
|
|
3073
|
+
activityDetail: '{date} · IP {ip}',
|
|
3074
|
+
activityApp: 'Application: {app}',
|
|
3075
|
+
activityEmpty: 'Nothing in the last 90 days.',
|
|
3076
|
+
activityMore: 'Load more',
|
|
3077
|
+
activityShowing: '{shown} of {total}',
|
|
3078
|
+
activityLoadError: 'Could not load the account activity.',
|
|
3079
|
+
unknownIp: 'unknown',
|
|
3080
|
+
unknownApp: 'unnamed',
|
|
3081
|
+
idle: 'Sign out when idle',
|
|
3082
|
+
idleDescription: 'Signs out by itself after a while without use, with a warning first.',
|
|
3083
|
+
idleKeywords: 'idle inactivity timeout sign out automatic logout security lock',
|
|
3084
|
+
idleNever: 'Never',
|
|
3085
|
+
idleOption: '{minutes} min',
|
|
3086
|
+
idleLimitHint: 'This application signs out after at most {minutes} min without use.',
|
|
3087
|
+
idleWarningHeading: 'Your session is about to end',
|
|
3088
|
+
idleWarningText: { one: 'No activity for a while. The session ends in {count} second.', other: 'No activity for a while. The session ends in {count} seconds.' },
|
|
3089
|
+
idleStay: 'Stay signed in',
|
|
3090
|
+
idleLogout: 'Sign out now',
|
|
3091
|
+
startPage: 'Start page',
|
|
3092
|
+
startPageDescription: 'Where the application opens after signing in.',
|
|
3093
|
+
startPageKeywords: 'home opening login favorite last page',
|
|
3094
|
+
startHome: 'Home',
|
|
3095
|
+
startLast: 'Last visited page',
|
|
3096
|
+
startFavorite: 'Favorite: {name}',
|
|
3097
|
+
startPageHint: 'Mark pages as favorites to open on one of them.',
|
|
3098
|
+
defaultBadge: 'Default badge',
|
|
3099
|
+
defaultBadgeDescription: 'Access level you sign in with in this application, in any browser.',
|
|
3100
|
+
defaultBadgeKeywords: 'badge access level profile default login',
|
|
3101
|
+
defaultBadgeAuto: 'Automatic (the lowest level)',
|
|
3102
|
+
defaultBadgeSaved: 'Default badge saved. It applies from the next sign-in.',
|
|
3103
|
+
defaultBadgeError: 'Could not save the default badge.',
|
|
3104
|
+
defaultBadgeLoadError: 'Could not load your badges.',
|
|
3105
|
+
notices: 'Notifications',
|
|
3106
|
+
noticesDescription: 'The notices this application shows.',
|
|
3107
|
+
noticesKeywords: 'notification notice alert browser push',
|
|
3108
|
+
browserNotices: 'Browser notifications',
|
|
3109
|
+
browserNoticesDescription: 'System notification when the tab is in the background.',
|
|
3110
|
+
browserNoticesDenied: 'The browser blocked notifications for this site. Allow them in the browser settings.',
|
|
3111
|
+
browserNoticesUnsupported: 'This browser does not show notifications.',
|
|
3112
|
+
noticeOpen: 'Open',
|
|
3113
|
+
sync: 'Preferences in your account',
|
|
3114
|
+
syncDescription: 'Appearance, region, favorites and the other preferences follow you in any browser.',
|
|
3115
|
+
syncKeywords: 'sync cloud account browser preferences backup',
|
|
3116
|
+
syncSynced: 'Synced at {time}',
|
|
3117
|
+
syncSaving: 'Saving…',
|
|
3118
|
+
syncLocal: 'Only in this browser: the account is not available.',
|
|
3119
|
+
syncError: 'Could not sync. Try again.',
|
|
3120
|
+
syncNow: 'Sync now',
|
|
3121
|
+
},
|
|
2339
3122
|
};
|
|
2340
3123
|
|
|
2341
3124
|
const SPINE_MESSAGES_ES = {
|
|
@@ -2460,7 +3243,7 @@ const SPINE_MESSAGES_ES = {
|
|
|
2460
3243
|
appearance: 'Apariencia',
|
|
2461
3244
|
appearanceKeywords: 'visual colores tema diseño',
|
|
2462
3245
|
theme: 'Tema',
|
|
2463
|
-
themeDescription: 'Claro, oscuro o
|
|
3246
|
+
themeDescription: 'Claro, oscuro o el del sistema operativo.',
|
|
2464
3247
|
themeKeywords: 'modo oscuro dark light nocturno',
|
|
2465
3248
|
themeLight: 'Claro',
|
|
2466
3249
|
themeDark: 'Oscuro',
|
|
@@ -2469,7 +3252,7 @@ const SPINE_MESSAGES_ES = {
|
|
|
2469
3252
|
accentDescription: 'Familia de colores del encabezado, los botones y los destacados.',
|
|
2470
3253
|
accentKeywords: 'familia paleta color acento',
|
|
2471
3254
|
density: 'Densidad',
|
|
2472
|
-
densityDescription: 'Compacta
|
|
3255
|
+
densityDescription: 'Compacta muestra más información en pantalla.',
|
|
2473
3256
|
densityKeywords: 'espaciado tamaño compacto',
|
|
2474
3257
|
comfortable: 'Cómoda',
|
|
2475
3258
|
compact: 'Compacta',
|
|
@@ -2477,64 +3260,121 @@ const SPINE_MESSAGES_ES = {
|
|
|
2477
3260
|
fontDescription: 'Tipografía de toda la aplicación.',
|
|
2478
3261
|
fontKeywords: 'tipografía letra texto roboto rubik figtree geist',
|
|
2479
3262
|
sidebar: 'Menú lateral',
|
|
2480
|
-
sidebarDescription: '
|
|
3263
|
+
sidebarDescription: 'Cómo se abre y se cierra el menú lateral.',
|
|
2481
3264
|
sidebarKeywords: 'sidebar navegación barra lateral',
|
|
3265
|
+
sidebarHelp: 'Automático: se abre al acercar el puntero. Fijo: siempre abierto. Compacto: muestra solo los íconos.',
|
|
2482
3266
|
sidebarAuto: 'Automático',
|
|
2483
3267
|
sidebarFixed: 'Fijo',
|
|
2484
3268
|
sidebarCompact: 'Compacto',
|
|
2485
3269
|
region: 'Región',
|
|
2486
|
-
regionKeywords: 'idioma localización horario fecha',
|
|
3270
|
+
regionKeywords: 'idioma localización horario fecha hora semana',
|
|
2487
3271
|
language: 'Idioma',
|
|
2488
|
-
languageDescription: '
|
|
3272
|
+
languageDescription: 'Se aplica al instante, sin recargar.',
|
|
2489
3273
|
languageKeywords: 'idioma lengua traducción inglés español portugués',
|
|
2490
3274
|
languageAuto: 'Predeterminado del sistema ({language})',
|
|
2491
3275
|
timeZone: 'Zona horaria',
|
|
2492
3276
|
timeZoneKeywords: 'timezone hora utc gmt',
|
|
2493
|
-
timeZoneHint: '
|
|
3277
|
+
timeZoneHint: 'Para fechas y horas. Ahora: {now}',
|
|
2494
3278
|
timeZoneAuto: 'Automático ({zone})',
|
|
3279
|
+
hourCycle: 'Formato de hora',
|
|
3280
|
+
hourCycleHint: 'Ahora: {now}',
|
|
3281
|
+
hourCycleKeywords: 'reloj 24h 12h am pm horario',
|
|
3282
|
+
hourCycleAuto: 'Automático',
|
|
3283
|
+
hourCycle24: '24 horas',
|
|
3284
|
+
hourCycle12: '12 horas',
|
|
3285
|
+
weekStart: 'Primer día de la semana',
|
|
3286
|
+
weekStartDescription: 'Para calendarios y selectores de fecha.',
|
|
3287
|
+
weekStartKeywords: 'semana calendario domingo lunes',
|
|
3288
|
+
weekStartAuto: 'Automático',
|
|
2495
3289
|
shortcuts: 'Atajos',
|
|
2496
3290
|
shortcutsDescription: 'Pulsa ? en cualquier pantalla para ver esta lista.',
|
|
2497
|
-
shortcutsKeywords: 'teclado teclas
|
|
3291
|
+
shortcutsKeywords: 'teclado teclas',
|
|
2498
3292
|
tour: 'Recorrido guiado',
|
|
2499
|
-
tourDescription: 'Muestra de nuevo
|
|
3293
|
+
tourDescription: 'Muestra de nuevo dónde está cada parte de la pantalla.',
|
|
2500
3294
|
tourKeywords: 'onboarding ayuda presentación',
|
|
2501
3295
|
replayTour: 'Repetir recorrido',
|
|
3296
|
+
accessibility: 'Accesibilidad',
|
|
3297
|
+
accessibilityKeywords: 'accesibilidad lectura visión',
|
|
3298
|
+
textSize: 'Tamaño del texto',
|
|
3299
|
+
textSizeDescription: 'Agranda el texto y los controles de todas las pantallas.',
|
|
3300
|
+
textSizeKeywords: 'zoom fuente letra más grande ampliar',
|
|
3301
|
+
motion: 'Reducir animaciones',
|
|
3302
|
+
motionDescription: 'Sistema sigue la computadora o el celular.',
|
|
3303
|
+
motionKeywords: 'animación movimiento transición reducido mareo',
|
|
3304
|
+
motionSystem: 'Sistema',
|
|
3305
|
+
motionReduce: 'Siempre',
|
|
3306
|
+
motionFull: 'Nunca',
|
|
3307
|
+
help: 'Ayuda',
|
|
3308
|
+
helpKeywords: 'ayuda novedades recorrido presentación',
|
|
3309
|
+
news: 'Novedades',
|
|
3310
|
+
newsDescription: 'Lo que cambió en las últimas versiones.',
|
|
3311
|
+
newsKeywords: 'novedades versión lanzamiento changelog',
|
|
3312
|
+
showNews: 'Ver novedades',
|
|
3313
|
+
browserData: 'Datos del navegador',
|
|
3314
|
+
browserDataDescription: 'Guardados solo en este navegador, para tu cuenta.',
|
|
3315
|
+
browserDataKeywords: 'privacidad limpiar borrar historial datos',
|
|
3316
|
+
recentPages: 'Páginas recientes',
|
|
3317
|
+
recentPagesKeywords: 'historial visitadas recientes',
|
|
3318
|
+
recentSearches: 'Búsquedas recientes',
|
|
3319
|
+
recentSearchesKeywords: 'búsqueda historial',
|
|
3320
|
+
favorites: 'Favoritos',
|
|
3321
|
+
favoritesKeywords: 'favoritos estrella',
|
|
3322
|
+
pagesCount: { zero: 'Ninguna página guardada', one: '{count} página guardada', other: '{count} páginas guardadas' },
|
|
3323
|
+
searchesCount: { zero: 'Ninguna búsqueda guardada', one: '{count} búsqueda guardada', other: '{count} búsquedas guardadas' },
|
|
3324
|
+
clear: 'Limpiar',
|
|
3325
|
+
confirmClear: 'Confirmar',
|
|
3326
|
+
cancel: 'Cancelar',
|
|
3327
|
+
recentPagesCleared: 'Páginas recientes borradas.',
|
|
3328
|
+
recentSearchesCleared: 'Búsquedas recientes borradas.',
|
|
3329
|
+
favoritesCleared: 'Favoritos borrados.',
|
|
3330
|
+
restorePreferences: 'Preferencias',
|
|
3331
|
+
restorePreferencesDescription: 'Apariencia, accesibilidad y formatos vuelven a los valores predeterminados.',
|
|
3332
|
+
restorePreferencesHelp: 'Vuelven a lo predeterminado: tema, color principal, densidad, fuente, menú lateral, tamaño del texto, animaciones, formato de hora y primer día de la semana. El idioma, la zona horaria y los atajos de una sola tecla se mantienen.',
|
|
3333
|
+
restorePreferencesKeywords: 'restaurar predeterminado restablecer reset preferencias',
|
|
3334
|
+
restore: 'Restaurar',
|
|
3335
|
+
confirmRestore: 'Confirmar',
|
|
3336
|
+
preferencesRestored: 'Preferencias restauradas.',
|
|
2502
3337
|
account: 'Cuenta',
|
|
2503
|
-
accountKeywords: 'perfil usuario
|
|
3338
|
+
accountKeywords: 'perfil usuario login nivel salir',
|
|
2504
3339
|
user: 'Usuario',
|
|
2505
3340
|
accessLevel: 'Nivel de acceso',
|
|
2506
3341
|
accessLevelKeywords: 'credencial badge perfil permiso grupo',
|
|
2507
3342
|
session: 'Sesión',
|
|
2508
|
-
sessionDescription: '
|
|
3343
|
+
sessionDescription: 'Se renueva sola mientras la aplicación esté abierta.',
|
|
2509
3344
|
sessionKeywords: 'expiración token login',
|
|
2510
3345
|
sessionUnknown: 'No informado',
|
|
2511
3346
|
sessionExpired: 'Expiró a las {time}',
|
|
2512
3347
|
sessionExpiresIn: 'Expira en {minutes} min (a las {time})',
|
|
2513
3348
|
sessionExpiresAt: 'Expira a las {time}',
|
|
2514
3349
|
accessToken: 'Token de acceso',
|
|
2515
|
-
accessTokenDescription: 'Para probar una API en tu nombre.
|
|
3350
|
+
accessTokenDescription: 'Para probar una API en tu nombre. No lo compartas.',
|
|
2516
3351
|
accessTokenKeywords: 'jwt bearer api desarrollador',
|
|
2517
3352
|
copy: 'Copiar',
|
|
3353
|
+
moreAbout: 'Más sobre {label}',
|
|
2518
3354
|
appTokens: 'Tokens de aplicación',
|
|
2519
|
-
appTokensDescription: 'Para usar
|
|
3355
|
+
appTokensDescription: 'Para usar la aplicación fuera de la interfaz: un MCP, un script.',
|
|
2520
3356
|
appTokensKeywords: 'token app mcp api clave pat x-app-token automatización script integración',
|
|
3357
|
+
appTokensHelp: 'El token vale solo para esta aplicación, con los permisos del nivel de acceso elegido, y vence en como máximo 1 año. Envíalo en el encabezado x-app-token.',
|
|
2521
3358
|
logout: 'Salir',
|
|
2522
3359
|
logoutDescription: 'Cierra la sesión en este navegador.',
|
|
2523
3360
|
logoutKeywords: 'logout desconectar',
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
3361
|
+
mfa: 'MFA',
|
|
3362
|
+
mfaDescription: 'Verificación en dos pasos de tu cuenta en Argos.',
|
|
3363
|
+
mfaKeywords: 'seguridad argos contraseña autenticación mfa 2fa dos factores dos pasos verificación',
|
|
2527
3364
|
signedInAccount: 'Cuenta de Argos',
|
|
2528
3365
|
signedInRealm: 'Realm {realm}',
|
|
2529
3366
|
twoFactor: 'Verificación en dos pasos',
|
|
2530
|
-
twoFactorDescription: '
|
|
3367
|
+
twoFactorDescription: 'Un código además de la contraseña para entrar.',
|
|
2531
3368
|
twoFactorKeywords: 'mfa 2fa totp autenticador authenticator código correo método dispositivo celular',
|
|
2532
3369
|
recoveryCodes: 'Códigos de recuperación',
|
|
2533
|
-
recoveryCodesDescription: '
|
|
3370
|
+
recoveryCodesDescription: 'Para entrar si pierdes el dispositivo.',
|
|
2534
3371
|
recoveryCodesKeywords: 'respaldo recuperación perdí celular dispositivo mfa 2fa',
|
|
2535
3372
|
sessions: 'Sesiones y dispositivos',
|
|
2536
|
-
sessionsDescription: '
|
|
3373
|
+
sessionsDescription: 'Dónde está conectada tu cuenta.',
|
|
2537
3374
|
sessionsKeywords: 'dispositivos navegador ip cerrar desconectar salir conectados',
|
|
3375
|
+
sessionsSection: 'Sesiones',
|
|
3376
|
+
sessionsSectionDescription: 'Esta sesión, los tokens de aplicación y los dispositivos conectados.',
|
|
3377
|
+
sessionsSectionKeywords: 'sesión sesiones token tokens dispositivos login seguridad',
|
|
2538
3378
|
about: 'Acerca de',
|
|
2539
3379
|
aboutKeywords: 'versión build entorno dependencias soporte',
|
|
2540
3380
|
application: 'Aplicación',
|
|
@@ -2552,7 +3392,7 @@ const SPINE_MESSAGES_ES = {
|
|
|
2552
3392
|
dependenciesDescription: 'Versiones declaradas en el package.json de esta aplicación.',
|
|
2553
3393
|
dependenciesKeywords: 'angular hermes rxjs apollo graphql',
|
|
2554
3394
|
supportInfo: 'Información para soporte',
|
|
2555
|
-
supportInfoDescription: '
|
|
3395
|
+
supportInfoDescription: 'Versión, entorno, navegador y preferencias, para pegar en el ticket.',
|
|
2556
3396
|
supportInfoKeywords: 'ayuda ticket diagnóstico',
|
|
2557
3397
|
noSessionToken: 'No hay ningún token de sesión disponible.',
|
|
2558
3398
|
tokenCopied: 'Token copiado. No lo compartas: da acceso a tu cuenta hasta que expire.',
|
|
@@ -2634,7 +3474,7 @@ const SPINE_MESSAGES_ES = {
|
|
|
2634
3474
|
removeHint: 'Ya no podrás usar este método para iniciar sesión.',
|
|
2635
3475
|
removeLastHint: 'Sin ningún método, los códigos de recuperación también dejan de valer.',
|
|
2636
3476
|
reauthTitle: 'Confirma tu identidad',
|
|
2637
|
-
reauthHint: '
|
|
3477
|
+
reauthHint: 'Por seguridad, confirma antes de continuar. Vale por 5 minutos.',
|
|
2638
3478
|
reauthHow: 'Cómo confirmar',
|
|
2639
3479
|
reauthPassword: 'Contraseña',
|
|
2640
3480
|
reauthRecoveryCode: 'Código de recuperación',
|
|
@@ -2658,13 +3498,13 @@ const SPINE_MESSAGES_ES = {
|
|
|
2658
3498
|
sendCode: 'Enviar código',
|
|
2659
3499
|
emailCodeTitle: 'Confirma el correo electrónico',
|
|
2660
3500
|
emailCodeHint: 'Escribe el código de 6 dígitos enviado a {email}.',
|
|
2661
|
-
codesRemaining: { zero: 'Ningún código disponible
|
|
2662
|
-
codesHint: 'Cada uno vale una vez
|
|
3501
|
+
codesRemaining: { zero: 'Ningún código disponible', one: '1 código disponible', other: '{count} códigos disponibles' },
|
|
3502
|
+
codesHint: 'Cada uno vale una vez. Generar nuevos invalida los anteriores.',
|
|
2663
3503
|
codesNeedMethod: 'Registra un método de verificación para generar códigos de recuperación.',
|
|
2664
3504
|
generateCodes: 'Generar códigos',
|
|
2665
3505
|
regenerateCodes: 'Generar códigos nuevos',
|
|
2666
3506
|
codesTitle: 'Tus códigos de recuperación',
|
|
2667
|
-
codesShownOnce: '
|
|
3507
|
+
codesShownOnce: 'Guárdalos en un lugar seguro: no se volverán a mostrar. Cada uno vale una vez.',
|
|
2668
3508
|
copyCodes: 'Copiar',
|
|
2669
3509
|
downloadCodes: 'Descargar .txt',
|
|
2670
3510
|
codesCopied: 'Códigos copiados.',
|
|
@@ -2789,10 +3629,10 @@ const SPINE_MESSAGES_ES = {
|
|
|
2789
3629
|
tabRoutes: 'Rutas',
|
|
2790
3630
|
tabRouters: 'Enrutadores',
|
|
2791
3631
|
tabAccess: 'Acceso',
|
|
2792
|
-
noClients: '
|
|
3632
|
+
noClients: 'No administras esta app. Necesitas (a) estar en el grupo de administración de su proyecto y (b) haber iniciado sesión con la credencial <strong>Administrador</strong> activa. Cambia de credencial en el menú de tu perfil, si está disponible, o pide acceso a quien administra el proyecto.',
|
|
2793
3633
|
pickClient: 'Selecciona el client que quieres administrar',
|
|
2794
3634
|
groupsTitle: 'Grupos',
|
|
2795
|
-
groupsIntro: '
|
|
3635
|
+
groupsIntro: 'Crea, edita y elimina los grupos de este client y gestiona sus miembros — sin depender del panel central.',
|
|
2796
3636
|
groupsFixed: 'Los 5 grupos de abajo son fijos de este client y no se pueden renombrar, crear ni eliminar — consulta uno para gestionar sus miembros.',
|
|
2797
3637
|
pickGroup: 'Selecciona un grupo',
|
|
2798
3638
|
noDescription: 'Sin descripción registrada.',
|
|
@@ -2878,6 +3718,9 @@ const SPINE_MESSAGES_ES = {
|
|
|
2878
3718
|
colPage: 'Página',
|
|
2879
3719
|
colBuiltPath: 'Ruta armada',
|
|
2880
3720
|
colVisibility: 'Visibilidad',
|
|
3721
|
+
colAllowedBadges: 'Credenciales permitidas',
|
|
3722
|
+
anyBadge: 'Cualquier credencial',
|
|
3723
|
+
allowedBadgesHint: 'Vacío = cualquier credencial. Con una o más elegidas, solo los grupos con una de esas credenciales pueden recibir acceso a esta pantalla en la pestaña Acceso.',
|
|
2881
3724
|
routesTitle: 'Rutas',
|
|
2882
3725
|
newRoute: 'Nueva ruta',
|
|
2883
3726
|
routesCaption: 'Rutas del client',
|
|
@@ -2896,6 +3739,19 @@ const SPINE_MESSAGES_ES = {
|
|
|
2896
3739
|
pathPlaceholder: 'ej.: dashboard',
|
|
2897
3740
|
pathHint: 'Un solo tramo de la dirección: letras minúsculas y guion. El "/" entre niveles lo arma el enrutador.',
|
|
2898
3741
|
pathInvalid: 'Usa solo letras minúsculas (a–z) y guion — sin "/", espacios, números ni acentos, y sin guion al inicio o al final.',
|
|
3742
|
+
rotateSecret: 'Generar nuevo secreto',
|
|
3743
|
+
confirmRotateSecretHeading: '¿Generar un nuevo secreto?',
|
|
3744
|
+
confirmRotateSecret: 'El secreto actual deja de funcionar de inmediato; actualice el APP_SECRET del servicio que usa esta aplicación. Los tokens ya emitidos valen hasta que expiren (hasta 1 hora).',
|
|
3745
|
+
rotatedSecretHeading: 'Nuevo secreto de {name}',
|
|
3746
|
+
rotatedSecretWarning: 'Cópielo ahora: el secreto no se volverá a mostrar.',
|
|
3747
|
+
rotatedSecretNote: 'El servidor guarda solo un hash del secreto. Al cerrar esta ventana no hay forma de consultarlo; si se pierde, genere otro.',
|
|
3748
|
+
rotatedSecretLabel: 'Secreto de la aplicación {name}',
|
|
3749
|
+
copySecret: 'Copiar',
|
|
3750
|
+
secretCopied: 'Secreto copiado.',
|
|
3751
|
+
rotatedSecretDone: 'Listo',
|
|
3752
|
+
rotateSecretError: 'No se pudo generar el nuevo secreto. Inténtelo de nuevo.',
|
|
3753
|
+
rotateSecretNotFound: 'Aplicación no encontrada en este client.',
|
|
3754
|
+
rotateSecretForbidden: 'Usted no administra este client.',
|
|
2899
3755
|
confirmDeleteAppHeading: '¿Eliminar aplicación?',
|
|
2900
3756
|
confirmDeleteApp: 'La aplicación {name} se eliminará y su credencial dejará de funcionar. Esta acción no se puede deshacer.',
|
|
2901
3757
|
confirmDeleteRouteHeading: '¿Eliminar ruta?',
|
|
@@ -2930,6 +3786,89 @@ const SPINE_MESSAGES_ES = {
|
|
|
2930
3786
|
reorderLoadError: 'No se pudo cargar el menú. Inténtelo de nuevo.',
|
|
2931
3787
|
reorderSaveError: 'No se pudo guardar el orden. No se perdió nada: inténtelo de nuevo.',
|
|
2932
3788
|
reorderSave: 'Guardar orden',
|
|
3789
|
+
newGroup: 'Nuevo grupo',
|
|
3790
|
+
editGroup: 'Editar grupo',
|
|
3791
|
+
groupsCaption: 'Grupos del proyecto',
|
|
3792
|
+
noGroups: 'Aún no hay grupos registrados.',
|
|
3793
|
+
colStatus: 'Estado',
|
|
3794
|
+
groupName: 'Nombre',
|
|
3795
|
+
groupType: 'Tipo',
|
|
3796
|
+
groupTypePlaceholder: 'Selecciona el tipo',
|
|
3797
|
+
groupDescription: 'Descripción (opcional)',
|
|
3798
|
+
openGroup: 'Abrir el grupo {name}',
|
|
3799
|
+
adminGroupTag: 'Administración',
|
|
3800
|
+
adminGroupNote: 'Grupo de administración del proyecto: sus miembros administran esta app en el autoservicio. Es el único del proyecto, no se puede eliminar, renombrar, desactivar ni cambiar de tipo, y no puede quedarse sin miembros.',
|
|
3801
|
+
adminGroupEditNote: 'Grupo de administración del proyecto: solo se puede cambiar la descripción.',
|
|
3802
|
+
adminGroupLastMemberWarning: 'El grupo de administración no puede quedarse sin miembros: agrega a otra persona o deshaz una eliminación.',
|
|
3803
|
+
confirmDeleteGroupHeading: '¿Eliminar grupo?',
|
|
3804
|
+
confirmDeleteGroup: 'El grupo {name} se eliminará junto con sus miembros, los accesos a pantallas y los permisos en aplicaciones. Esta acción no se puede deshacer.',
|
|
3805
|
+
groupSaveError: 'No se pudo guardar el grupo. Inténtalo de nuevo.',
|
|
3806
|
+
membersSaveError: 'No se pudieron guardar todos los cambios de los miembros. Revisa la lista e inténtalo de nuevo.',
|
|
3807
|
+
appsCaption: 'Aplicaciones del proyecto',
|
|
3808
|
+
noApps: 'Ninguna aplicación registrada todavía.',
|
|
3809
|
+
colGrants: 'Grants',
|
|
3810
|
+
openApp: 'Abrir la aplicación {name}',
|
|
3811
|
+
tabTokens: 'Tokens',
|
|
3812
|
+
tokensCaption: 'Tokens de la aplicación',
|
|
3813
|
+
noTokens: 'Ningún token creado para esta aplicación todavía.',
|
|
3814
|
+
newToken: 'Nuevo token',
|
|
3815
|
+
colTokenPrefix: 'Inicio del token',
|
|
3816
|
+
colExpiresAt: 'Vence',
|
|
3817
|
+
colLastUsed: 'Último uso',
|
|
3818
|
+
tokenExpired: 'Vencido',
|
|
3819
|
+
tokenRevoked: 'Revocado',
|
|
3820
|
+
neverUsed: 'Nunca',
|
|
3821
|
+
revokeToken: 'Revocar',
|
|
3822
|
+
confirmRevokeTokenHeading: '¿Revocar token?',
|
|
3823
|
+
confirmRevokeToken: 'El token {name} deja de funcionar de inmediato. La revocación no se puede deshacer.',
|
|
3824
|
+
tokenRevokedDone: 'Token {name} revocado.',
|
|
3825
|
+
tokenRevokeError: 'No se pudo revocar el token. Inténtalo de nuevo.',
|
|
3826
|
+
tokensLoadError: 'No se pudieron cargar los tokens de la aplicación.',
|
|
3827
|
+
tokenName: 'Nombre',
|
|
3828
|
+
tokenDescription: 'Descripción (opcional)',
|
|
3829
|
+
tokenExpiresAt: 'Vence el',
|
|
3830
|
+
tokenExpiresHint: 'Desde mañana hasta 365 días a partir de hoy.',
|
|
3831
|
+
tokenExpiresInvalid: 'Elige una fecha entre mañana y 365 días a partir de hoy.',
|
|
3832
|
+
tokenOperations: 'Operaciones concedidas al token',
|
|
3833
|
+
tokenOperationsNote: 'Marca las operaciones protected que el token puede llamar. Las public y private ya valen para él y aparecen marcadas.',
|
|
3834
|
+
freeForAll: 'abierta a todos',
|
|
3835
|
+
freeForAuthenticated: 'abierta a autenticados',
|
|
3836
|
+
freeNoPermission: 'no depende de permiso',
|
|
3837
|
+
createToken: 'Crear token',
|
|
3838
|
+
tokenSaveError: 'No se pudo crear el token. Inténtalo de nuevo.',
|
|
3839
|
+
tokenCreatedHeading: 'Token {name} creado',
|
|
3840
|
+
tokenCreatedWarning: 'Cópialo ahora: el token no se mostrará de nuevo.',
|
|
3841
|
+
tokenCreatedNote: 'Envíalo en el encabezado x-api-token. El servidor guarda solo un hash del token; si se pierde, revócalo y crea otro.',
|
|
3842
|
+
tokenValueLabel: 'Token {name}',
|
|
3843
|
+
copyToken: 'Copiar',
|
|
3844
|
+
tokenCopied: 'Token copiado.',
|
|
3845
|
+
hierarchyHint: 'De arriba hacia abajo: Navegación solo con Header, Menú solo con Navegación, Ítem solo con Menú y Submenú solo con Ítem. Borrar un nivel borra los de abajo.',
|
|
3846
|
+
routerSaveError: 'No se pudo guardar el enrutador. Inténtalo de nuevo.',
|
|
3847
|
+
permissionsSaveError: 'No se pudieron guardar todos los cambios de las operaciones. Vuelve a abrir el panel y revisa.',
|
|
3848
|
+
tokenErrors: {
|
|
3849
|
+
invalidExpiresAt: 'Fecha de vencimiento no válida. Elige otra fecha.',
|
|
3850
|
+
invalidValidity: 'El vencimiento debe estar entre mañana y 365 días a partir de hoy.',
|
|
3851
|
+
invalidOperationIds: 'Alguna operación elegida ya no existe en esta aplicación. Vuelve a abrir el formulario y elige de nuevo.',
|
|
3852
|
+
operationNotProtected: 'Solo las operaciones protected se pueden conceder al token; las public y private ya valen para él.',
|
|
3853
|
+
appNotFound: 'Aplicación no encontrada en este client. Puede haber sido eliminada.',
|
|
3854
|
+
tokenNotFound: 'Token no encontrado en esta aplicación. Puede que ya haya sido revocado.',
|
|
3855
|
+
},
|
|
3856
|
+
routerErrors: {
|
|
3857
|
+
hierarchyGap: 'La jerarquía tiene un nivel vacío en el medio: cada nivel necesita el de arriba (Header → Navegación → Menú → Ítem → Submenú). Completa el nivel que falta o borra los de abajo.',
|
|
3858
|
+
invalidAllowedTypes: 'Alguna credencial elegida ya no existe. Revisa las credenciales permitidas.',
|
|
3859
|
+
},
|
|
3860
|
+
groupErrors: {
|
|
3861
|
+
invalidType: 'Ese tipo de grupo ya no existe. Elige otro tipo.',
|
|
3862
|
+
adminTypeReserved: 'El tipo Administrador es solo del grupo de administración del proyecto.',
|
|
3863
|
+
emptyUpdate: 'Nada que guardar: no se cambió ningún campo.',
|
|
3864
|
+
groupProjectImmutable: 'El grupo no cambia de proyecto.',
|
|
3865
|
+
groupNameTaken: 'Ya existe un grupo con ese nombre en este proyecto.',
|
|
3866
|
+
adminGroupImmutable: 'El grupo de administración no cambia de nombre ni de tipo, ni se desactiva.',
|
|
3867
|
+
adminGroupProtected: 'El grupo de administración del proyecto no se puede eliminar.',
|
|
3868
|
+
adminGroupLastMember: 'El grupo de administración no puede quedarse sin miembros.',
|
|
3869
|
+
adminGroupAccessProtected: 'El acceso del grupo de administración a esta app no se puede quitar.',
|
|
3870
|
+
groupNotFound: 'Grupo no encontrado en este proyecto. Puede que se haya eliminado.',
|
|
3871
|
+
},
|
|
2933
3872
|
},
|
|
2934
3873
|
autoServiceAudit: {
|
|
2935
3874
|
title: 'Auditoría',
|
|
@@ -3099,6 +4038,132 @@ const SPINE_MESSAGES_ES = {
|
|
|
3099
4038
|
spansSummary: '{count} spans en {duration}',
|
|
3100
4039
|
spanRow: '{app}, {operation}: {outcome}, empieza en +{offset}, dura {duration}',
|
|
3101
4040
|
},
|
|
4041
|
+
loginAttempts: {
|
|
4042
|
+
refresh: 'Actualizar',
|
|
4043
|
+
user: 'Usuario',
|
|
4044
|
+
userPlaceholder: 'Usuario, correo o identificador escrito',
|
|
4045
|
+
period: 'Período',
|
|
4046
|
+
result: 'Resultado',
|
|
4047
|
+
method: 'Método',
|
|
4048
|
+
all: 'Todos',
|
|
4049
|
+
clear: 'Limpiar',
|
|
4050
|
+
advancedFilters: 'Filtros avanzados',
|
|
4051
|
+
ip: 'IP o red',
|
|
4052
|
+
ipPlaceholder: '10.0.0.5 o 10.0.0.0/8',
|
|
4053
|
+
ipHint: 'IP exacta o red en notación CIDR.',
|
|
4054
|
+
reason: 'Motivo',
|
|
4055
|
+
caption: 'Intentos de inicio de sesión',
|
|
4056
|
+
pageItems: 'intentos',
|
|
4057
|
+
pageSize: 'Intentos por página',
|
|
4058
|
+
colDate: 'Fecha/hora',
|
|
4059
|
+
colResult: 'Resultado',
|
|
4060
|
+
colMethod: 'Método',
|
|
4061
|
+
colUser: 'Usuario',
|
|
4062
|
+
colReason: 'Motivo',
|
|
4063
|
+
colIp: 'IP',
|
|
4064
|
+
colRealm: 'Realm',
|
|
4065
|
+
colClient: 'Client',
|
|
4066
|
+
colUserAgent: 'Navegador',
|
|
4067
|
+
filterByIp: 'Filtrar por esta IP',
|
|
4068
|
+
filterByUser: 'Filtrar por este usuario',
|
|
4069
|
+
noMatchingUser: 'sin usuario correspondiente',
|
|
4070
|
+
methods: { local: 'Contraseña', mfa: 'MFA', github: 'GitHub', google: 'Google', keycloak: 'Keycloak', entraid: 'Entra ID' },
|
|
4071
|
+
results: { success: 'Éxito', failure: 'Fallo', cancelled: 'Cancelado' },
|
|
4072
|
+
reasons: {
|
|
4073
|
+
bad_password: 'Contraseña incorrecta',
|
|
4074
|
+
unknown_user: 'Usuario inexistente o inactivo',
|
|
4075
|
+
locked: 'Cuenta bloqueada por intentos',
|
|
4076
|
+
mfa_failed: 'Código de verificación incorrecto',
|
|
4077
|
+
mfa_expired: 'Código de verificación vencido',
|
|
4078
|
+
mfa_not_allowed: 'Método de verificación no permitido',
|
|
4079
|
+
mfa_invalid_method: 'Método de verificación desconocido',
|
|
4080
|
+
recovery_failed: 'Código de recuperación incorrecto o ya usado',
|
|
4081
|
+
recovery_refused: 'Código de recuperación rechazado',
|
|
4082
|
+
not_linked: 'Cuenta externa no vinculada',
|
|
4083
|
+
wrong_realm: 'Usuario de otro realm',
|
|
4084
|
+
},
|
|
4085
|
+
forbiddenAdmin: 'Tu cuenta no puede consultar los intentos de inicio de sesión. Pide a un administrador la operación admin:attempts:list.',
|
|
4086
|
+
forbiddenClient: 'Solo el grupo de administración del proyecto, con la insignia Administrador activa, ve los intentos de inicio de sesión de esta aplicación.',
|
|
4087
|
+
loadErrorDetail: 'No se pudieron cargar los intentos: {detail}',
|
|
4088
|
+
loadError: 'No se pudieron cargar los intentos de inicio de sesión.',
|
|
4089
|
+
},
|
|
4090
|
+
accountFeatures: {
|
|
4091
|
+
aiAgent: 'Conectar un agente de IA',
|
|
4092
|
+
aiAgentDescription: 'Genera el token y la configuración MCP para pegar en Claude Code.',
|
|
4093
|
+
aiAgentKeywords: 'ia agente claude mcp asistente llm automatización',
|
|
4094
|
+
aiAgentHelp: 'El agente usa un token de aplicación personal (x-app-token) con los permisos del nivel de acceso elegido. Revóquelo en "Tokens de aplicación" cuando ya no lo necesite.',
|
|
4095
|
+
aiAgentStart: 'Conectar agente',
|
|
4096
|
+
aiAgentServers: 'Servidores MCP',
|
|
4097
|
+
aiAgentAccess: 'Acceso del agente',
|
|
4098
|
+
aiAgentReadOnly: 'Solo lectura',
|
|
4099
|
+
aiAgentReadWrite: 'Lectura y escritura',
|
|
4100
|
+
aiAgentWriteHint: 'El agente podrá cambiar datos en su nombre. Prefiera solo lectura cuando sea suficiente.',
|
|
4101
|
+
aiAgentReadOnlyServer: '{name} (solo lectura)',
|
|
4102
|
+
aiAgentTokenName: 'Agente de IA ({date})',
|
|
4103
|
+
aiAgentGenerate: 'Generar configuración',
|
|
4104
|
+
aiAgentSelectServer: 'Elija al menos un servidor.',
|
|
4105
|
+
aiAgentResult: 'Configuración lista',
|
|
4106
|
+
aiAgentResultHint: 'Péguelo en .mcp.json, en la raíz del proyecto (Claude Code). El token aparece solo ahora: cópielo antes de terminar. Válido hasta {date}.',
|
|
4107
|
+
aiAgentCopy: 'Copiar configuración',
|
|
4108
|
+
aiAgentCopied: 'Configuración copiada. No la comparta: contiene su token.',
|
|
4109
|
+
aiAgentDone: 'Terminar',
|
|
4110
|
+
aiAgentCreateError: 'No fue posible generar el token del agente.',
|
|
4111
|
+
aiAgentUnavailable: 'No disponible en esta aplicación: no está conectada a argos-admin.',
|
|
4112
|
+
activity: 'Actividad de la cuenta',
|
|
4113
|
+
activityDescription: 'Inicios de sesión e intentos fallidos en los últimos 90 días.',
|
|
4114
|
+
activityKeywords: 'login acceso historial intento falla ip navegador seguridad',
|
|
4115
|
+
activityFilter: 'Mostrar',
|
|
4116
|
+
activityAll: 'Todas',
|
|
4117
|
+
activityFailures: 'Solo fallas',
|
|
4118
|
+
activityDetail: '{date} · IP {ip}',
|
|
4119
|
+
activityApp: 'Aplicación: {app}',
|
|
4120
|
+
activityEmpty: 'Nada en los últimos 90 días.',
|
|
4121
|
+
activityMore: 'Cargar más',
|
|
4122
|
+
activityShowing: '{shown} de {total}',
|
|
4123
|
+
activityLoadError: 'No fue posible cargar la actividad de la cuenta.',
|
|
4124
|
+
unknownIp: 'desconocido',
|
|
4125
|
+
unknownApp: 'sin nombre',
|
|
4126
|
+
idle: 'Cerrar por inactividad',
|
|
4127
|
+
idleDescription: 'Sale solo después de un tiempo sin uso, con un aviso antes.',
|
|
4128
|
+
idleKeywords: 'inactividad tiempo salir automático logout seguridad bloqueo',
|
|
4129
|
+
idleNever: 'Nunca',
|
|
4130
|
+
idleOption: '{minutes} min',
|
|
4131
|
+
idleLimitHint: 'Esta aplicación cierra la sesión en un máximo de {minutes} min sin uso.',
|
|
4132
|
+
idleWarningHeading: 'La sesión se va a cerrar',
|
|
4133
|
+
idleWarningText: { one: 'Sin actividad desde hace un tiempo. La sesión termina en {count} segundo.', other: 'Sin actividad desde hace un tiempo. La sesión termina en {count} segundos.' },
|
|
4134
|
+
idleStay: 'Seguir conectado',
|
|
4135
|
+
idleLogout: 'Salir ahora',
|
|
4136
|
+
startPage: 'Pantalla inicial',
|
|
4137
|
+
startPageDescription: 'Dónde se abre la aplicación después del inicio de sesión.',
|
|
4138
|
+
startPageKeywords: 'inicio apertura login favorito última pantalla',
|
|
4139
|
+
startHome: 'Inicio',
|
|
4140
|
+
startLast: 'Última pantalla visitada',
|
|
4141
|
+
startFavorite: 'Favorito: {name}',
|
|
4142
|
+
startPageHint: 'Marque pantallas como favoritas para abrir en una de ellas.',
|
|
4143
|
+
defaultBadge: 'Credencial predeterminada',
|
|
4144
|
+
defaultBadgeDescription: 'Nivel de acceso con el que entra en esta aplicación, en cualquier navegador.',
|
|
4145
|
+
defaultBadgeKeywords: 'credencial badge nivel acceso perfil predeterminado login',
|
|
4146
|
+
defaultBadgeAuto: 'Automático (el de menor nivel)',
|
|
4147
|
+
defaultBadgeSaved: 'Credencial predeterminada guardada. Vale desde el próximo inicio de sesión.',
|
|
4148
|
+
defaultBadgeError: 'No fue posible guardar la credencial predeterminada.',
|
|
4149
|
+
defaultBadgeLoadError: 'No fue posible cargar sus credenciales.',
|
|
4150
|
+
notices: 'Notificaciones',
|
|
4151
|
+
noticesDescription: 'Los avisos que muestra esta aplicación.',
|
|
4152
|
+
noticesKeywords: 'notificación aviso alerta navegador push',
|
|
4153
|
+
browserNotices: 'Avisos del navegador',
|
|
4154
|
+
browserNoticesDescription: 'Aviso del sistema cuando la pestaña está en segundo plano.',
|
|
4155
|
+
browserNoticesDenied: 'El navegador bloqueó las notificaciones de este sitio. Permítalas en la configuración del navegador.',
|
|
4156
|
+
browserNoticesUnsupported: 'Este navegador no muestra notificaciones.',
|
|
4157
|
+
noticeOpen: 'Abrir',
|
|
4158
|
+
sync: 'Preferencias en la cuenta',
|
|
4159
|
+
syncDescription: 'Apariencia, región, favoritos y las demás preferencias lo acompañan en cualquier navegador.',
|
|
4160
|
+
syncKeywords: 'sincronizar nube cuenta navegador preferencias respaldo',
|
|
4161
|
+
syncSynced: 'Sincronizado a las {time}',
|
|
4162
|
+
syncSaving: 'Guardando…',
|
|
4163
|
+
syncLocal: 'Solo en este navegador: la cuenta no está disponible.',
|
|
4164
|
+
syncError: 'No fue posible sincronizar. Inténtelo de nuevo.',
|
|
4165
|
+
syncNow: 'Sincronizar ahora',
|
|
4166
|
+
},
|
|
3102
4167
|
};
|
|
3103
4168
|
|
|
3104
4169
|
const SPINE_I18N_CONFIG = new InjectionToken('SPINE_I18N_CONFIG', {
|
|
@@ -3125,6 +4190,10 @@ function currentSpineMessages() {
|
|
|
3125
4190
|
* Textos do spine no idioma ativo da lib (`HermesI18nService.locale`): uma troca de idioma com
|
|
3126
4191
|
* `setLocale` atualiza a lib e o spine juntos, sem recarregar. Leitura igual à do `HERMES_MESSAGES`
|
|
3127
4192
|
* (`inject(SPINE_MESSAGES).header.settings`), viva também em template.
|
|
4193
|
+
*
|
|
4194
|
+
* `meta.locale` é o de formatação da lib (`HermesI18nService.formatLocale`) quando a língua é a mesma: a
|
|
4195
|
+
* variante regional (`en-GB`) e o relógio/primeiro dia da semana escolhidos em Região valem também nas
|
|
4196
|
+
* datas e horas que o spine formata.
|
|
3128
4197
|
*/
|
|
3129
4198
|
const SPINE_MESSAGES = new InjectionToken('SPINE_MESSAGES', {
|
|
3130
4199
|
providedIn: 'root',
|
|
@@ -3133,8 +4202,11 @@ const SPINE_MESSAGES = new InjectionToken('SPINE_MESSAGES', {
|
|
|
3133
4202
|
const config = inject(SPINE_I18N_CONFIG);
|
|
3134
4203
|
const catalogs = { ...BUILT_IN, ...config.catalogs };
|
|
3135
4204
|
const active = computed(() => {
|
|
3136
|
-
const
|
|
3137
|
-
|
|
4205
|
+
const picked = i18n.pick(catalogs, SPINE_MESSAGES_PT_BR);
|
|
4206
|
+
const base = config.override ? mergeCatalog(config.override, picked) : picked;
|
|
4207
|
+
const locale = i18n.formatLocale();
|
|
4208
|
+
const sameLanguage = locale.split('-')[0].toLowerCase() === base.meta.locale.split('-')[0].toLowerCase();
|
|
4209
|
+
return sameLanguage && locale !== base.meta.locale ? { ...base, meta: { ...base.meta, locale } } : base;
|
|
3138
4210
|
}, ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
|
|
3139
4211
|
current = liveCatalog(() => active());
|
|
3140
4212
|
return current;
|
|
@@ -3149,5 +4221,5 @@ function provideSpineMessages(config) {
|
|
|
3149
4221
|
* Generated bundle index. Do not edit.
|
|
3150
4222
|
*/
|
|
3151
4223
|
|
|
3152
|
-
export { APP_PACKAGE_INFO, DensityService, HERMES_DS_IMPORTS, SPINE_ADMIN_API, SPINE_CONFIG, SPINE_DEFAULT_LOGO, SPINE_I18N_CONFIG, SPINE_MESSAGES, SPINE_MESSAGES_EN, SPINE_MESSAGES_ES, SPINE_MESSAGES_PT_BR, SPINE_NEWS, SPINE_USER_STORAGE_KEYS, SpinePreferencesService, SpineQuickAccessService, SpineUserStorage, ThemePresetService, ThemeService, applyRuntimeEnvironment, applySpineFavicon, currentSpineMessages, mergeRouteTree, provideSpineMessages, provideSpineNews, provideUi, resolveSpineLogo, routerIdOf, spineRoutesOf };
|
|
4224
|
+
export { APP_PACKAGE_INFO, DensityService, HERMES_DS_IMPORTS, SPINE_ADMIN_API, SPINE_CONFIG, SPINE_DEFAULT_LOGO, SPINE_I18N_CONFIG, SPINE_IDLE_OPTIONS, SPINE_MESSAGES, SPINE_MESSAGES_EN, SPINE_MESSAGES_ES, SPINE_MESSAGES_PT_BR, SPINE_NEWS, SPINE_USER_STORAGE_KEYS, SpinePreferencesService, SpineQuickAccessService, SpineUserStorage, ThemePresetService, ThemeService, applyRuntimeEnvironment, applySpineFavicon, currentSpineMessages, mergeRouteTree, provideSpineMessages, provideSpineNews, provideUi, resolveSpineLogo, routerIdOf, spineRoutesOf };
|
|
3153
4225
|
//# sourceMappingURL=trismegisto-spine.mjs.map
|