diff --git a/.changeset/20493-ja-es-object-labels.md b/.changeset/20493-ja-es-object-labels.md new file mode 100644 index 00000000000..01a2f0c06b8 --- /dev/null +++ b/.changeset/20493-ja-es-object-labels.md @@ -0,0 +1,35 @@ +--- +'@objectstack/platform-objects': patch +--- + +fix(platform-objects): the ja-JP and es-ES platform-object bundles no longer ship English labels, options and help as copies of the source (#20493) + +Clause-②: no + +A ja-JP or es-ES console showed English on Setup surfaces: the Invite user +dialog listed the membership roles with **Delegated Admin** among the +translated ones. The keys were present in `ja-JP.objects.generated.ts` and +`es-ES.objects.generated.ts`, but their values were byte copies of the English +source that `os i18n extract --fill=default` seeds. + +- ja-JP: 340 of the 383 string leaves that equalled their `en` source are now + translated: labels, plural labels, select options, help, descriptions and + empty states. `delegated_admin` reads 委任管理者 on both `sys_member` and + `sys_invitation`, the word the console already uses for that role. +- es-ES: 338 of the 392 are now translated the same way. `delegated_admin` + reads Administrador delegado on both objects, again the console's word. +- The rest stay as written by design, each recorded with its reason in a + per-locale ledger (`objects-ja-jp-echo-decisions.test.ts`, + `objects-es-es-echo-decisions.test.ts`). ja-JP keeps 43: sign-in provider + brands, the bare `ID` initialism, protocol names (JWKS, IdP SSO URL, + Message-ID, UI / API), the `Web` client type as the bundle already renders it, + the Cc / Bcc header abbreviations, and placeholders that show a value the + admin types. es-ES keeps 54: the same brands, `ID`, JWKS, Message-ID, + UI / API, `Web` and placeholders, plus words Spanish spells as English (Error, + Actor, Global, Variables), the loanwords the bundle already uses (Token, + Checksum, Slug) and Cc. + +`ja-JP.source-hashes.generated.ts` and `es-ES.source-hashes.generated.ts` were +regenerated by `pnpm i18n:extract`: each records a leaf only while the leaf is +a copy of its source, so they now list exactly those 43 and 54. zh-CN is +unchanged. diff --git a/packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts b/packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts index 20ef8ed1746..644bd60bccc 100644 --- a/packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts +++ b/packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts @@ -97,11 +97,11 @@ export const esESObjects: NonNullable = { }, manager_id: { label: "Gerente", - help: "This user's direct manager. Forms the reporting chain the `own_and_reports` hierarchy scope walks (ADR-0057 / @objectstack/security-enterprise)." + help: "Gerente directo de este usuario. Forma la cadena de reporte que recorre el ámbito jerárquico `own_and_reports` (ADR-0057 / @objectstack/security-enterprise)." }, primary_business_unit_id: { label: "Unidad de negocio principal", - help: "The user's primary business unit — a denormalised projection of sys_business_unit_member.is_primary, maintained by plugin-sharing (ADR-0057 addendum D12). Lets a user-lookup filter candidates by business unit without traversing the membership junction. Do not edit directly; set it via business-unit membership." + help: "Unidad de negocio principal del usuario: una proyección desnormalizada de sys_business_unit_member.is_primary que mantiene plugin-sharing (anexo D12 de ADR-0057). Permite que una búsqueda de usuarios filtre candidatos por unidad de negocio sin recorrer la tabla de unión de membresías. No la edites directamente; establécela mediante la membresía a la unidad de negocio." }, source: { label: "Origen de la identidad", @@ -334,16 +334,16 @@ export const esESObjects: NonNullable = { label: "Caduca el" }, last_activity_at: { - label: "Last Activity At", - help: "Timestamp of the last request on this session; drives idle-timeout. System-managed." + label: "Última actividad el", + help: "Marca temporal de la última solicitud en esta sesión; determina el tiempo de espera por inactividad. Gestionado por el sistema." }, revoked_at: { - label: "Revoked At", - help: "When set, this session was revoked (idle / absolute-max / concurrent-cap / admin / organization membership ended). System-managed." + label: "Revocado el", + help: "Si está establecido, esta sesión se revocó (inactividad / duración máxima absoluta / límite de sesiones simultáneas / administrador / fin de la membresía de la organización). Gestionado por el sistema." }, revoke_reason: { - label: "Revoke Reason", - help: "Why the session was revoked (idle_timeout, absolute_max, concurrent_cap, user_revoked, admin, organization_membership_ended, …)." + label: "Motivo de la revocación", + help: "Por qué se revocó la sesión (idle_timeout, absolute_max, concurrent_cap, user_revoked, admin, organization_membership_ended, …)." }, active_organization_id: { label: "Organización activa" @@ -431,15 +431,15 @@ export const esESObjects: NonNullable = { }, access_token: { label: "Token de acceso", - help: "Live OAuth access token issued by the provider — never returned on the data API (#7987); better-auth reads it back through the engine's privileged internal-field accessor" + help: "Token de acceso OAuth vigente emitido por el proveedor; nunca se devuelve en la API de datos (#7987). better-auth lo vuelve a leer mediante el accesor privilegiado de campos internos del motor." }, refresh_token: { label: "Token de actualización", - help: "Live OAuth refresh token — long-lived and not revoked by revoking an ObjectStack session; never returned on the data API (#7987)" + help: "Token de actualización OAuth vigente: de larga duración y no se revoca al revocar una sesión de ObjectStack; nunca se devuelve en la API de datos (#7987)." }, id_token: { label: "Token de ID", - help: "OIDC ID token issued by the provider — never returned on the data API (#7987)" + help: "Token de ID de OIDC emitido por el proveedor; nunca se devuelve en la API de datos (#7987)." }, access_token_expires_at: { label: "El token de acceso caduca el" @@ -455,8 +455,8 @@ export const esESObjects: NonNullable = { help: "Hash de la contraseña para el proveedor de correo electrónico/contraseña." }, previous_password_hashes: { - label: "Previous Password Hashes", - help: "JSON array of prior password hashes (bounded by password_history_count); reuse-prevention only. System-managed." + label: "Hashes de contraseñas anteriores", + help: "Matriz JSON de hashes de contraseñas anteriores (limitada por password_history_count); solo para impedir su reutilización. Gestionado por el sistema." } }, _views: { @@ -554,12 +554,12 @@ export const esESObjects: NonNullable = { help: "Zona horaria IANA (p. ej. UTC, Asia/Shanghai) en la que se calculan los límites de fecha de esta organización: el valor raíz que hereda toda unidad de negocio sin zona propia. Sin definir significa UTC." }, parent_organization_id: { - label: "Parent Organization", - help: "Reporting/grouping parent. Grants NOTHING — visibility across organizations comes from membership, never from this reference (ADR-0105 D6)." + label: "Organización principal", + help: "Organización principal a efectos de informes y agrupación. No concede NADA: la visibilidad entre organizaciones procede de la membresía, nunca de esta referencia (ADR-0105 D6)." }, sort_order: { - label: "Sort Order", - help: "Display order among sibling organizations. Presentation only." + label: "Orden", + help: "Orden de visualización entre organizaciones hermanas. Solo afecta a la presentación." }, id: { label: "ID de organización" @@ -633,17 +633,17 @@ export const esESObjects: NonNullable = { options: { owner: "Propietario", admin: "Administrador", - delegated_admin: "Delegated Admin", + delegated_admin: "Administrador delegado", member: "Miembro" } } }, _views: { mine: { - label: "My Memberships", + label: "Mis organizaciones", emptyState: { - title: "No organizations yet", - message: "You haven't joined any organizations." + title: "Aún no hay organizaciones", + message: "No te has unido a ninguna organización." } } }, @@ -700,7 +700,7 @@ export const esESObjects: NonNullable = { options: { owner: "Propietario", admin: "Administrador", - delegated_admin: "Delegated Admin", + delegated_admin: "Administrador delegado", member: "Miembro" } }, @@ -726,12 +726,12 @@ export const esESObjects: NonNullable = { help: "Equipo opcional que se asignará al aceptar." }, business_unit_id: { - label: "Placement Business Unit", - help: "Business unit the invitee is placed under on acceptance (ADR-0105 D8). Must lie inside the issuer's delegated subtree." + label: "Unidad de negocio de asignación", + help: "Unidad de negocio en la que se asigna a la persona invitada al aceptar (ADR-0105 D8). Debe estar dentro del subárbol delegado de quien emite la invitación." }, positions: { - label: "Placement Positions", - help: "sys_position names assigned on acceptance (ADR-0105 D8). Every position's permission sets must be allowlisted by the issuer's adminScope." + label: "Puestos de asignación", + help: "Nombres de sys_position asignados al aceptar (ADR-0105 D8). Los conjuntos de permisos de cada puesto deben estar en la lista de permitidos del adminScope de quien emite la invitación." } }, _views: { @@ -786,8 +786,8 @@ export const esESObjects: NonNullable = { help: "Organización principal de este equipo." }, member_count: { - label: "Member Count", - help: "Seat counter maintained by better-auth; do not write directly." + label: "Número de miembros", + help: "Contador de plazas que mantiene better-auth; no lo escribas directamente." }, id: { label: "ID de equipo" @@ -845,8 +845,8 @@ export const esESObjects: NonNullable = { label: "Usuario" }, membership_key: { - label: "Membership Key", - help: "Derived membership digest maintained by better-auth; do not write directly." + label: "Clave de membresía", + help: "Resumen derivado de la membresía que mantiene better-auth; no lo escribas directamente." } }, _actions: { @@ -1007,8 +1007,8 @@ export const esESObjects: NonNullable = { help: "Usuario que posee esta clave de API." }, active_organization_id: { - label: "Active Organization", - help: "Organization this key authenticates into — inherited from the minter at creation and established as the request’s active organization" + label: "Organización activa", + help: "Organización en la que se autentica esta clave: se hereda de quien la emite al crearla y se establece como la organización activa de la solicitud." }, scopes: { label: "Ámbitos", @@ -1095,16 +1095,16 @@ export const esESObjects: NonNullable = { help: "Códigos de recuperación de respaldo serializados en JSON." }, verified: { - label: "Verified", - help: "Whether the enrollment was confirmed with a valid TOTP code (managed by better-auth)" + label: "Verificado", + help: "Indica si la inscripción se confirmó con un código TOTP válido (gestionado por better-auth)." }, failed_verification_count: { - label: "Failed Verification Count", - help: "Consecutive failed 2FA verifications; reset on success. Maintained by better-auth." + label: "Verificaciones fallidas", + help: "Verificaciones 2FA fallidas consecutivas; se restablece tras una verificación correcta. Lo mantiene better-auth." }, locked_until: { - label: "Locked Until", - help: "Set when failed 2FA verifications cross the lockout threshold. Maintained by better-auth." + label: "Bloqueado hasta", + help: "Se establece cuando las verificaciones 2FA fallidas superan el umbral de bloqueo. Lo mantiene better-auth." } }, _views: { @@ -1291,8 +1291,8 @@ export const esESObjects: NonNullable = { help: "Identificador público del cliente OAuth." }, client_discovery_id: { - label: "Client Discovery ID", - help: "Opaque identifier the provider uses to look this client up on the discovery path, kept apart from the public `client_id`" + label: "ID de descubrimiento del cliente", + help: "Identificador opaco que usa el proveedor para localizar este cliente en la ruta de descubrimiento; se mantiene separado del `client_id` público." }, client_secret: { label: "Secreto de cliente", @@ -1339,8 +1339,8 @@ export const esESObjects: NonNullable = { help: "Lista serializada en JSON de ámbitos que el cliente puede solicitar." }, client_credentials_scopes: { - label: "Client-Credentials Scopes", - help: "JSON-serialized list of scopes the client may request on the client_credentials grant, where there is no user to consent — kept apart from `scopes`, which governs user-delegated grants" + label: "Ámbitos de credenciales de cliente", + help: "Lista serializada en JSON de ámbitos que el cliente puede solicitar en la concesión client_credentials, donde no hay un usuario que dé su consentimiento; se mantiene separada de `scopes`, que rige las concesiones delegadas por el usuario." }, subject_type: { label: "Tipo de sujeto", @@ -1348,15 +1348,15 @@ export const esESObjects: NonNullable = { }, jwks: { label: "JWKS", - help: "Client JSON Web Key Set (for private_key_jwt / signed-request verification)" + help: "JSON Web Key Set del cliente (para private_key_jwt y la verificación de solicitudes firmadas)." }, jwks_uri: { label: "JWKS URI", - help: "URL of the client JSON Web Key Set" + help: "URL del JSON Web Key Set del cliente." }, dpop_bound_access_tokens: { - label: "DPoP-bound Access Tokens", - help: "Require access tokens issued to this client to be DPoP-bound (RFC 9449)" + label: "Tokens de acceso vinculados a DPoP", + help: "Exige que los tokens de acceso emitidos a este cliente estén vinculados a DPoP (RFC 9449)." }, disabled: { label: "Deshabilitado" @@ -1370,12 +1370,12 @@ export const esESObjects: NonNullable = { help: "Permitir que el cliente llame al endpoint OIDC de finalización de sesión." }, backchannel_logout_uri: { - label: "Back-channel Logout URI", - help: "OIDC back-channel logout endpoint of the client" + label: "URI de cierre de sesión por canal secundario", + help: "Endpoint de cierre de sesión por canal secundario de OIDC del cliente." }, backchannel_logout_session_required: { - label: "Back-channel Logout Session Required", - help: "Whether the back-channel logout token must include a sid claim" + label: "Sesión requerida en el cierre por canal secundario", + help: "Indica si el token de cierre de sesión por canal secundario debe incluir un reclamo sid." }, software_id: { label: "ID de software" @@ -1404,7 +1404,7 @@ export const esESObjects: NonNullable = { }, _views: { mine: { - label: "My Applications" + label: "Mis aplicaciones" }, active: { label: "Activo" @@ -1509,16 +1509,16 @@ export const esESObjects: NonNullable = { help: "Identificador de correlación proporcionado por quien llama." }, authorization_code_id: { - label: "Authorization Code ID", - help: "ID of the authorization-code grant this token originates from" + label: "ID del código de autorización", + help: "ID de la concesión de código de autorización de la que procede este token." }, resources: { - label: "Resources", - help: "JSON-serialized list of RFC 8707 resource indicators bound to this token" + label: "Recursos", + help: "Lista serializada en JSON de indicadores de recurso RFC 8707 vinculados a este token." }, requested_user_info_claims: { - label: "Requested UserInfo Claims", - help: "JSON-serialized list of OIDC claims requested for the userinfo endpoint" + label: "Reclamos de UserInfo solicitados", + help: "Lista serializada en JSON de reclamos OIDC solicitados para el endpoint userinfo." }, scopes: { label: "Ámbitos", @@ -1531,12 +1531,12 @@ export const esESObjects: NonNullable = { label: "Creado el" }, revoked: { - label: "Revoked At", - help: "Timestamp at which this access token was revoked" + label: "Revocado el", + help: "Marca temporal en la que se revocó este token de acceso." }, confirmation: { - label: "Confirmation", - help: "JSON RFC 7800 cnf claim (e.g. DPoP key thumbprint) binding this token to a key" + label: "Confirmación", + help: "Reclamo cnf de RFC 7800 en JSON (p. ej., la huella de la clave DPoP) que vincula este token a una clave." } } }, @@ -1569,16 +1569,16 @@ export const esESObjects: NonNullable = { help: "Identificador de correlación proporcionado por quien llama." }, authorization_code_id: { - label: "Authorization Code ID", - help: "ID of the authorization-code grant this token chain originates from" + label: "ID del código de autorización", + help: "ID de la concesión de código de autorización de la que procede esta cadena de tokens." }, resources: { - label: "Resources", - help: "JSON-serialized list of RFC 8707 resource indicators bound to this token" + label: "Recursos", + help: "Lista serializada en JSON de indicadores de recurso RFC 8707 vinculados a este token." }, requested_user_info_claims: { - label: "Requested UserInfo Claims", - help: "JSON-serialized list of OIDC claims requested for the userinfo endpoint" + label: "Reclamos de UserInfo solicitados", + help: "Lista serializada en JSON de reclamos OIDC solicitados para el endpoint userinfo." }, scopes: { label: "Ámbitos", @@ -1595,24 +1595,24 @@ export const esESObjects: NonNullable = { help: "Marca temporal en la que se revocó este token de actualización." }, rotated_at: { - label: "Rotated At", - help: "Timestamp at which this token was rotated (superseded by a new row)" + label: "Rotado el", + help: "Marca temporal en la que se rotó este token (sustituido por una fila nueva)." }, rotation_replay_response: { - label: "Rotation Replay Response", - help: "Cached token response replayed when the old token is re-presented within the reuse interval" + label: "Respuesta de reproducción de la rotación", + help: "Respuesta de token almacenada en caché que se reproduce cuando el token anterior se vuelve a presentar dentro del intervalo de reutilización." }, rotation_replay_expires_at: { - label: "Rotation Replay Expires At", - help: "End of the post-rotation reuse interval during which the replay response is served" + label: "La reproducción de la rotación caduca el", + help: "Fin del intervalo de reutilización posterior a la rotación durante el que se sirve la respuesta de reproducción." }, auth_time: { label: "Hora de autenticación", help: "Momento en que el usuario se autenticó originalmente para esta cadena de tokens." }, confirmation: { - label: "Confirmation", - help: "JSON RFC 7800 cnf claim (e.g. DPoP key thumbprint) binding this token to a key" + label: "Confirmación", + help: "Reclamo cnf de RFC 7800 en JSON (p. ej., la huella de la clave DPoP) que vincula este token a una clave." } } }, @@ -1637,12 +1637,12 @@ export const esESObjects: NonNullable = { help: "Identificador de correlación proporcionado por quien llama." }, resources: { - label: "Resources", - help: "JSON-serialized list of RFC 8707 resource indicators the consent covers" + label: "Recursos", + help: "Lista serializada en JSON de indicadores de recurso RFC 8707 que abarca el consentimiento." }, requested_user_info_claims: { - label: "Requested UserInfo Claims", - help: "JSON-serialized list of OIDC claims the user consented to expose" + label: "Reclamos de UserInfo solicitados", + help: "Lista serializada en JSON de reclamos OIDC que el usuario consintió en exponer." }, scopes: { label: "Ámbitos", @@ -1657,103 +1657,103 @@ export const esESObjects: NonNullable = { } }, sys_oauth_resource: { - label: "OAuth Resource", - pluralLabel: "OAuth Resources", - description: "Registered OAuth protected resources (RFC 8707 resource indicators)", + label: "Recurso OAuth", + pluralLabel: "Recursos OAuth", + description: "Recursos protegidos OAuth registrados (indicadores de recurso RFC 8707).", fields: { id: { label: "ID" }, identifier: { - label: "Identifier", - help: "Resource indicator URI presented in the RFC 8707 resource parameter" + label: "Identificador", + help: "URI del indicador de recurso que se presenta en el parámetro resource de RFC 8707." }, name: { - label: "Name" + label: "Nombre" }, access_token_ttl: { - label: "Access Token TTL", - help: "Access-token lifetime in seconds for this resource (overrides the server default)" + label: "TTL del token de acceso", + help: "Vida útil del token de acceso para este recurso, en segundos (anula el valor predeterminado del servidor)." }, refresh_token_ttl: { - label: "Refresh Token TTL", - help: "Refresh-token lifetime in seconds for this resource (overrides the server default)" + label: "TTL del token de actualización", + help: "Vida útil del token de actualización para este recurso, en segundos (anula el valor predeterminado del servidor)." }, signing_algorithm: { - label: "Signing Algorithm", - help: "JWS algorithm used to sign access tokens for this resource" + label: "Algoritmo de firma", + help: "Algoritmo JWS que se usa para firmar los tokens de acceso de este recurso." }, signing_key_id: { - label: "Signing Key ID", - help: "Key id (kid) used to sign access tokens for this resource" + label: "ID de la clave de firma", + help: "ID de clave (kid) que se usa para firmar los tokens de acceso de este recurso." }, allowed_scopes: { - label: "Allowed Scopes", - help: "JSON-serialized list of scopes clients may request for this resource" + label: "Ámbitos permitidos", + help: "Lista serializada en JSON de ámbitos que los clientes pueden solicitar para este recurso." }, custom_claims: { - label: "Custom Claims", - help: "JSON object of extra claims stamped on access tokens for this resource" + label: "Reclamos personalizados", + help: "Objeto JSON de reclamos adicionales que se añaden a los tokens de acceso de este recurso." }, dpop_bound_access_tokens_required: { - label: "DPoP Required", - help: "Require access tokens for this resource to be DPoP-bound (RFC 9449)" + label: "DPoP obligatorio", + help: "Exige que los tokens de acceso de este recurso estén vinculados a DPoP (RFC 9449)." }, disabled: { - label: "Disabled" + label: "Deshabilitado" }, policy_version: { - label: "Policy Version", - help: "Monotonic version of the resource token policy" + label: "Versión de la política", + help: "Versión monotónica de la política de tokens del recurso." }, metadata: { - label: "Metadata", - help: "JSON object of additional resource metadata" + label: "Metadatos", + help: "Objeto JSON con metadatos adicionales del recurso." }, created_at: { - label: "Created At" + label: "Creado el" }, updated_at: { - label: "Updated At" + label: "Actualizado el" } } }, sys_oauth_client_resource: { - label: "OAuth Client Resource", - pluralLabel: "OAuth Client Resources", - description: "Grants allowing an OAuth client to request tokens for a protected resource", + label: "Recurso de cliente OAuth", + pluralLabel: "Recursos de cliente OAuth", + description: "Concesiones que permiten a un cliente OAuth solicitar tokens para un recurso protegido.", fields: { id: { label: "ID" }, client_id: { - label: "Client ID", - help: "Foreign key to sys_oauth_application.client_id" + label: "ID de cliente", + help: "Clave foránea a sys_oauth_application.client_id." }, resource_id: { - label: "Resource ID", - help: "Foreign key to sys_oauth_resource.identifier" + label: "ID del recurso", + help: "Clave foránea a sys_oauth_resource.identifier." }, metadata: { - label: "Metadata", - help: "JSON object of additional grant metadata" + label: "Metadatos", + help: "Objeto JSON con metadatos adicionales de la concesión." }, created_at: { - label: "Created At" + label: "Creado el" } } }, sys_oauth_client_assertion: { - label: "OAuth Client Assertion", - pluralLabel: "OAuth Client Assertions", - description: "Consumed OAuth client-assertion JTIs (RFC 7523 replay prevention)", + label: "Aserción de cliente OAuth", + pluralLabel: "Aserciones de cliente OAuth", + description: "JTI de aserciones de cliente OAuth ya consumidos (prevención de reproducción de RFC 7523).", fields: { id: { label: "ID" }, expires_at: { - label: "Expires At", - help: "Assertion expiry — rows past this instant are safe to prune" + label: "Caduca el", + help: "Caducidad de la aserción: las filas posteriores a este instante se pueden depurar con seguridad." } } }, @@ -1947,174 +1947,174 @@ export const esESObjects: NonNullable = { } }, sys_scim_connection_binding: { - label: "SCIM Connection Binding", - pluralLabel: "SCIM Connection Bindings", - description: "Lifecycle state for a SCIM provisioning connection, including its decommission state machine", + label: "Vinculación de conexión SCIM", + pluralLabel: "Vinculaciones de conexión SCIM", + description: "Estado del ciclo de vida de una conexión de aprovisionamiento SCIM, incluida su máquina de estados de retirada.", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID", - help: "Immutable SCIM connection identifier that scopes every provisioned resource" + label: "ID de conexión", + help: "Identificador inmutable de la conexión SCIM que delimita cada recurso aprovisionado." }, connection_key: { - label: "Connection Key", - help: "Derived connection uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave de conexión", + help: "Clave derivada de unicidad de la conexión que mantiene @better-auth/scim; no la escribas directamente." }, provisioning_domain_id: { - label: "Provisioning Domain", - help: "Application-owned boundary that receives provisioned resources (defaults to the connection id)" + label: "Dominio de aprovisionamiento", + help: "Límite propiedad de la aplicación que recibe los recursos aprovisionados (de forma predeterminada, el ID de conexión)." }, decommission_status: { - label: "Decommission Status", - help: "Connection lifecycle state: active | reconciling | complete" + label: "Estado de retirada", + help: "Estado del ciclo de vida de la conexión: active | reconciling | complete." }, decommissioned_at: { - label: "Decommissioned At" + label: "Retirada el" }, decommission_cursor_user_id: { - label: "Decommission Cursor User", - help: "Resumable reconciliation cursor maintained by the library" + label: "Usuario del cursor de retirada", + help: "Cursor de conciliación reanudable que mantiene la biblioteca." }, decommission_reconciled_user_count: { - label: "Reconciled Users" + label: "Usuarios conciliados" }, decommission_batch_count: { - label: "Decommission Batches" + label: "Lotes de retirada" }, decommission_revision: { - label: "Decommission Revision", - help: "Optimistic-concurrency revision for the decommission state machine" + label: "Revisión de la retirada", + help: "Revisión de concurrencia optimista para la máquina de estados de retirada." }, decommission_completed_at: { - label: "Decommission Completed At" + label: "Retirada completada el" }, decommission_lease_id: { - label: "Decommission Lease", - help: "Single-worker reconciliation lease maintained by the library" + label: "Arrendamiento de la retirada", + help: "Arrendamiento de conciliación de un único worker que mantiene la biblioteca." }, decommission_lease_expires_at: { - label: "Decommission Lease Expires At" + label: "El arrendamiento de la retirada caduca el" }, created_at: { - label: "Created At" + label: "Creado el" } }, _views: { all: { - label: "All" + label: "Todas" } } }, sys_scim_connection_credential: { - label: "SCIM Connection Credential", - pluralLabel: "SCIM Connection Credentials", - description: "Bearer credentials (one-way digests) that authenticate SCIM provisioning connections", + label: "Credencial de conexión SCIM", + pluralLabel: "Credenciales de conexión SCIM", + description: "Credenciales de portador (resúmenes unidireccionales) que autentican las conexiones de aprovisionamiento SCIM.", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID", - help: "The SCIM connection this credential authenticates (e.g. \"okta-prod\"); scopes every resource the IdP provisions with it" + label: "ID de conexión", + help: "Conexión SCIM que autentica esta credencial (p. ej., «okta-prod»); delimita cada recurso que el IdP aprovisiona con ella." }, provisioning_domain_id: { - label: "Provisioning Domain", - help: "Application-owned boundary receiving provisioned resources; defaults to the connection id when absent" + label: "Dominio de aprovisionamiento", + help: "Límite propiedad de la aplicación que recibe los recursos aprovisionados; si no se indica, se usa el ID de conexión." }, organization_id: { - label: "Organization", - help: "Organization scope of this connection, when provisioning is org-scoped" + label: "Organización", + help: "Ámbito de organización de esta conexión, cuando el aprovisionamiento es por organización." }, label: { - label: "Label", - help: "Operator-facing name for this credential (e.g. \"rotation 2026-Q3\")" + label: "Etiqueta", + help: "Nombre de esta credencial para los operadores (p. ej., «rotation 2026-Q3»)." }, token_digest: { - label: "Token Digest", - help: "HMAC-SHA-256 (base64url) of the bearer, keyed by the deployment auth secret — one-way; the plaintext is shown once at mint and never stored." + label: "Resumen del token", + help: "HMAC-SHA-256 (base64url) del token de portador, con clave derivada del secreto de autenticación del despliegue; unidireccional: el texto sin cifrar se muestra una vez al emitirlo y nunca se almacena." }, active: { - label: "Active", - help: "Revocation switch — an inactive credential is refused at verification" + label: "Activa", + help: "Interruptor de revocación: una credencial inactiva se rechaza al verificarla." }, expires_at: { - label: "Expires At", - help: "Optional hard expiry for staged credential rotation; an expired credential is refused" + label: "Caduca el", + help: "Caducidad estricta opcional para la rotación escalonada de credenciales; una credencial caducada se rechaza." }, user_id: { - label: "Minted By", - help: "User who minted this credential" + label: "Emitida por", + help: "Usuario que emitió esta credencial." }, created_at: { - label: "Created At" + label: "Creado el" }, updated_at: { - label: "Updated At" + label: "Actualizado el" } }, _views: { all: { - label: "All" + label: "Todas" } } }, sys_scim_group: { - label: "SCIM Group", - pluralLabel: "SCIM Groups", - description: "IdP-pushed SCIM 2.0 groups, scoped per provisioning connection", + label: "Grupo SCIM", + pluralLabel: "Grupos SCIM", + description: "Grupos SCIM 2.0 enviados por el IdP, delimitados por conexión de aprovisionamiento.", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID" + label: "ID de conexión" }, provisioning_domain_id: { - label: "Provisioning Domain" + label: "Dominio de aprovisionamiento" }, revision: { - label: "Revision", - help: "Optimistic-concurrency revision maintained by @better-auth/scim" + label: "Revisión", + help: "Revisión de concurrencia optimista que mantiene @better-auth/scim." }, display_name: { - label: "Display Name", - help: "SCIM displayName as sent by the IdP" + label: "Nombre visible", + help: "displayName de SCIM tal como lo envía el IdP." }, display_name_key: { - label: "Display Name Key", - help: "Derived case-folded displayName uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave del nombre visible", + help: "Clave derivada de unicidad del displayName, sin distinción de mayúsculas, que mantiene @better-auth/scim; no la escribas directamente." }, external_id: { - label: "External ID", - help: "IdP-assigned externalId, when the IdP sends one" + label: "ID externo", + help: "externalId asignado por el IdP, cuando el IdP lo envía." }, external_id_key: { - label: "External ID Key", - help: "Derived externalId uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave del ID externo", + help: "Clave derivada de unicidad del externalId que mantiene @better-auth/scim; no la escribas directamente." }, order_key: { - label: "Order Key", - help: "Derived stable-pagination key maintained by @better-auth/scim; do not write directly." + label: "Clave de orden", + help: "Clave derivada para una paginación estable que mantiene @better-auth/scim; no la escribas directamente." }, created_at: { - label: "Created At" + label: "Creado el" }, updated_at: { - label: "Updated At" + label: "Actualizado el" } }, _views: { all: { - label: "All" + label: "Todos" } } }, sys_scim_group_member: { - label: "SCIM Group Member", - pluralLabel: "SCIM Group Members", - description: "SCIM group membership rows pushed by the IdP (group ↔ provisioned user)", + label: "Miembro de grupo SCIM", + pluralLabel: "Miembros de grupo SCIM", + description: "Filas de membresía de grupos SCIM enviadas por el IdP (grupo ↔ usuario aprovisionado).", fields: { id: { label: "ID" @@ -2124,72 +2124,72 @@ export const esESObjects: NonNullable = { help: "Título del registro: el usuario aprovisionado y el grupo (calculado al leer)" }, connection_id: { - label: "Connection ID" + label: "ID de conexión" }, group_id: { - label: "Group" + label: "Grupo" }, scim_user_id: { - label: "SCIM User" + label: "Usuario SCIM" }, membership_key: { - label: "Membership Key", - help: "Derived membership uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave de membresía", + help: "Clave derivada de unicidad de la membresía que mantiene @better-auth/scim; no la escribas directamente." }, created_at: { - label: "Created At" + label: "Creado el" } }, _views: { all: { - label: "All" + label: "Todos" } } }, sys_scim_identity_tombstone: { - label: "SCIM Identity Tombstone", - pluralLabel: "SCIM Identity Tombstones", - description: "Tombstones of IdP-deleted SCIM identities, kept so a re-provision is recognized", + label: "Lápida de identidad SCIM", + pluralLabel: "Lápidas de identidad SCIM", + description: "Lápidas de identidades SCIM eliminadas por el IdP, que se conservan para reconocer un nuevo aprovisionamiento.", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID" + label: "ID de conexión" }, provisioning_domain_id: { - label: "Provisioning Domain" + label: "Dominio de aprovisionamiento" }, external_id: { - label: "External ID", - help: "The IdP-assigned externalId of the deleted identity" + label: "ID externo", + help: "externalId asignado por el IdP a la identidad eliminada." }, external_id_key: { - label: "External ID Key", - help: "Derived externalId uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave del ID externo", + help: "Clave derivada de unicidad del externalId que mantiene @better-auth/scim; no la escribas directamente." }, user_id: { - label: "User", - help: "The platform user the deleted identity was linked to" + label: "Usuario", + help: "Usuario de la plataforma al que estaba vinculada la identidad eliminada." }, profile: { - label: "Final Profile", - help: "Serialized final SCIM profile at deletion time, maintained by @better-auth/scim" + label: "Perfil final", + help: "Perfil SCIM final serializado en el momento de la eliminación, mantenido por @better-auth/scim." }, deleted_at: { - label: "Deleted At" + label: "Eliminado el" } }, _views: { all: { - label: "All" + label: "Todas" } } }, sys_scim_projection_grant: { - label: "SCIM Projection Grant", - pluralLabel: "SCIM Projection Grants", - description: "Role/entitlement grants projected onto platform users by SCIM provisioning", + label: "Concesión proyectada por SCIM", + pluralLabel: "Concesiones proyectadas por SCIM", + description: "Concesiones de roles o derechos que el aprovisionamiento SCIM proyecta sobre los usuarios de la plataforma.", fields: { id: { label: "ID" @@ -2199,173 +2199,173 @@ export const esESObjects: NonNullable = { help: "Título del registro: el rol proyectado y el usuario al que se concede (calculado al leer)" }, connection_id: { - label: "Connection ID" + label: "ID de conexión" }, provisioning_domain_id: { - label: "Provisioning Domain" + label: "Dominio de aprovisionamiento" }, scim_user_id: { - label: "SCIM User", - help: "The per-connection user projection this grant belongs to" + label: "Usuario SCIM", + help: "Proyección de usuario por conexión a la que pertenece esta concesión." }, user_id: { - label: "User", - help: "The platform user the grant is projected onto" + label: "Usuario", + help: "Usuario de la plataforma sobre el que se proyecta la concesión." }, source_kind: { - label: "Source Kind", - help: "What projected the grant (e.g. group, entitlement, attribute)" + label: "Tipo de origen", + help: "Qué proyectó la concesión (p. ej., group, entitlement, attribute)." }, source_id: { - label: "Source ID", - help: "Identifier of the projecting source (e.g. the SCIM group id)" + label: "ID de origen", + help: "Identificador del origen de la proyección (p. ej., el ID del grupo SCIM)." }, source_value: { - label: "Source Value", - help: "Source attribute value, when the source kind carries one" + label: "Valor de origen", + help: "Valor del atributo de origen, cuando el tipo de origen lo incluye." }, role: { - label: "Role", - help: "The role/entitlement projected onto the user" + label: "Rol", + help: "Rol o derecho proyectado sobre el usuario." }, grant_key: { - label: "Grant Key", - help: "Derived grant uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave de la concesión", + help: "Clave derivada de unicidad de la concesión que mantiene @better-auth/scim; no la escribas directamente." }, created_at: { - label: "Created At" + label: "Creado el" }, updated_at: { - label: "Updated At" + label: "Actualizado el" } }, _views: { all: { - label: "All" + label: "Todas" } } }, sys_scim_subject: { - label: "SCIM Subject", - pluralLabel: "SCIM Subjects", - description: "Per-user SCIM provisioning link — one row per user any SCIM connection provisions", + label: "Sujeto SCIM", + pluralLabel: "Sujetos SCIM", + description: "Vínculo de aprovisionamiento SCIM por usuario: una fila por cada usuario que aprovisiona cualquier conexión SCIM.", fields: { id: { label: "ID" }, user_id: { - label: "User", - help: "The platform user this subject row tracks (unique — one row per user)" + label: "Usuario", + help: "Usuario de la plataforma del que hace seguimiento esta fila de sujeto (único: una fila por usuario)." }, profile_source_id: { - label: "Profile Source", - help: "The sys_scim_user projection currently sourcing this user's profile" + label: "Origen del perfil", + help: "Proyección de sys_scim_user que aporta actualmente el perfil de este usuario." }, revision: { - label: "Revision", - help: "Optimistic-concurrency revision maintained by @better-auth/scim" + label: "Revisión", + help: "Revisión de concurrencia optimista que mantiene @better-auth/scim." }, created_at: { - label: "Created At" + label: "Creado el" }, updated_at: { - label: "Updated At" + label: "Actualizado el" } }, _views: { all: { - label: "All" + label: "Todos" } } }, sys_scim_user: { - label: "SCIM User", - pluralLabel: "SCIM Users", - description: "Per-connection projection of an IdP-provisioned user (SCIM 2.0 /Users)", + label: "Usuario SCIM", + pluralLabel: "Usuarios SCIM", + description: "Proyección por conexión de un usuario aprovisionado por el IdP (SCIM 2.0 /Users).", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID", - help: "SCIM connection that provisioned this user" + label: "ID de conexión", + help: "Conexión SCIM que aprovisionó a este usuario." }, provisioning_domain_id: { - label: "Provisioning Domain" + label: "Dominio de aprovisionamiento" }, user_id: { - label: "User", - help: "The platform user this projection materialized as" + label: "Usuario", + help: "Usuario de la plataforma en el que se materializó esta proyección." }, connection_user_key: { - label: "Connection User Key", - help: "Derived (connection, user) uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave de conexión y usuario", + help: "Clave derivada de unicidad (conexión, usuario) que mantiene @better-auth/scim; no la escribas directamente." }, user_name: { - label: "User Name", - help: "SCIM userName as sent by the IdP" + label: "Nombre de usuario", + help: "userName de SCIM tal como lo envía el IdP." }, user_name_key: { - label: "User Name Key", - help: "Derived case-folded userName uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave del nombre de usuario", + help: "Clave derivada de unicidad del userName, sin distinción de mayúsculas, que mantiene @better-auth/scim; no la escribas directamente." }, primary_email: { - label: "Primary Email" + label: "Correo principal" }, work_email_value_index: { - label: "Work Email Index", - help: "Derived lookup index maintained by @better-auth/scim; do not write directly." + label: "Índice del correo del trabajo", + help: "Índice de búsqueda derivado que mantiene @better-auth/scim; no lo escribas directamente." }, email_value_index: { - label: "Email Index", - help: "Derived lookup index maintained by @better-auth/scim; do not write directly." + label: "Índice del correo", + help: "Índice de búsqueda derivado que mantiene @better-auth/scim; no lo escribas directamente." }, display_name: { - label: "Display Name" + label: "Nombre visible" }, formatted_name: { - label: "Formatted Name" + label: "Nombre con formato" }, given_name: { - label: "Given Name" + label: "Nombre de pila" }, family_name: { - label: "Family Name" + label: "Apellidos" }, serialized_emails: { - label: "Emails (serialized)", - help: "Canonical serialized SCIM emails list maintained by @better-auth/scim; do not write directly." + label: "Correos (serializados)", + help: "Lista canónica serializada de correos SCIM que mantiene @better-auth/scim; no la escribas directamente." }, serialized_attributes: { - label: "Attributes (serialized)", - help: "Canonical serialized SCIM attributes maintained by @better-auth/scim; do not write directly." + label: "Atributos (serializados)", + help: "Atributos SCIM canónicos serializados que mantiene @better-auth/scim; no los escribas directamente." }, external_id: { - label: "External ID", - help: "IdP-assigned externalId, when the IdP sends one" + label: "ID externo", + help: "externalId asignado por el IdP, cuando el IdP lo envía." }, external_id_key: { - label: "External ID Key", - help: "Derived externalId uniqueness key maintained by @better-auth/scim; do not write directly." + label: "Clave del ID externo", + help: "Clave derivada de unicidad del externalId que mantiene @better-auth/scim; no la escribas directamente." }, active: { - label: "Active", - help: "SCIM active flag — false means the IdP deactivated this user" + label: "Activo", + help: "Indicador active de SCIM: false significa que el IdP desactivó a este usuario." }, order_key: { - label: "Order Key", - help: "Derived stable-pagination key maintained by @better-auth/scim; do not write directly." + label: "Clave de orden", + help: "Clave derivada para una paginación estable que mantiene @better-auth/scim; no la escribas directamente." }, created_at: { - label: "Created At" + label: "Creado el" }, updated_at: { - label: "Updated At" + label: "Actualizado el" } }, _views: { all: { - label: "All" + label: "Todos" } } }, @@ -2378,29 +2378,29 @@ export const esESObjects: NonNullable = { label: "ID de notificación" }, topic: { - label: "Topic", - help: "Notification topic, e.g. task.assigned, collab.mention" + label: "Tema", + help: "Tema de la notificación, p. ej., task.assigned o collab.mention." }, payload: { - label: "Payload", - help: "Template inputs carried to channels (title/body/url/actor/source/…)" + label: "Carga útil", + help: "Entradas de plantilla que se envían a los canales (title/body/url/actor/source/…)." }, severity: { - label: "Severity", - help: "Severity hint for rendering / filtering", + label: "Severidad", + help: "Indicación de severidad para la visualización y el filtrado.", options: { - info: "info", - warning: "warning", - critical: "critical" + info: "Información", + warning: "Advertencia", + critical: "Crítica" } }, suppressed_channels: { - label: "Suppressed Channels", - help: "Channels fan-out skipped because they are unavailable for this tenant, as [{channel, reason}]; reason is the closed set: transport_not_configured" + label: "Canales suprimidos", + help: "Canales que la distribución omitió porque no están disponibles para este inquilino, como [{channel, reason}]; reason es un conjunto cerrado: transport_not_configured." }, dedup_key: { - label: "Dedup Key", - help: "Idempotency key within a topic window; a repeat emit is a no-op" + label: "Clave de deduplicación", + help: "Clave de idempotencia dentro de una ventana de tema; una emisión repetida no tiene efecto." }, source_object: { label: "Objeto de origen", @@ -2420,14 +2420,14 @@ export const esESObjects: NonNullable = { }, _views: { recent: { - label: "Recent", + label: "Recientes", emptyState: { - title: "No events", - message: "No notification events have been emitted." + title: "No hay eventos", + message: "No se ha emitido ningún evento de notificación." } }, by_topic: { - label: "By Topic" + label: "Por tema" } } }, @@ -2626,17 +2626,17 @@ export const esESObjects: NonNullable = { help: "Matriz JSON de {name,type,required,description}." }, managed_by: { - label: "Managed By", - help: "Record provenance: platform = framework built-in / package = app/package-declared (boot-seeded from declared email_template metadata) / admin = created in Studio.", + label: "Gestionado por", + help: "Procedencia del registro: platform = integrado en el framework / package = declarado por una aplicación o paquete (sembrado al arrancar a partir de los metadatos email_template declarados) / admin = creado en Studio.", options: { - platform: "platform", - package: "package", - admin: "admin" + platform: "Plataforma", + package: "Paquete", + admin: "Administrador" } }, customized: { - label: "Customized", - help: "Set when an admin edits a package-declared template; boot seeding will no longer overwrite the row (a reworded password-reset mail survives redeploys). Meaningless on admin rows." + label: "Personalizada", + help: "Se establece cuando un administrador edita una plantilla declarada por un paquete; la siembra al arrancar ya no sobrescribirá la fila (un correo de restablecimiento de contraseña reformulado se conserva tras los redespliegues). No tiene significado en las filas de administrador." }, created_at: { label: "Creado el" @@ -3100,7 +3100,7 @@ export const esESObjects: NonNullable = { }, recorded_by: { label: "Registrado por", - help: "User who made this change. NULL = system-initiated (boot sync, migration, scheduled job) — never a sentinel string." + help: "Usuario que realizó este cambio. NULL = iniciado por el sistema (sincronización al arrancar, migración, tarea programada); nunca una cadena centinela." }, recorded_at: { label: "Registrado el" @@ -3232,8 +3232,8 @@ export const esESObjects: NonNullable = { label: "Estado de bloqueo", options: { none: "Ninguno", - nooverlay: "no-overlay", - nodelete: "no-delete", + nooverlay: "Sin superposición", + nodelete: "Sin eliminación", full: "Bloqueo total" } }, @@ -3367,7 +3367,7 @@ export const esESObjects: NonNullable = { }, _views: { all: { - label: "All Secrets" + label: "Todos los secretos" } } }, @@ -3447,60 +3447,60 @@ export const esESObjects: NonNullable = { }, _views: { recent: { - label: "Recent" + label: "Recientes" } } }, sys_migration: { - label: "Data Migration", - pluralLabel: "Data Migrations", - description: "Deployment-level data-migration flags: which gated data migrations ran here and whether their self-check passed.", + label: "Migración de datos", + pluralLabel: "Migraciones de datos", + description: "Indicadores de migración de datos a nivel de despliegue: qué migraciones de datos con compuerta se ejecutaron aquí y si su autocomprobación fue correcta.", fields: { id: { - label: "Migration ID", - help: "Well-known migration id (e.g. adr-0104-file-references). One row per migration." + label: "ID de migración", + help: "ID conocido de la migración (p. ej., adr-0104-file-references). Una fila por migración." }, last_run_at: { - label: "Last Run At", - help: "When this migration last completed a gated (apply-mode) run on this deployment." + label: "Última ejecución el", + help: "Cuándo completó esta migración por última vez una ejecución con compuerta (modo de aplicación) en este despliegue." }, verified_at: { - label: "Verified At", - help: "When the self-check last PASSED. Null until it does, and cleared again by a later failing run — a regression closes the gate. Consumers require this to be set AND blocking = 0." + label: "Verificado el", + help: "Cuándo SUPERÓ por última vez la autocomprobación. Es nulo hasta que la supera y se vuelve a borrar si una ejecución posterior falla: una regresión cierra la compuerta. Los consumidores exigen que esté establecido Y que blocking = 0." }, applied_at: { - label: "Applied At", - help: "When the backfill last ran in apply mode (writes enabled)." + label: "Aplicado el", + help: "Cuándo se ejecutó por última vez el relleno en modo de aplicación (escrituras habilitadas)." }, blocking: { - label: "Blocking Discrepancies", - help: "Blocking discrepancies reported by the last self-check. The gate requires 0." + label: "Discrepancias bloqueantes", + help: "Discrepancias bloqueantes que notificó la última autocomprobación. La compuerta exige 0." }, advisory: { - label: "Advisory Findings", - help: "Advisory findings from the last run (external URLs, stale owners, …) — cost storage or need a modelling decision, never block the gate." + label: "Hallazgos informativos", + help: "Hallazgos informativos de la última ejecución (URL externas, propietarios obsoletos, …): consumen almacenamiento o requieren una decisión de modelado, pero nunca bloquean la compuerta." }, details: { - label: "Details (JSON)", - help: "JSON-encoded counts from the last run, for diagnostics." + label: "Detalles (JSON)", + help: "Recuentos codificados en JSON de la última ejecución, para diagnóstico." }, deviation_observed_at: { - label: "Deviation Observed At", - help: "When this deployment last ADMITTED a value its own verified contract rejects, through an OS_ALLOW_LAX_* escape hatch. Deliberately does NOT clear verified_at: it withdraws only the irreversible half of what the certificate authorises — byte deletion stops, validation and tombstoning continue. Cleared by the next apply-mode run." + label: "Desviación observada el", + help: "Cuándo ADMITIÓ por última vez este despliegue un valor que su propio contrato verificado rechaza, mediante una vía de escape OS_ALLOW_LAX_*. A propósito NO borra verified_at: solo retira la mitad irreversible de lo que autoriza el certificado; se detiene la eliminación de bytes y continúan la validación y la creación de lápidas. Se borra en la siguiente ejecución en modo de aplicación." }, deviation_detail: { - label: "Deviation Detail (JSON)", - help: "JSON-encoded first counterexample behind deviation_observed_at (object, field, type, parse issue), so an operator can find the value that closed the irreversible gate." + label: "Detalle de la desviación (JSON)", + help: "Primer contraejemplo codificado en JSON detrás de deviation_observed_at (objeto, campo, tipo, problema de análisis), para que un operador pueda encontrar el valor que cerró la compuerta irreversible." }, columns_moved_at: { - label: "Columns Moved At", - help: "When this deployment last completed the COLUMN MOVE for this migration — the step that retypes the migrated columns and rewrites the values they hold into the new encoding. Separate evidence from applied_at and verified_at, which attest the backfill and its self-check only: a deployment can carry both and still store the legacy encoding. Null says exactly that, and is an expected steady state rather than an error — it is what a consumer that cannot read this field must assume." + label: "Columnas movidas el", + help: "Cuándo completó este despliegue por última vez el MOVIMIENTO DE COLUMNAS de esta migración: el paso que cambia el tipo de las columnas migradas y reescribe sus valores con la nueva codificación. Es una prueba distinta de applied_at y verified_at, que solo acreditan el relleno y su autocomprobación: un despliegue puede tener ambos y seguir almacenando la codificación heredada. Un valor nulo indica exactamente eso y es un estado estable esperado, no un error: es lo que debe suponer un consumidor que no pueda leer este campo." }, created_at: { - label: "Created At" + label: "Creado el" }, updated_at: { - label: "Updated At" + label: "Actualizado el" } } } diff --git a/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts b/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts index 22c23059978..d6ade64f6d1 100644 --- a/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts +++ b/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts @@ -25,368 +25,42 @@ export const esESGeneratedSourceHashes: Readonly> = { "objects.sys_account._actions.link_social.params.provider.options.gitlab": "bc3dbbf4b650e600", "objects.sys_account._actions.link_social.params.provider.options.google": "6fadcd05bb8da367", "objects.sys_account._actions.link_social.params.provider.options.microsoft": "17309efbdb1ec122", - "objects.sys_account.fields.access_token.help": "814695a136172228", - "objects.sys_account.fields.id_token.help": "b545f62224b21f69", - "objects.sys_account.fields.previous_password_hashes.help": "3a98e8164b0daf11", - "objects.sys_account.fields.previous_password_hashes.label": "2aa498ce717c7d77", - "objects.sys_account.fields.refresh_token.help": "f337bcd15c9b4cb3", - "objects.sys_api_key.fields.active_organization_id.help": "74718b93fdaa52cc", - "objects.sys_api_key.fields.active_organization_id.label": "51bce7fbc99fbf87", "objects.sys_email.fields.cc_addresses.label": "02946d952cf15623", "objects.sys_email.fields.error.label": "786fed84bd8d5a32", "objects.sys_email.fields.message_id.label": "14cd089a4062f4b1", - "objects.sys_email_template.fields.customized.help": "fc75c32a37f906ea", - "objects.sys_email_template.fields.customized.label": "6990986111e53429", "objects.sys_email_template.fields.id.label": "00b0385c9c152888", - "objects.sys_email_template.fields.managed_by.help": "0d7397e9e0e84cfe", - "objects.sys_email_template.fields.managed_by.label": "be9070801491e6af", - "objects.sys_email_template.fields.managed_by.options.admin": "f8c9f123caf6217d", - "objects.sys_email_template.fields.managed_by.options.package": "1c8c6168730324a3", - "objects.sys_email_template.fields.managed_by.options.platform": "820d30a5082ebc6c", "objects.sys_email_template.fields.variables_json.label": "c2cfff50e8151e3d", - "objects.sys_invitation.fields.business_unit_id.help": "b4e37b1bfcc40f34", - "objects.sys_invitation.fields.business_unit_id.label": "bf0e0fdbda66ec9b", - "objects.sys_invitation.fields.positions.help": "abfa7911007e38f1", - "objects.sys_invitation.fields.positions.label": "3428d066379ee33b", - "objects.sys_invitation.fields.role.options.delegated_admin": "13f0e7f118c839e0", "objects.sys_job_run.fields.error.label": "786fed84bd8d5a32", - "objects.sys_member._views.mine.emptyState.message": "36cf7e3a3eebed0b", - "objects.sys_member._views.mine.emptyState.title": "df533ee25aba6de9", - "objects.sys_member._views.mine.label": "46b6227bcdb2d02e", - "objects.sys_member.fields.role.options.delegated_admin": "13f0e7f118c839e0", "objects.sys_metadata.fields.checksum.label": "4fe7cc0967282ec9", "objects.sys_metadata.fields.id.label": "00b0385c9c152888", "objects.sys_metadata_audit.fields.actor.label": "b155813f8a7f06e3", "objects.sys_metadata_audit.fields.id.label": "00b0385c9c152888", - "objects.sys_metadata_audit.fields.lock_state.options.nodelete": "248b810d57fe8bb9", - "objects.sys_metadata_audit.fields.lock_state.options.nooverlay": "49a44e4a03ff124c", "objects.sys_metadata_history.fields.checksum.label": "4fe7cc0967282ec9", "objects.sys_metadata_history.fields.id.label": "00b0385c9c152888", - "objects.sys_metadata_history.fields.recorded_by.help": "e293bd6cf3c47060", - "objects.sys_migration.description": "2124b4abfb243e56", - "objects.sys_migration.fields.advisory.help": "ff96ea989b140e52", - "objects.sys_migration.fields.advisory.label": "b32c5f9a93d20e02", - "objects.sys_migration.fields.applied_at.help": "7414bd643f6b30cf", - "objects.sys_migration.fields.applied_at.label": "e95c287d92cd1215", - "objects.sys_migration.fields.blocking.help": "e807388f81f23dda", - "objects.sys_migration.fields.blocking.label": "fde63021cfe650a1", - "objects.sys_migration.fields.columns_moved_at.help": "eaa31d8860c680ec", - "objects.sys_migration.fields.columns_moved_at.label": "9f0cfcef656a7ec8", - "objects.sys_migration.fields.created_at.label": "1f02d416befb595b", - "objects.sys_migration.fields.details.help": "315f8003d77cf2b9", - "objects.sys_migration.fields.details.label": "974694e5c164374e", - "objects.sys_migration.fields.deviation_detail.help": "681fe28dc0c34386", - "objects.sys_migration.fields.deviation_detail.label": "5bf0f0f59a89e2fb", - "objects.sys_migration.fields.deviation_observed_at.help": "d6720808eb570acd", - "objects.sys_migration.fields.deviation_observed_at.label": "d68ffbef206322e0", - "objects.sys_migration.fields.id.help": "5cf4db327551205b", - "objects.sys_migration.fields.id.label": "349621d298d12bd4", - "objects.sys_migration.fields.last_run_at.help": "721c7ab4ce68bab9", - "objects.sys_migration.fields.last_run_at.label": "0540810f87bb4ac0", - "objects.sys_migration.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_migration.fields.verified_at.help": "ef3ed908c6407126", - "objects.sys_migration.fields.verified_at.label": "a1115e0d1677f1af", - "objects.sys_migration.label": "97fdaf1d2e0d8c2a", - "objects.sys_migration.pluralLabel": "91d61a84b5ff632b", - "objects.sys_notification._views.by_topic.label": "a0ddbe432474ed94", - "objects.sys_notification._views.recent.emptyState.message": "4a1e91a49eaf59d6", - "objects.sys_notification._views.recent.emptyState.title": "6f708a09bb4c9a5c", - "objects.sys_notification._views.recent.label": "62d27bb9d0349c99", "objects.sys_notification.fields.actor_id.label": "b155813f8a7f06e3", - "objects.sys_notification.fields.dedup_key.help": "58a5e28b6a87e6d6", - "objects.sys_notification.fields.dedup_key.label": "33a740837f882c98", - "objects.sys_notification.fields.payload.help": "e1e8514cd730b06f", - "objects.sys_notification.fields.payload.label": "4488e1328e37dcb2", - "objects.sys_notification.fields.severity.help": "4925b29cf7e10346", - "objects.sys_notification.fields.severity.label": "d59e4345bdc57b59", - "objects.sys_notification.fields.severity.options.critical": "7ff0ff69c0abaf81", - "objects.sys_notification.fields.severity.options.info": "3e0c8611029f253b", - "objects.sys_notification.fields.severity.options.warning": "2673ee95caf83284", - "objects.sys_notification.fields.suppressed_channels.help": "1fbbc17b95ea75d2", - "objects.sys_notification.fields.suppressed_channels.label": "910cb46f687f6270", - "objects.sys_notification.fields.topic.help": "80e1790edfda49df", - "objects.sys_notification.fields.topic.label": "819afdb3853e9d80", - "objects.sys_oauth_access_token.fields.authorization_code_id.help": "84ad4d5d8c4c1cee", - "objects.sys_oauth_access_token.fields.authorization_code_id.label": "1c1d06cc01295862", - "objects.sys_oauth_access_token.fields.confirmation.help": "9d086fdc90baa01d", - "objects.sys_oauth_access_token.fields.confirmation.label": "64755493e6425b37", "objects.sys_oauth_access_token.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_access_token.fields.requested_user_info_claims.help": "dc0cd8121cbde60f", - "objects.sys_oauth_access_token.fields.requested_user_info_claims.label": "5a6338a357257661", - "objects.sys_oauth_access_token.fields.resources.help": "8c153517b30bd6a5", - "objects.sys_oauth_access_token.fields.resources.label": "f5753a2fa351119e", - "objects.sys_oauth_access_token.fields.revoked.help": "ff6a4b6dac031959", - "objects.sys_oauth_access_token.fields.revoked.label": "054f918e632528c7", "objects.sys_oauth_access_token.fields.token.label": "6e8de3393d2cee54", "objects.sys_oauth_application._actions.create_oauth_application.params.type.options.web": "2a7ead3da8c035c5", - "objects.sys_oauth_application._views.mine.label": "d1cb1174cd96176c", - "objects.sys_oauth_application.fields.backchannel_logout_session_required.help": "2d12d1e1f9461576", - "objects.sys_oauth_application.fields.backchannel_logout_session_required.label": "fbc6eee84fb8a1d7", - "objects.sys_oauth_application.fields.backchannel_logout_uri.help": "e7c8abeac494b145", - "objects.sys_oauth_application.fields.backchannel_logout_uri.label": "f78777a91cebd19f", - "objects.sys_oauth_application.fields.client_credentials_scopes.help": "bf69fe7f91bb78e7", - "objects.sys_oauth_application.fields.client_credentials_scopes.label": "e257098b80b760d2", - "objects.sys_oauth_application.fields.client_discovery_id.help": "6d7fff4d4e7fb705", - "objects.sys_oauth_application.fields.client_discovery_id.label": "2070f4b2f6456352", - "objects.sys_oauth_application.fields.dpop_bound_access_tokens.help": "e7257c5c6ea7043b", - "objects.sys_oauth_application.fields.dpop_bound_access_tokens.label": "3772715f1d9588af", "objects.sys_oauth_application.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_application.fields.jwks.help": "6a6c5fe835f213b8", "objects.sys_oauth_application.fields.jwks.label": "b2cf79f9d66c0dbc", - "objects.sys_oauth_application.fields.jwks_uri.help": "217cff7cca47a35e", "objects.sys_oauth_application.fields.jwks_uri.label": "2a4339df734ab269", - "objects.sys_oauth_client_assertion.description": "82a3f5fec7571bd4", - "objects.sys_oauth_client_assertion.fields.expires_at.help": "90b732ea4d289003", - "objects.sys_oauth_client_assertion.fields.expires_at.label": "df0ef5fae02b2044", "objects.sys_oauth_client_assertion.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_client_assertion.label": "964d685e79999dce", - "objects.sys_oauth_client_assertion.pluralLabel": "286f417fcbf2ab81", - "objects.sys_oauth_client_resource.description": "c63dda9f9c51165b", - "objects.sys_oauth_client_resource.fields.client_id.help": "8df79a6c07fc32b4", - "objects.sys_oauth_client_resource.fields.client_id.label": "09cb452151e7b1b6", - "objects.sys_oauth_client_resource.fields.created_at.label": "1f02d416befb595b", "objects.sys_oauth_client_resource.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_client_resource.fields.metadata.help": "c51d0437d1b00c8b", - "objects.sys_oauth_client_resource.fields.metadata.label": "9cabc04013c80ef3", - "objects.sys_oauth_client_resource.fields.resource_id.help": "5c7d52276882432d", - "objects.sys_oauth_client_resource.fields.resource_id.label": "21668ca570b12d71", - "objects.sys_oauth_client_resource.label": "882f5ca283a58ed1", - "objects.sys_oauth_client_resource.pluralLabel": "ab6a91aa51de6ac0", "objects.sys_oauth_consent.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_consent.fields.requested_user_info_claims.help": "6f1fc3c5e6b4031d", - "objects.sys_oauth_consent.fields.requested_user_info_claims.label": "5a6338a357257661", - "objects.sys_oauth_consent.fields.resources.help": "f1e24c7b80ba287a", - "objects.sys_oauth_consent.fields.resources.label": "f5753a2fa351119e", - "objects.sys_oauth_refresh_token.fields.authorization_code_id.help": "b16f370e0a06cf43", - "objects.sys_oauth_refresh_token.fields.authorization_code_id.label": "1c1d06cc01295862", - "objects.sys_oauth_refresh_token.fields.confirmation.help": "9d086fdc90baa01d", - "objects.sys_oauth_refresh_token.fields.confirmation.label": "64755493e6425b37", "objects.sys_oauth_refresh_token.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_refresh_token.fields.requested_user_info_claims.help": "dc0cd8121cbde60f", - "objects.sys_oauth_refresh_token.fields.requested_user_info_claims.label": "5a6338a357257661", - "objects.sys_oauth_refresh_token.fields.resources.help": "8c153517b30bd6a5", - "objects.sys_oauth_refresh_token.fields.resources.label": "f5753a2fa351119e", - "objects.sys_oauth_refresh_token.fields.rotated_at.help": "704d34a1f46f4412", - "objects.sys_oauth_refresh_token.fields.rotated_at.label": "aa747daa25d440d1", - "objects.sys_oauth_refresh_token.fields.rotation_replay_expires_at.help": "7f5925e4b2d73586", - "objects.sys_oauth_refresh_token.fields.rotation_replay_expires_at.label": "f6a0bbe6ef73bded", - "objects.sys_oauth_refresh_token.fields.rotation_replay_response.help": "ea6d3f140afbbca7", - "objects.sys_oauth_refresh_token.fields.rotation_replay_response.label": "ddf6cf0ccba55c30", "objects.sys_oauth_refresh_token.fields.token.label": "6e8de3393d2cee54", - "objects.sys_oauth_resource.description": "3c7f0cfae5b1a887", - "objects.sys_oauth_resource.fields.access_token_ttl.help": "293dc402a9669032", - "objects.sys_oauth_resource.fields.access_token_ttl.label": "afebf5750ed4d9ee", - "objects.sys_oauth_resource.fields.allowed_scopes.help": "af9195bf5efc4b27", - "objects.sys_oauth_resource.fields.allowed_scopes.label": "1a3202eecb314841", - "objects.sys_oauth_resource.fields.created_at.label": "1f02d416befb595b", - "objects.sys_oauth_resource.fields.custom_claims.help": "0afe2b2a099c7813", - "objects.sys_oauth_resource.fields.custom_claims.label": "c6182d11456325c4", - "objects.sys_oauth_resource.fields.disabled.label": "639459b8a7bbec04", - "objects.sys_oauth_resource.fields.dpop_bound_access_tokens_required.help": "d82b668d32d9d48f", - "objects.sys_oauth_resource.fields.dpop_bound_access_tokens_required.label": "715d383f9fc4fcfb", "objects.sys_oauth_resource.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_resource.fields.identifier.help": "b69d2662e0438576", - "objects.sys_oauth_resource.fields.identifier.label": "85b28b4a09f37cd0", - "objects.sys_oauth_resource.fields.metadata.help": "896f351a40678f21", - "objects.sys_oauth_resource.fields.metadata.label": "9cabc04013c80ef3", - "objects.sys_oauth_resource.fields.name.label": "5274417ff1ccaf01", - "objects.sys_oauth_resource.fields.policy_version.help": "18b93d988a1d6107", - "objects.sys_oauth_resource.fields.policy_version.label": "55fdeadcaba6cd2a", - "objects.sys_oauth_resource.fields.refresh_token_ttl.help": "9bbb700667d7cee7", - "objects.sys_oauth_resource.fields.refresh_token_ttl.label": "e4b35b5501ac588f", - "objects.sys_oauth_resource.fields.signing_algorithm.help": "3f8231cc5435a673", - "objects.sys_oauth_resource.fields.signing_algorithm.label": "c26616cf69746887", - "objects.sys_oauth_resource.fields.signing_key_id.help": "8504e8cddac3b67c", - "objects.sys_oauth_resource.fields.signing_key_id.label": "50da11ac4977fa58", - "objects.sys_oauth_resource.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_oauth_resource.label": "5077fa14e8d7418e", - "objects.sys_oauth_resource.pluralLabel": "1c6ad6e11287866f", - "objects.sys_organization.fields.parent_organization_id.help": "2ad4ebe3782901b9", - "objects.sys_organization.fields.parent_organization_id.label": "24129608643b897f", "objects.sys_organization.fields.slug.label": "fe4132df05ec637b", - "objects.sys_organization.fields.sort_order.help": "7355b98a96f85dfc", - "objects.sys_organization.fields.sort_order.label": "5f6b33fdc89e9d9f", - "objects.sys_scim_connection_binding._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_connection_binding.description": "b895133352f6681c", - "objects.sys_scim_connection_binding.fields.connection_id.help": "034eb7d93a212da1", - "objects.sys_scim_connection_binding.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_connection_binding.fields.connection_key.help": "7df9975f32bdf0bc", - "objects.sys_scim_connection_binding.fields.connection_key.label": "d6f7536848750bc1", - "objects.sys_scim_connection_binding.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_connection_binding.fields.decommission_batch_count.label": "69d0d27bdfad1158", - "objects.sys_scim_connection_binding.fields.decommission_completed_at.label": "4b4367514668f16b", - "objects.sys_scim_connection_binding.fields.decommission_cursor_user_id.help": "1d826764513040e4", - "objects.sys_scim_connection_binding.fields.decommission_cursor_user_id.label": "05a4591457a4e80f", - "objects.sys_scim_connection_binding.fields.decommission_lease_expires_at.label": "8593f0a433758002", - "objects.sys_scim_connection_binding.fields.decommission_lease_id.help": "4baba8767b4bd19d", - "objects.sys_scim_connection_binding.fields.decommission_lease_id.label": "3f5bbd3bde910338", - "objects.sys_scim_connection_binding.fields.decommission_reconciled_user_count.label": "bc1a74ac6ea6dc87", - "objects.sys_scim_connection_binding.fields.decommission_revision.help": "08fc0bb780421ed4", - "objects.sys_scim_connection_binding.fields.decommission_revision.label": "a017c828e4cc0b22", - "objects.sys_scim_connection_binding.fields.decommission_status.help": "f766f15ae7b4e26e", - "objects.sys_scim_connection_binding.fields.decommission_status.label": "7d49c647b4e1e843", - "objects.sys_scim_connection_binding.fields.decommissioned_at.label": "912fef87cf041169", "objects.sys_scim_connection_binding.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_connection_binding.fields.provisioning_domain_id.help": "16baa93cc3b3ca9e", - "objects.sys_scim_connection_binding.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_connection_binding.label": "a86dce83ff9ae560", - "objects.sys_scim_connection_binding.pluralLabel": "074d8c7e8bd7e51b", - "objects.sys_scim_connection_credential._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_connection_credential.description": "e298fae44c1fb26b", - "objects.sys_scim_connection_credential.fields.active.help": "f1bb8af835e80434", - "objects.sys_scim_connection_credential.fields.active.label": "eee107cf4e466779", - "objects.sys_scim_connection_credential.fields.connection_id.help": "e12a9e64684333ba", - "objects.sys_scim_connection_credential.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_connection_credential.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_connection_credential.fields.expires_at.help": "219771cb7e23e7f0", - "objects.sys_scim_connection_credential.fields.expires_at.label": "df0ef5fae02b2044", "objects.sys_scim_connection_credential.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_connection_credential.fields.label.help": "4c9becbaf107e198", - "objects.sys_scim_connection_credential.fields.label.label": "c680364257b11569", - "objects.sys_scim_connection_credential.fields.organization_id.help": "6b3f4cd8ef844bc5", - "objects.sys_scim_connection_credential.fields.organization_id.label": "3e55836156e1c1de", - "objects.sys_scim_connection_credential.fields.provisioning_domain_id.help": "dbcc622262a32b57", - "objects.sys_scim_connection_credential.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_connection_credential.fields.token_digest.help": "657e4fa81f3972f5", - "objects.sys_scim_connection_credential.fields.token_digest.label": "4373e0d7f2686878", - "objects.sys_scim_connection_credential.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_connection_credential.fields.user_id.help": "d960168361e9bf6a", - "objects.sys_scim_connection_credential.fields.user_id.label": "31bf172b446396d0", - "objects.sys_scim_connection_credential.label": "115ec12ad3c5cd52", - "objects.sys_scim_connection_credential.pluralLabel": "dc5e36622fb23f62", - "objects.sys_scim_group._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_group.description": "2cefe59ab8f2d6a2", - "objects.sys_scim_group.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_group.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_group.fields.display_name.help": "9dfb190daeafc7ca", - "objects.sys_scim_group.fields.display_name.label": "5512fceb5183fd1f", - "objects.sys_scim_group.fields.display_name_key.help": "44628861d6565776", - "objects.sys_scim_group.fields.display_name_key.label": "ce0b9207c2a0b3e2", - "objects.sys_scim_group.fields.external_id.help": "6f779f6f163b3028", - "objects.sys_scim_group.fields.external_id.label": "b81498d9908b2ed1", - "objects.sys_scim_group.fields.external_id_key.help": "d91a6810e74d9d74", - "objects.sys_scim_group.fields.external_id_key.label": "70076aa519914607", "objects.sys_scim_group.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_group.fields.order_key.help": "d19cba034fc15454", - "objects.sys_scim_group.fields.order_key.label": "929e5f874fa283d5", - "objects.sys_scim_group.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_group.fields.revision.help": "9a4a009aaad3d9f7", - "objects.sys_scim_group.fields.revision.label": "9736a257b7ba380b", - "objects.sys_scim_group.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_group.label": "b1e8cffa120eaaf3", - "objects.sys_scim_group.pluralLabel": "041e7e49c26e6e23", - "objects.sys_scim_group_member._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_group_member.description": "5da1f5a9f6c74dce", - "objects.sys_scim_group_member.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_group_member.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_group_member.fields.group_id.label": "588222bcabb4c16e", "objects.sys_scim_group_member.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_group_member.fields.membership_key.help": "127024a3ec9d4924", - "objects.sys_scim_group_member.fields.membership_key.label": "8fcb9f17bcc8cae9", - "objects.sys_scim_group_member.fields.scim_user_id.label": "ff9e9e3696e17ae8", - "objects.sys_scim_group_member.label": "a15085ccdbba4e72", - "objects.sys_scim_group_member.pluralLabel": "3f643c5a50a46d0d", - "objects.sys_scim_identity_tombstone._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_identity_tombstone.description": "e0c9699fda63d907", - "objects.sys_scim_identity_tombstone.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_identity_tombstone.fields.deleted_at.label": "ecae63a743df29cd", - "objects.sys_scim_identity_tombstone.fields.external_id.help": "62b69d5bd951252c", - "objects.sys_scim_identity_tombstone.fields.external_id.label": "b81498d9908b2ed1", - "objects.sys_scim_identity_tombstone.fields.external_id_key.help": "d91a6810e74d9d74", - "objects.sys_scim_identity_tombstone.fields.external_id_key.label": "70076aa519914607", "objects.sys_scim_identity_tombstone.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_identity_tombstone.fields.profile.help": "d11763773ca4c440", - "objects.sys_scim_identity_tombstone.fields.profile.label": "b174cad0a9c78e11", - "objects.sys_scim_identity_tombstone.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_identity_tombstone.fields.user_id.help": "b4c468629790014b", - "objects.sys_scim_identity_tombstone.fields.user_id.label": "6c0d22a931e235bd", - "objects.sys_scim_identity_tombstone.label": "1c70519325beeb22", - "objects.sys_scim_identity_tombstone.pluralLabel": "525ddcdf78b4ed15", - "objects.sys_scim_projection_grant._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_projection_grant.description": "8603e83095133dee", - "objects.sys_scim_projection_grant.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_projection_grant.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_projection_grant.fields.grant_key.help": "d55c81e0237a4286", - "objects.sys_scim_projection_grant.fields.grant_key.label": "c5fbfa14170b0a49", "objects.sys_scim_projection_grant.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_projection_grant.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_projection_grant.fields.role.help": "5c3718daca38e97e", - "objects.sys_scim_projection_grant.fields.role.label": "6e45203a573cd5ab", - "objects.sys_scim_projection_grant.fields.scim_user_id.help": "da657b19880f3536", - "objects.sys_scim_projection_grant.fields.scim_user_id.label": "ff9e9e3696e17ae8", - "objects.sys_scim_projection_grant.fields.source_id.help": "ba8fcdf2adba6295", - "objects.sys_scim_projection_grant.fields.source_id.label": "9764aa679981804c", - "objects.sys_scim_projection_grant.fields.source_kind.help": "fbf04bdf23967c33", - "objects.sys_scim_projection_grant.fields.source_kind.label": "44c76b7b2471dd7c", - "objects.sys_scim_projection_grant.fields.source_value.help": "eb7d8b2966e31fb1", - "objects.sys_scim_projection_grant.fields.source_value.label": "5699bf94c3a3d655", - "objects.sys_scim_projection_grant.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_projection_grant.fields.user_id.help": "e1e49423749a2d12", - "objects.sys_scim_projection_grant.fields.user_id.label": "6c0d22a931e235bd", - "objects.sys_scim_projection_grant.label": "fbf273320dc0e8cb", - "objects.sys_scim_projection_grant.pluralLabel": "b8bb5769deedfbe3", - "objects.sys_scim_subject._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_subject.description": "8fc839e493ef3e75", - "objects.sys_scim_subject.fields.created_at.label": "1f02d416befb595b", "objects.sys_scim_subject.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_subject.fields.profile_source_id.help": "c109ad373576afe5", - "objects.sys_scim_subject.fields.profile_source_id.label": "6a263b010b51ecd1", - "objects.sys_scim_subject.fields.revision.help": "9a4a009aaad3d9f7", - "objects.sys_scim_subject.fields.revision.label": "9736a257b7ba380b", - "objects.sys_scim_subject.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_subject.fields.user_id.help": "6798a366e9db4bb8", - "objects.sys_scim_subject.fields.user_id.label": "6c0d22a931e235bd", - "objects.sys_scim_subject.label": "350900f1977ecb7f", - "objects.sys_scim_subject.pluralLabel": "6ae4d4963680cee7", - "objects.sys_scim_user._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_user.description": "efe9c1a95d6eeb8e", - "objects.sys_scim_user.fields.active.help": "d82a2ec5aebe530f", - "objects.sys_scim_user.fields.active.label": "eee107cf4e466779", - "objects.sys_scim_user.fields.connection_id.help": "e18a3d5a0d3d1ac8", - "objects.sys_scim_user.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_user.fields.connection_user_key.help": "efb51acc3fea954a", - "objects.sys_scim_user.fields.connection_user_key.label": "58622a8cc908c01e", - "objects.sys_scim_user.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_user.fields.display_name.label": "5512fceb5183fd1f", - "objects.sys_scim_user.fields.email_value_index.help": "4f3c5b1f20c870be", - "objects.sys_scim_user.fields.email_value_index.label": "b31d7d6d561bcde3", - "objects.sys_scim_user.fields.external_id.help": "6f779f6f163b3028", - "objects.sys_scim_user.fields.external_id.label": "b81498d9908b2ed1", - "objects.sys_scim_user.fields.external_id_key.help": "d91a6810e74d9d74", - "objects.sys_scim_user.fields.external_id_key.label": "70076aa519914607", - "objects.sys_scim_user.fields.family_name.label": "9190adafe369fb71", - "objects.sys_scim_user.fields.formatted_name.label": "90c57aa3a7dfffd6", - "objects.sys_scim_user.fields.given_name.label": "055d37cebecaf97e", "objects.sys_scim_user.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_user.fields.order_key.help": "d19cba034fc15454", - "objects.sys_scim_user.fields.order_key.label": "929e5f874fa283d5", - "objects.sys_scim_user.fields.primary_email.label": "15da02d3854d82c1", - "objects.sys_scim_user.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_user.fields.serialized_attributes.help": "e865a06565b3e303", - "objects.sys_scim_user.fields.serialized_attributes.label": "93c3785f905ff51e", - "objects.sys_scim_user.fields.serialized_emails.help": "5eea0721c9a26b9c", - "objects.sys_scim_user.fields.serialized_emails.label": "100eb0a58d7c9d5a", - "objects.sys_scim_user.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_user.fields.user_id.help": "8d35db5208c6bdf4", - "objects.sys_scim_user.fields.user_id.label": "6c0d22a931e235bd", - "objects.sys_scim_user.fields.user_name.help": "a72cc81d09cd66b6", - "objects.sys_scim_user.fields.user_name.label": "bf59c7fd3e98bc55", - "objects.sys_scim_user.fields.user_name_key.help": "72b94b4a5964572b", - "objects.sys_scim_user.fields.user_name_key.label": "632218ca52daf77b", - "objects.sys_scim_user.fields.work_email_value_index.help": "4f3c5b1f20c870be", - "objects.sys_scim_user.fields.work_email_value_index.label": "8d37193924db29c7", - "objects.sys_scim_user.label": "ff9e9e3696e17ae8", - "objects.sys_scim_user.pluralLabel": "b8538685c24f5084", - "objects.sys_secret._views.all.label": "20d032bd60c81773", "objects.sys_secret.fields.id.label": "00b0385c9c152888", - "objects.sys_session.fields.last_activity_at.help": "f7851e9373505e73", - "objects.sys_session.fields.last_activity_at.label": "43bd2f1b231bc12b", - "objects.sys_session.fields.revoke_reason.help": "fcd18baf6b341b7f", - "objects.sys_session.fields.revoke_reason.label": "13b0146153a2ecf8", - "objects.sys_session.fields.revoked_at.help": "77a508fdceda2f6d", - "objects.sys_session.fields.revoked_at.label": "054f918e632528c7", "objects.sys_setting.fields.scope.options.global": "5e377106508d2ecd", - "objects.sys_setting_audit._views.recent.label": "62d27bb9d0349c99", "objects.sys_setting_audit.fields.actor_id.label": "b155813f8a7f06e3", "objects.sys_setting_audit.fields.id.label": "00b0385c9c152888", "objects.sys_setting_audit.fields.scope.options.global": "5e377106508d2ecd", @@ -397,17 +71,5 @@ export const esESGeneratedSourceHashes: Readonly> = { "objects.sys_sso_provider._actions.register_sso_provider.params.mapName.placeholder": "a484c34aaf624bd6", "objects.sys_sso_provider._actions.register_sso_provider.params.scopes.placeholder": "58ac90cde28c764d", "objects.sys_sso_provider.fields.id.label": "00b0385c9c152888", - "objects.sys_team.fields.member_count.help": "498d7d7119ffff12", - "objects.sys_team.fields.member_count.label": "7bb48f7c92af14e0", - "objects.sys_team_member.fields.membership_key.help": "08a5017306c3ac4e", - "objects.sys_team_member.fields.membership_key.label": "8fcb9f17bcc8cae9", - "objects.sys_two_factor.fields.failed_verification_count.help": "8cea41d6de7f4d5a", - "objects.sys_two_factor.fields.failed_verification_count.label": "e0438d2e39cb0500", - "objects.sys_two_factor.fields.locked_until.help": "059956062c752f2c", - "objects.sys_two_factor.fields.locked_until.label": "c7f013ad9b7208d2", - "objects.sys_two_factor.fields.verified.help": "0d351ba4c31608c2", - "objects.sys_two_factor.fields.verified.label": "866e3a245ef04734", - "objects.sys_user.fields.manager_id.help": "a53dec9ccd9d131f", - "objects.sys_user.fields.primary_business_unit_id.help": "e01690f4a9b83956", "objects.sys_view_definition.fields.id.label": "00b0385c9c152888", }; diff --git a/packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts b/packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts index 12c0136f779..816580b84c5 100644 --- a/packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts +++ b/packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts @@ -97,11 +97,11 @@ export const jaJPObjects: NonNullable = { }, manager_id: { label: "マネージャー", - help: "This user's direct manager. Forms the reporting chain the `own_and_reports` hierarchy scope walks (ADR-0057 / @objectstack/security-enterprise)." + help: "このユーザーの直属のマネージャー。`own_and_reports` 階層スコープがたどるレポートラインを形成します(ADR-0057 / @objectstack/security-enterprise)。" }, primary_business_unit_id: { label: "主所属ビジネスユニット", - help: "The user's primary business unit — a denormalised projection of sys_business_unit_member.is_primary, maintained by plugin-sharing (ADR-0057 addendum D12). Lets a user-lookup filter candidates by business unit without traversing the membership junction. Do not edit directly; set it via business-unit membership." + help: "ユーザーの主所属ビジネスユニット — sys_business_unit_member.is_primary を非正規化した投影で、plugin-sharing が管理します(ADR-0057 補遺 D12)。ユーザー参照の候補を、メンバーシップの中間テーブルをたどらずにビジネスユニットで絞り込めるようにします。直接編集せず、ビジネスユニットのメンバーシップで設定してください。" }, source: { label: "ID ソース", @@ -334,16 +334,16 @@ export const jaJPObjects: NonNullable = { label: "有効期限" }, last_activity_at: { - label: "Last Activity At", - help: "Timestamp of the last request on this session; drives idle-timeout. System-managed." + label: "最終アクティビティ日時", + help: "このセッションで最後にリクエストがあった日時。アイドルタイムアウトの判定に使われます。システム管理。" }, revoked_at: { - label: "Revoked At", - help: "When set, this session was revoked (idle / absolute-max / concurrent-cap / admin / organization membership ended). System-managed." + label: "失効日時", + help: "設定されている場合、このセッションは失効しています(アイドル / 絶対上限 / 同時セッション上限 / 管理者 / 組織メンバーシップの終了)。システム管理。" }, revoke_reason: { - label: "Revoke Reason", - help: "Why the session was revoked (idle_timeout, absolute_max, concurrent_cap, user_revoked, admin, organization_membership_ended, …)." + label: "失効理由", + help: "セッションが失効した理由(idle_timeout、absolute_max、concurrent_cap、user_revoked、admin、organization_membership_ended など)。" }, active_organization_id: { label: "アクティブ組織" @@ -431,15 +431,15 @@ export const jaJPObjects: NonNullable = { }, access_token: { label: "アクセストークン", - help: "Live OAuth access token issued by the provider — never returned on the data API (#7987); better-auth reads it back through the engine's privileged internal-field accessor" + help: "プロバイダーが発行した有効な OAuth アクセストークン — データ API では決して返されません(#7987)。better-auth はエンジンの特権的な内部フィールドアクセサーを通じてこれを読み戻します" }, refresh_token: { label: "リフレッシュトークン", - help: "Live OAuth refresh token — long-lived and not revoked by revoking an ObjectStack session; never returned on the data API (#7987)" + help: "有効な OAuth リフレッシュトークン — 長期間有効で、ObjectStack セッションを失効しても失効しません。データ API では決して返されません(#7987)" }, id_token: { label: "ID トークン", - help: "OIDC ID token issued by the provider — never returned on the data API (#7987)" + help: "プロバイダーが発行した OIDC ID トークン — データ API では決して返されません(#7987)" }, access_token_expires_at: { label: "アクセストークン有効期限" @@ -455,8 +455,8 @@ export const jaJPObjects: NonNullable = { help: "メール/パスワードプロバイダー用のハッシュ化パスワード" }, previous_password_hashes: { - label: "Previous Password Hashes", - help: "JSON array of prior password hashes (bounded by password_history_count); reuse-prevention only. System-managed." + label: "過去のパスワードハッシュ", + help: "過去のパスワードハッシュの JSON 配列(password_history_count が上限)。再利用防止専用。システム管理。" } }, _views: { @@ -554,12 +554,12 @@ export const jaJPObjects: NonNullable = { help: "この組織で日付の境界を計算する IANA タイムゾーン(例: UTC、Asia/Shanghai)。独自のタイムゾーンを持たないすべてのビジネスユニットが継承するルートの既定値です。未設定の場合は UTC です。" }, parent_organization_id: { - label: "Parent Organization", - help: "Reporting/grouping parent. Grants NOTHING — visibility across organizations comes from membership, never from this reference (ADR-0105 D6)." + label: "親組織", + help: "レポート/グループ化のための親。何の権限も付与しません — 組織をまたぐ可視性はメンバーシップから生じ、この参照からは決して生じません(ADR-0105 D6)。" }, sort_order: { - label: "Sort Order", - help: "Display order among sibling organizations. Presentation only." + label: "並び順", + help: "兄弟組織の間での表示順。表示専用です。" }, id: { label: "組織 ID" @@ -633,17 +633,17 @@ export const jaJPObjects: NonNullable = { options: { owner: "所有者", admin: "管理者", - delegated_admin: "Delegated Admin", + delegated_admin: "委任管理者", member: "メンバー" } } }, _views: { mine: { - label: "My Memberships", + label: "所属組織", emptyState: { - title: "No organizations yet", - message: "You haven't joined any organizations." + title: "まだ組織がありません", + message: "まだどの組織にも参加していません。" } } }, @@ -700,7 +700,7 @@ export const jaJPObjects: NonNullable = { options: { owner: "所有者", admin: "管理者", - delegated_admin: "Delegated Admin", + delegated_admin: "委任管理者", member: "メンバー" } }, @@ -726,12 +726,12 @@ export const jaJPObjects: NonNullable = { help: "承認時に割り当てるオプションのチーム" }, business_unit_id: { - label: "Placement Business Unit", - help: "Business unit the invitee is placed under on acceptance (ADR-0105 D8). Must lie inside the issuer's delegated subtree." + label: "配属先ビジネスユニット", + help: "承認時に招待されたユーザーが配属されるビジネスユニット(ADR-0105 D8)。発行者の委任されたサブツリー内にある必要があります。" }, positions: { - label: "Placement Positions", - help: "sys_position names assigned on acceptance (ADR-0105 D8). Every position's permission sets must be allowlisted by the issuer's adminScope." + label: "配属先ポジション", + help: "承認時に割り当てられる sys_position 名(ADR-0105 D8)。各ポジションの権限セットは、発行者の adminScope で許可されている必要があります。" } }, _views: { @@ -786,8 +786,8 @@ export const jaJPObjects: NonNullable = { help: "このチームの親組織" }, member_count: { - label: "Member Count", - help: "Seat counter maintained by better-auth; do not write directly." + label: "メンバー数", + help: "better-auth が管理する人数カウンター。直接書き込まないでください。" }, id: { label: "チーム ID" @@ -845,8 +845,8 @@ export const jaJPObjects: NonNullable = { label: "ユーザー" }, membership_key: { - label: "Membership Key", - help: "Derived membership digest maintained by better-auth; do not write directly." + label: "メンバーシップキー", + help: "better-auth が管理する派生メンバーシップダイジェスト。直接書き込まないでください。" } }, _actions: { @@ -1007,8 +1007,8 @@ export const jaJPObjects: NonNullable = { help: "この API キーを所有するユーザー" }, active_organization_id: { - label: "Active Organization", - help: "Organization this key authenticates into — inherited from the minter at creation and established as the request’s active organization" + label: "アクティブ組織", + help: "このキーが認証する組織 — 作成時に発行者から継承され、リクエストのアクティブ組織として確立されます" }, scopes: { label: "スコープ", @@ -1095,16 +1095,16 @@ export const jaJPObjects: NonNullable = { help: "JSON シリアライズされたバックアップ回復コード" }, verified: { - label: "Verified", - help: "Whether the enrollment was confirmed with a valid TOTP code (managed by better-auth)" + label: "確認済み", + help: "登録が有効な TOTP コードで確認されたかどうか(better-auth が管理)" }, failed_verification_count: { - label: "Failed Verification Count", - help: "Consecutive failed 2FA verifications; reset on success. Maintained by better-auth." + label: "検証失敗回数", + help: "連続した 2FA 検証の失敗回数。成功するとリセットされます。better-auth が管理します。" }, locked_until: { - label: "Locked Until", - help: "Set when failed 2FA verifications cross the lockout threshold. Maintained by better-auth." + label: "ロック解除日時", + help: "2FA 検証の失敗がロックアウトのしきい値を超えたときに設定されます。better-auth が管理します。" } }, _views: { @@ -1291,8 +1291,8 @@ export const jaJPObjects: NonNullable = { help: "公開 OAuth クライアント識別子" }, client_discovery_id: { - label: "Client Discovery ID", - help: "Opaque identifier the provider uses to look this client up on the discovery path, kept apart from the public `client_id`" + label: "クライアントディスカバリ ID", + help: "プロバイダーがディスカバリパスでこのクライアントを検索するために使う不透明な識別子。公開の `client_id` とは区別されます" }, client_secret: { label: "クライアントシークレット", @@ -1339,8 +1339,8 @@ export const jaJPObjects: NonNullable = { help: "クライアントがリクエスト可能なスコープの JSON シリアライズリスト" }, client_credentials_scopes: { - label: "Client-Credentials Scopes", - help: "JSON-serialized list of scopes the client may request on the client_credentials grant, where there is no user to consent — kept apart from `scopes`, which governs user-delegated grants" + label: "クライアントクレデンシャルスコープ", + help: "同意するユーザーが存在しない client_credentials グラントでクライアントがリクエストできるスコープの JSON シリアライズリスト — ユーザー委任グラントを管理する `scopes` とは区別されます" }, subject_type: { label: "サブジェクトタイプ", @@ -1348,15 +1348,15 @@ export const jaJPObjects: NonNullable = { }, jwks: { label: "JWKS", - help: "Client JSON Web Key Set (for private_key_jwt / signed-request verification)" + help: "クライアントの JSON Web Key Set(private_key_jwt/署名付きリクエストの検証用)" }, jwks_uri: { label: "JWKS URI", - help: "URL of the client JSON Web Key Set" + help: "クライアントの JSON Web Key Set の URL" }, dpop_bound_access_tokens: { - label: "DPoP-bound Access Tokens", - help: "Require access tokens issued to this client to be DPoP-bound (RFC 9449)" + label: "DPoP バインドアクセストークン", + help: "このクライアントに発行されるアクセストークンに DPoP バインドを必須にします(RFC 9449)" }, disabled: { label: "無効" @@ -1370,12 +1370,12 @@ export const jaJPObjects: NonNullable = { help: "クライアントが OIDC エンドセッションエンドポイントを呼び出せるようにします" }, backchannel_logout_uri: { - label: "Back-channel Logout URI", - help: "OIDC back-channel logout endpoint of the client" + label: "バックチャネルログアウト URI", + help: "クライアントの OIDC バックチャネルログアウトエンドポイント" }, backchannel_logout_session_required: { - label: "Back-channel Logout Session Required", - help: "Whether the back-channel logout token must include a sid claim" + label: "バックチャネルログアウトのセッション必須", + help: "バックチャネルログアウトトークンに sid クレームを含める必要があるかどうか" }, software_id: { label: "ソフトウェア ID" @@ -1404,7 +1404,7 @@ export const jaJPObjects: NonNullable = { }, _views: { mine: { - label: "My Applications" + label: "自分のアプリケーション" }, active: { label: "有効" @@ -1509,16 +1509,16 @@ export const jaJPObjects: NonNullable = { help: "呼び出し元が指定した相関識別子" }, authorization_code_id: { - label: "Authorization Code ID", - help: "ID of the authorization-code grant this token originates from" + label: "認可コード ID", + help: "このトークンの発行元である認可コードグラントの ID" }, resources: { - label: "Resources", - help: "JSON-serialized list of RFC 8707 resource indicators bound to this token" + label: "リソース", + help: "このトークンにバインドされた RFC 8707 リソースインジケーターの JSON シリアライズリスト" }, requested_user_info_claims: { - label: "Requested UserInfo Claims", - help: "JSON-serialized list of OIDC claims requested for the userinfo endpoint" + label: "要求された UserInfo クレーム", + help: "userinfo エンドポイント向けに要求された OIDC クレームの JSON シリアライズリスト" }, scopes: { label: "スコープ", @@ -1531,12 +1531,12 @@ export const jaJPObjects: NonNullable = { label: "作成日時" }, revoked: { - label: "Revoked At", - help: "Timestamp at which this access token was revoked" + label: "失効日時", + help: "このアクセストークンが失効したタイムスタンプ" }, confirmation: { - label: "Confirmation", - help: "JSON RFC 7800 cnf claim (e.g. DPoP key thumbprint) binding this token to a key" + label: "確認情報", + help: "このトークンを鍵にバインドする JSON 形式の RFC 7800 cnf クレーム(例: DPoP 鍵のサムプリント)" } } }, @@ -1569,16 +1569,16 @@ export const jaJPObjects: NonNullable = { help: "呼び出し元が指定した相関識別子" }, authorization_code_id: { - label: "Authorization Code ID", - help: "ID of the authorization-code grant this token chain originates from" + label: "認可コード ID", + help: "このトークンチェーンの発行元である認可コードグラントの ID" }, resources: { - label: "Resources", - help: "JSON-serialized list of RFC 8707 resource indicators bound to this token" + label: "リソース", + help: "このトークンにバインドされた RFC 8707 リソースインジケーターの JSON シリアライズリスト" }, requested_user_info_claims: { - label: "Requested UserInfo Claims", - help: "JSON-serialized list of OIDC claims requested for the userinfo endpoint" + label: "要求された UserInfo クレーム", + help: "userinfo エンドポイント向けに要求された OIDC クレームの JSON シリアライズリスト" }, scopes: { label: "スコープ", @@ -1595,24 +1595,24 @@ export const jaJPObjects: NonNullable = { help: "このリフレッシュトークンが失効したタイムスタンプ" }, rotated_at: { - label: "Rotated At", - help: "Timestamp at which this token was rotated (superseded by a new row)" + label: "ローテーション日時", + help: "このトークンがローテーションされた(新しい行に置き換えられた)タイムスタンプ" }, rotation_replay_response: { - label: "Rotation Replay Response", - help: "Cached token response replayed when the old token is re-presented within the reuse interval" + label: "ローテーションリプレイ応答", + help: "再利用猶予期間内に古いトークンが再提示されたときに再送される、キャッシュ済みのトークン応答" }, rotation_replay_expires_at: { - label: "Rotation Replay Expires At", - help: "End of the post-rotation reuse interval during which the replay response is served" + label: "ローテーションリプレイ有効期限", + help: "リプレイ応答が返される、ローテーション後の再利用猶予期間の終了日時" }, auth_time: { label: "認証日時", help: "このトークンチェーンのためにユーザーが最初に認証した日時" }, confirmation: { - label: "Confirmation", - help: "JSON RFC 7800 cnf claim (e.g. DPoP key thumbprint) binding this token to a key" + label: "確認情報", + help: "このトークンを鍵にバインドする JSON 形式の RFC 7800 cnf クレーム(例: DPoP 鍵のサムプリント)" } } }, @@ -1637,12 +1637,12 @@ export const jaJPObjects: NonNullable = { help: "呼び出し元が指定した相関識別子" }, resources: { - label: "Resources", - help: "JSON-serialized list of RFC 8707 resource indicators the consent covers" + label: "リソース", + help: "この同意が対象とする RFC 8707 リソースインジケーターの JSON シリアライズリスト" }, requested_user_info_claims: { - label: "Requested UserInfo Claims", - help: "JSON-serialized list of OIDC claims the user consented to expose" + label: "要求された UserInfo クレーム", + help: "ユーザーが開示に同意した OIDC クレームの JSON シリアライズリスト" }, scopes: { label: "スコープ", @@ -1657,103 +1657,103 @@ export const jaJPObjects: NonNullable = { } }, sys_oauth_resource: { - label: "OAuth Resource", - pluralLabel: "OAuth Resources", - description: "Registered OAuth protected resources (RFC 8707 resource indicators)", + label: "OAuth リソース", + pluralLabel: "OAuth リソース", + description: "登録済みの OAuth 保護リソース(RFC 8707 リソースインジケーター)", fields: { id: { label: "ID" }, identifier: { - label: "Identifier", - help: "Resource indicator URI presented in the RFC 8707 resource parameter" + label: "識別子", + help: "RFC 8707 の resource パラメーターで提示されるリソースインジケーター URI" }, name: { - label: "Name" + label: "名前" }, access_token_ttl: { - label: "Access Token TTL", - help: "Access-token lifetime in seconds for this resource (overrides the server default)" + label: "アクセストークン TTL", + help: "このリソースのアクセストークンの有効期間(秒)。サーバーの既定値を上書きします" }, refresh_token_ttl: { - label: "Refresh Token TTL", - help: "Refresh-token lifetime in seconds for this resource (overrides the server default)" + label: "リフレッシュトークン TTL", + help: "このリソースのリフレッシュトークンの有効期間(秒)。サーバーの既定値を上書きします" }, signing_algorithm: { - label: "Signing Algorithm", - help: "JWS algorithm used to sign access tokens for this resource" + label: "署名アルゴリズム", + help: "このリソースのアクセストークンの署名に使用する JWS アルゴリズム" }, signing_key_id: { - label: "Signing Key ID", - help: "Key id (kid) used to sign access tokens for this resource" + label: "署名キー ID", + help: "このリソースのアクセストークンの署名に使用するキー ID(kid)" }, allowed_scopes: { - label: "Allowed Scopes", - help: "JSON-serialized list of scopes clients may request for this resource" + label: "許可スコープ", + help: "クライアントがこのリソースに対してリクエストできるスコープの JSON シリアライズリスト" }, custom_claims: { - label: "Custom Claims", - help: "JSON object of extra claims stamped on access tokens for this resource" + label: "カスタムクレーム", + help: "このリソースのアクセストークンに付与される追加クレームの JSON オブジェクト" }, dpop_bound_access_tokens_required: { - label: "DPoP Required", - help: "Require access tokens for this resource to be DPoP-bound (RFC 9449)" + label: "DPoP 必須", + help: "このリソースのアクセストークンに DPoP バインドを必須にします(RFC 9449)" }, disabled: { - label: "Disabled" + label: "無効" }, policy_version: { - label: "Policy Version", - help: "Monotonic version of the resource token policy" + label: "ポリシーバージョン", + help: "リソーストークンポリシーの単調増加するバージョン" }, metadata: { - label: "Metadata", - help: "JSON object of additional resource metadata" + label: "メタデータ", + help: "追加のリソースメタデータの JSON オブジェクト" }, created_at: { - label: "Created At" + label: "作成日時" }, updated_at: { - label: "Updated At" + label: "更新日時" } } }, sys_oauth_client_resource: { - label: "OAuth Client Resource", - pluralLabel: "OAuth Client Resources", - description: "Grants allowing an OAuth client to request tokens for a protected resource", + label: "OAuth クライアントリソース", + pluralLabel: "OAuth クライアントリソース", + description: "OAuth クライアントが保護リソースのトークンをリクエストすることを許可する付与", fields: { id: { label: "ID" }, client_id: { - label: "Client ID", - help: "Foreign key to sys_oauth_application.client_id" + label: "クライアント ID", + help: "sys_oauth_application.client_id への外部キー" }, resource_id: { - label: "Resource ID", - help: "Foreign key to sys_oauth_resource.identifier" + label: "リソース ID", + help: "sys_oauth_resource.identifier への外部キー" }, metadata: { - label: "Metadata", - help: "JSON object of additional grant metadata" + label: "メタデータ", + help: "追加の付与メタデータの JSON オブジェクト" }, created_at: { - label: "Created At" + label: "作成日時" } } }, sys_oauth_client_assertion: { - label: "OAuth Client Assertion", - pluralLabel: "OAuth Client Assertions", - description: "Consumed OAuth client-assertion JTIs (RFC 7523 replay prevention)", + label: "OAuth クライアントアサーション", + pluralLabel: "OAuth クライアントアサーション", + description: "使用済みの OAuth クライアントアサーション JTI(RFC 7523 のリプレイ防止)", fields: { id: { label: "ID" }, expires_at: { - label: "Expires At", - help: "Assertion expiry — rows past this instant are safe to prune" + label: "有効期限", + help: "アサーションの有効期限 — この時刻を過ぎた行は安全に削除できます" } } }, @@ -1947,174 +1947,174 @@ export const jaJPObjects: NonNullable = { } }, sys_scim_connection_binding: { - label: "SCIM Connection Binding", - pluralLabel: "SCIM Connection Bindings", - description: "Lifecycle state for a SCIM provisioning connection, including its decommission state machine", + label: "SCIM 接続バインディング", + pluralLabel: "SCIM 接続バインディング", + description: "SCIM プロビジョニング接続のライフサイクル状態(廃止ステートマシンを含む)", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID", - help: "Immutable SCIM connection identifier that scopes every provisioned resource" + label: "接続 ID", + help: "プロビジョニングされるすべてのリソースのスコープとなる、変更不可の SCIM 接続識別子" }, connection_key: { - label: "Connection Key", - help: "Derived connection uniqueness key maintained by @better-auth/scim; do not write directly." + label: "接続キー", + help: "@better-auth/scim が管理する派生接続一意性キー。直接書き込まないでください。" }, provisioning_domain_id: { - label: "Provisioning Domain", - help: "Application-owned boundary that receives provisioned resources (defaults to the connection id)" + label: "プロビジョニングドメイン", + help: "プロビジョニングされたリソースを受け取る、アプリケーション所有の境界(既定は接続 ID)" }, decommission_status: { - label: "Decommission Status", - help: "Connection lifecycle state: active | reconciling | complete" + label: "廃止ステータス", + help: "接続のライフサイクル状態: active | reconciling | complete" }, decommissioned_at: { - label: "Decommissioned At" + label: "廃止日時" }, decommission_cursor_user_id: { - label: "Decommission Cursor User", - help: "Resumable reconciliation cursor maintained by the library" + label: "廃止カーソルユーザー", + help: "ライブラリが管理する再開可能な照合カーソル" }, decommission_reconciled_user_count: { - label: "Reconciled Users" + label: "照合済みユーザー数" }, decommission_batch_count: { - label: "Decommission Batches" + label: "廃止バッチ数" }, decommission_revision: { - label: "Decommission Revision", - help: "Optimistic-concurrency revision for the decommission state machine" + label: "廃止リビジョン", + help: "廃止ステートマシンの楽観的同時実行制御リビジョン" }, decommission_completed_at: { - label: "Decommission Completed At" + label: "廃止完了日時" }, decommission_lease_id: { - label: "Decommission Lease", - help: "Single-worker reconciliation lease maintained by the library" + label: "廃止リース", + help: "ライブラリが管理する単一ワーカーの照合リース" }, decommission_lease_expires_at: { - label: "Decommission Lease Expires At" + label: "廃止リース有効期限" }, created_at: { - label: "Created At" + label: "作成日時" } }, _views: { all: { - label: "All" + label: "すべて" } } }, sys_scim_connection_credential: { - label: "SCIM Connection Credential", - pluralLabel: "SCIM Connection Credentials", - description: "Bearer credentials (one-way digests) that authenticate SCIM provisioning connections", + label: "SCIM 接続資格情報", + pluralLabel: "SCIM 接続資格情報", + description: "SCIM プロビジョニング接続を認証するベアラー資格情報(一方向ダイジェスト)", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID", - help: "The SCIM connection this credential authenticates (e.g. \"okta-prod\"); scopes every resource the IdP provisions with it" + label: "接続 ID", + help: "この資格情報が認証する SCIM 接続(例: 「okta-prod」)。IdP がこれを使ってプロビジョニングするすべてのリソースのスコープとなります" }, provisioning_domain_id: { - label: "Provisioning Domain", - help: "Application-owned boundary receiving provisioned resources; defaults to the connection id when absent" + label: "プロビジョニングドメイン", + help: "プロビジョニングされたリソースを受け取る、アプリケーション所有の境界。未指定の場合は接続 ID が既定です" }, organization_id: { - label: "Organization", - help: "Organization scope of this connection, when provisioning is org-scoped" + label: "組織", + help: "プロビジョニングが組織スコープの場合の、この接続の組織スコープ" }, label: { - label: "Label", - help: "Operator-facing name for this credential (e.g. \"rotation 2026-Q3\")" + label: "ラベル", + help: "運用者向けのこの資格情報の名前(例: 「rotation 2026-Q3」)" }, token_digest: { - label: "Token Digest", - help: "HMAC-SHA-256 (base64url) of the bearer, keyed by the deployment auth secret — one-way; the plaintext is shown once at mint and never stored." + label: "トークンダイジェスト", + help: "デプロイメントの認証シークレットを鍵とする、ベアラーの HMAC-SHA-256(base64url)— 一方向。平文は発行時に一度だけ表示され、保存されません。" }, active: { - label: "Active", - help: "Revocation switch — an inactive credential is refused at verification" + label: "有効", + help: "失効スイッチ — 無効な資格情報は検証時に拒否されます" }, expires_at: { - label: "Expires At", - help: "Optional hard expiry for staged credential rotation; an expired credential is refused" + label: "有効期限", + help: "段階的な資格情報ローテーションのための任意の強制有効期限。期限切れの資格情報は拒否されます" }, user_id: { - label: "Minted By", - help: "User who minted this credential" + label: "発行者", + help: "この資格情報を発行したユーザー" }, created_at: { - label: "Created At" + label: "作成日時" }, updated_at: { - label: "Updated At" + label: "更新日時" } }, _views: { all: { - label: "All" + label: "すべて" } } }, sys_scim_group: { - label: "SCIM Group", - pluralLabel: "SCIM Groups", - description: "IdP-pushed SCIM 2.0 groups, scoped per provisioning connection", + label: "SCIM グループ", + pluralLabel: "SCIM グループ", + description: "IdP からプッシュされた SCIM 2.0 グループ(プロビジョニング接続ごとにスコープ)", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID" + label: "接続 ID" }, provisioning_domain_id: { - label: "Provisioning Domain" + label: "プロビジョニングドメイン" }, revision: { - label: "Revision", - help: "Optimistic-concurrency revision maintained by @better-auth/scim" + label: "リビジョン", + help: "@better-auth/scim が管理する楽観的同時実行制御リビジョン" }, display_name: { - label: "Display Name", - help: "SCIM displayName as sent by the IdP" + label: "表示名", + help: "IdP から送信された SCIM displayName" }, display_name_key: { - label: "Display Name Key", - help: "Derived case-folded displayName uniqueness key maintained by @better-auth/scim; do not write directly." + label: "表示名キー", + help: "@better-auth/scim が管理する、大文字小文字を正規化した派生 displayName 一意性キー。直接書き込まないでください。" }, external_id: { - label: "External ID", - help: "IdP-assigned externalId, when the IdP sends one" + label: "外部 ID", + help: "IdP が割り当てた externalId(IdP が送信した場合)" }, external_id_key: { - label: "External ID Key", - help: "Derived externalId uniqueness key maintained by @better-auth/scim; do not write directly." + label: "外部 ID キー", + help: "@better-auth/scim が管理する派生 externalId 一意性キー。直接書き込まないでください。" }, order_key: { - label: "Order Key", - help: "Derived stable-pagination key maintained by @better-auth/scim; do not write directly." + label: "並び順キー", + help: "@better-auth/scim が管理する、安定したページネーションのための派生キー。直接書き込まないでください。" }, created_at: { - label: "Created At" + label: "作成日時" }, updated_at: { - label: "Updated At" + label: "更新日時" } }, _views: { all: { - label: "All" + label: "すべて" } } }, sys_scim_group_member: { - label: "SCIM Group Member", - pluralLabel: "SCIM Group Members", - description: "SCIM group membership rows pushed by the IdP (group ↔ provisioned user)", + label: "SCIM グループメンバー", + pluralLabel: "SCIM グループメンバー", + description: "IdP からプッシュされた SCIM グループメンバーシップの行(グループ ↔ プロビジョニングされたユーザー)", fields: { id: { label: "ID" @@ -2124,72 +2124,72 @@ export const jaJPObjects: NonNullable = { help: "レコードタイトル:プロビジョニングされたユーザーとグループ(読み取り時に計算)" }, connection_id: { - label: "Connection ID" + label: "接続 ID" }, group_id: { - label: "Group" + label: "グループ" }, scim_user_id: { - label: "SCIM User" + label: "SCIM ユーザー" }, membership_key: { - label: "Membership Key", - help: "Derived membership uniqueness key maintained by @better-auth/scim; do not write directly." + label: "メンバーシップキー", + help: "@better-auth/scim が管理する派生メンバーシップ一意性キー。直接書き込まないでください。" }, created_at: { - label: "Created At" + label: "作成日時" } }, _views: { all: { - label: "All" + label: "すべて" } } }, sys_scim_identity_tombstone: { - label: "SCIM Identity Tombstone", - pluralLabel: "SCIM Identity Tombstones", - description: "Tombstones of IdP-deleted SCIM identities, kept so a re-provision is recognized", + label: "SCIM ID トゥームストーン", + pluralLabel: "SCIM ID トゥームストーン", + description: "IdP で削除された SCIM ID のトゥームストーン。再プロビジョニングを認識できるよう保持されます", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID" + label: "接続 ID" }, provisioning_domain_id: { - label: "Provisioning Domain" + label: "プロビジョニングドメイン" }, external_id: { - label: "External ID", - help: "The IdP-assigned externalId of the deleted identity" + label: "外部 ID", + help: "削除された ID の、IdP が割り当てた externalId" }, external_id_key: { - label: "External ID Key", - help: "Derived externalId uniqueness key maintained by @better-auth/scim; do not write directly." + label: "外部 ID キー", + help: "@better-auth/scim が管理する派生 externalId 一意性キー。直接書き込まないでください。" }, user_id: { - label: "User", - help: "The platform user the deleted identity was linked to" + label: "ユーザー", + help: "削除された ID がリンクされていたプラットフォームユーザー" }, profile: { - label: "Final Profile", - help: "Serialized final SCIM profile at deletion time, maintained by @better-auth/scim" + label: "最終プロファイル", + help: "削除時点の SCIM 最終プロファイルのシリアライズ値(@better-auth/scim が管理)" }, deleted_at: { - label: "Deleted At" + label: "削除日時" } }, _views: { all: { - label: "All" + label: "すべて" } } }, sys_scim_projection_grant: { - label: "SCIM Projection Grant", - pluralLabel: "SCIM Projection Grants", - description: "Role/entitlement grants projected onto platform users by SCIM provisioning", + label: "SCIM 投影付与", + pluralLabel: "SCIM 投影付与", + description: "SCIM プロビジョニングによってプラットフォームユーザーに投影されるロール/エンタイトルメントの付与", fields: { id: { label: "ID" @@ -2199,173 +2199,173 @@ export const jaJPObjects: NonNullable = { help: "レコードタイトル:投影されたロールと、その付与先のユーザー(読み取り時に計算)" }, connection_id: { - label: "Connection ID" + label: "接続 ID" }, provisioning_domain_id: { - label: "Provisioning Domain" + label: "プロビジョニングドメイン" }, scim_user_id: { - label: "SCIM User", - help: "The per-connection user projection this grant belongs to" + label: "SCIM ユーザー", + help: "この付与が属する、接続ごとのユーザー投影" }, user_id: { - label: "User", - help: "The platform user the grant is projected onto" + label: "ユーザー", + help: "この付与が投影されるプラットフォームユーザー" }, source_kind: { - label: "Source Kind", - help: "What projected the grant (e.g. group, entitlement, attribute)" + label: "ソース種別", + help: "付与を投影したもの(例: group、entitlement、attribute)" }, source_id: { - label: "Source ID", - help: "Identifier of the projecting source (e.g. the SCIM group id)" + label: "ソース ID", + help: "投影元ソースの識別子(例: SCIM グループ ID)" }, source_value: { - label: "Source Value", - help: "Source attribute value, when the source kind carries one" + label: "ソース値", + help: "ソース種別が値を持つ場合のソース属性値" }, role: { - label: "Role", - help: "The role/entitlement projected onto the user" + label: "ロール", + help: "ユーザーに投影されるロール/エンタイトルメント" }, grant_key: { - label: "Grant Key", - help: "Derived grant uniqueness key maintained by @better-auth/scim; do not write directly." + label: "付与キー", + help: "@better-auth/scim が管理する派生付与一意性キー。直接書き込まないでください。" }, created_at: { - label: "Created At" + label: "作成日時" }, updated_at: { - label: "Updated At" + label: "更新日時" } }, _views: { all: { - label: "All" + label: "すべて" } } }, sys_scim_subject: { - label: "SCIM Subject", - pluralLabel: "SCIM Subjects", - description: "Per-user SCIM provisioning link — one row per user any SCIM connection provisions", + label: "SCIM サブジェクト", + pluralLabel: "SCIM サブジェクト", + description: "ユーザーごとの SCIM プロビジョニングリンク — いずれかの SCIM 接続がプロビジョニングするユーザーごとに 1 行", fields: { id: { label: "ID" }, user_id: { - label: "User", - help: "The platform user this subject row tracks (unique — one row per user)" + label: "ユーザー", + help: "このサブジェクト行が追跡するプラットフォームユーザー(一意 — ユーザーごとに 1 行)" }, profile_source_id: { - label: "Profile Source", - help: "The sys_scim_user projection currently sourcing this user's profile" + label: "プロファイルソース", + help: "このユーザーのプロファイルの現在のソースである sys_scim_user 投影" }, revision: { - label: "Revision", - help: "Optimistic-concurrency revision maintained by @better-auth/scim" + label: "リビジョン", + help: "@better-auth/scim が管理する楽観的同時実行制御リビジョン" }, created_at: { - label: "Created At" + label: "作成日時" }, updated_at: { - label: "Updated At" + label: "更新日時" } }, _views: { all: { - label: "All" + label: "すべて" } } }, sys_scim_user: { - label: "SCIM User", - pluralLabel: "SCIM Users", - description: "Per-connection projection of an IdP-provisioned user (SCIM 2.0 /Users)", + label: "SCIM ユーザー", + pluralLabel: "SCIM ユーザー", + description: "IdP によってプロビジョニングされたユーザーの、接続ごとの投影(SCIM 2.0 /Users)", fields: { id: { label: "ID" }, connection_id: { - label: "Connection ID", - help: "SCIM connection that provisioned this user" + label: "接続 ID", + help: "このユーザーをプロビジョニングした SCIM 接続" }, provisioning_domain_id: { - label: "Provisioning Domain" + label: "プロビジョニングドメイン" }, user_id: { - label: "User", - help: "The platform user this projection materialized as" + label: "ユーザー", + help: "この投影が実体化されたプラットフォームユーザー" }, connection_user_key: { - label: "Connection User Key", - help: "Derived (connection, user) uniqueness key maintained by @better-auth/scim; do not write directly." + label: "接続ユーザーキー", + help: "@better-auth/scim が管理する(接続、ユーザー)の派生一意性キー。直接書き込まないでください。" }, user_name: { - label: "User Name", - help: "SCIM userName as sent by the IdP" + label: "ユーザー名", + help: "IdP から送信された SCIM userName" }, user_name_key: { - label: "User Name Key", - help: "Derived case-folded userName uniqueness key maintained by @better-auth/scim; do not write directly." + label: "ユーザー名キー", + help: "@better-auth/scim が管理する、大文字小文字を正規化した派生 userName 一意性キー。直接書き込まないでください。" }, primary_email: { - label: "Primary Email" + label: "プライマリメールアドレス" }, work_email_value_index: { - label: "Work Email Index", - help: "Derived lookup index maintained by @better-auth/scim; do not write directly." + label: "勤務先メールインデックス", + help: "@better-auth/scim が管理する派生検索インデックス。直接書き込まないでください。" }, email_value_index: { - label: "Email Index", - help: "Derived lookup index maintained by @better-auth/scim; do not write directly." + label: "メールインデックス", + help: "@better-auth/scim が管理する派生検索インデックス。直接書き込まないでください。" }, display_name: { - label: "Display Name" + label: "表示名" }, formatted_name: { - label: "Formatted Name" + label: "フォーマット済み氏名" }, given_name: { - label: "Given Name" + label: "名" }, family_name: { - label: "Family Name" + label: "姓" }, serialized_emails: { - label: "Emails (serialized)", - help: "Canonical serialized SCIM emails list maintained by @better-auth/scim; do not write directly." + label: "メールアドレス(シリアライズ済み)", + help: "@better-auth/scim が管理する、正規化された SCIM emails リストのシリアライズ値。直接書き込まないでください。" }, serialized_attributes: { - label: "Attributes (serialized)", - help: "Canonical serialized SCIM attributes maintained by @better-auth/scim; do not write directly." + label: "属性(シリアライズ済み)", + help: "@better-auth/scim が管理する、正規化された SCIM 属性のシリアライズ値。直接書き込まないでください。" }, external_id: { - label: "External ID", - help: "IdP-assigned externalId, when the IdP sends one" + label: "外部 ID", + help: "IdP が割り当てた externalId(IdP が送信した場合)" }, external_id_key: { - label: "External ID Key", - help: "Derived externalId uniqueness key maintained by @better-auth/scim; do not write directly." + label: "外部 ID キー", + help: "@better-auth/scim が管理する派生 externalId 一意性キー。直接書き込まないでください。" }, active: { - label: "Active", - help: "SCIM active flag — false means the IdP deactivated this user" + label: "有効", + help: "SCIM の active フラグ — false は IdP がこのユーザーを無効化したことを示します" }, order_key: { - label: "Order Key", - help: "Derived stable-pagination key maintained by @better-auth/scim; do not write directly." + label: "並び順キー", + help: "@better-auth/scim が管理する、安定したページネーションのための派生キー。直接書き込まないでください。" }, created_at: { - label: "Created At" + label: "作成日時" }, updated_at: { - label: "Updated At" + label: "更新日時" } }, _views: { all: { - label: "All" + label: "すべて" } } }, @@ -2378,29 +2378,29 @@ export const jaJPObjects: NonNullable = { label: "通知 ID" }, topic: { - label: "Topic", - help: "Notification topic, e.g. task.assigned, collab.mention" + label: "トピック", + help: "通知トピック(例: task.assigned、collab.mention)" }, payload: { - label: "Payload", - help: "Template inputs carried to channels (title/body/url/actor/source/…)" + label: "ペイロード", + help: "チャネルに渡されるテンプレート入力(title/body/url/actor/source など)" }, severity: { - label: "Severity", - help: "Severity hint for rendering / filtering", + label: "重大度", + help: "表示/フィルタリング用の重大度ヒント", options: { - info: "info", - warning: "warning", - critical: "critical" + info: "情報", + warning: "警告", + critical: "重大" } }, suppressed_channels: { - label: "Suppressed Channels", - help: "Channels fan-out skipped because they are unavailable for this tenant, as [{channel, reason}]; reason is the closed set: transport_not_configured" + label: "抑止されたチャネル", + help: "このテナントで利用できないためにファンアウトでスキップされたチャネル([{channel, reason}] 形式)。reason は閉じた集合: transport_not_configured" }, dedup_key: { - label: "Dedup Key", - help: "Idempotency key within a topic window; a repeat emit is a no-op" + label: "重複排除キー", + help: "トピックウィンドウ内の冪等キー。同じ内容を再度発行しても何も起こりません" }, source_object: { label: "ソースオブジェクト", @@ -2420,14 +2420,14 @@ export const jaJPObjects: NonNullable = { }, _views: { recent: { - label: "Recent", + label: "最近", emptyState: { - title: "No events", - message: "No notification events have been emitted." + title: "イベントはありません", + message: "通知イベントはまだ発行されていません。" } }, by_topic: { - label: "By Topic" + label: "トピック別" } } }, @@ -2501,7 +2501,7 @@ export const jaJPObjects: NonNullable = { label: "Bcc" }, reply_to: { - label: "Reply-To" + label: "返信先" }, subject: { label: "件名" @@ -2612,7 +2612,7 @@ export const jaJPObjects: NonNullable = { label: "送信者アドレス" }, reply_to: { - label: "Reply-To" + label: "返信先" }, active: { label: "有効" @@ -2626,17 +2626,17 @@ export const jaJPObjects: NonNullable = { help: "{name,type,required,description} の JSON 配列" }, managed_by: { - label: "Managed By", - help: "Record provenance: platform = framework built-in / package = app/package-declared (boot-seeded from declared email_template metadata) / admin = created in Studio.", + label: "管理者", + help: "レコードの出所: platform = フレームワーク組み込み / package = アプリ/パッケージで宣言(宣言された email_template メタデータから起動時にシード)/ admin = Studio で作成。", options: { - platform: "platform", - package: "package", - admin: "admin" + platform: "プラットフォーム", + package: "パッケージ", + admin: "管理者" } }, customized: { - label: "Customized", - help: "Set when an admin edits a package-declared template; boot seeding will no longer overwrite the row (a reworded password-reset mail survives redeploys). Meaningless on admin rows." + label: "カスタマイズ済み", + help: "管理者がパッケージで宣言されたテンプレートを編集すると設定されます。以後、起動時のシードはこの行を上書きしません(文面を変えたパスワードリセットメールは再デプロイ後も残ります)。admin 行では意味を持ちません。" }, created_at: { label: "作成日時" @@ -3100,7 +3100,7 @@ export const jaJPObjects: NonNullable = { }, recorded_by: { label: "記録者", - help: "User who made this change. NULL = system-initiated (boot sync, migration, scheduled job) — never a sentinel string." + help: "この変更を行ったユーザー。NULL = システムによる変更(起動時の同期、マイグレーション、スケジュールジョブ)— センチネル文字列は使いません。" }, recorded_at: { label: "記録日時" @@ -3232,8 +3232,8 @@ export const jaJPObjects: NonNullable = { label: "ロック状態", options: { none: "なし", - nooverlay: "no-overlay", - nodelete: "no-delete", + nooverlay: "オーバーレイ禁止", + nodelete: "削除禁止", full: "完全ロック" } }, @@ -3367,7 +3367,7 @@ export const jaJPObjects: NonNullable = { }, _views: { all: { - label: "All Secrets" + label: "すべてのシークレット" } } }, @@ -3447,60 +3447,60 @@ export const jaJPObjects: NonNullable = { }, _views: { recent: { - label: "Recent" + label: "最近" } } }, sys_migration: { - label: "Data Migration", - pluralLabel: "Data Migrations", - description: "Deployment-level data-migration flags: which gated data migrations ran here and whether their self-check passed.", + label: "データマイグレーション", + pluralLabel: "データマイグレーション", + description: "デプロイメント単位のデータマイグレーションフラグ: ゲート付きのどのデータマイグレーションがここで実行され、そのセルフチェックに合格したかを示します。", fields: { id: { - label: "Migration ID", - help: "Well-known migration id (e.g. adr-0104-file-references). One row per migration." + label: "マイグレーション ID", + help: "既知のマイグレーション ID(例: adr-0104-file-references)。マイグレーションごとに 1 行。" }, last_run_at: { - label: "Last Run At", - help: "When this migration last completed a gated (apply-mode) run on this deployment." + label: "最終実行日時", + help: "このデプロイメントで、このマイグレーションがゲート付き(適用モード)の実行を最後に完了した日時。" }, verified_at: { - label: "Verified At", - help: "When the self-check last PASSED. Null until it does, and cleared again by a later failing run — a regression closes the gate. Consumers require this to be set AND blocking = 0." + label: "検証日時", + help: "セルフチェックに最後に合格した日時。合格するまでは null で、後の実行が失敗すると再びクリアされます — 退行はゲートを閉じます。利用側は、これが設定されていて、かつ blocking = 0 であることを要求します。" }, applied_at: { - label: "Applied At", - help: "When the backfill last ran in apply mode (writes enabled)." + label: "適用日時", + help: "バックフィルが最後に適用モード(書き込み有効)で実行された日時。" }, blocking: { - label: "Blocking Discrepancies", - help: "Blocking discrepancies reported by the last self-check. The gate requires 0." + label: "ブロッキング不整合", + help: "直近のセルフチェックが報告したブロッキング不整合。ゲートは 0 を要求します。" }, advisory: { - label: "Advisory Findings", - help: "Advisory findings from the last run (external URLs, stale owners, …) — cost storage or need a modelling decision, never block the gate." + label: "参考指摘", + help: "直近の実行による参考指摘(外部 URL、古い所有者など)— ストレージを消費したりモデリング上の判断が必要になったりしますが、ゲートをブロックすることはありません。" }, details: { - label: "Details (JSON)", - help: "JSON-encoded counts from the last run, for diagnostics." + label: "詳細(JSON)", + help: "診断用の、直近の実行による JSON エンコードされたカウント。" }, deviation_observed_at: { - label: "Deviation Observed At", - help: "When this deployment last ADMITTED a value its own verified contract rejects, through an OS_ALLOW_LAX_* escape hatch. Deliberately does NOT clear verified_at: it withdraws only the irreversible half of what the certificate authorises — byte deletion stops, validation and tombstoning continue. Cleared by the next apply-mode run." + label: "逸脱検出日時", + help: "このデプロイメントが、自身の検証済みコントラクトが拒否する値を OS_ALLOW_LAX_* エスケープハッチ経由で最後に受け入れた日時。意図的に verified_at はクリアしません。証明書が認める内容のうち不可逆な半分だけを取り下げます — バイトの削除は停止し、検証とトゥームストーン化は継続します。次の適用モードの実行でクリアされます。" }, deviation_detail: { - label: "Deviation Detail (JSON)", - help: "JSON-encoded first counterexample behind deviation_observed_at (object, field, type, parse issue), so an operator can find the value that closed the irreversible gate." + label: "逸脱の詳細(JSON)", + help: "deviation_observed_at の原因となった最初の反例を JSON エンコードしたもの(オブジェクト、フィールド、型、パースの問題)。運用者が不可逆ゲートを閉じた値を見つけられるようにします。" }, columns_moved_at: { - label: "Columns Moved At", - help: "When this deployment last completed the COLUMN MOVE for this migration — the step that retypes the migrated columns and rewrites the values they hold into the new encoding. Separate evidence from applied_at and verified_at, which attest the backfill and its self-check only: a deployment can carry both and still store the legacy encoding. Null says exactly that, and is an expected steady state rather than an error — it is what a consumer that cannot read this field must assume." + label: "カラム移行日時", + help: "このデプロイメントが、このマイグレーションのカラム移行(移行対象カラムの型を変更し、保持する値を新しいエンコーディングに書き換える手順)を最後に完了した日時。バックフィルとそのセルフチェックだけを証明する applied_at および verified_at とは別の証拠です。デプロイメントは両方を持ちながら、なおレガシーエンコーディングを保存していることがあります。null はまさにその状態を示し、エラーではなく想定された定常状態です — このフィールドを読めない利用側はそう想定しなければなりません。" }, created_at: { - label: "Created At" + label: "作成日時" }, updated_at: { - label: "Updated At" + label: "更新日時" } } } diff --git a/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts b/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts index 7d47368b7fd..3e846e94cee 100644 --- a/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts +++ b/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts @@ -25,360 +25,32 @@ export const jaJPGeneratedSourceHashes: Readonly> = { "objects.sys_account._actions.link_social.params.provider.options.gitlab": "bc3dbbf4b650e600", "objects.sys_account._actions.link_social.params.provider.options.google": "6fadcd05bb8da367", "objects.sys_account._actions.link_social.params.provider.options.microsoft": "17309efbdb1ec122", - "objects.sys_account.fields.access_token.help": "814695a136172228", - "objects.sys_account.fields.id_token.help": "b545f62224b21f69", - "objects.sys_account.fields.previous_password_hashes.help": "3a98e8164b0daf11", - "objects.sys_account.fields.previous_password_hashes.label": "2aa498ce717c7d77", - "objects.sys_account.fields.refresh_token.help": "f337bcd15c9b4cb3", - "objects.sys_api_key.fields.active_organization_id.help": "74718b93fdaa52cc", - "objects.sys_api_key.fields.active_organization_id.label": "51bce7fbc99fbf87", "objects.sys_email.fields.bcc_addresses.label": "8674899b7b6d5126", "objects.sys_email.fields.cc_addresses.label": "02946d952cf15623", "objects.sys_email.fields.message_id.label": "14cd089a4062f4b1", - "objects.sys_email.fields.reply_to.label": "90ad8f2ca791a95a", - "objects.sys_email_template.fields.customized.help": "fc75c32a37f906ea", - "objects.sys_email_template.fields.customized.label": "6990986111e53429", "objects.sys_email_template.fields.id.label": "00b0385c9c152888", - "objects.sys_email_template.fields.managed_by.help": "0d7397e9e0e84cfe", - "objects.sys_email_template.fields.managed_by.label": "be9070801491e6af", - "objects.sys_email_template.fields.managed_by.options.admin": "f8c9f123caf6217d", - "objects.sys_email_template.fields.managed_by.options.package": "1c8c6168730324a3", - "objects.sys_email_template.fields.managed_by.options.platform": "820d30a5082ebc6c", - "objects.sys_email_template.fields.reply_to.label": "90ad8f2ca791a95a", - "objects.sys_invitation.fields.business_unit_id.help": "b4e37b1bfcc40f34", - "objects.sys_invitation.fields.business_unit_id.label": "bf0e0fdbda66ec9b", - "objects.sys_invitation.fields.positions.help": "abfa7911007e38f1", - "objects.sys_invitation.fields.positions.label": "3428d066379ee33b", - "objects.sys_invitation.fields.role.options.delegated_admin": "13f0e7f118c839e0", - "objects.sys_member._views.mine.emptyState.message": "36cf7e3a3eebed0b", - "objects.sys_member._views.mine.emptyState.title": "df533ee25aba6de9", - "objects.sys_member._views.mine.label": "46b6227bcdb2d02e", - "objects.sys_member.fields.role.options.delegated_admin": "13f0e7f118c839e0", "objects.sys_metadata.fields.id.label": "00b0385c9c152888", "objects.sys_metadata_audit.fields.id.label": "00b0385c9c152888", - "objects.sys_metadata_audit.fields.lock_state.options.nodelete": "248b810d57fe8bb9", - "objects.sys_metadata_audit.fields.lock_state.options.nooverlay": "49a44e4a03ff124c", "objects.sys_metadata_history.fields.id.label": "00b0385c9c152888", - "objects.sys_metadata_history.fields.recorded_by.help": "e293bd6cf3c47060", - "objects.sys_migration.description": "2124b4abfb243e56", - "objects.sys_migration.fields.advisory.help": "ff96ea989b140e52", - "objects.sys_migration.fields.advisory.label": "b32c5f9a93d20e02", - "objects.sys_migration.fields.applied_at.help": "7414bd643f6b30cf", - "objects.sys_migration.fields.applied_at.label": "e95c287d92cd1215", - "objects.sys_migration.fields.blocking.help": "e807388f81f23dda", - "objects.sys_migration.fields.blocking.label": "fde63021cfe650a1", - "objects.sys_migration.fields.columns_moved_at.help": "eaa31d8860c680ec", - "objects.sys_migration.fields.columns_moved_at.label": "9f0cfcef656a7ec8", - "objects.sys_migration.fields.created_at.label": "1f02d416befb595b", - "objects.sys_migration.fields.details.help": "315f8003d77cf2b9", - "objects.sys_migration.fields.details.label": "974694e5c164374e", - "objects.sys_migration.fields.deviation_detail.help": "681fe28dc0c34386", - "objects.sys_migration.fields.deviation_detail.label": "5bf0f0f59a89e2fb", - "objects.sys_migration.fields.deviation_observed_at.help": "d6720808eb570acd", - "objects.sys_migration.fields.deviation_observed_at.label": "d68ffbef206322e0", - "objects.sys_migration.fields.id.help": "5cf4db327551205b", - "objects.sys_migration.fields.id.label": "349621d298d12bd4", - "objects.sys_migration.fields.last_run_at.help": "721c7ab4ce68bab9", - "objects.sys_migration.fields.last_run_at.label": "0540810f87bb4ac0", - "objects.sys_migration.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_migration.fields.verified_at.help": "ef3ed908c6407126", - "objects.sys_migration.fields.verified_at.label": "a1115e0d1677f1af", - "objects.sys_migration.label": "97fdaf1d2e0d8c2a", - "objects.sys_migration.pluralLabel": "91d61a84b5ff632b", - "objects.sys_notification._views.by_topic.label": "a0ddbe432474ed94", - "objects.sys_notification._views.recent.emptyState.message": "4a1e91a49eaf59d6", - "objects.sys_notification._views.recent.emptyState.title": "6f708a09bb4c9a5c", - "objects.sys_notification._views.recent.label": "62d27bb9d0349c99", - "objects.sys_notification.fields.dedup_key.help": "58a5e28b6a87e6d6", - "objects.sys_notification.fields.dedup_key.label": "33a740837f882c98", - "objects.sys_notification.fields.payload.help": "e1e8514cd730b06f", - "objects.sys_notification.fields.payload.label": "4488e1328e37dcb2", - "objects.sys_notification.fields.severity.help": "4925b29cf7e10346", - "objects.sys_notification.fields.severity.label": "d59e4345bdc57b59", - "objects.sys_notification.fields.severity.options.critical": "7ff0ff69c0abaf81", - "objects.sys_notification.fields.severity.options.info": "3e0c8611029f253b", - "objects.sys_notification.fields.severity.options.warning": "2673ee95caf83284", - "objects.sys_notification.fields.suppressed_channels.help": "1fbbc17b95ea75d2", - "objects.sys_notification.fields.suppressed_channels.label": "910cb46f687f6270", - "objects.sys_notification.fields.topic.help": "80e1790edfda49df", - "objects.sys_notification.fields.topic.label": "819afdb3853e9d80", - "objects.sys_oauth_access_token.fields.authorization_code_id.help": "84ad4d5d8c4c1cee", - "objects.sys_oauth_access_token.fields.authorization_code_id.label": "1c1d06cc01295862", - "objects.sys_oauth_access_token.fields.confirmation.help": "9d086fdc90baa01d", - "objects.sys_oauth_access_token.fields.confirmation.label": "64755493e6425b37", "objects.sys_oauth_access_token.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_access_token.fields.requested_user_info_claims.help": "dc0cd8121cbde60f", - "objects.sys_oauth_access_token.fields.requested_user_info_claims.label": "5a6338a357257661", - "objects.sys_oauth_access_token.fields.resources.help": "8c153517b30bd6a5", - "objects.sys_oauth_access_token.fields.resources.label": "f5753a2fa351119e", - "objects.sys_oauth_access_token.fields.revoked.help": "ff6a4b6dac031959", - "objects.sys_oauth_access_token.fields.revoked.label": "054f918e632528c7", "objects.sys_oauth_application._actions.create_oauth_application.params.type.options.web": "2a7ead3da8c035c5", - "objects.sys_oauth_application._views.mine.label": "d1cb1174cd96176c", - "objects.sys_oauth_application.fields.backchannel_logout_session_required.help": "2d12d1e1f9461576", - "objects.sys_oauth_application.fields.backchannel_logout_session_required.label": "fbc6eee84fb8a1d7", - "objects.sys_oauth_application.fields.backchannel_logout_uri.help": "e7c8abeac494b145", - "objects.sys_oauth_application.fields.backchannel_logout_uri.label": "f78777a91cebd19f", - "objects.sys_oauth_application.fields.client_credentials_scopes.help": "bf69fe7f91bb78e7", - "objects.sys_oauth_application.fields.client_credentials_scopes.label": "e257098b80b760d2", - "objects.sys_oauth_application.fields.client_discovery_id.help": "6d7fff4d4e7fb705", - "objects.sys_oauth_application.fields.client_discovery_id.label": "2070f4b2f6456352", - "objects.sys_oauth_application.fields.dpop_bound_access_tokens.help": "e7257c5c6ea7043b", - "objects.sys_oauth_application.fields.dpop_bound_access_tokens.label": "3772715f1d9588af", "objects.sys_oauth_application.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_application.fields.jwks.help": "6a6c5fe835f213b8", "objects.sys_oauth_application.fields.jwks.label": "b2cf79f9d66c0dbc", - "objects.sys_oauth_application.fields.jwks_uri.help": "217cff7cca47a35e", "objects.sys_oauth_application.fields.jwks_uri.label": "2a4339df734ab269", - "objects.sys_oauth_client_assertion.description": "82a3f5fec7571bd4", - "objects.sys_oauth_client_assertion.fields.expires_at.help": "90b732ea4d289003", - "objects.sys_oauth_client_assertion.fields.expires_at.label": "df0ef5fae02b2044", "objects.sys_oauth_client_assertion.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_client_assertion.label": "964d685e79999dce", - "objects.sys_oauth_client_assertion.pluralLabel": "286f417fcbf2ab81", - "objects.sys_oauth_client_resource.description": "c63dda9f9c51165b", - "objects.sys_oauth_client_resource.fields.client_id.help": "8df79a6c07fc32b4", - "objects.sys_oauth_client_resource.fields.client_id.label": "09cb452151e7b1b6", - "objects.sys_oauth_client_resource.fields.created_at.label": "1f02d416befb595b", "objects.sys_oauth_client_resource.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_client_resource.fields.metadata.help": "c51d0437d1b00c8b", - "objects.sys_oauth_client_resource.fields.metadata.label": "9cabc04013c80ef3", - "objects.sys_oauth_client_resource.fields.resource_id.help": "5c7d52276882432d", - "objects.sys_oauth_client_resource.fields.resource_id.label": "21668ca570b12d71", - "objects.sys_oauth_client_resource.label": "882f5ca283a58ed1", - "objects.sys_oauth_client_resource.pluralLabel": "ab6a91aa51de6ac0", "objects.sys_oauth_consent.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_consent.fields.requested_user_info_claims.help": "6f1fc3c5e6b4031d", - "objects.sys_oauth_consent.fields.requested_user_info_claims.label": "5a6338a357257661", - "objects.sys_oauth_consent.fields.resources.help": "f1e24c7b80ba287a", - "objects.sys_oauth_consent.fields.resources.label": "f5753a2fa351119e", - "objects.sys_oauth_refresh_token.fields.authorization_code_id.help": "b16f370e0a06cf43", - "objects.sys_oauth_refresh_token.fields.authorization_code_id.label": "1c1d06cc01295862", - "objects.sys_oauth_refresh_token.fields.confirmation.help": "9d086fdc90baa01d", - "objects.sys_oauth_refresh_token.fields.confirmation.label": "64755493e6425b37", "objects.sys_oauth_refresh_token.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_refresh_token.fields.requested_user_info_claims.help": "dc0cd8121cbde60f", - "objects.sys_oauth_refresh_token.fields.requested_user_info_claims.label": "5a6338a357257661", - "objects.sys_oauth_refresh_token.fields.resources.help": "8c153517b30bd6a5", - "objects.sys_oauth_refresh_token.fields.resources.label": "f5753a2fa351119e", - "objects.sys_oauth_refresh_token.fields.rotated_at.help": "704d34a1f46f4412", - "objects.sys_oauth_refresh_token.fields.rotated_at.label": "aa747daa25d440d1", - "objects.sys_oauth_refresh_token.fields.rotation_replay_expires_at.help": "7f5925e4b2d73586", - "objects.sys_oauth_refresh_token.fields.rotation_replay_expires_at.label": "f6a0bbe6ef73bded", - "objects.sys_oauth_refresh_token.fields.rotation_replay_response.help": "ea6d3f140afbbca7", - "objects.sys_oauth_refresh_token.fields.rotation_replay_response.label": "ddf6cf0ccba55c30", - "objects.sys_oauth_resource.description": "3c7f0cfae5b1a887", - "objects.sys_oauth_resource.fields.access_token_ttl.help": "293dc402a9669032", - "objects.sys_oauth_resource.fields.access_token_ttl.label": "afebf5750ed4d9ee", - "objects.sys_oauth_resource.fields.allowed_scopes.help": "af9195bf5efc4b27", - "objects.sys_oauth_resource.fields.allowed_scopes.label": "1a3202eecb314841", - "objects.sys_oauth_resource.fields.created_at.label": "1f02d416befb595b", - "objects.sys_oauth_resource.fields.custom_claims.help": "0afe2b2a099c7813", - "objects.sys_oauth_resource.fields.custom_claims.label": "c6182d11456325c4", - "objects.sys_oauth_resource.fields.disabled.label": "639459b8a7bbec04", - "objects.sys_oauth_resource.fields.dpop_bound_access_tokens_required.help": "d82b668d32d9d48f", - "objects.sys_oauth_resource.fields.dpop_bound_access_tokens_required.label": "715d383f9fc4fcfb", "objects.sys_oauth_resource.fields.id.label": "00b0385c9c152888", - "objects.sys_oauth_resource.fields.identifier.help": "b69d2662e0438576", - "objects.sys_oauth_resource.fields.identifier.label": "85b28b4a09f37cd0", - "objects.sys_oauth_resource.fields.metadata.help": "896f351a40678f21", - "objects.sys_oauth_resource.fields.metadata.label": "9cabc04013c80ef3", - "objects.sys_oauth_resource.fields.name.label": "5274417ff1ccaf01", - "objects.sys_oauth_resource.fields.policy_version.help": "18b93d988a1d6107", - "objects.sys_oauth_resource.fields.policy_version.label": "55fdeadcaba6cd2a", - "objects.sys_oauth_resource.fields.refresh_token_ttl.help": "9bbb700667d7cee7", - "objects.sys_oauth_resource.fields.refresh_token_ttl.label": "e4b35b5501ac588f", - "objects.sys_oauth_resource.fields.signing_algorithm.help": "3f8231cc5435a673", - "objects.sys_oauth_resource.fields.signing_algorithm.label": "c26616cf69746887", - "objects.sys_oauth_resource.fields.signing_key_id.help": "8504e8cddac3b67c", - "objects.sys_oauth_resource.fields.signing_key_id.label": "50da11ac4977fa58", - "objects.sys_oauth_resource.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_oauth_resource.label": "5077fa14e8d7418e", - "objects.sys_oauth_resource.pluralLabel": "1c6ad6e11287866f", - "objects.sys_organization.fields.parent_organization_id.help": "2ad4ebe3782901b9", - "objects.sys_organization.fields.parent_organization_id.label": "24129608643b897f", - "objects.sys_organization.fields.sort_order.help": "7355b98a96f85dfc", - "objects.sys_organization.fields.sort_order.label": "5f6b33fdc89e9d9f", - "objects.sys_scim_connection_binding._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_connection_binding.description": "b895133352f6681c", - "objects.sys_scim_connection_binding.fields.connection_id.help": "034eb7d93a212da1", - "objects.sys_scim_connection_binding.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_connection_binding.fields.connection_key.help": "7df9975f32bdf0bc", - "objects.sys_scim_connection_binding.fields.connection_key.label": "d6f7536848750bc1", - "objects.sys_scim_connection_binding.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_connection_binding.fields.decommission_batch_count.label": "69d0d27bdfad1158", - "objects.sys_scim_connection_binding.fields.decommission_completed_at.label": "4b4367514668f16b", - "objects.sys_scim_connection_binding.fields.decommission_cursor_user_id.help": "1d826764513040e4", - "objects.sys_scim_connection_binding.fields.decommission_cursor_user_id.label": "05a4591457a4e80f", - "objects.sys_scim_connection_binding.fields.decommission_lease_expires_at.label": "8593f0a433758002", - "objects.sys_scim_connection_binding.fields.decommission_lease_id.help": "4baba8767b4bd19d", - "objects.sys_scim_connection_binding.fields.decommission_lease_id.label": "3f5bbd3bde910338", - "objects.sys_scim_connection_binding.fields.decommission_reconciled_user_count.label": "bc1a74ac6ea6dc87", - "objects.sys_scim_connection_binding.fields.decommission_revision.help": "08fc0bb780421ed4", - "objects.sys_scim_connection_binding.fields.decommission_revision.label": "a017c828e4cc0b22", - "objects.sys_scim_connection_binding.fields.decommission_status.help": "f766f15ae7b4e26e", - "objects.sys_scim_connection_binding.fields.decommission_status.label": "7d49c647b4e1e843", - "objects.sys_scim_connection_binding.fields.decommissioned_at.label": "912fef87cf041169", "objects.sys_scim_connection_binding.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_connection_binding.fields.provisioning_domain_id.help": "16baa93cc3b3ca9e", - "objects.sys_scim_connection_binding.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_connection_binding.label": "a86dce83ff9ae560", - "objects.sys_scim_connection_binding.pluralLabel": "074d8c7e8bd7e51b", - "objects.sys_scim_connection_credential._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_connection_credential.description": "e298fae44c1fb26b", - "objects.sys_scim_connection_credential.fields.active.help": "f1bb8af835e80434", - "objects.sys_scim_connection_credential.fields.active.label": "eee107cf4e466779", - "objects.sys_scim_connection_credential.fields.connection_id.help": "e12a9e64684333ba", - "objects.sys_scim_connection_credential.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_connection_credential.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_connection_credential.fields.expires_at.help": "219771cb7e23e7f0", - "objects.sys_scim_connection_credential.fields.expires_at.label": "df0ef5fae02b2044", "objects.sys_scim_connection_credential.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_connection_credential.fields.label.help": "4c9becbaf107e198", - "objects.sys_scim_connection_credential.fields.label.label": "c680364257b11569", - "objects.sys_scim_connection_credential.fields.organization_id.help": "6b3f4cd8ef844bc5", - "objects.sys_scim_connection_credential.fields.organization_id.label": "3e55836156e1c1de", - "objects.sys_scim_connection_credential.fields.provisioning_domain_id.help": "dbcc622262a32b57", - "objects.sys_scim_connection_credential.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_connection_credential.fields.token_digest.help": "657e4fa81f3972f5", - "objects.sys_scim_connection_credential.fields.token_digest.label": "4373e0d7f2686878", - "objects.sys_scim_connection_credential.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_connection_credential.fields.user_id.help": "d960168361e9bf6a", - "objects.sys_scim_connection_credential.fields.user_id.label": "31bf172b446396d0", - "objects.sys_scim_connection_credential.label": "115ec12ad3c5cd52", - "objects.sys_scim_connection_credential.pluralLabel": "dc5e36622fb23f62", - "objects.sys_scim_group._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_group.description": "2cefe59ab8f2d6a2", - "objects.sys_scim_group.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_group.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_group.fields.display_name.help": "9dfb190daeafc7ca", - "objects.sys_scim_group.fields.display_name.label": "5512fceb5183fd1f", - "objects.sys_scim_group.fields.display_name_key.help": "44628861d6565776", - "objects.sys_scim_group.fields.display_name_key.label": "ce0b9207c2a0b3e2", - "objects.sys_scim_group.fields.external_id.help": "6f779f6f163b3028", - "objects.sys_scim_group.fields.external_id.label": "b81498d9908b2ed1", - "objects.sys_scim_group.fields.external_id_key.help": "d91a6810e74d9d74", - "objects.sys_scim_group.fields.external_id_key.label": "70076aa519914607", "objects.sys_scim_group.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_group.fields.order_key.help": "d19cba034fc15454", - "objects.sys_scim_group.fields.order_key.label": "929e5f874fa283d5", - "objects.sys_scim_group.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_group.fields.revision.help": "9a4a009aaad3d9f7", - "objects.sys_scim_group.fields.revision.label": "9736a257b7ba380b", - "objects.sys_scim_group.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_group.label": "b1e8cffa120eaaf3", - "objects.sys_scim_group.pluralLabel": "041e7e49c26e6e23", - "objects.sys_scim_group_member._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_group_member.description": "5da1f5a9f6c74dce", - "objects.sys_scim_group_member.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_group_member.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_group_member.fields.group_id.label": "588222bcabb4c16e", "objects.sys_scim_group_member.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_group_member.fields.membership_key.help": "127024a3ec9d4924", - "objects.sys_scim_group_member.fields.membership_key.label": "8fcb9f17bcc8cae9", - "objects.sys_scim_group_member.fields.scim_user_id.label": "ff9e9e3696e17ae8", - "objects.sys_scim_group_member.label": "a15085ccdbba4e72", - "objects.sys_scim_group_member.pluralLabel": "3f643c5a50a46d0d", - "objects.sys_scim_identity_tombstone._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_identity_tombstone.description": "e0c9699fda63d907", - "objects.sys_scim_identity_tombstone.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_identity_tombstone.fields.deleted_at.label": "ecae63a743df29cd", - "objects.sys_scim_identity_tombstone.fields.external_id.help": "62b69d5bd951252c", - "objects.sys_scim_identity_tombstone.fields.external_id.label": "b81498d9908b2ed1", - "objects.sys_scim_identity_tombstone.fields.external_id_key.help": "d91a6810e74d9d74", - "objects.sys_scim_identity_tombstone.fields.external_id_key.label": "70076aa519914607", "objects.sys_scim_identity_tombstone.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_identity_tombstone.fields.profile.help": "d11763773ca4c440", - "objects.sys_scim_identity_tombstone.fields.profile.label": "b174cad0a9c78e11", - "objects.sys_scim_identity_tombstone.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_identity_tombstone.fields.user_id.help": "b4c468629790014b", - "objects.sys_scim_identity_tombstone.fields.user_id.label": "6c0d22a931e235bd", - "objects.sys_scim_identity_tombstone.label": "1c70519325beeb22", - "objects.sys_scim_identity_tombstone.pluralLabel": "525ddcdf78b4ed15", - "objects.sys_scim_projection_grant._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_projection_grant.description": "8603e83095133dee", - "objects.sys_scim_projection_grant.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_projection_grant.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_projection_grant.fields.grant_key.help": "d55c81e0237a4286", - "objects.sys_scim_projection_grant.fields.grant_key.label": "c5fbfa14170b0a49", "objects.sys_scim_projection_grant.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_projection_grant.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_projection_grant.fields.role.help": "5c3718daca38e97e", - "objects.sys_scim_projection_grant.fields.role.label": "6e45203a573cd5ab", - "objects.sys_scim_projection_grant.fields.scim_user_id.help": "da657b19880f3536", - "objects.sys_scim_projection_grant.fields.scim_user_id.label": "ff9e9e3696e17ae8", - "objects.sys_scim_projection_grant.fields.source_id.help": "ba8fcdf2adba6295", - "objects.sys_scim_projection_grant.fields.source_id.label": "9764aa679981804c", - "objects.sys_scim_projection_grant.fields.source_kind.help": "fbf04bdf23967c33", - "objects.sys_scim_projection_grant.fields.source_kind.label": "44c76b7b2471dd7c", - "objects.sys_scim_projection_grant.fields.source_value.help": "eb7d8b2966e31fb1", - "objects.sys_scim_projection_grant.fields.source_value.label": "5699bf94c3a3d655", - "objects.sys_scim_projection_grant.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_projection_grant.fields.user_id.help": "e1e49423749a2d12", - "objects.sys_scim_projection_grant.fields.user_id.label": "6c0d22a931e235bd", - "objects.sys_scim_projection_grant.label": "fbf273320dc0e8cb", - "objects.sys_scim_projection_grant.pluralLabel": "b8bb5769deedfbe3", - "objects.sys_scim_subject._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_subject.description": "8fc839e493ef3e75", - "objects.sys_scim_subject.fields.created_at.label": "1f02d416befb595b", "objects.sys_scim_subject.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_subject.fields.profile_source_id.help": "c109ad373576afe5", - "objects.sys_scim_subject.fields.profile_source_id.label": "6a263b010b51ecd1", - "objects.sys_scim_subject.fields.revision.help": "9a4a009aaad3d9f7", - "objects.sys_scim_subject.fields.revision.label": "9736a257b7ba380b", - "objects.sys_scim_subject.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_subject.fields.user_id.help": "6798a366e9db4bb8", - "objects.sys_scim_subject.fields.user_id.label": "6c0d22a931e235bd", - "objects.sys_scim_subject.label": "350900f1977ecb7f", - "objects.sys_scim_subject.pluralLabel": "6ae4d4963680cee7", - "objects.sys_scim_user._views.all.label": "6d6f653f8264ab17", - "objects.sys_scim_user.description": "efe9c1a95d6eeb8e", - "objects.sys_scim_user.fields.active.help": "d82a2ec5aebe530f", - "objects.sys_scim_user.fields.active.label": "eee107cf4e466779", - "objects.sys_scim_user.fields.connection_id.help": "e18a3d5a0d3d1ac8", - "objects.sys_scim_user.fields.connection_id.label": "0208b246b41cd035", - "objects.sys_scim_user.fields.connection_user_key.help": "efb51acc3fea954a", - "objects.sys_scim_user.fields.connection_user_key.label": "58622a8cc908c01e", - "objects.sys_scim_user.fields.created_at.label": "1f02d416befb595b", - "objects.sys_scim_user.fields.display_name.label": "5512fceb5183fd1f", - "objects.sys_scim_user.fields.email_value_index.help": "4f3c5b1f20c870be", - "objects.sys_scim_user.fields.email_value_index.label": "b31d7d6d561bcde3", - "objects.sys_scim_user.fields.external_id.help": "6f779f6f163b3028", - "objects.sys_scim_user.fields.external_id.label": "b81498d9908b2ed1", - "objects.sys_scim_user.fields.external_id_key.help": "d91a6810e74d9d74", - "objects.sys_scim_user.fields.external_id_key.label": "70076aa519914607", - "objects.sys_scim_user.fields.family_name.label": "9190adafe369fb71", - "objects.sys_scim_user.fields.formatted_name.label": "90c57aa3a7dfffd6", - "objects.sys_scim_user.fields.given_name.label": "055d37cebecaf97e", "objects.sys_scim_user.fields.id.label": "00b0385c9c152888", - "objects.sys_scim_user.fields.order_key.help": "d19cba034fc15454", - "objects.sys_scim_user.fields.order_key.label": "929e5f874fa283d5", - "objects.sys_scim_user.fields.primary_email.label": "15da02d3854d82c1", - "objects.sys_scim_user.fields.provisioning_domain_id.label": "d3da6908c7123b00", - "objects.sys_scim_user.fields.serialized_attributes.help": "e865a06565b3e303", - "objects.sys_scim_user.fields.serialized_attributes.label": "93c3785f905ff51e", - "objects.sys_scim_user.fields.serialized_emails.help": "5eea0721c9a26b9c", - "objects.sys_scim_user.fields.serialized_emails.label": "100eb0a58d7c9d5a", - "objects.sys_scim_user.fields.updated_at.label": "aba63dc2a9c79b8d", - "objects.sys_scim_user.fields.user_id.help": "8d35db5208c6bdf4", - "objects.sys_scim_user.fields.user_id.label": "6c0d22a931e235bd", - "objects.sys_scim_user.fields.user_name.help": "a72cc81d09cd66b6", - "objects.sys_scim_user.fields.user_name.label": "bf59c7fd3e98bc55", - "objects.sys_scim_user.fields.user_name_key.help": "72b94b4a5964572b", - "objects.sys_scim_user.fields.user_name_key.label": "632218ca52daf77b", - "objects.sys_scim_user.fields.work_email_value_index.help": "4f3c5b1f20c870be", - "objects.sys_scim_user.fields.work_email_value_index.label": "8d37193924db29c7", - "objects.sys_scim_user.label": "ff9e9e3696e17ae8", - "objects.sys_scim_user.pluralLabel": "b8538685c24f5084", - "objects.sys_secret._views.all.label": "20d032bd60c81773", "objects.sys_secret.fields.id.label": "00b0385c9c152888", - "objects.sys_session.fields.last_activity_at.help": "f7851e9373505e73", - "objects.sys_session.fields.last_activity_at.label": "43bd2f1b231bc12b", - "objects.sys_session.fields.revoke_reason.help": "fcd18baf6b341b7f", - "objects.sys_session.fields.revoke_reason.label": "13b0146153a2ecf8", - "objects.sys_session.fields.revoked_at.help": "77a508fdceda2f6d", - "objects.sys_session.fields.revoked_at.label": "054f918e632528c7", - "objects.sys_setting_audit._views.recent.label": "62d27bb9d0349c99", "objects.sys_setting_audit.fields.id.label": "00b0385c9c152888", "objects.sys_setting_audit.fields.source.options.api": "4baeeff968e192d1", "objects.sys_setting_audit.fields.source.options.ui": "95caad102a5c97ba", @@ -388,17 +60,5 @@ export const jaJPGeneratedSourceHashes: Readonly> = { "objects.sys_sso_provider._actions.register_sso_provider.params.mapName.placeholder": "a484c34aaf624bd6", "objects.sys_sso_provider._actions.register_sso_provider.params.scopes.placeholder": "58ac90cde28c764d", "objects.sys_sso_provider.fields.id.label": "00b0385c9c152888", - "objects.sys_team.fields.member_count.help": "498d7d7119ffff12", - "objects.sys_team.fields.member_count.label": "7bb48f7c92af14e0", - "objects.sys_team_member.fields.membership_key.help": "08a5017306c3ac4e", - "objects.sys_team_member.fields.membership_key.label": "8fcb9f17bcc8cae9", - "objects.sys_two_factor.fields.failed_verification_count.help": "8cea41d6de7f4d5a", - "objects.sys_two_factor.fields.failed_verification_count.label": "e0438d2e39cb0500", - "objects.sys_two_factor.fields.locked_until.help": "059956062c752f2c", - "objects.sys_two_factor.fields.locked_until.label": "c7f013ad9b7208d2", - "objects.sys_two_factor.fields.verified.help": "0d351ba4c31608c2", - "objects.sys_two_factor.fields.verified.label": "866e3a245ef04734", - "objects.sys_user.fields.manager_id.help": "a53dec9ccd9d131f", - "objects.sys_user.fields.primary_business_unit_id.help": "e01690f4a9b83956", "objects.sys_view_definition.fields.id.label": "00b0385c9c152888", }; diff --git a/packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts b/packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts index d6a8b4dbbe4..6525a44bd03 100644 --- a/packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts +++ b/packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts @@ -1291,29 +1291,22 @@ describe('#19403 round 10 — ⚠️⚠️ the phantom-translation trap, asserte } }); - it('⭐ the near-twin that was LOOKED UP AND REFUSED is asserted to be a fill, not a decision', () => { + it('⭐ the near-twin that was LOOKED UP AND REFUSED is authored in every locale, never a standing echo', () => { // `Access Token TTL` was byte-identical in all three locales and read like a // standing decision to keep TTL verbatim. It was an unauthored fill in every // locale, and the provenance tables said so. Asserted so that no later round - // leans on it. #20462 then AUTHORED the zh-CN leaf (访问令牌 TTL): the - // concept is rendered and the initialism survives, the same treatment the - // lifecycle rows give TTL. ja-JP and es-ES are still fills. + // leans on it. #20462 then AUTHORED the zh-CN leaf (访问令牌 TTL) and #20493 + // the ja-JP (アクセストークン TTL) and es-ES (TTL del token de acceso) ones: + // the concept is rendered and the initialism survives, the same treatment + // the lifecycle rows give TTL. const key = 'sys_oauth_resource.fields.access_token_ttl.label'; const en = FLAT_OBJECTS.get('en')!.get(key); expect(en).toBe('Access Token TTL'); for (const [locale, table] of PROVENANCE) { const value = FLAT_OBJECTS.get(locale)!.get(key); - if (locale === 'zh-CN') { - expect(value, `${locale} ${key} reads its en source again`).not.toBe(en); - expect(carriesToken(value!, 'TTL'), `${locale} dropped the machine token`).toBe(true); - expect(table[`objects.${key}`], `${locale} still records the authored ${key} as a fill`).toBeUndefined(); - continue; - } - expect(value, `${locale} ${key}`).toBe(en); - expect( - table[`objects.${key}`], - `${locale} no longer records ${key} as a fill — if a translator authored it, this ledger note is stale`, - ).toBeTypeOf('string'); + expect(value, `${locale} ${key} reads its en source again`).not.toBe(en); + expect(carriesToken(value!, 'TTL'), `${locale} dropped the machine token`).toBe(true); + expect(table[`objects.${key}`], `${locale} still records the authored ${key} as a fill`).toBeUndefined(); } }); }); diff --git a/packages/platform-objects/src/apps/translations/objects-es-es-echo-decisions.test.ts b/packages/platform-objects/src/apps/translations/objects-es-es-echo-decisions.test.ts new file mode 100644 index 00000000000..7b1377fc36a --- /dev/null +++ b/packages/platform-objects/src/apps/translations/objects-es-es-echo-decisions.test.ts @@ -0,0 +1,357 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. +// +// #20493 — the DECISION LEDGER for the es-ES `objects` bundle's en-echoes. +// +// An en-echo is not automatically a defect: a leaf that reads its English +// source may be an unauthored extractor fill, or it may be the right rendering +// for that locale. The two are byte-identical, so the distinction cannot be +// recovered from the catalog later — it has to be RECORDED when someone looks. +// `objects-zh-cn-echo-decisions.test.ts` keeps that record for zh-CN; this file +// is the same record, in the same shape, for es-ES: `Verdict` per row, a reason +// for every row, and a per-locale `departure` for every `echo`. Each locale +// decides its own set — the zh-CN set was where reading started, not a list +// copied over. +// +// ## What was decided, and where it was measured +// +// Walk of `en.objects.generated.ts` against `es-ES.objects.generated.ts` at +// base 397572ed5, counting every string leaf byte-equal to its `en` leaf +// (1529 leaves in each bundle): +// +// before 392 copies — `label` 217 · `options.*` 22 · `pluralLabel` 12 · +// `help` 121 · `description` 12 · `placeholder` 4 · +// `emptyState.*` 4 +// after 54 copies — every one of them a row below with verdict `echo` +// +// The other 338 were extractor fills and are translated. The extractor files a +// field's `help` / `description` / `placeholder` under the same `source` kind +// as its `label` (`ExpectedEntry.source` in `packages/cli/src/utils/ +// i18n-extract.ts`), so they were decided as the same class. +// +// Where es-ES departs from zh-CN, and why: +// - the result dialog's `Client ID` / `Client Secret` and the SAML +// `IdP SSO URL` were never copies here: this bundle authored them; +// - the register dialog's `Web` option stays `Web`, because this bundle +// already renders the sibling `fields.type.options.web` as Web; +// - fourteen leaves are Spanish as written. Eight are words Spanish spells +// exactly as English (Error, Actor, Global, Variables); five are the +// loanwords this bundle already uses for the concept (Token, Checksum, +// Slug); and `Cc` is the Spanish copy abbreviation beside its authored +// blind-copy sibling `Cco`. +// +// Per-leaf witness: the package's provenance table +// (`es-ES.source-hashes.generated.ts`) holds an entry exactly while a leaf is +// still a byte copy of its source revision. `pnpm i18n:extract` dropped the 338 +// rows for the translated leaves and kept 54 rows, one per echo below (measured +// equal at the time). What is asserted is one direction per verdict: every +// declared echo still has its row, and no pinned translation has one. That the +// table holds nothing BEYOND the echoes is not asserted, for the reason the +// next section gives. +// +// ## What this file deliberately does NOT assert +// +// That no OTHER es-ES objects leaf reads its `en` source. A new field's label +// arrives in every translated locale as a `--fill=default` copy, so that +// assertion would red every future PR that adds a platform-object field without +// an es-ES word. It is the coverage-ratchet half, which the triage kept out of +// this card: widening a gate is a separate decision. +// +// ⛔ Do not add a row here to make a red go away. A row is a decision someone +// took about one leaf; the `echo` verdict needs its own reason precisely so that +// recording "the English is right here" costs a sentence. + +import { describe, it, expect } from 'vitest'; + +import { enObjects } from './en.objects.generated.js'; +import { esESObjects } from './es-ES.objects.generated.js'; +import { esESGeneratedSourceHashes } from './es-ES.source-hashes.generated.js'; +import { hashSource } from './source-hash.js'; + +const LOCALE = 'es-ES'; + +/** `translate` — the echo was an unauthored fill. `echo` — the English IS the rendering. */ +type Verdict = 'translate' | 'echo'; + +interface Decision { + /** Dotted leaf path under `objects`. */ + path: string; + /** + * The `en` source the verdict was taken against. Held equal to the live + * bundle, so a reworded source reds this file instead of leaving a decision + * standing over text nobody judged. + */ + en: string; + /** The verdict for es-ES. */ + verdict: Verdict; + /** Why — recorded for `translate` as much as for `echo`. */ + reason: string; + /** Required for every `echo` verdict: why the English is right in es-ES. */ + departure?: string; +} + +const BRAND = + 'A sign-in provider brand, shown as the name a user recognises on the link button. This bundle renders no brand name: the authored SSO empty state keeps Okta, Entra and Auth0 verbatim.'; +const BARE_ID = + 'The bare initialism ID. This bundle keeps ID verbatim inside every label that carries it (ID de usuario, ID de organización, ID de cliente); a bare en ID has no noun to render, and adding one would invent content.'; +const JWKS = + 'A protocol name (the RFC 7517 JWK Set) that this bundle keeps verbatim: sys_jwks is authored as Clave de firma (JWKS), and every URI stays URI (URI de redirección).'; +const WEB_CLIENT_TYPE = + 'The web client type as this bundle already renders it: the sibling option sys_oauth_application.fields.type.options.web is authored as Web, so the register dialog and the record field read one word.'; +const TYPED_CLAIM = + 'A placeholder shows the literal value the admin types: OIDC scope and claim names the IdP matches byte for byte. The authored help on the same param keeps them verbatim (Valor predeterminado: «email»).'; +const TYPED_URN = + 'A placeholder shows the literal value the admin types, here the SAML NameID format URN: an identifier matched byte for byte, not prose.'; +const MESSAGE_ID = + 'The RFC 5322 header name. The authored help on the same field keeps it verbatim (Message-ID RFC-5322 asignado por el transporte).'; +const COPY_HEADER = + 'The Spanish copy-recipient abbreviation (con copia) is spelled Cc as well; the blind-copy sibling on the same record is authored as its Spanish form, Cco.'; +const CHANNEL_INITIALISM = + 'An initialism this bundle keeps verbatim wherever it appears (nunca se muestra en la UI; sys_metadata.fields.source.options.api is authored as API); the option names the channel a setting change came through.'; +const SAME_WORD_ERROR = + 'Spanish spells the word exactly as English (el error); this bundle already writes it so in the authored label Último error on sys_job_queue.'; +const SAME_WORD_ACTOR = + 'Spanish spells the word exactly as English (el actor); this bundle already writes it so in authored help (Último actor que escribió esta fila), and the messaging bundle authors its actor label as Actor.'; +const SAME_WORD_GLOBAL = + 'Spanish spells the word exactly as English (global); the security bundle already writes it so in authored help (nulo = global (entre inquilinos)), beside the authored sibling scope options Inquilino and Usuario.'; +const SAME_WORD_VARIABLES = + 'Spanish spells the word exactly as English (las variables); the authored description of this same object already says (asunto + contenido + variables).'; +const BUNDLE_LOANWORD = + 'The loanword this bundle already uses for the concept, so one term is not rendered two ways: Token de sesión and Token de acceso (token), Checksum anterior (checksum), Cambiar slug (slug).'; + +function echo(path: string, en: string, departure: string): Decision { + return { + path, + en, + verdict: 'echo', + reason: 'Kept as written by design: a brand, protocol or typed value, or a word es-ES already spells this way.', + departure, + }; +} + +const DECISIONS: readonly Decision[] = [ + // ── The card's named strings (three leaves), pinned translated ─────────── + { + path: 'sys_member.fields.role.options.delegated_admin', + en: 'Delegated Admin', + verdict: 'translate', + reason: + 'Read from the bundle, not re-driven in a browser: the membership role list rendered Propietario / Administrador / Delegated Admin / Miembro. Rendered with the word the console already uses for this role value.', + }, + { + path: 'sys_invitation.fields.role.options.delegated_admin', + en: 'Delegated Admin', + verdict: 'translate', + reason: + 'The option list the Invite user dialog reads. The same word as the sys_member row, asserted below, so one role is not translated two ways.', + }, + { + path: 'sys_team.fields.member_count.label', + en: 'Member Count', + verdict: 'translate', + reason: 'The team record page field zh-CN reproduced as MEMBER COUNT: an ordinary field label an admin reads, an unauthored fill.', + }, + + // ── Kept as written by design (54) ─────────────────────────────────────── + echo('sys_account._actions.link_social.params.provider.options.google', 'Google', BRAND), + echo('sys_account._actions.link_social.params.provider.options.github', 'GitHub', BRAND), + echo('sys_account._actions.link_social.params.provider.options.microsoft', 'Microsoft', BRAND), + echo('sys_account._actions.link_social.params.provider.options.apple', 'Apple', BRAND), + echo('sys_account._actions.link_social.params.provider.options.facebook', 'Facebook', BRAND), + echo('sys_account._actions.link_social.params.provider.options.gitlab', 'GitLab', BRAND), + echo('sys_account._actions.link_social.params.provider.options.discord', 'Discord', BRAND), + + echo('sys_oauth_application.fields.jwks.label', 'JWKS', JWKS), + echo('sys_oauth_application.fields.jwks_uri.label', 'JWKS URI', JWKS), + echo('sys_oauth_application._actions.create_oauth_application.params.type.options.web', 'Web', WEB_CLIENT_TYPE), + + echo('sys_sso_provider._actions.register_sso_provider.params.scopes.placeholder', 'openid email profile', TYPED_CLAIM), + echo('sys_sso_provider._actions.register_sso_provider.params.mapEmail.placeholder', 'email', TYPED_CLAIM), + echo('sys_sso_provider._actions.register_sso_provider.params.mapName.placeholder', 'name', TYPED_CLAIM), + echo( + 'sys_sso_provider._actions.register_saml_provider.params.identifierFormat.placeholder', + 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', + TYPED_URN, + ), + + echo('sys_email.fields.message_id.label', 'Message-ID', MESSAGE_ID), + echo('sys_email.fields.cc_addresses.label', 'Cc', COPY_HEADER), + echo('sys_setting_audit.fields.source.options.ui', 'UI', CHANNEL_INITIALISM), + echo('sys_setting_audit.fields.source.options.api', 'API', CHANNEL_INITIALISM), + + echo('sys_email.fields.error.label', 'Error', SAME_WORD_ERROR), + echo('sys_job_run.fields.error.label', 'Error', SAME_WORD_ERROR), + echo('sys_notification.fields.actor_id.label', 'Actor', SAME_WORD_ACTOR), + echo('sys_metadata_audit.fields.actor.label', 'Actor', SAME_WORD_ACTOR), + echo('sys_setting_audit.fields.actor_id.label', 'Actor', SAME_WORD_ACTOR), + echo('sys_setting.fields.scope.options.global', 'Global', SAME_WORD_GLOBAL), + echo('sys_setting_audit.fields.scope.options.global', 'Global', SAME_WORD_GLOBAL), + echo('sys_email_template.fields.variables_json.label', 'Variables (JSON)', SAME_WORD_VARIABLES), + + echo('sys_oauth_access_token.fields.token.label', 'Token', BUNDLE_LOANWORD), + echo('sys_oauth_refresh_token.fields.token.label', 'Token', BUNDLE_LOANWORD), + echo('sys_metadata.fields.checksum.label', 'Checksum', BUNDLE_LOANWORD), + echo('sys_metadata_history.fields.checksum.label', 'Checksum', BUNDLE_LOANWORD), + echo('sys_organization.fields.slug.label', 'Slug', BUNDLE_LOANWORD), + + ...[ + 'sys_oauth_application', + 'sys_oauth_access_token', + 'sys_oauth_refresh_token', + 'sys_oauth_consent', + 'sys_oauth_resource', + 'sys_oauth_client_resource', + 'sys_oauth_client_assertion', + 'sys_sso_provider', + 'sys_scim_connection_binding', + 'sys_scim_connection_credential', + 'sys_scim_group', + 'sys_scim_group_member', + 'sys_scim_identity_tombstone', + 'sys_scim_projection_grant', + 'sys_scim_subject', + 'sys_scim_user', + 'sys_email_template', + 'sys_metadata', + 'sys_metadata_history', + 'sys_view_definition', + 'sys_metadata_audit', + 'sys_secret', + 'sys_setting_audit', + ].map((object) => echo(`${object}.fields.id.label`, 'ID', BARE_ID)), +]; + +/** Every string leaf of a bundle, keyed by its dotted path. */ +function flatten(node: unknown, prefix = '', out = new Map()): Map { + if (typeof node === 'string') { + out.set(prefix, node); + } else if (node && typeof node === 'object') { + for (const [k, v] of Object.entries(node)) flatten(v, prefix ? `${prefix}.${k}` : k, out); + } + return out; +} + +const EN = flatten(enObjects); +const ES = flatten(esESObjects); + +/** + * Every `echo` verdict that carries no departure reason. A predicate rather + * than an inlined loop so the suite can prove it FIRES. + */ +function undeclaredEchoes(rows: readonly Decision[]): string[] { + return rows.filter((d) => d.verdict === 'echo' && (d.departure ?? '').length <= 40).map((d) => d.path); +} + +describe('#20493 es-ES — the ledger itself (controls before verdicts)', () => { + it('is the size it claims: 3 pinned translations and 54 declared echoes, no path twice', () => { + expect(DECISIONS.length).toBe(57); + expect(DECISIONS.filter((d) => d.verdict === 'translate').length).toBe(3); + expect(DECISIONS.filter((d) => d.verdict === 'echo').length).toBe(54); + expect(new Set(DECISIONS.map((d) => d.path)).size).toBe(DECISIONS.length); + }); + + it('every row is pinned to the live `en` source it was decided against', () => { + for (const d of DECISIONS) { + expect(EN.get(d.path), `en ${d.path} moved — re-judge the decision, do not refresh this row`).toBe(d.en); + } + }); + + it('the echo predicate can say "echo" — fed the `en` catalog, it flags every row', () => { + // Dark. `value === en` is the whole verdict test below; run it against the + // source catalog itself and it must hold for every row, or a green verdict + // run means nothing. + const flagged = DECISIONS.filter((d) => EN.get(d.path) === d.en); + expect(flagged.length).toBe(DECISIONS.length); + }); + + it('every decision records a reason, and every `echo` its departure', () => { + for (const d of DECISIONS) { + expect(d.reason.length, `${d.path} records no reason`).toBeGreaterThan(40); + } + expect(undeclaredEchoes(DECISIONS), 'a declared echo here carries no departure reason').toEqual([]); + }); + + it('refuses an `echo` verdict that carries no departure — proved on a synthetic row', () => { + const synthetic: Decision = { + path: 'sys_team.fields.member_count.label', + en: 'Member Count', + verdict: 'echo', + reason: 'A synthetic row that exists only to prove this file can refuse an undeclared echo.', + }; + expect(undeclaredEchoes([synthetic])).toEqual(['sys_team.fields.member_count.label']); + expect( + undeclaredEchoes([ + { ...synthetic, departure: 'A departure reason long enough to satisfy the rule, standing in for a real one.' }, + ]), + ).toEqual([]); + }); +}); + +describe('#20493 es-ES — the catalog holds what the ledger decided', () => { + it('every decided leaf matches its verdict', () => { + for (const d of DECISIONS) { + const id = `${LOCALE} ${d.path}`; + const value = ES.get(d.path); + expect(typeof value, `${id} is missing from the catalog`).toBe('string'); + expect((value as string).length, `${id} is empty`).toBeGreaterThan(0); + if (d.verdict === 'translate') { + expect(value, `${id} reads its en source again — the decision was that this echo is a fill`).not.toBe(d.en); + } else { + expect(value, `${id} is a declared echo and must stay the en source`).toBe(d.en); + } + } + }); + + it('⭐ the role options read one word per role, on both objects the console lists them from', () => { + // The members list and the Invite user dialog render the same role values + // from two objects, which declare them from one spec constant + // (`BUILTIN_MEMBERSHIP_ROLE_OPTIONS`). One word per role on both. + const roles = (object: string): Record => + (esESObjects as Record)[object].fields.role.options; + const enRoles = (enObjects as Record).sys_member.fields.role.options as Record; + expect(Object.keys(roles('sys_member'))).toContain('delegated_admin'); + expect(roles('sys_invitation')).toEqual(roles('sys_member')); + // DISTINCT words: a copy of one role's word onto another would pass the + // equality above. + const words = Object.values(roles('sys_member')); + expect(new Set(words).size).toBe(words.length); + // No role reads its English source: es-ES has no script to test, so the + // en catalog is the negative. + for (const [role, word] of Object.entries(roles('sys_member'))) { + expect(word, `es-ES role ${role} reads its en source`).not.toBe(enRoles[role]); + } + // The console's own word for this role value — objectui + // `packages/i18n/src/locales/es.ts`, `organization.roles.delegatedAdmin` — + // so the Invite dialog and the console name the role the same way. + expect(roles('sys_member').delegated_admin).toBe('Administrador delegado'); + }); +}); + +describe('#20493 es-ES — the provenance table agrees', () => { + const table = esESGeneratedSourceHashes; + + it('every declared echo is still recorded as a byte copy of its CURRENT source', () => { + // Lit — the table really loaded. + expect(Object.keys(table).length, `${LOCALE} provenance table is empty`).toBeGreaterThan(0); + for (const d of DECISIONS.filter((r) => r.verdict === 'echo')) { + expect(table[`objects.${d.path}`], `${d.path} is a declared echo with no provenance row`).toBe( + hashSource(d.en), + ); + } + }); + + it('no translated row is still recorded as an extractor fill', () => { + const stillFilled = DECISIONS.filter((d) => d.verdict === 'translate' && table[`objects.${d.path}`] !== undefined); + expect(stillFilled.map((d) => d.path)).toEqual([]); + }); + + it('the provenance lookup can say "still a fill" and "authored" — both directions, on this bundle', () => { + // Dark. The verdict above is a run of `undefined`s, which is also what a + // misspelt key shape returns. The echo rows prove the composed key finds a + // real row; a leaf a translator wrote long before this card proves it does + // not find one where there is none. + const echoRow = DECISIONS.find((d) => d.verdict === 'echo')!; + expect(table[`objects.${echoRow.path}`]).toBeTypeOf('string'); + expect(ES.get('sys_user.fields.email.label')).not.toBe(EN.get('sys_user.fields.email.label')); + expect(table['objects.sys_user.fields.email.label']).toBeUndefined(); + }); +}); diff --git a/packages/platform-objects/src/apps/translations/objects-ja-jp-echo-decisions.test.ts b/packages/platform-objects/src/apps/translations/objects-ja-jp-echo-decisions.test.ts new file mode 100644 index 00000000000..6aa17e0307b --- /dev/null +++ b/packages/platform-objects/src/apps/translations/objects-ja-jp-echo-decisions.test.ts @@ -0,0 +1,338 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. +// +// #20493 — the DECISION LEDGER for the ja-JP `objects` bundle's en-echoes. +// +// An en-echo is not automatically a defect: a leaf that reads its English +// source may be an unauthored extractor fill, or it may be the right rendering +// for that locale. The two are byte-identical, so the distinction cannot be +// recovered from the catalog later — it has to be RECORDED when someone looks. +// `objects-zh-cn-echo-decisions.test.ts` keeps that record for zh-CN; this file +// is the same record, in the same shape, for ja-JP: `Verdict` per row, a reason +// for every row, and a per-locale `departure` for every `echo`. Each locale +// decides its own set — the zh-CN set was where reading started, not a list +// copied over. +// +// ## What was decided, and where it was measured +// +// Walk of `en.objects.generated.ts` against `ja-JP.objects.generated.ts` at +// base 397572ed5, counting every string leaf byte-equal to its `en` leaf +// (1529 leaves in each bundle): +// +// before 383 copies — `label` 210 · `options.*` 20 · `pluralLabel` 12 · +// `help` 121 · `description` 12 · `placeholder` 4 · +// `emptyState.*` 4 +// after 43 copies — every one of them a row below with verdict `echo` +// +// The other 340 were extractor fills and are translated. The extractor files a +// field's `help` / `description` / `placeholder` under the same `source` kind +// as its `label` (`ExpectedEntry.source` in `packages/cli/src/utils/ +// i18n-extract.ts`), so they were decided as the same class. +// +// Where ja-JP departs from zh-CN, and why: +// - the result dialog's `Client ID` / `Client Secret` were never copies here: +// this bundle authored them (クライアント ID, クライアントシークレット); +// - the register dialog's `Web` option stays `Web`, because this bundle +// already renders the sibling `fields.type.options.web` as Web; +// - `Cc` / `Bcc` stay as written, the header abbreviations Japanese mail +// clients print in Latin letters, while `Reply-To` is translated (返信先). +// +// Per-leaf witness: the package's provenance table +// (`ja-JP.source-hashes.generated.ts`) holds an entry exactly while a leaf is +// still a byte copy of its source revision. `pnpm i18n:extract` dropped the 340 +// rows for the translated leaves and kept 43 rows, one per echo below (measured +// equal at the time). What is asserted is one direction per verdict: every +// declared echo still has its row, and no pinned translation has one. That the +// table holds nothing BEYOND the echoes is not asserted, for the reason the +// next section gives. +// +// ## What this file deliberately does NOT assert +// +// That no OTHER ja-JP objects leaf reads its `en` source. A new field's label +// arrives in every translated locale as a `--fill=default` copy, so that +// assertion would red every future PR that adds a platform-object field without +// a ja-JP word. It is the coverage-ratchet half, which the triage kept out of +// this card: widening a gate is a separate decision. +// +// ⛔ Do not add a row here to make a red go away. A row is a decision someone +// took about one leaf; the `echo` verdict needs its own reason precisely so that +// recording "the English is right here" costs a sentence. + +import { describe, it, expect } from 'vitest'; + +import { enObjects } from './en.objects.generated.js'; +import { jaJPObjects } from './ja-JP.objects.generated.js'; +import { jaJPGeneratedSourceHashes } from './ja-JP.source-hashes.generated.js'; +import { hashSource } from './source-hash.js'; + +const LOCALE = 'ja-JP'; + +/** Kana or kanji: what a Japanese rendering carries and an en copy never does. */ +const JAPANESE = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]/u; + +/** `translate` — the echo was an unauthored fill. `echo` — the English IS the rendering. */ +type Verdict = 'translate' | 'echo'; + +interface Decision { + /** Dotted leaf path under `objects`. */ + path: string; + /** + * The `en` source the verdict was taken against. Held equal to the live + * bundle, so a reworded source reds this file instead of leaving a decision + * standing over text nobody judged. + */ + en: string; + /** The verdict for ja-JP. */ + verdict: Verdict; + /** Why — recorded for `translate` as much as for `echo`. */ + reason: string; + /** Required for every `echo` verdict: why the English is right in ja-JP. */ + departure?: string; +} + +const BRAND = + 'A sign-in provider brand, shown as the name a user recognises on the link button. This bundle renders no brand name in kana: the authored SSO empty state keeps Okta, Entra and Auth0 verbatim.'; +const BARE_ID = + 'The bare initialism ID. This bundle keeps ID verbatim inside every label that carries it (ユーザー ID, 組織 ID, クライアント ID); a bare en ID has no noun to render, and adding one would invent content.'; +const JWKS = + 'A protocol name (the RFC 7517 JWK Set) that this bundle keeps verbatim: sys_jwks is authored as 署名キー (JWKS), and every URI stays URI (リダイレクト URI).'; +const WEB_CLIENT_TYPE = + 'The web client type as this bundle already renders it: the sibling option sys_oauth_application.fields.type.options.web is authored as Web, so the register dialog and the record field read one word.'; +const IDP_SSO_URL = + 'Nothing but protocol initialisms (IdP, SSO, URL), each of which this bundle keeps verbatim; the sibling SAML params are authored as IdP エンティティ ID and IdP 署名証明書.'; +const TYPED_CLAIM = + 'A placeholder shows the literal value the admin types: OIDC scope and claim names the IdP matches byte for byte. The authored help on the same param keeps them verbatim (既定値は「email」).'; +const TYPED_URN = + 'A placeholder shows the literal value the admin types, here the SAML NameID format URN: an identifier matched byte for byte, not prose.'; +const MESSAGE_ID = + 'The RFC 5322 header name. The authored help on the same field keeps it verbatim (トランスポートが割り当てる RFC-5322 Message-ID).'; +const COPY_HEADER = + 'A copy-recipient header abbreviation that Japanese mail clients print in Latin letters, with no kana or kanji form in use. The prose labels beside it on the same record are authored (送信元, 宛先, 返信先).'; +const CHANNEL_INITIALISM = + 'An initialism this bundle keeps verbatim wherever it appears (API キー, UI には表示されません; sys_metadata.fields.source.options.api is authored as API); the option names the channel a setting change came through.'; + +function echo(path: string, en: string, departure: string): Decision { + return { + path, + en, + verdict: 'echo', + reason: 'Kept in English by design, in the small brand / protocol / typed-value class the triage names.', + departure, + }; +} + +const DECISIONS: readonly Decision[] = [ + // ── The card's named strings (three leaves), pinned translated ─────────── + { + path: 'sys_member.fields.role.options.delegated_admin', + en: 'Delegated Admin', + verdict: 'translate', + reason: + 'Read from the bundle, not re-driven in a browser: the membership role list rendered 所有者 / 管理者 / Delegated Admin / メンバー. Rendered with the word the console already uses for this role value.', + }, + { + path: 'sys_invitation.fields.role.options.delegated_admin', + en: 'Delegated Admin', + verdict: 'translate', + reason: + 'The option list the Invite user dialog reads. The same word as the sys_member row, asserted below, so one role is not translated two ways.', + }, + { + path: 'sys_team.fields.member_count.label', + en: 'Member Count', + verdict: 'translate', + reason: 'The team record page field zh-CN reproduced as MEMBER COUNT: an ordinary field label an admin reads, an unauthored fill.', + }, + + // ── Kept in English by design (43) ─────────────────────────────────────── + echo('sys_account._actions.link_social.params.provider.options.google', 'Google', BRAND), + echo('sys_account._actions.link_social.params.provider.options.github', 'GitHub', BRAND), + echo('sys_account._actions.link_social.params.provider.options.microsoft', 'Microsoft', BRAND), + echo('sys_account._actions.link_social.params.provider.options.apple', 'Apple', BRAND), + echo('sys_account._actions.link_social.params.provider.options.facebook', 'Facebook', BRAND), + echo('sys_account._actions.link_social.params.provider.options.gitlab', 'GitLab', BRAND), + echo('sys_account._actions.link_social.params.provider.options.discord', 'Discord', BRAND), + + echo('sys_oauth_application.fields.jwks.label', 'JWKS', JWKS), + echo('sys_oauth_application.fields.jwks_uri.label', 'JWKS URI', JWKS), + echo('sys_oauth_application._actions.create_oauth_application.params.type.options.web', 'Web', WEB_CLIENT_TYPE), + + echo('sys_sso_provider._actions.register_saml_provider.params.entryPoint.label', 'IdP SSO URL', IDP_SSO_URL), + echo('sys_sso_provider._actions.register_sso_provider.params.scopes.placeholder', 'openid email profile', TYPED_CLAIM), + echo('sys_sso_provider._actions.register_sso_provider.params.mapEmail.placeholder', 'email', TYPED_CLAIM), + echo('sys_sso_provider._actions.register_sso_provider.params.mapName.placeholder', 'name', TYPED_CLAIM), + echo( + 'sys_sso_provider._actions.register_saml_provider.params.identifierFormat.placeholder', + 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', + TYPED_URN, + ), + + echo('sys_email.fields.message_id.label', 'Message-ID', MESSAGE_ID), + echo('sys_email.fields.cc_addresses.label', 'Cc', COPY_HEADER), + echo('sys_email.fields.bcc_addresses.label', 'Bcc', COPY_HEADER), + echo('sys_setting_audit.fields.source.options.ui', 'UI', CHANNEL_INITIALISM), + echo('sys_setting_audit.fields.source.options.api', 'API', CHANNEL_INITIALISM), + + ...[ + 'sys_oauth_application', + 'sys_oauth_access_token', + 'sys_oauth_refresh_token', + 'sys_oauth_consent', + 'sys_oauth_resource', + 'sys_oauth_client_resource', + 'sys_oauth_client_assertion', + 'sys_sso_provider', + 'sys_scim_connection_binding', + 'sys_scim_connection_credential', + 'sys_scim_group', + 'sys_scim_group_member', + 'sys_scim_identity_tombstone', + 'sys_scim_projection_grant', + 'sys_scim_subject', + 'sys_scim_user', + 'sys_email_template', + 'sys_metadata', + 'sys_metadata_history', + 'sys_view_definition', + 'sys_metadata_audit', + 'sys_secret', + 'sys_setting_audit', + ].map((object) => echo(`${object}.fields.id.label`, 'ID', BARE_ID)), +]; + +/** Every string leaf of a bundle, keyed by its dotted path. */ +function flatten(node: unknown, prefix = '', out = new Map()): Map { + if (typeof node === 'string') { + out.set(prefix, node); + } else if (node && typeof node === 'object') { + for (const [k, v] of Object.entries(node)) flatten(v, prefix ? `${prefix}.${k}` : k, out); + } + return out; +} + +const EN = flatten(enObjects); +const JA = flatten(jaJPObjects); + +/** + * Every `echo` verdict that carries no departure reason. A predicate rather + * than an inlined loop so the suite can prove it FIRES. + */ +function undeclaredEchoes(rows: readonly Decision[]): string[] { + return rows.filter((d) => d.verdict === 'echo' && (d.departure ?? '').length <= 40).map((d) => d.path); +} + +describe('#20493 ja-JP — the ledger itself (controls before verdicts)', () => { + it('is the size it claims: 3 pinned translations and 43 declared echoes, no path twice', () => { + expect(DECISIONS.length).toBe(46); + expect(DECISIONS.filter((d) => d.verdict === 'translate').length).toBe(3); + expect(DECISIONS.filter((d) => d.verdict === 'echo').length).toBe(43); + expect(new Set(DECISIONS.map((d) => d.path)).size).toBe(DECISIONS.length); + }); + + it('every row is pinned to the live `en` source it was decided against', () => { + for (const d of DECISIONS) { + expect(EN.get(d.path), `en ${d.path} moved — re-judge the decision, do not refresh this row`).toBe(d.en); + } + }); + + it('the echo predicate can say "echo" — fed the `en` catalog, it flags every row', () => { + // Dark. `value === en` is the whole verdict test below; run it against the + // source catalog itself and it must hold for every row, or a green verdict + // run means nothing. + const flagged = DECISIONS.filter((d) => EN.get(d.path) === d.en); + expect(flagged.length).toBe(DECISIONS.length); + }); + + it('every decision records a reason, and every `echo` its departure', () => { + for (const d of DECISIONS) { + expect(d.reason.length, `${d.path} records no reason`).toBeGreaterThan(40); + } + expect(undeclaredEchoes(DECISIONS), 'a declared echo here carries no departure reason').toEqual([]); + }); + + it('refuses an `echo` verdict that carries no departure — proved on a synthetic row', () => { + const synthetic: Decision = { + path: 'sys_team.fields.member_count.label', + en: 'Member Count', + verdict: 'echo', + reason: 'A synthetic row that exists only to prove this file can refuse an undeclared echo.', + }; + expect(undeclaredEchoes([synthetic])).toEqual(['sys_team.fields.member_count.label']); + expect( + undeclaredEchoes([ + { ...synthetic, departure: 'A departure reason long enough to satisfy the rule, standing in for a real one.' }, + ]), + ).toEqual([]); + }); + + it('the Japanese-script predicate can say "no" — an en copy fails it', () => { + // Dark. The verdict below asks a translated leaf to carry kana or kanji; + // the en source of every pinned row must fail that same test. + for (const d of DECISIONS.filter((r) => r.verdict === 'translate')) expect(d.en).not.toMatch(JAPANESE); + }); +}); + +describe('#20493 ja-JP — the catalog holds what the ledger decided', () => { + it('every decided leaf matches its verdict', () => { + for (const d of DECISIONS) { + const id = `${LOCALE} ${d.path}`; + const value = JA.get(d.path); + expect(typeof value, `${id} is missing from the catalog`).toBe('string'); + expect((value as string).length, `${id} is empty`).toBeGreaterThan(0); + if (d.verdict === 'translate') { + expect(value, `${id} reads its en source again — the decision was that this echo is a fill`).not.toBe(d.en); + expect(value, `${id} carries no Japanese`).toMatch(JAPANESE); + } else { + expect(value, `${id} is a declared echo and must stay the en source`).toBe(d.en); + } + } + }); + + it('⭐ the role options read one word per role, on both objects the console lists them from', () => { + // The members list and the Invite user dialog render the same role values + // from two objects, which declare them from one spec constant + // (`BUILTIN_MEMBERSHIP_ROLE_OPTIONS`). One word per role on both. + const roles = (object: string): Record => + (jaJPObjects as Record)[object].fields.role.options; + expect(Object.keys(roles('sys_member'))).toContain('delegated_admin'); + expect(roles('sys_invitation')).toEqual(roles('sys_member')); + // DISTINCT words: a copy of one role's word onto another would pass the + // equality above. + const words = Object.values(roles('sys_member')); + expect(new Set(words).size).toBe(words.length); + for (const word of words) expect(word).toMatch(JAPANESE); + // The console's own word for this role value — objectui + // `packages/i18n/src/locales/ja.ts`, `organization.roles.delegatedAdmin` — + // so the Invite dialog and the console name the role the same way. + expect(roles('sys_member').delegated_admin).toBe('委任管理者'); + }); +}); + +describe('#20493 ja-JP — the provenance table agrees', () => { + const table = jaJPGeneratedSourceHashes; + + it('every declared echo is still recorded as a byte copy of its CURRENT source', () => { + // Lit — the table really loaded. + expect(Object.keys(table).length, `${LOCALE} provenance table is empty`).toBeGreaterThan(0); + for (const d of DECISIONS.filter((r) => r.verdict === 'echo')) { + expect(table[`objects.${d.path}`], `${d.path} is a declared echo with no provenance row`).toBe( + hashSource(d.en), + ); + } + }); + + it('no translated row is still recorded as an extractor fill', () => { + const stillFilled = DECISIONS.filter((d) => d.verdict === 'translate' && table[`objects.${d.path}`] !== undefined); + expect(stillFilled.map((d) => d.path)).toEqual([]); + }); + + it('the provenance lookup can say "still a fill" and "authored" — both directions, on this bundle', () => { + // Dark. The verdict above is a run of `undefined`s, which is also what a + // misspelt key shape returns. The echo rows prove the composed key finds a + // real row; a leaf a translator wrote long before this card proves it does + // not find one where there is none. + const echoRow = DECISIONS.find((d) => d.verdict === 'echo')!; + expect(table[`objects.${echoRow.path}`]).toBeTypeOf('string'); + expect(JA.get('sys_user.fields.email.label')).not.toBe(EN.get('sys_user.fields.email.label')); + expect(table['objects.sys_user.fields.email.label']).toBeUndefined(); + }); +});