@things-factory/auth-base 10.1.142 → 10.1.146
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/config/config.development.js +4 -0
- package/config/config.production.js +4 -0
- package/dist-server/index.js +2 -9
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/access-request/index.d.ts +1 -1
- package/dist-server/service/app-binding/index.d.ts +1 -1
- package/dist-server/service/appliance/index.d.ts +1 -1
- package/dist-server/service/application/index.d.ts +1 -1
- package/dist-server/service/domain-link/index.d.ts +1 -1
- package/dist-server/service/domain-owner/index.d.ts +1 -1
- package/dist-server/service/granted-role/index.d.ts +1 -1
- package/dist-server/service/index.d.ts +1 -1
- package/dist-server/service/invitation/index.d.ts +1 -1
- package/dist-server/service/partner/index.d.ts +1 -1
- package/dist-server/service/privilege/index.d.ts +1 -1
- package/dist-server/service/privilege/privilege-sync.d.ts +10 -0
- package/dist-server/service/privilege/privilege-sync.js +28 -0
- package/dist-server/service/privilege/privilege-sync.js.map +1 -0
- package/dist-server/service/role/index.d.ts +1 -1
- package/dist-server/service/role-template/index.d.ts +1 -1
- package/dist-server/service/user/index.d.ts +1 -1
- package/dist-server/service/verification-token/index.d.ts +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/tests/privilege-rejection.test.ts +2 -2
- package/tests/privilege-sync-db.test.ts +58 -0
- package/translations/es.json +254 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/auth-base",
|
|
3
|
-
"version": "10.1.
|
|
3
|
+
"version": "10.1.146",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "dist-client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -34,9 +34,9 @@
|
|
|
34
34
|
"@reduxjs/toolkit": "^2.2.5",
|
|
35
35
|
"@simplewebauthn/browser": "^13.0.0",
|
|
36
36
|
"@simplewebauthn/server": "^13.0.0",
|
|
37
|
-
"@things-factory/email-base": "^10.1.
|
|
37
|
+
"@things-factory/email-base": "^10.1.146",
|
|
38
38
|
"@things-factory/env": "^10.1.20",
|
|
39
|
-
"@things-factory/shell": "^10.1.
|
|
39
|
+
"@things-factory/shell": "^10.1.146",
|
|
40
40
|
"@things-factory/utils": "^10.1.20",
|
|
41
41
|
"@types/webappsec-credential-management": "^0.6.9",
|
|
42
42
|
"jsonwebtoken": "^9.0.0",
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"passport-jwt": "^4.0.0",
|
|
49
49
|
"passport-local": "^1.0.0"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "7aeb3de935ec913d271866b27d931b2278259c13"
|
|
52
52
|
}
|
|
@@ -94,9 +94,9 @@ describe('privilege rejection carries why (ADR-0103 decision 1)', () => {
|
|
|
94
94
|
expect(license).toContain('licensed')
|
|
95
95
|
})
|
|
96
96
|
|
|
97
|
-
it('every sentence key is in all
|
|
97
|
+
it('every sentence key is in all six languages', () => {
|
|
98
98
|
const keys = ['error.x not allowed from this address', 'error.x not licensed', 'error.x refused for this request', 'error.ownership not allowed from this address']
|
|
99
|
-
for (const lng of ['en', 'ko', 'ja', 'zh', 'ms']) {
|
|
99
|
+
for (const lng of ['en', 'ko', 'ja', 'zh', 'ms', 'es']) {
|
|
100
100
|
const dict = require(`../translations/${lng}.json`)
|
|
101
101
|
for (const key of keys) expect([lng, key, typeof dict[key]]).toEqual([lng, key, 'string'])
|
|
102
102
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The privilege sync is boot-time writing, and boot-time writing takes its turn (shell `inBootTurn`).
|
|
3
|
+
*
|
|
4
|
+
* On sqlite every transaction shares one connection. Another module's boot transaction (work-shift's
|
|
5
|
+
* baseline) that began while the sync's insert was open failed with "cannot start a transaction within a
|
|
6
|
+
* transaction", and its rollback took the insert with it — so the same privilege was missing again on
|
|
7
|
+
* the next boot, and the collision repeated every boot (`contact/query`, operato-plant, 2026-10-10).
|
|
8
|
+
*/
|
|
9
|
+
import { inBootTurn } from '@things-factory/shell'
|
|
10
|
+
|
|
11
|
+
import { closeAuthDatabase, Domain, getRepository, openAuthDatabase, resetAuthDatabase } from './db'
|
|
12
|
+
import { loadCompiled } from './compiled'
|
|
13
|
+
|
|
14
|
+
const { synchronizePrivileges } = loadCompiled('service/privilege/privilege-sync')
|
|
15
|
+
const { Privilege } = loadCompiled('service/privilege/privilege')
|
|
16
|
+
|
|
17
|
+
const pause = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))
|
|
18
|
+
|
|
19
|
+
beforeAll(async () => {
|
|
20
|
+
await openAuthDatabase()
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
beforeEach(async () => {
|
|
24
|
+
await resetAuthDatabase()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
afterAll(async () => {
|
|
28
|
+
await closeAuthDatabase()
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
test('adds what is missing and leaves what is there', async () => {
|
|
32
|
+
await getRepository(Privilege).save({ category: 'contact', name: 'mutation' })
|
|
33
|
+
|
|
34
|
+
expect(await synchronizePrivileges([['contact', 'mutation'], ['contact', 'query']])).toEqual(['contact/query'])
|
|
35
|
+
expect(await getRepository(Privilege).countBy({ category: 'contact' })).toBe(2)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('another boot job that fails does not take the sync with it', async () => {
|
|
39
|
+
const dataSource = await openAuthDatabase()
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* A boot job of another module, in its turn: it holds a transaction for a while and then fails. On
|
|
43
|
+
* sqlite TypeORM shares one query runner, so a save that starts meanwhile rides inside that
|
|
44
|
+
* transaction — and goes when it rolls back.
|
|
45
|
+
*/
|
|
46
|
+
const other = inBootTurn(() =>
|
|
47
|
+
dataSource.transaction(async tx => {
|
|
48
|
+
await tx.getRepository(Domain).save({ name: 'boot-job', subdomain: 'boot-job' })
|
|
49
|
+
await pause(30)
|
|
50
|
+
throw new Error('the other boot job failed')
|
|
51
|
+
})
|
|
52
|
+
).catch(() => undefined)
|
|
53
|
+
const sync = synchronizePrivileges([['contact', 'query']])
|
|
54
|
+
|
|
55
|
+
await Promise.all([other, sync])
|
|
56
|
+
expect(await getRepository(Domain).countBy({ subdomain: 'boot-job' })).toBe(0)
|
|
57
|
+
expect(await getRepository(Privilege).countBy({ category: 'contact', name: 'query' })).toBe(1)
|
|
58
|
+
})
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
{
|
|
2
|
+
"error.auth error": "error de autenticación. {message}",
|
|
3
|
+
"error.authn verification failed": "no se pudo verificar la credencial del usuario.",
|
|
4
|
+
"error.confirm password not matched": "la nueva contraseña y la confirmación no coinciden",
|
|
5
|
+
"error.domain mismatch": "el certificado no corresponde a este dominio",
|
|
6
|
+
"error.domain not allowed": "el usuario no tiene permitido el dominio `{subdomain}`",
|
|
7
|
+
"error.email already exists": "el correo electrónico ya lo usa otro usuario",
|
|
8
|
+
"error.failed to find x": "no se encontró {x}",
|
|
9
|
+
"error.invalid username": "nombre de usuario no válido: {username}",
|
|
10
|
+
"error.ownership required": "¡no autorizado! se requiere la propiedad del dominio o del sistema",
|
|
11
|
+
"error.password should be supported": "se debe proporcionar una contraseña inicial o una contraseña predeterminada",
|
|
12
|
+
"error.password should match the rule": "la contraseña debe cumplir la siguiente regla. ${rule}",
|
|
13
|
+
"error.password used in the past": "contraseña usada anteriormente",
|
|
14
|
+
"error.role-name-stands-inherited": "ya se muestra aquí un rol llamado {name}, definido en {domain}. cree en este dominio uno propio con ese nombre solo si es lo que pretende hacer.",
|
|
15
|
+
"error.role-name-taken-here": "este dominio ya tiene un rol llamado {name}.",
|
|
16
|
+
"error.subdomain not found": "dominio no encontrado",
|
|
17
|
+
"error.token or password is invalid": "el token o la contraseña no son válidos",
|
|
18
|
+
"error.unavailable-domain": "dominio no disponible",
|
|
19
|
+
"error.user credential not found": "no se encontró la credencial del usuario. Debe registrar el dispositivo para usar la autenticación biométrica.",
|
|
20
|
+
"error.user credential registration failed": "el registro no se completó. se canceló en el dispositivo o no se pudo conectar con el servidor.",
|
|
21
|
+
"error.user credential registration not allowed": "no se pudo registrar este dispositivo. el registro superó el tiempo de espera o la credencial ya está registrada.",
|
|
22
|
+
"error.user duplicated": "ya existe una cuenta de usuario con el mismo correo electrónico o ID de usuario.",
|
|
23
|
+
"error.user not activated": "el usuario no está activado",
|
|
24
|
+
"error.user not found": "usuario no encontrado",
|
|
25
|
+
"error.user or verification token not found": "no se encontró el usuario o el token de verificación",
|
|
26
|
+
"error.user validation failed": "no se pudo validar el usuario",
|
|
27
|
+
"error.username already exists": "el nombre de usuario ya lo usa otro usuario",
|
|
28
|
+
"error.x is not a member of y": "{x} no es miembro de {y}",
|
|
29
|
+
"error.x privilege required": "¡no autorizado! se requiere el privilegio {x}",
|
|
30
|
+
"error.role-not-assignable-here": "este dominio no puede asignar los roles {roles}.",
|
|
31
|
+
"error.x not allowed from this address": "¡no autorizado! {x} no está permitido desde esta dirección",
|
|
32
|
+
"error.x not licensed": "¡no autorizado! {x} no tiene licencia en esta instalación",
|
|
33
|
+
"error.x refused for this request": "¡no autorizado! {x} se ha denegado para esta solicitud",
|
|
34
|
+
"error.ownership not allowed from this address": "¡no autorizado! la propiedad no se tiene en cuenta desde esta dirección",
|
|
35
|
+
"field.appliance_id": "ID del dispositivo",
|
|
36
|
+
"field.brand": "marca",
|
|
37
|
+
"field.password": "contraseña",
|
|
38
|
+
"field.privileges": "privilegios",
|
|
39
|
+
"field.token": "token",
|
|
40
|
+
"field.user": "usuario",
|
|
41
|
+
"field.user_account": "cuenta de usuario",
|
|
42
|
+
"field.user_type": "tipo de usuario",
|
|
43
|
+
"label.partner": "socio",
|
|
44
|
+
"privilege.allows.accounting.mutation": "registrar, corregir y cerrar comprobantes",
|
|
45
|
+
"privilege.allows.accounting.query": "ver comprobantes y saldos de cuentas",
|
|
46
|
+
"privilege.allows.activity-instance.mutation": "iniciar, traspasar y finalizar o cancelar trabajos",
|
|
47
|
+
"privilege.allows.activity-instance.query": "ver trabajos en curso y finalizados",
|
|
48
|
+
"privilege.allows.activity.mutation": "definir y cambiar tipos de actividad y sus pasos",
|
|
49
|
+
"privilege.allows.ai-assistant.mutation": "pedir al asistente que realice trabajos",
|
|
50
|
+
"privilege.allows.ai-assistant.query": "ver las conversaciones con el asistente",
|
|
51
|
+
"privilege.allows.ai-inference.query": "ver los resultados de inferencia de los modelos entrenados",
|
|
52
|
+
"privilege.allows.attachment.mutation": "subir y eliminar archivos",
|
|
53
|
+
"privilege.allows.attachment.query": "abrir archivos subidos",
|
|
54
|
+
"privilege.allows.bizplace.mutation": "registrar y cambiar centros de negocio",
|
|
55
|
+
"privilege.allows.bizplace.query": "ver los centros de negocio y sus direcciones",
|
|
56
|
+
"privilege.allows.board-ai.mutation": "hacer que la IA cree tableros",
|
|
57
|
+
"privilege.allows.board-ai.query": "ver los tableros redactados por la IA",
|
|
58
|
+
"privilege.allows.board-import.mutation": "importar tableros desde archivos externos",
|
|
59
|
+
"privilege.allows.board-import.query": "ver el historial de importación de tableros",
|
|
60
|
+
"privilege.allows.board-template.mutation": "crear y cambiar plantillas de tablero",
|
|
61
|
+
"privilege.allows.board-template.query": "ver las plantillas de tablero",
|
|
62
|
+
"privilege.allows.board.mutation": "crear, editar y eliminar tableros",
|
|
63
|
+
"privilege.allows.board.query": "abrir tableros",
|
|
64
|
+
"privilege.allows.company.mutation": "cambiar la información de la empresa",
|
|
65
|
+
"privilege.allows.company.query": "ver la información de la empresa",
|
|
66
|
+
"privilege.allows.connection.mutation": "crear, cambiar y eliminar conexiones — aquí se guardan las credenciales",
|
|
67
|
+
"privilege.allows.connection.query": "ver las conexiones con otros sistemas y su estado",
|
|
68
|
+
"privilege.allows.contact_point.mutation": "registrar y cambiar datos de contacto",
|
|
69
|
+
"privilege.allows.contact_point.query": "ver los datos de contacto de los socios",
|
|
70
|
+
"privilege.allows.data-archive.mutation": "mover datos al archivo y recuperarlos",
|
|
71
|
+
"privilege.allows.data-archive.query": "ver los datos archivados",
|
|
72
|
+
"privilege.allows.data-ooc.mutation": "tratar los valores fuera de control y registrar el motivo",
|
|
73
|
+
"privilege.allows.data-ooc.query": "ver los valores fuera de los límites de control",
|
|
74
|
+
"privilege.allows.data-sample.mutation": "registrar muestras e introducir mediciones",
|
|
75
|
+
"privilege.allows.data-sample.query": "ver las muestras y sus mediciones",
|
|
76
|
+
"privilege.allows.data-set-history.query": "ver cuándo y cómo se cambió un conjunto de datos",
|
|
77
|
+
"privilege.allows.data-set.mutation": "crear conjuntos de datos y cambiar sus campos",
|
|
78
|
+
"privilege.allows.data-set.query": "ver los conjuntos de datos y la disposición de sus campos",
|
|
79
|
+
"privilege.allows.data-summary.query": "ver valores resumidos por período y campo",
|
|
80
|
+
"privilege.allows.department.mutation": "crear, cambiar y mover departamentos",
|
|
81
|
+
"privilege.allows.department.query": "ver los departamentos y quién pertenece a ellos",
|
|
82
|
+
"privilege.allows.disposition.mutation": "decidir una disposición y enviarla a aprobación — aquí se decide el desecho y el reproceso",
|
|
83
|
+
"privilege.allows.disposition.query": "ver qué disposición se dio a los artículos no conformes",
|
|
84
|
+
"privilege.allows.employee.mutation": "registrar empleados y cambiar sus asignaciones",
|
|
85
|
+
"privilege.allows.employee.query": "ver la plantilla de empleados y sus asignaciones",
|
|
86
|
+
"privilege.allows.env-var.mutation": "añadir y cambiar variables de entorno — esto cambia el funcionamiento del servidor",
|
|
87
|
+
"privilege.allows.env-var.query": "ver los nombres y valores de las variables de entorno",
|
|
88
|
+
"privilege.allows.equipment-state.mutation": "cambiar el estado del equipo y registrar por qué se detuvo",
|
|
89
|
+
"privilege.allows.equipment-state.query": "ver si el equipo está en marcha o detenido",
|
|
90
|
+
"privilege.allows.figure.mutation": "crear y cambiar modelos de figura",
|
|
91
|
+
"privilege.allows.figure.query": "ver los modelos de figura y cómo están construidos",
|
|
92
|
+
"privilege.allows.inspection.mutation": "introducir resultados de inspección y evaluarlos",
|
|
93
|
+
"privilege.allows.inspection.query": "ver las especificaciones y los resultados de inspección",
|
|
94
|
+
"privilege.allows.job-order.mutation": "emitir, cambiar y cerrar órdenes de trabajo",
|
|
95
|
+
"privilege.allows.job-order.query": "ver las órdenes de trabajo y su avance",
|
|
96
|
+
"privilege.allows.kpi.mutation": "crear indicadores y cambiar sus objetivos y fórmulas",
|
|
97
|
+
"privilege.allows.kpi.query": "ver los indicadores y su evolución frente al objetivo",
|
|
98
|
+
"privilege.allows.label-studio.mutation": "configurar la conexión con Label Studio y enviarle trabajo",
|
|
99
|
+
"privilege.allows.label-studio.query": "ver el trabajo intercambiado con Label Studio",
|
|
100
|
+
"privilege.allows.labeling.mutation": "aplicar y cambiar etiquetas",
|
|
101
|
+
"privilege.allows.labeling.query": "ver las tareas de etiquetado y sus resultados",
|
|
102
|
+
"privilege.allows.maintenance.mutation": "planificar el mantenimiento e informar de lo realizado",
|
|
103
|
+
"privilege.allows.maintenance.query": "ver los planes de mantenimiento y lo realizado",
|
|
104
|
+
"privilege.allows.menu.mutation": "cambiar el menú y su orden — esto cambia las pantallas que ven otras personas",
|
|
105
|
+
"privilege.allows.mes-outbox.mutation": "configurar destinos y reenviar lo que falló",
|
|
106
|
+
"privilege.allows.mes-outbox.query": "ver si se acumulan los mensajes a sistemas externos",
|
|
107
|
+
"privilege.allows.mlflow.mutation": "configurar la conexión con MLflow y registrar modelos",
|
|
108
|
+
"privilege.allows.mlflow.query": "ver los experimentos y modelos registrados en MLflow",
|
|
109
|
+
"privilege.allows.mlops.mutation": "crear pipelines y ejecutar entrenamientos y despliegues",
|
|
110
|
+
"privilege.allows.mlops.query": "ver las ejecuciones de pipelines de entrenamiento y despliegue",
|
|
111
|
+
"privilege.allows.ops-master.mutation": "cambiar las reglas de operación — la programación se basa en estos valores",
|
|
112
|
+
"privilege.allows.ops-master.query": "ver las reglas de operación, como los días laborables y no laborables",
|
|
113
|
+
"privilege.allows.order.mutation": "recibir, cambiar y cancelar pedidos",
|
|
114
|
+
"privilege.allows.order.query": "ver los pedidos y sus líneas",
|
|
115
|
+
"privilege.allows.organization.mutation": "cambiar la estructura de la organización",
|
|
116
|
+
"privilege.allows.organization.query": "ver la estructura de la organización",
|
|
117
|
+
"privilege.allows.partner.mutation": "registrar socios y desvincularlos",
|
|
118
|
+
"privilege.allows.partner.query": "ver los socios y cómo están vinculados sus dominios",
|
|
119
|
+
"privilege.allows.privilege.query": "ver los privilegios declarados en esta implantación",
|
|
120
|
+
"privilege.allows.process-instance.query": "ver hasta dónde ha avanzado una ejecución de proceso",
|
|
121
|
+
"privilege.allows.process.mutation": "crear procesos y cambiar sus pasos",
|
|
122
|
+
"privilege.allows.process.query": "ver las definiciones de procesos y sus pasos",
|
|
123
|
+
"privilege.allows.production-report.mutation": "informar de la producción y emitir correcciones",
|
|
124
|
+
"privilege.allows.production-report.query": "ver los informes de producción y sus correcciones",
|
|
125
|
+
"privilege.allows.scenario.mutation": "crear escenarios e iniciarlos y detenerlos",
|
|
126
|
+
"privilege.allows.scenario.query": "ver los escenarios de integración y sus ejecuciones",
|
|
127
|
+
"privilege.allows.schedule.mutation": "elaborar y mover la programación",
|
|
128
|
+
"privilege.allows.schedule.query": "ver la programación de producción",
|
|
129
|
+
"privilege.allows.security.mutation": "cambiar la configuración de seguridad — esto cambia quién puede acceder al sistema",
|
|
130
|
+
"privilege.allows.security.query": "ver la configuración de seguridad, como las restricciones de dirección",
|
|
131
|
+
"privilege.allows.setting.mutation": "cambiar la configuración del sistema",
|
|
132
|
+
"privilege.allows.setting.query": "ver la configuración del sistema",
|
|
133
|
+
"privilege.allows.state-register.mutation": "cambiar ese registro — la siguiente ejecución se reanuda desde él",
|
|
134
|
+
"privilege.allows.state-register.query": "ver hasta dónde ha procesado una integración",
|
|
135
|
+
"privilege.allows.station.mutation": "asignar estaciones y enviarles directivas de trabajo",
|
|
136
|
+
"privilege.allows.station.query": "ver las estaciones y quién está asignado a ellas",
|
|
137
|
+
"privilege.allows.terminology.mutation": "cambiar los términos que se muestran en pantalla y sus traducciones",
|
|
138
|
+
"privilege.allows.tutorial.mutation": "crear y cambiar tutoriales",
|
|
139
|
+
"privilege.allows.twin.mutation": "crear y cambiar gemelos, e iniciarlos y detenerlos",
|
|
140
|
+
"privilege.allows.twin.query": "ver los gemelos y la disposición de sus emplazamientos",
|
|
141
|
+
"privilege.allows.user.mutation": "invitar usuarios, conceder roles y bloquear cuentas — aquí se decide quién puede hacer qué",
|
|
142
|
+
"privilege.allows.user.query": "ver la lista de usuarios y los roles de cada persona",
|
|
143
|
+
"privilege.allows.webhook.mutation": "crear webhooks y cambiar el destino de sus envíos",
|
|
144
|
+
"privilege.allows.webhook.query": "ver los webhooks y lo que han enviado",
|
|
145
|
+
"privilege.allows.work-shift.mutation": "crear y cambiar horarios de turnos",
|
|
146
|
+
"privilege.allows.worker.mutation": "registrar trabajadores y cambiar su asignación",
|
|
147
|
+
"privilege.allows.worker.query": "ver los trabajadores y dónde están asignados",
|
|
148
|
+
"privilege.category.accounting": "contabilidad",
|
|
149
|
+
"privilege.category.activity": "definición de actividades de trabajo",
|
|
150
|
+
"privilege.category.activity-instance": "trabajo en curso",
|
|
151
|
+
"privilege.category.ai-assistant": "asistente de IA",
|
|
152
|
+
"privilege.category.ai-inference": "inferencia de IA",
|
|
153
|
+
"privilege.category.attachment": "archivo adjunto",
|
|
154
|
+
"privilege.category.bizplace": "centro de negocio",
|
|
155
|
+
"privilege.category.board": "tablero",
|
|
156
|
+
"privilege.category.board-ai": "IA de tableros",
|
|
157
|
+
"privilege.category.board-import": "importación de tableros",
|
|
158
|
+
"privilege.category.board-template": "plantilla de tablero",
|
|
159
|
+
"privilege.category.company": "empresa",
|
|
160
|
+
"privilege.category.connection": "conexión del sistema",
|
|
161
|
+
"privilege.category.contact_point": "punto de contacto",
|
|
162
|
+
"privilege.category.data-archive": "archivo de datos",
|
|
163
|
+
"privilege.category.data-ooc": "datos fuera de control",
|
|
164
|
+
"privilege.category.data-sample": "muestra de datos",
|
|
165
|
+
"privilege.category.data-set": "conjunto de datos",
|
|
166
|
+
"privilege.category.data-set-history": "historial del conjunto de datos",
|
|
167
|
+
"privilege.category.data-summary": "resumen de datos",
|
|
168
|
+
"privilege.category.department": "departamento",
|
|
169
|
+
"privilege.category.disposition": "disposición de no conformidades",
|
|
170
|
+
"privilege.category.employee": "empleado",
|
|
171
|
+
"privilege.category.env-var": "variable de entorno",
|
|
172
|
+
"privilege.category.equipment-state": "estado del equipo",
|
|
173
|
+
"privilege.category.figure": "modelo de figura",
|
|
174
|
+
"privilege.category.inspection": "inspección",
|
|
175
|
+
"privilege.category.job-order": "orden de trabajo",
|
|
176
|
+
"privilege.category.kpi": "indicador de rendimiento",
|
|
177
|
+
"privilege.category.label-studio": "conexión con Label Studio",
|
|
178
|
+
"privilege.category.labeling": "etiquetado de datos",
|
|
179
|
+
"privilege.category.maintenance": "mantenimiento",
|
|
180
|
+
"privilege.category.menu": "menú",
|
|
181
|
+
"privilege.category.mes-outbox": "bandeja de salida MES",
|
|
182
|
+
"privilege.category.mlflow": "conexión con MLflow",
|
|
183
|
+
"privilege.category.mlops": "MLOps",
|
|
184
|
+
"privilege.category.ops-master": "datos maestros de operación",
|
|
185
|
+
"privilege.category.order": "pedido",
|
|
186
|
+
"privilege.category.organization": "organización",
|
|
187
|
+
"privilege.category.partner": "socio",
|
|
188
|
+
"privilege.category.privilege": "lista de privilegios",
|
|
189
|
+
"privilege.category.process": "definición de procesos",
|
|
190
|
+
"privilege.category.process-instance": "ejecución de procesos",
|
|
191
|
+
"privilege.category.production-report": "informe de producción",
|
|
192
|
+
"privilege.category.scenario": "escenario de integración",
|
|
193
|
+
"privilege.category.schedule": "programación de producción",
|
|
194
|
+
"privilege.category.security": "seguridad",
|
|
195
|
+
"privilege.category.setting": "configuración",
|
|
196
|
+
"privilege.category.state-register": "registro de estado de integración",
|
|
197
|
+
"privilege.category.station": "estación",
|
|
198
|
+
"privilege.category.system": "configuración del sistema",
|
|
199
|
+
"privilege.category.terminology": "terminología",
|
|
200
|
+
"privilege.category.tutorial": "tutorial",
|
|
201
|
+
"privilege.category.twin": "gemelo digital",
|
|
202
|
+
"privilege.category.user": "usuario",
|
|
203
|
+
"privilege.category.webhook": "webhook",
|
|
204
|
+
"privilege.category.work-shift": "turno de trabajo",
|
|
205
|
+
"privilege.category.worker": "trabajador",
|
|
206
|
+
"privilege.name.mutation": "edición",
|
|
207
|
+
"privilege.name.query": "lectura",
|
|
208
|
+
"text.account is reactivated": "la cuenta se ha reactivado",
|
|
209
|
+
"text.delete account succeed": "cuenta eliminada correctamente",
|
|
210
|
+
"text.inactive user": "usuario inactivo",
|
|
211
|
+
"text.invalid verification token": "token de verificación no válido",
|
|
212
|
+
"text.invitation email sent": "correo de invitación enviado",
|
|
213
|
+
"text.password changed successfully": "contraseña cambiada correctamente",
|
|
214
|
+
"text.password reset email sent": "correo de restablecimiento de contraseña enviado",
|
|
215
|
+
"text.password reset succeed": "contraseña restablecida correctamente",
|
|
216
|
+
"text.pattern_atleast_1_digit": "al menos 1 dígito",
|
|
217
|
+
"text.pattern_atleast_1_lowercase": "al menos 1 letra minúscula",
|
|
218
|
+
"text.pattern_atleast_1_special": "al menos 1 carácter especial(!@#$%^&*())",
|
|
219
|
+
"text.pattern_atleast_1_uppercase": "al menos 1 letra mayúscula",
|
|
220
|
+
"text.pattern_minimum_charaters": "mínimo {length} caracteres",
|
|
221
|
+
"text.pattern_not_allowed": "no se permiten caracteres repetidos",
|
|
222
|
+
"text.profile changed successfully": "perfil cambiado correctamente",
|
|
223
|
+
"text.result": "resultado",
|
|
224
|
+
"text.signout successfully": "sesión cerrada correctamente",
|
|
225
|
+
"text.user activated successfully": "usuario activado correctamente",
|
|
226
|
+
"text.user credential registered successfully": "el registro del dispositivo se ha completado correctamente. Ya puede usar la autenticación biométrica.",
|
|
227
|
+
"text.user inactivated successfully": "usuario desactivado correctamente",
|
|
228
|
+
"text.user registered successfully": "usuario registrado correctamente. busque el correo electrónico para activar la cuenta",
|
|
229
|
+
"text.verification email sent": "correo de verificación enviado",
|
|
230
|
+
"privilege.description": "{name} de {category}",
|
|
231
|
+
"error.access-request-names-nothing": "una solicitud de acceso indica una categoría y un privilegio.",
|
|
232
|
+
"error.access-request-unknown-privilege": "no existe el privilegio {privilege}.",
|
|
233
|
+
"error.access-request-already-holds": "ya tiene {privilege}.",
|
|
234
|
+
"error.access-request-not-by-role": "aquí un rol no daría acceso a {privilege}, así que no se puede solicitar.",
|
|
235
|
+
"error.access-request-not-withdrawable": "no tiene ninguna solicitud pendiente que retirar.",
|
|
236
|
+
"error.access-decision-access-request-not-found": "la solicitud de acceso no se encuentra en este dominio.",
|
|
237
|
+
"error.access-decision-request-not-pending": "la solicitud ya se ha resuelto, retirado o ha caducado.",
|
|
238
|
+
"error.access-decision-own-request": "no puede resolver su propia solicitud.",
|
|
239
|
+
"error.access-decision-requester-unavailable": "el solicitante está bloqueado, inactivo o ya no pertenece a este dominio.",
|
|
240
|
+
"error.access-decision-deny-needs-reason": "un rechazo necesita un motivo.",
|
|
241
|
+
"error.access-decision-already-holds": "el solicitante ya tiene este privilegio.",
|
|
242
|
+
"error.access-decision-role-required": "seleccione el rol que se va a conceder.",
|
|
243
|
+
"error.access-decision-role-not-assignable": "este dominio no puede asignar ese rol.",
|
|
244
|
+
"error.access-decision-role-does-not-grant": "ese rol no tiene el privilegio solicitado.",
|
|
245
|
+
"access-request.notify.asked.title": "solicitud de acceso",
|
|
246
|
+
"access-request.notify.asked.body": "{name} solicita {privilege}.",
|
|
247
|
+
"access-request.notify.granted.title": "acceso concedido",
|
|
248
|
+
"access-request.notify.granted.body": "ahora tiene {privilege} (rol: {role}).",
|
|
249
|
+
"access-request.notify.denied.title": "solicitud de acceso rechazada",
|
|
250
|
+
"access-request.notify.denied.body": "{privilege}: {reason}",
|
|
251
|
+
"error.access-request-needs-reason": "indique por qué lo necesita.",
|
|
252
|
+
"error.access-request-same-reason-as-denied": "se rechazó hace poco por el mismo motivo ({reason}). indique qué ha cambiado.",
|
|
253
|
+
"error.role-belongs-to-parent": "{roles}: un rol del dominio principal. solo quien decide los roles allí puede concederlo o quitarlo."
|
|
254
|
+
}
|