@@ -650,23 +640,23 @@
type="button"
class="fixed inset-0 z-40 bg-slate-900/50"
on:click={() => (removeModalUser = null)}
- aria-label="Close remove access confirmation"
+ aria-label={$_('usersComponent.closeRemoveModal')}
>
-
Remove access
+ {$_('usersComponent.removeModalTitle')}
- Remove access for {removeModalUser.username}? This will revoke this scope assignment.
+ >{$_('usersComponent.removeModalDescriptionEnd')}
@@ -674,9 +664,7 @@
type="button"
on:click={() => (removeModalUser = null)}
class="btn-secondary rounded-md px-3 py-2 text-sm font-medium"
- >
- Cancel
-
+ >{$_('common.cancel')}
diff --git a/src/lib/i18n/index.ts b/src/lib/i18n/index.ts
new file mode 100644
index 0000000..7b43deb
--- /dev/null
+++ b/src/lib/i18n/index.ts
@@ -0,0 +1,30 @@
+import { browser } from '$app/environment';
+import { init, register, locale } from 'svelte-i18n';
+
+const LOCALE_KEY = 'gitops-locale';
+export const SUPPORTED_LOCALES = ['es', 'en'] as const;
+export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
+export const DEFAULT_LOCALE: SupportedLocale = 'es';
+
+register('es', () => import('./locales/es.json'));
+register('en', () => import('./locales/en.json'));
+
+export function setupI18n() {
+ const initialLocale = browser
+ ? (localStorage.getItem(LOCALE_KEY) as SupportedLocale | null) ?? DEFAULT_LOCALE
+ : DEFAULT_LOCALE;
+
+ init({
+ fallbackLocale: DEFAULT_LOCALE,
+ initialLocale,
+ });
+}
+
+export function setLocale(lang: SupportedLocale) {
+ locale.set(lang);
+ if (browser) {
+ localStorage.setItem(LOCALE_KEY, lang);
+ }
+}
+
+export { locale };
diff --git a/src/lib/i18n/locales/en.json b/src/lib/i18n/locales/en.json
new file mode 100644
index 0000000..296e1b5
--- /dev/null
+++ b/src/lib/i18n/locales/en.json
@@ -0,0 +1,900 @@
+{
+ "nav": {
+ "selectProject": "Select project",
+ "selectOrganization": "Select organization",
+ "noActiveProjects": "No active projects.",
+ "noOrganizationSelected": "No organization selected.",
+ "chooseOne": "Choose one",
+ "viewAllProjects": "View all projects",
+ "howTo": "How To",
+ "profile": "Profile",
+ "changeOrganization": "Change Organization",
+ "signOut": "Sign out",
+ "account": "Account"
+ },
+ "sidebar": {
+ "organization": "Organization",
+ "expandSidebar": "Expand sidebar",
+ "collapseSidebar": "Collapse sidebar",
+ "setupPending": "Setup pending",
+ "categories": {
+ "inicio": "Home",
+ "seguridad": "Security",
+ "analisis": "Analysis",
+ "gitops": "GitOps",
+ "proyecto": "Project",
+ "sistema": "System"
+ },
+ "modules": {
+ "overview": "Overview",
+ "vault": "Vault",
+ "codeReport": "Code Report",
+ "stateIac": "State IaC",
+ "projectSettings": "Project Settings",
+ "organizationSettings": "Organization Settings",
+ "clusterSettings": "Cluster Settings"
+ },
+ "items": {
+ "overview": "Overview",
+ "cves": "CVEs",
+ "selectOrganization": "Select organization",
+ "dashboard": "Dashboard",
+ "services": "Services",
+ "securityPolicies": "Security Policies",
+ "history": "History",
+ "settings": "Settings",
+ "information": "Information",
+ "usersAndGroups": "Users and Groups",
+ "rolesAndPermissions": "Roles and Permissions",
+ "audit": "Audit",
+ "serverKeys": "Server Keys",
+ "projects": "Projects",
+ "global": "Global",
+ "users": "Users",
+ "systemAndBackup": "System & Backup",
+ "serverAccessKeys": "Server Access Keys",
+ "organizations": "Organizations",
+ "database": "Database",
+ "auditLog": "Audit Log"
+ }
+ },
+ "footer": {
+ "releasedUnder": "Released under the",
+ "license": "Elastic License 2.0",
+ "developedBy": "Developed by",
+ "gitdbSyncStatus": "GitDB sync status"
+ },
+ "profile": {
+ "title": "Profile",
+ "subtitle": "Manage your identity, password and API access from one place.",
+ "account": "Account",
+ "username": "Username",
+ "email": "Email",
+ "role": "Role",
+ "gcp": "GCP",
+ "connected": "Connected",
+ "notConnected": "Not connected",
+ "notSet": "Not set",
+ "accountInformation": "Account information",
+ "saveChanges": "Save changes",
+ "password": "Password",
+ "currentPassword": "Current password",
+ "newPassword": "New password",
+ "confirmPassword": "Confirm password",
+ "updatePassword": "Update password",
+ "apiKeys": "API Keys",
+ "apiKeysDescription": "Create and revoke keys for future API access.",
+ "create": "Create",
+ "copyNow": "Copy this token now. It will not be shown again.",
+ "copy": "Copy",
+ "copied": "Copied",
+ "noApiKeys": "No API keys created yet.",
+ "prefix": "Prefix",
+ "created": "Created",
+ "expires": "Expires",
+ "status": "Status",
+ "revoked": "Revoked",
+ "expired": "Expired",
+ "active": "Active",
+ "regenerate": "Regenerate",
+ "revoke": "Revoke",
+ "revokedActionsUnavailable": "Actions unavailable for revoked keys.",
+ "createApiKey": "Create API key",
+ "setNameAndExpiration": "Set a name and an expiration before creating it.",
+ "name": "Name",
+ "expiration": "Expiration",
+ "never": "Never",
+ "days": "days",
+ "cancel": "Cancel",
+ "closeCreateApiKeyModal": "Close create API key modal",
+ "languageDescription": "Select the interface language.",
+ "spanish": "Spanish",
+ "english": "English",
+ "darkMode": "Dark mode",
+ "lightMode": "Light mode",
+ "enableDarkMode": "Enable dark mode",
+ "disableDarkMode": "Disable dark mode"
+ },
+ "common": {
+ "loading": "Loading...",
+ "save": "Save",
+ "cancel": "Cancel",
+ "delete": "Delete",
+ "edit": "Edit",
+ "create": "Create",
+ "search": "Search",
+ "back": "Back",
+ "next": "Next",
+ "previous": "Previous",
+ "close": "Close",
+ "confirm": "Confirm",
+ "error": "Error",
+ "success": "Success",
+ "warning": "Warning",
+ "info": "Info",
+ "yes": "Yes",
+ "no": "No",
+ "or": "or",
+ "and": "and",
+ "of": "of",
+ "actions": "Actions",
+ "status": "Status",
+ "name": "Name",
+ "description": "Description",
+ "date": "Date",
+ "never": "Never",
+ "username": "Username",
+ "email": "Email",
+ "password": "Password",
+ "confirmPassword": "Confirm password",
+ "slug": "Slug",
+ "role": "Role",
+ "created": "Created",
+ "view": "View",
+ "copy": "Copy",
+ "copied": "Copied",
+ "prefix": "Prefix",
+ "expires": "Expires",
+ "active": "Active",
+ "inactive": "Inactive",
+ "comingSoon": "Coming soon",
+ "optionalDescription": "Optional description",
+ "saving": "Saving..."
+ },
+ "error": {
+ "notFoundTitle": "Page not found",
+ "notFoundDescription": "The page you are looking for does not exist or was moved to another location.",
+ "forbiddenTitle": "You do not have permission",
+ "forbiddenDescription": "You do not have the required permissions to access this resource.",
+ "genericTitle": "Something went wrong",
+ "genericDescription": "An unexpected error occurred. Please try again later.",
+ "goHome": "Go home",
+ "statusLabel": "Error"
+ },
+ "landing": {
+ "tagline": "SvelteKit + Bun + DDD starter scaffold."
+ },
+ "auth": {
+ "loginTitle": "Sign in",
+ "workspace": "Workspace",
+ "signInTitle": "Sign in to GitOps",
+ "signInSubtitle": "Continue with your private admin workspace.",
+ "signedOut": "You have been signed out.",
+ "signIn": "Sign in",
+ "signingIn": "Signing in...",
+ "invitationLabel": "Invitation",
+ "acceptInvitationTitle": "Accept your invitation",
+ "setPasswordPrefix": "Set a password for",
+ "setPasswordSuffix": "to activate your account.",
+ "goToSignIn": "Go to sign in",
+ "activateAccount": "Activate account",
+ "activating": "Activating..."
+ },
+ "bootstrap": {
+ "title": "Cluster setup",
+ "subtitle": "The GitDB repository is already connected. Complete these steps to finish the installation.",
+ "stepAdministrator": "Create cluster administrator",
+ "stepOrganization": "Create organization",
+ "createAdministratorFailed": "Failed to create the cluster administrator.",
+ "administratorCardTitle": "1. Create cluster administrator",
+ "administratorCardDescription": "This account gets full access to cluster settings.",
+ "createAdministrator": "Create administrator",
+ "createOrganizationFailed": "Failed to create the organization.",
+ "organizationCardTitle": "2. Create organization",
+ "organizationCardDescription": "Organizations group projects and their members.",
+ "slugOptional": "Slug (optional)",
+ "creating": "Creating...",
+ "finishSetup": "Finish setup"
+ },
+ "maintenance": {
+ "title": "Maintenance",
+ "startupFailed": "Startup failed",
+ "gettingReady": "Getting things ready…",
+ "startupFailedDescription": "The server failed to start. Check the server logs.",
+ "startingDescription": "The server is starting up. This page will refresh automatically."
+ },
+ "clusterSettings": {
+ "title": "Cluster Settings",
+ "audit": {
+ "title": "Cluster Audit Log",
+ "description": "History of changes recorded across the cluster's data repository."
+ },
+ "users": {
+ "title": "Cluster Users",
+ "description": "Create users and grant them access to this cluster."
+ },
+ "roles": {
+ "title": "Cluster Roles & Permissions",
+ "description": "Manage roles and granular access policies across the cluster.",
+ "addRole": "Add Cluster Role"
+ },
+ "database": {
+ "title": "Database",
+ "description": "GitDB state lives in the Git repository configured through environment variables. Restart the container to apply changes.",
+ "authToken": "Token (GITDB_TOKEN)",
+ "authBasic": "User / Password (GITDB_USERNAME + GITDB_PASSWORD)",
+ "authNone": "None (SSH key or public repository)",
+ "syncInProgress": "Sync in progress",
+ "repositorySynchronized": "Repository synchronized.",
+ "syncFailed": "Sync failed.",
+ "status": "Status",
+ "lastCommit": "Last commit",
+ "lastSync": "Last sync",
+ "lastAttempt": "Last attempt",
+ "aheadBehind": "Ahead / Behind",
+ "lastError": "Last error",
+ "syncNow": "Sync now",
+ "syncing": "Syncing...",
+ "repository": "Repository",
+ "authentication": "Authentication",
+ "credentialLoaded": "credential loaded",
+ "commitAuthor": "Commit author",
+ "repositoryMissing": "GITDB_REPOSITORY_URL is not set. The cluster cannot start without it.",
+ "syncPoll": "Sync Poll",
+ "everySeconds": "Every",
+ "seconds": "seconds",
+ "configuredWith": "Configured with"
+ },
+ "organizations": {
+ "title": "Organizations",
+ "description": "Create, view and manage cluster organizations.",
+ "searchPlaceholder": "Search by name, slug or description...",
+ "nameRequired": "Organization name is required.",
+ "created": "Organization created.",
+ "createFailed": "Failed to create organization.",
+ "deleted": "Organization deleted.",
+ "deleteFailed": "Failed to delete organization.",
+ "empty": "No organizations found.",
+ "emptySearch": "No organizations match your search.",
+ "viewOrganization": "View organization",
+ "newOrganization": "New organization",
+ "createOrganization": "Create organization",
+ "closeCreateModal": "Close create organization modal",
+ "createModal": "Create organization modal",
+ "closeDeleteModal": "Close delete organization modal",
+ "deleteModal": "Delete organization modal",
+ "deleteOrganization": "Delete organization",
+ "deleteConfirmationStart": "Are you sure you want to delete",
+ "deleteConfirmationEnd": "? This action cannot be undone.",
+ "deleting": "Deleting...",
+ "new": "New organization",
+ "createdColumn": "Created",
+ "slugPlaceholder": "gitops (auto-generated if empty)",
+ "descriptionPlaceholder": "Optional description",
+ "createModalTitle": "New organization",
+ "deleteSuccess": "Organization deleted."
+ },
+ "organizationDetail": {
+ "information": "Information",
+ "copySlug": "Copy organization slug",
+ "slugCopied": "Slug copied",
+ "nameRequired": "Organization name is required.",
+ "updated": "Organization updated.",
+ "updateFailed": "Failed to update organization.",
+ "copyFailed": "Failed to copy slug.",
+ "saveChanges": "Save changes",
+ "saving": "Saving...",
+ "dangerZone": "Danger Zone",
+ "deleteTitle": "Delete organization",
+ "deleteDescription": "Permanently deletes this organization. This action cannot be undone.",
+ "deleteFailed": "Failed to delete organization.",
+ "deleteConfirmationStart": "Are you sure you want to delete",
+ "deleteConfirmationEnd": "? This action cannot be undone.",
+ "deleting": "Deleting...",
+ "copySlugFailed": "Failed to copy slug.",
+ "titleSuffix": "Cluster Settings",
+ "optionalDescription": "Optional description",
+ "closeDeleteModal": "Close delete organization modal",
+ "deleteModal": "Delete organization modal",
+ "deleteConfirmTitle": "Delete organization",
+ "deleteConfirmStart": "Are you sure you want to delete ",
+ "deleteConfirmEnd": "? This action cannot be undone."
+ }
+ },
+ "org": {
+ "notFound": "Organization not found.",
+ "selectorTitle": "Select an organization",
+ "selectorDescription": "Choose an organization to continue.",
+ "noMembershipTitle": "You don't belong to any organization yet",
+ "noMembershipDescription": "Ask an administrator to add you to an organization to get started.",
+ "overview": {
+ "title": "Overview",
+ "welcome": "Welcome to GitOps.",
+ "comingSoon": "Coming soon",
+ "vaultGuide": "Vault Guide",
+ "vaultGuideDescription": "Centralize secrets, credentials and access controls.",
+ "openReportGuide": "Open Report Guide",
+ "openReportGuideDescription": "Review vulnerability and dependency reports.",
+ "stateIacGuide": "State IaC Guide",
+ "stateIacGuideDescription": "Configure backends and inspect Pulumi state.",
+ "gitopsCliDescription": "Manage projects and secrets from the terminal.",
+ "gitopsReportCliDescription": "Generate and inspect vulnerability reports from the terminal.",
+ "gitopsBotDescription": "CI/CD with automated analysis and automatic PRs.",
+ "projectsTitle": "Projects",
+ "projectsDescription": "Select an active project to view its details.",
+ "searchProjects": "Search projects...",
+ "noActiveProjects": "No active projects.",
+ "noProjectMatches": "No project matches your search."
+ },
+ "cves": {
+ "title": "Organization CVEs",
+ "infoMessage": "This list aggregates CVEs from all organization projects using the latest completed analysis for each service.",
+ "emptyMessage": "No CVEs have been detected in this organization yet."
+ }
+ },
+ "project": {
+ "layout": {
+ "overview": "Overview",
+ "overviewSubtitle": "Project overview at a glance.",
+ "vaultSubtitle": "Project secrets, credentials and access controls.",
+ "codeReportSubtitle": "Project vulnerability and dependency reports.",
+ "stateIacSubtitle": "Pulumi state and storage backends for this project.",
+ "information": "Information",
+ "informationSubtitle": "General data, modules and danger zone for the project.",
+ "usersAndGroups": "Users and Groups",
+ "usersAndGroupsSubtitle": "Manage which users and groups can access this project.",
+ "rolesAndPermissions": "Roles and Permissions",
+ "rolesAndPermissionsSubtitle": "Define roles and permissions specific to this project.",
+ "serverAccessKeysSubtitle": "Credentials so external tools can report analysis into this project.",
+ "audit": "Audit",
+ "auditSubtitle": "History of changes and relevant project activity."
+ },
+ "overview": {
+ "inviteMembers": "Invite members",
+ "inviteMembersDescription": "Invite users to collaborate on this project.",
+ "addSecretToken": "Add secret token",
+ "addSecretTokenDescription": "Generate a token for integrations and CI/CD.",
+ "description": "Description",
+ "noDescription": "No description.",
+ "activeModules": "Active modules",
+ "noActiveModules": "This project has no active modules. Enable them in project settings.",
+ "guides": "Guides",
+ "guidesDescription": "Learn how to get the most out of each module.",
+ "guidePrefix": "Guide for",
+ "quickAccess": "Quick access"
+ },
+ "stateIac": {
+ "title": "State IaC",
+ "description": "Inspect Pulumi state, storage backends and stack history for this project.",
+ "stacks": "Stacks",
+ "stacksDescription": "Resources, outputs and configuration.",
+ "storageBackends": "Storage Backends",
+ "storageBackendsDescription": "Connected S3 or GCS buckets.",
+ "history": "History",
+ "historyDescription": "Checkpoints and deployment history.",
+ "workingTitle": "We are working on this",
+ "workingDescription": "The State IaC module is under construction. Soon you will be able to view Pulumi stacks, storage backends and deployment history directly from here."
+ },
+ "vault": {
+ "sectionLabel": "Security",
+ "description": "Centralize secrets, credentials and access controls for future security modules.",
+ "policies": "Policies",
+ "policiesDescription": "Access rules and limits per module.",
+ "secrets": "Secrets",
+ "secretsDescription": "Variables, tokens and shared keys.",
+ "access": "Access",
+ "accessDescription": "Authorization and role-based separation.",
+ "workingTitle": "We are working on this",
+ "workingDescription": "The Vault module is under construction. Soon you will be able to manage secrets, policies and access controls directly from here."
+ }
+ },
+ "projectSettings": {
+ "users": {
+ "title": "Project Users",
+ "descriptionPrefix": "Assign existing organization users to",
+ "descriptionSuffix": "."
+ },
+ "roles": {
+ "title": "Project Roles & Permissions",
+ "description": "Manage roles and granular access policies inside this project.",
+ "addRole": "Add Project Role"
+ },
+ "audit": {
+ "title": "Audit",
+ "description": "History of changes and relevant activity for each project.",
+ "comingSoon": "Coming soon",
+ "comingSoonDescription": "Project-level audit log is not available yet."
+ },
+ "serverAccessKeys": {
+ "title": "Server Access Keys",
+ "descriptionPrefix": "Credentials so external tools (CI/CD) can report Code Report analyses to this project via",
+ "createKey": "Create key",
+ "copyTokenNow": "Copy this token now. It will not be shown again.",
+ "noKeys": "There are no keys for this project yet.",
+ "created": "Created",
+ "expires": "Expires",
+ "state": "Status",
+ "revoked": "Revoked",
+ "expired": "Expired",
+ "active": "Active",
+ "revoke": "Revoke",
+ "createServerAccessKey": "Create server access key",
+ "expiration": "Expiration",
+ "copy": "Copy",
+ "copied": "Copied",
+ "copyToken": "Copy token",
+ "createServerAccessKeyShort": "Create server access key",
+ "cancel": "Cancel",
+ "never": "Never",
+ "prefix": "Prefix",
+ "days7": "7 days",
+ "days30": "30 days",
+ "days90": "90 days",
+ "days365": "365 days"
+ },
+ "overview": {
+ "codeReport": "Code Report",
+ "stateIac": "State IaC",
+ "gitopsCliDescription": "Connect this project with gitops project use {slug}.",
+ "gitopsBotDescription": "Automate analyses and PRs for this project.",
+ "copyFailed": "Failed to copy slug.",
+ "nameRequired": "Project name is required.",
+ "updated": "Project updated.",
+ "updateFailed": "Failed to update project.",
+ "reactivated": "Project reactivated.",
+ "archived": "Project archived.",
+ "statusUpdateFailed": "Failed to update project status.",
+ "deleteFailed": "Failed to delete project.",
+ "archivedBadge": "Archived",
+ "copySlug": "Copy project slug",
+ "slugCopied": "Slug copied",
+ "modules": "Modules",
+ "modulesDescription": "Click a card to enable or disable the module.",
+ "moduleActive": "Active",
+ "moduleDisabled": "Disabled",
+ "open": "Open",
+ "integrations": "Integrations",
+ "integrationsDescription": "Connect this project with GitOps tools.",
+ "dangerZone": "Danger Zone",
+ "transferToOrganization": "Transfer to organization",
+ "transferDescription": "Move this project to another organization.",
+ "transfer": "Transfer",
+ "activateProject": "Activate project",
+ "archiveProject": "Archive project",
+ "activateDescription": "The project will return to active status and be listed again.",
+ "archiveDescription": "The project will become inactive and stop appearing as active.",
+ "activate": "Activate",
+ "archive": "Archive",
+ "deleteProject": "Delete project",
+ "deleteDescription": "This action cannot be undone.",
+ "closeArchiveModal": "Close archive project modal",
+ "archiveModal": "Archive project modal",
+ "activateProjectModal": "Activate project",
+ "archiveProjectModal": "Archive project",
+ "activateConfirmationStart": "Are you sure you want to activate",
+ "activateConfirmationEnd": "? It will be marked as active again.",
+ "archiveConfirmationStart": "Are you sure you want to archive",
+ "archiveConfirmationEnd": "? It will be marked as inactive.",
+ "activating": "Activating...",
+ "archiving": "Archiving...",
+ "closeDeleteModal": "Close delete project modal",
+ "deleteModal": "Delete project modal",
+ "deleteConfirmationStart": "Are you sure you want to delete",
+ "deleteConfirmationEnd": "? This action cannot be undone.",
+ "deleting": "Deleting...",
+ "saveChanges": "Save changes",
+ "title": "Settings",
+ "copyProjectSlug": "Copy project slug",
+ "optionalDescription": "Optional description",
+ "comingSoon": "Coming soon",
+ "transferSoon": "Coming soon"
+ }
+ },
+ "codeReport": {
+ "dashboard": {
+ "title": "Dashboard",
+ "services": "Services",
+ "analysesCompleted": "with at least one completed analysis",
+ "criticalAndHighCves": "Critical + high CVEs",
+ "totalCvesDetected": "of {count} total CVEs detected",
+ "exposedSecrets": "Exposed secrets",
+ "gitleaksDetected": "detected in the latest gitleaks analyses",
+ "remediationCoverage": "Remediation coverage",
+ "fixVersionAvailable": "CVEs with an available fixed version",
+ "severityDistribution": "Severity distribution",
+ "severityDistributionDescription": "Vulnerabilities from the latest analysis of each service.",
+ "noVulnerabilities": "No vulnerabilities have been detected.",
+ "total": "Total",
+ "securityPolicy": "Security Policy",
+ "manage": "Manage",
+ "activePoliciesSummary": "{active} active policies across {evaluated} evaluated services.",
+ "servicesFailing": "services failing · {violations} breached rules",
+ "servicesSuffix": "services",
+ "ok": "OK",
+ "servicesCompliant": "services comply with all policies",
+ "noActivePolicies": "There are no active policies yet.",
+ "createFirstPolicy": "Create the first one",
+ "insufficientAnalyses": "There are not enough analyses to evaluate active policies.",
+ "topCves": "Top CVEs",
+ "noProjectCves": "No CVEs have been detected in this project yet.",
+ "serviceCount": "service(s)",
+ "viewAllCves": "View all CVEs",
+ "riskiestServices": "Riskiest services",
+ "noRiskyServices": "No service has detected vulnerabilities.",
+ "staleServices": "Services without recent analyses",
+ "staleServicesDescription": "Without a completed scan in the last 30 days.",
+ "allRecent": "All services have recent analyses.",
+ "lastScan": "Last scan",
+ "critical": "critical",
+ "high": "high",
+ "medium": "medium",
+ "low": "low",
+ "unknown": "unknown"
+ },
+ "services": {
+ "searchPlaceholder": "Search services by name, slug or tag...",
+ "addService": "Add Service",
+ "empty": "There are no services in this project yet.",
+ "emptySearch": "No results for your search.",
+ "lastScan": "Last scan",
+ "noAnalysis": "No vulnerability analyses yet.",
+ "slugHelp": "(optional, generated from the name)",
+ "tags": "Tags",
+ "tagPlaceholder": "Add a tag and press Enter",
+ "creating": "Creating...",
+ "createService": "Create service",
+ "name": "Name",
+ "description": "Description",
+ "cancel": "Cancel",
+ "severity": {
+ "critical": "Critical",
+ "high": "High",
+ "medium": "Medium",
+ "low": "Low"
+ }
+ },
+ "serviceDetail": {
+ "backToServices": "Back to services",
+ "viewHistory": "View history",
+ "deleteService": "Delete service",
+ "deleteDescriptionStart": "You are about to delete",
+ "deleteDescriptionEnd": "and all its analyses. This action cannot be undone.",
+ "deleting": "Deleting...",
+ "deleteServiceAndAnalyses": "Delete service and analyses",
+ "deleteTitle": "Delete service",
+ "cancel": "Cancel"
+ },
+ "cves": {
+ "title": "Code Report CVEs",
+ "infoMessage": "This list shows CVEs detected in the latest analysis of each service. Services without a recent completed analysis do not appear here.",
+ "emptyMessage": "No CVEs have been detected in this project yet."
+ },
+ "history": {
+ "allStatuses": "All statuses",
+ "completed": "Completed",
+ "inProgress": "In progress",
+ "failed": "Failed",
+ "critical": "Critical",
+ "high": "High",
+ "medium": "Medium",
+ "low": "Low",
+ "noRisk": "No risk",
+ "allServices": "All services",
+ "title": "Analysis history",
+ "description": "Review every report in the project and open any run.",
+ "searchPlaceholder": "Search service or tool...",
+ "filterByDate": "Filter by date",
+ "reportSingular": "report",
+ "reportPlural": "reports",
+ "noReports": "No reports match the filters.",
+ "serviceDeleted": "Deleted service",
+ "serviceLabel": "Service",
+ "idLabel": "ID",
+ "risk": "Risk",
+ "vulnerabilities": "vulnerabilities",
+ "backToServices": "Back to services",
+ "backToHistory": "Back to history",
+ "reportViewed": "Viewed report"
+ },
+ "securityPolicy": {
+ "title": "Security Policies",
+ "searchPlaceholder": "Search policies by name or slug...",
+ "allTypes": "All types",
+ "newPolicy": "New policy",
+ "empty": "There are no security policies in this project yet.",
+ "emptySearch": "No results for your search.",
+ "createFirstPolicy": "Create the first policy",
+ "active": "Active",
+ "inactive": "Inactive",
+ "scope": "Scope",
+ "disablePolicy": "Disable policy",
+ "activatePolicy": "Activate policy",
+ "backToPolicies": "Back to policies",
+ "createPolicy": "Create policy",
+ "editing": "Edit",
+ "cancelEditing": "Cancel editing",
+ "delete": "Delete",
+ "evaluating": "Evaluating...",
+ "evaluateServices": "Evaluate services",
+ "servicesReevaluated": "services reevaluated",
+ "analysesUpdated": "analyses updated",
+ "failingPolicy": "are failing this policy.",
+ "noneFailPolicy": "None are failing this policy.",
+ "detailTab": "Detail",
+ "affectedServicesTab": "Affected services",
+ "affectedServices": "Affected services",
+ "affectedServicesDescription": "Services with analyses evaluated against this policy.",
+ "failing": "failing",
+ "noEvaluations": "No analysis has been evaluated against this policy yet. Use \"Evaluate services\" to evaluate them.",
+ "analysesEvaluated": "analyses evaluated",
+ "lastWith": "latest with",
+ "onDate": "on",
+ "compliant": "Compliant",
+ "nonCompliant": "Non-compliant",
+ "analysesAffected": "affected analyses",
+ "type": "Type",
+ "application": "Enforcement",
+ "rules": "Rules",
+ "createdOn": "Created on",
+ "updatedOn": "Updated on",
+ "deletePolicy": "Delete policy",
+ "deleteDescriptionStart": "You are about to delete",
+ "deleteDescriptionEnd": ". This action cannot be undone.",
+ "deleting": "Deleting..."
+ },
+ "settings": {
+ "title": "Code Report Settings",
+ "tabsLabel": "Code Report settings tabs",
+ "general": "General",
+ "tools": "Tools",
+ "notifications": "Notifications",
+ "reportBot": "GitOps Report Bot",
+ "webhooks": "Webhooks",
+ "soon": "Soon",
+ "comingSoon": "Coming soon",
+ "generalTitle": "General",
+ "generalDescription": "Module-wide parameters to score risk and classify findings in this project.",
+ "riskMultipliers": "Security Risk Multipliers",
+ "formulaDescription": "Formula applied in service detail: (Critical × M_c) + (High × M_h) + (Medium × M_m) + (Low × M_l).",
+ "critical": "Critical",
+ "high": "High",
+ "medium": "Medium",
+ "low": "Low",
+ "example": "Current example: (Critical × 10) + (High × 6) + (Medium × 3) + (Low × 1) = 561 points.",
+ "ranges": "Ranges: low 1-7, medium 8-19, high 20-39, critical 40+ or any Critical vulnerability.",
+ "moreSettings": "More settings",
+ "moreSettingsDescription": "Coming soon: service baselines, minimum severities for alerts, and temporary CVE exceptions.",
+ "toolsTitle": "Analysis tools",
+ "toolsDescription": "Manage the enabled analysis categories for this project. What you enable here is stored in project settings and returned by the scan API.",
+ "enabled": "Enabled",
+ "disabled": "Disabled"
+ },
+ "servicesTitle": "Code Report Services"
+ },
+ "orgSettings": {
+ "title": "Settings",
+ "users": {
+ "title": "Organization Users",
+ "description": "Create users and grant them access to this organization."
+ },
+ "roles": {
+ "title": "Organization Roles & Permissions",
+ "description": "Manage roles and granular access policies in this organization.",
+ "addRole": "Add Organization Role"
+ },
+ "audit": {
+ "title": "Audit",
+ "description": "History of changes recorded in this organization data."
+ },
+ "global": {
+ "notWired": "Global authentication settings are not wired to a server action yet.",
+ "title": "Global Settings",
+ "description": "Configure organization-wide authentication methods and security defaults.",
+ "authentication": "Authentication",
+ "authenticationDescription": "Local login is always enabled. Optionally connect GCP Workspace and SAML as additional providers.",
+ "localAuthAlwaysOn": "Local authentication: always ON",
+ "localAuthDescription": "Username/password access remains available even when external providers are enabled.",
+ "googleDescription": "Allow users to authenticate with Google Workspace accounts.",
+ "googleClientId": "Google Client ID",
+ "googleClientSecret": "Google Client Secret",
+ "samlDescription": "Connect an enterprise identity provider through SAML.",
+ "samlEntryPoint": "SAML Entry Point",
+ "samlIssuer": "SAML Issuer",
+ "samlCertificate": "SAML Certificate (PEM)",
+ "saved": "Global settings saved.",
+ "saving": "Saving...",
+ "save": "Save global settings",
+ "encryption": "Encryption",
+ "encryptionDescription": "Organization encryption controls will be managed here.",
+ "comingSoon": "Coming soon",
+ "comingSoonDescription": "Key rotation, encryption policy, and scoped secret protection settings are planned for a future release.",
+ "saveNotWired": "Global authentication settings are not wired to a server action yet.",
+ "localAuthTitle": "Local authentication: always ON"
+ },
+ "projects": {
+ "title": "Projects",
+ "description": "Create, organize and manage the projects.",
+ "searchPlaceholder": "Search by name, slug or description...",
+ "allStatuses": "All statuses",
+ "nameRequired": "Project name is required.",
+ "noOrganizationSelected": "No organization selected.",
+ "created": "Project created.",
+ "createFailed": "Failed to create project.",
+ "deleted": "Project deleted.",
+ "deleteFailed": "Failed to delete project.",
+ "empty": "No projects found.",
+ "emptyFiltered": "No projects match your filters.",
+ "newProject": "New project",
+ "viewProject": "View project",
+ "createProject": "Create project",
+ "closeCreateModal": "Close create project modal",
+ "createModal": "Create project modal",
+ "closeDeleteModal": "Close delete project confirmation",
+ "deleteModal": "Delete project modal",
+ "deleteProject": "Delete project",
+ "deleteConfirmationStart": "Are you sure you want to delete",
+ "deleteConfirmationEnd": "? This action cannot be undone.",
+ "deleting": "Deleting...",
+ "creating": "Creating...",
+ "new": "New project",
+ "noOrganization": "No organization selected.",
+ "createModalTitle": "New project",
+ "slugPlaceholder": "platform-core (auto-generated if empty)",
+ "descriptionPlaceholder": "Optional description",
+ "deleteConfirmTitle": "Delete project",
+ "deleteConfirmStart": "Are you sure you want to delete ",
+ "deleteConfirmEnd": "? This action cannot be undone."
+ },
+ "serverAccessKeys": {
+ "title": "Server Access Keys",
+ "description": "Manage machine-to-machine credentials for server integrations.",
+ "comingSoonDescription": "This section will host server key issuance, rotation, and revocation flows."
+ },
+ "systemBackup": {
+ "title": "System & Backup",
+ "description": "Configure system behavior, exports, and backup lifecycle.",
+ "comingSoonDescription": "Backup schedules, retention, and import/export controls will be available here."
+ }
+ },
+ "usersComponent": {
+ "defaultTitle": "Users",
+ "defaultDescription": "Manage user access.",
+ "actionFailed": "User action failed.",
+ "roleRequired": "Role is required.",
+ "usernamePasswordRequired": "Username and password are required.",
+ "userRequired": "User is required.",
+ "userAssigned": "User assigned.",
+ "userCreated": "User created.",
+ "addFailed": "Failed to add user.",
+ "emailRequired": "Email is required.",
+ "invitationSent": "Invitation sent.",
+ "inviteFailed": "Failed to invite user.",
+ "roleUpdated": "Role updated.",
+ "updateAccessFailed": "Failed to update user access.",
+ "accessRemoved": "User access removed.",
+ "removeAccessFailed": "Failed to remove user access.",
+ "invitationResent": "Invitation resent.",
+ "resendFailed": "Failed to resend invitation.",
+ "inviteUser": "Invite user",
+ "addUser": "Add user",
+ "newUser": "New user",
+ "searchPlaceholder": "Search by user, email or role...",
+ "empty": "No users found.",
+ "emptySearch": "No users match your search.",
+ "organizations": "Organizations",
+ "user": "User",
+ "added": "Added",
+ "resendInvitation": "Resend invitation",
+ "removeAccess": "Remove access",
+ "closeAddModal": "Close add user modal",
+ "addModal": "Add user modal",
+ "selectRole": "Select role",
+ "invited": "Invited",
+ "sending": "Sending...",
+ "closeInviteModal": "Close invite user modal",
+ "inviteModal": "Invite user modal",
+ "inviteModalTitle": "Invite user",
+ "inviteModalDescription": "If the account does not exist yet we will create it and email the invitation. Existing active accounts are granted access straight away.",
+ "sendInvitation": "Send invitation",
+ "closeRemoveModal": "Close remove access confirmation",
+ "removeModal": "Remove access confirmation",
+ "removeModalTitle": "Remove access",
+ "removeModalDescriptionStart": "Remove access for",
+ "removeModalDescriptionEnd": "? This will revoke this scope assignment.",
+ "removing": "Removing...",
+ "adding": "Adding..."
+ },
+ "rolePermissions": {
+ "defaultTitle": "Roles & Permissions",
+ "defaultDescription": "Manage user roles and granular access policies.",
+ "addRole": "Add role",
+ "empty": "No roles found."
+ },
+ "roleDetail": {
+ "edit": "Edit",
+ "actionFailed": "Role action failed.",
+ "saved": "Role saved.",
+ "saveFailed": "Failed to save role.",
+ "deleteFailed": "Failed to delete role.",
+ "orgRoleDetails": "Organization Role Details",
+ "projectRoleDetails": "Project Role Details",
+ "clusterRoleDetails": "Cluster Role Details",
+ "roleId": "Role ID",
+ "developerPlaceholder": "Developer",
+ "newRole": "New role",
+ "roleSuffix": "role",
+ "permissions": "Permissions",
+ "deleting": "Deleting...",
+ "saving": "Saving...",
+ "resource": "Resource",
+ "permission": "Permission",
+ "collapseSection": "Collapse section",
+ "expandSection": "Expand section",
+ "noAccess": "No Access",
+ "readOnly": "Read Only",
+ "fullAccess": "Full Access",
+ "custom": "Custom",
+ "sectionGroup": "Section group",
+ "addClusterRole": "Add Cluster Role",
+ "addOrganizationRole": "Add Organization Role",
+ "addProjectRole": "Add Project Role"
+ },
+ "auditLog": {
+ "defaultTitle": "Audit Log",
+ "defaultDescription": "History of changes recorded in the data repository.",
+ "allTime": "All time",
+ "today": "Today",
+ "last7Days": "Last 7 days",
+ "last30Days": "Last 30 days",
+ "last3Months": "Last 3 months",
+ "customRange": "Custom range...",
+ "loadFailed": "Failed to load changes.",
+ "searchPlaceholder": "Search by entity, action, author or commit...",
+ "fromDate": "From date",
+ "toDate": "To date",
+ "allOrganizations": "All organizations",
+ "filter": "Filter",
+ "clear": "Clear",
+ "emptyFiltered": "No audit events match your filters.",
+ "empty": "No audit events found.",
+ "author": "Author",
+ "commit": "Commit",
+ "viewCommit": "View commit in repository",
+ "viewChanges": "View changes",
+ "perPage": "per page",
+ "previous": "Previous",
+ "next": "Next",
+ "page": "Page",
+ "closeChangesModal": "Close changes modal",
+ "changeDetails": "Change details",
+ "by": "by",
+ "loadingChanges": "Loading changes...",
+ "noChanges": "No changes detected.",
+ "before": "Before",
+ "after": "After",
+ "actions": {
+ "insert": "insert",
+ "update": "update",
+ "delete": "delete",
+ "other": "other"
+ },
+ "actionsLabel": "Action",
+ "entity": "Entity"
+ },
+ "subNavbar": {
+ "defaultLabel": "State",
+ "defaultRootLabel": "Projects",
+ "select": "Select",
+ "notAvailable": "N/A"
+ }
+}
diff --git a/src/lib/i18n/locales/es.json b/src/lib/i18n/locales/es.json
new file mode 100644
index 0000000..c849371
--- /dev/null
+++ b/src/lib/i18n/locales/es.json
@@ -0,0 +1,900 @@
+{
+ "nav": {
+ "selectProject": "Seleccionar proyecto",
+ "selectOrganization": "Seleccionar organización",
+ "noActiveProjects": "No hay proyectos activos.",
+ "noOrganizationSelected": "No hay organización seleccionada.",
+ "chooseOne": "Elige una",
+ "viewAllProjects": "Ver todos los proyectos",
+ "howTo": "Cómo usar",
+ "profile": "Perfil",
+ "changeOrganization": "Cambiar organización",
+ "signOut": "Cerrar sesión",
+ "account": "Cuenta"
+ },
+ "sidebar": {
+ "organization": "Organización",
+ "expandSidebar": "Expandir menú lateral",
+ "collapseSidebar": "Contraer menú lateral",
+ "setupPending": "Configuración pendiente",
+ "categories": {
+ "inicio": "Inicio",
+ "seguridad": "Seguridad",
+ "analisis": "Análisis",
+ "gitops": "GitOps",
+ "proyecto": "Proyecto",
+ "sistema": "Sistema"
+ },
+ "modules": {
+ "overview": "Vista general",
+ "vault": "Vault",
+ "codeReport": "Code Report",
+ "stateIac": "State IaC",
+ "projectSettings": "Ajustes de proyecto",
+ "organizationSettings": "Ajustes de organización",
+ "clusterSettings": "Ajustes del clúster"
+ },
+ "items": {
+ "overview": "Vista general",
+ "cves": "CVEs",
+ "selectOrganization": "Seleccionar organización",
+ "dashboard": "Panel",
+ "services": "Servicios",
+ "securityPolicies": "Políticas de seguridad",
+ "history": "Historial",
+ "settings": "Ajustes",
+ "information": "Información",
+ "usersAndGroups": "Usuarios y grupos",
+ "rolesAndPermissions": "Roles y permisos",
+ "audit": "Auditoría",
+ "serverKeys": "Claves del servidor",
+ "projects": "Proyectos",
+ "global": "Global",
+ "users": "Usuarios",
+ "systemAndBackup": "Sistema y respaldo",
+ "serverAccessKeys": "Claves de acceso del servidor",
+ "organizations": "Organizaciones",
+ "database": "Base de datos",
+ "auditLog": "Registro de auditoría"
+ }
+ },
+ "footer": {
+ "releasedUnder": "Publicado bajo la",
+ "license": "Elastic License 2.0",
+ "developedBy": "Desarrollado por",
+ "gitdbSyncStatus": "Estado de sincronización GitDB"
+ },
+ "profile": {
+ "title": "Perfil",
+ "subtitle": "Gestiona tu identidad, contraseña y acceso API desde un solo lugar.",
+ "account": "Cuenta",
+ "username": "Nombre de usuario",
+ "email": "Correo electrónico",
+ "role": "Rol",
+ "gcp": "GCP",
+ "connected": "Conectado",
+ "notConnected": "No conectado",
+ "notSet": "No configurado",
+ "accountInformation": "Información de la cuenta",
+ "saveChanges": "Guardar cambios",
+ "password": "Contraseña",
+ "currentPassword": "Contraseña actual",
+ "newPassword": "Nueva contraseña",
+ "confirmPassword": "Confirmar contraseña",
+ "updatePassword": "Actualizar contraseña",
+ "apiKeys": "Claves API",
+ "apiKeysDescription": "Crea y revoca claves para acceso futuro a la API.",
+ "create": "Crear",
+ "copyNow": "Copia este token ahora. No se mostrará de nuevo.",
+ "copy": "Copiar",
+ "copied": "Copiado",
+ "noApiKeys": "Aún no hay claves API creadas.",
+ "prefix": "Prefijo",
+ "created": "Creado",
+ "expires": "Expira",
+ "status": "Estado",
+ "revoked": "Revocada",
+ "expired": "Expirada",
+ "active": "Activa",
+ "regenerate": "Regenerar",
+ "revoke": "Revocar",
+ "revokedActionsUnavailable": "Acciones no disponibles para claves revocadas.",
+ "createApiKey": "Crear clave API",
+ "setNameAndExpiration": "Establece un nombre y fecha de expiración antes de crearla.",
+ "name": "Nombre",
+ "expiration": "Expiración",
+ "never": "Nunca",
+ "days": "días",
+ "cancel": "Cancelar",
+ "closeCreateApiKeyModal": "Cerrar modal de creación de clave API",
+ "languageDescription": "Selecciona el idioma de la interfaz.",
+ "spanish": "Español",
+ "english": "Inglés",
+ "darkMode": "Modo oscuro",
+ "lightMode": "Modo claro",
+ "enableDarkMode": "Activar modo oscuro",
+ "disableDarkMode": "Desactivar modo oscuro"
+ },
+ "common": {
+ "loading": "Cargando...",
+ "save": "Guardar",
+ "cancel": "Cancelar",
+ "delete": "Eliminar",
+ "edit": "Editar",
+ "create": "Crear",
+ "search": "Buscar",
+ "back": "Volver",
+ "next": "Siguiente",
+ "previous": "Anterior",
+ "close": "Cerrar",
+ "confirm": "Confirmar",
+ "error": "Error",
+ "success": "Éxito",
+ "warning": "Advertencia",
+ "info": "Información",
+ "yes": "Sí",
+ "no": "No",
+ "or": "o",
+ "and": "y",
+ "of": "de",
+ "actions": "Acciones",
+ "status": "Estado",
+ "name": "Nombre",
+ "description": "Descripción",
+ "date": "Fecha",
+ "never": "Nunca",
+ "username": "Nombre de usuario",
+ "email": "Correo electrónico",
+ "password": "Contraseña",
+ "confirmPassword": "Confirmar contraseña",
+ "slug": "Slug",
+ "role": "Rol",
+ "created": "Creado",
+ "view": "Ver",
+ "copy": "Copiar",
+ "copied": "Copiado",
+ "prefix": "Prefijo",
+ "expires": "Expira",
+ "active": "Activo",
+ "inactive": "Inactivo",
+ "comingSoon": "Próximamente",
+ "optionalDescription": "Descripción opcional",
+ "saving": "Guardando..."
+ },
+ "error": {
+ "notFoundTitle": "Página no encontrada",
+ "notFoundDescription": "La página que buscas no existe o fue movida a otra ubicación.",
+ "forbiddenTitle": "No tienes permisos",
+ "forbiddenDescription": "No cuentas con los permisos necesarios para acceder a este recurso.",
+ "genericTitle": "Algo salió mal",
+ "genericDescription": "Ocurrió un error inesperado. Intenta nuevamente más tarde.",
+ "goHome": "Ir al inicio",
+ "statusLabel": "Error"
+ },
+ "landing": {
+ "tagline": "SvelteKit + Bun + DDD starter scaffold."
+ },
+ "auth": {
+ "loginTitle": "Iniciar sesión",
+ "workspace": "Espacio de trabajo",
+ "signInTitle": "Inicia sesión en GitOps",
+ "signInSubtitle": "Continúa con tu espacio de trabajo privado de administración.",
+ "signedOut": "Has cerrado sesión.",
+ "signIn": "Iniciar sesión",
+ "signingIn": "Iniciando sesión...",
+ "invitationLabel": "Invitación",
+ "acceptInvitationTitle": "Acepta tu invitación",
+ "setPasswordPrefix": "Define una contraseña para",
+ "setPasswordSuffix": "para activar tu cuenta.",
+ "goToSignIn": "Ir al inicio de sesión",
+ "activateAccount": "Activar cuenta",
+ "activating": "Activando..."
+ },
+ "bootstrap": {
+ "title": "Configuración del clúster",
+ "subtitle": "El repositorio de GitDB ya está conectado. Completa estos pasos para terminar la instalación.",
+ "stepAdministrator": "Crear administrador del clúster",
+ "stepOrganization": "Crear organización",
+ "createAdministratorFailed": "No se pudo crear el administrador del clúster.",
+ "administratorCardTitle": "1. Crear administrador del clúster",
+ "administratorCardDescription": "Esta cuenta tendrá acceso completo a la configuración del clúster.",
+ "createAdministrator": "Crear administrador",
+ "createOrganizationFailed": "No se pudo crear la organización.",
+ "organizationCardTitle": "2. Crear organización",
+ "organizationCardDescription": "Las organizaciones agrupan proyectos y sus miembros.",
+ "slugOptional": "Slug (opcional)",
+ "creating": "Creando...",
+ "finishSetup": "Finalizar configuración"
+ },
+ "maintenance": {
+ "title": "Mantenimiento",
+ "startupFailed": "Falló el arranque",
+ "gettingReady": "Preparándolo todo…",
+ "startupFailedDescription": "El servidor no pudo iniciarse. Revisa los logs del servidor.",
+ "startingDescription": "El servidor se está iniciando. Esta página se actualizará automáticamente."
+ },
+ "clusterSettings": {
+ "title": "Ajustes del clúster",
+ "audit": {
+ "title": "Registro de auditoría del clúster",
+ "description": "Historial de cambios registrados en el repositorio de datos del clúster."
+ },
+ "users": {
+ "title": "Usuarios del clúster",
+ "description": "Crea usuarios y dales acceso a este clúster."
+ },
+ "roles": {
+ "title": "Roles y permisos del clúster",
+ "description": "Gestiona roles y políticas de acceso granulares en todo el clúster.",
+ "addRole": "Añadir rol del clúster"
+ },
+ "database": {
+ "title": "Base de datos",
+ "description": "El estado de GitDB vive en el repositorio Git configurado mediante variables de entorno. Reinicia el contenedor para aplicar cambios.",
+ "authToken": "Token (GITDB_TOKEN)",
+ "authBasic": "Usuario / Contraseña (GITDB_USERNAME + GITDB_PASSWORD)",
+ "authNone": "Ninguna (clave SSH o repositorio público)",
+ "syncInProgress": "Sincronización en curso",
+ "repositorySynchronized": "Repositorio sincronizado.",
+ "syncFailed": "La sincronización falló.",
+ "status": "Estado",
+ "lastCommit": "Último commit",
+ "lastSync": "Última sincronización",
+ "lastAttempt": "Último intento",
+ "aheadBehind": "Adelante / Detrás",
+ "lastError": "Último error",
+ "syncNow": "Sincronizar ahora",
+ "syncing": "Sincronizando...",
+ "repository": "Repositorio",
+ "authentication": "Autenticación",
+ "credentialLoaded": "credencial cargada",
+ "commitAuthor": "Autor del commit",
+ "repositoryMissing": "GITDB_REPOSITORY_URL no está configurado. El clúster no puede arrancar sin él.",
+ "syncPoll": "Intervalo de sincronización",
+ "everySeconds": "Cada",
+ "seconds": "segundos",
+ "configuredWith": "Configurado con"
+ },
+ "organizations": {
+ "title": "Organizaciones",
+ "description": "Crear, ver y gestionar organizaciones del clúster.",
+ "searchPlaceholder": "Buscar por nombre, slug o descripción...",
+ "nameRequired": "El nombre de la organización es obligatorio.",
+ "created": "Organización creada.",
+ "createFailed": "No se pudo crear la organización.",
+ "deleted": "Organización eliminada.",
+ "deleteFailed": "No se pudo eliminar la organización.",
+ "empty": "No se encontraron organizaciones.",
+ "emptySearch": "Ninguna organización coincide con tu búsqueda.",
+ "viewOrganization": "Ver organización",
+ "newOrganization": "Nueva organización",
+ "createOrganization": "Crear organización",
+ "closeCreateModal": "Cerrar modal de crear organización",
+ "createModal": "Modal de crear organización",
+ "closeDeleteModal": "Cerrar modal de eliminación de organización",
+ "deleteModal": "Modal de eliminación de organización",
+ "deleteOrganization": "Eliminar organización",
+ "deleteConfirmationStart": "¿Seguro que quieres eliminar",
+ "deleteConfirmationEnd": "? Esta acción no se puede deshacer.",
+ "deleting": "Eliminando...",
+ "new": "Nueva organización",
+ "createdColumn": "Creada",
+ "slugPlaceholder": "gitops (se genera automáticamente si se deja vacío)",
+ "descriptionPlaceholder": "Descripción opcional",
+ "createModalTitle": "Nueva organización",
+ "deleteSuccess": "Organización eliminada."
+ },
+ "organizationDetail": {
+ "information": "Información",
+ "copySlug": "Copiar slug de la organización",
+ "slugCopied": "Slug copiado",
+ "nameRequired": "El nombre de la organización es obligatorio.",
+ "updated": "Organización actualizada.",
+ "updateFailed": "No se pudo actualizar la organización.",
+ "copyFailed": "No se pudo copiar el slug.",
+ "saveChanges": "Guardar cambios",
+ "saving": "Guardando...",
+ "dangerZone": "Zona de peligro",
+ "deleteTitle": "Eliminar organización",
+ "deleteDescription": "Elimina permanentemente esta organización. Esta acción no se puede deshacer.",
+ "deleteFailed": "No se pudo eliminar la organización.",
+ "deleteConfirmationStart": "¿Seguro que quieres eliminar",
+ "deleteConfirmationEnd": "? Esta acción no se puede deshacer.",
+ "deleting": "Eliminando...",
+ "copySlugFailed": "No se pudo copiar el slug.",
+ "titleSuffix": "Ajustes del clúster",
+ "optionalDescription": "Descripción opcional",
+ "closeDeleteModal": "Cerrar modal de eliminar organización",
+ "deleteModal": "Modal de eliminar organización",
+ "deleteConfirmTitle": "Eliminar organización",
+ "deleteConfirmStart": "¿Seguro que quieres eliminar ",
+ "deleteConfirmEnd": "? Esta acción no se puede deshacer."
+ }
+ },
+ "org": {
+ "notFound": "Organización no encontrada.",
+ "selectorTitle": "Selecciona una organización",
+ "selectorDescription": "Elige una organización para continuar.",
+ "noMembershipTitle": "Todavía no perteneces a ninguna organización",
+ "noMembershipDescription": "Pide a un administrador que te añada a una organización para empezar.",
+ "overview": {
+ "title": "Vista general",
+ "welcome": "Bienvenido a GitOps.",
+ "comingSoon": "Próximamente",
+ "vaultGuide": "Guía de Vault",
+ "vaultGuideDescription": "Centraliza secretos, credenciales y controles de acceso.",
+ "openReportGuide": "Guía de Open Report",
+ "openReportGuideDescription": "Consulta reportes de vulnerabilidades y dependencias.",
+ "stateIacGuide": "Guía de State IaC",
+ "stateIacGuideDescription": "Configura backends e inspecciona el estado de Pulumi.",
+ "gitopsCliDescription": "Gestiona proyectos y secretos desde la terminal.",
+ "gitopsReportCliDescription": "Genera y consulta reportes de vulnerabilidades desde la terminal.",
+ "gitopsBotDescription": "CI/CD con análisis automatizado y PRs automáticas.",
+ "projectsTitle": "Proyectos",
+ "projectsDescription": "Selecciona un proyecto activo para ver su detalle.",
+ "searchProjects": "Buscar proyectos...",
+ "noActiveProjects": "No hay proyectos activos.",
+ "noProjectMatches": "Ningún proyecto coincide con la búsqueda."
+ },
+ "cves": {
+ "title": "CVEs de la organización",
+ "infoMessage": "Este listado agrupa los CVEs de todos los proyectos de la organización usando el último análisis completado de cada servicio.",
+ "emptyMessage": "Todavía no se han detectado CVEs en esta organización."
+ }
+ },
+ "project": {
+ "layout": {
+ "overview": "Vista general",
+ "overviewSubtitle": "Resumen general del proyecto.",
+ "vaultSubtitle": "Secretos, credenciales y controles de acceso del proyecto.",
+ "codeReportSubtitle": "Reportes de vulnerabilidades y dependencias del proyecto.",
+ "stateIacSubtitle": "Estado de Pulumi y backends de almacenamiento del proyecto.",
+ "information": "Información",
+ "informationSubtitle": "Datos generales, módulos y zona de peligro del proyecto.",
+ "usersAndGroups": "Usuarios y grupos",
+ "usersAndGroupsSubtitle": "Gestiona qué usuarios y grupos tienen acceso a este proyecto.",
+ "rolesAndPermissions": "Roles y permisos",
+ "rolesAndPermissionsSubtitle": "Define roles y permisos específicos para este proyecto.",
+ "serverAccessKeysSubtitle": "Credenciales para que herramientas externas reporten análisis a este proyecto.",
+ "audit": "Auditoría",
+ "auditSubtitle": "Historial de cambios y actividad relevante del proyecto."
+ },
+ "overview": {
+ "inviteMembers": "Invitar miembros",
+ "inviteMembersDescription": "Invita usuarios a colaborar en este proyecto.",
+ "addSecretToken": "Añadir token secreto",
+ "addSecretTokenDescription": "Genera un token para integraciones y CI/CD.",
+ "description": "Descripción",
+ "noDescription": "Sin descripción.",
+ "activeModules": "Módulos activos",
+ "noActiveModules": "Este proyecto no tiene módulos activos. Actívalos desde la configuración del proyecto.",
+ "guides": "Guías",
+ "guidesDescription": "Aprende a sacarle partido a cada módulo.",
+ "guidePrefix": "Guía de",
+ "quickAccess": "Acceso rápido"
+ },
+ "stateIac": {
+ "title": "State IaC",
+ "description": "Inspecciona el estado de Pulumi, backends de almacenamiento e historial de stacks para este proyecto.",
+ "stacks": "Stacks",
+ "stacksDescription": "Recursos, outputs y configuración.",
+ "storageBackends": "Backends de almacenamiento",
+ "storageBackendsDescription": "Buckets S3 o GCS conectados.",
+ "history": "Historial",
+ "historyDescription": "Checkpoints e historial de despliegues.",
+ "workingTitle": "Estamos trabajando en esto",
+ "workingDescription": "El módulo de State IaC está en construcción. Pronto podrás ver stacks, backends de almacenamiento e historial de despliegues de Pulumi directamente desde aquí."
+ },
+ "vault": {
+ "sectionLabel": "Seguridad",
+ "description": "Centraliza secretos, credenciales y controles de acceso para los futuros módulos de seguridad.",
+ "policies": "Policies",
+ "policiesDescription": "Reglas y límites de acceso por módulo.",
+ "secrets": "Secrets",
+ "secretsDescription": "Variables, tokens y claves compartidas.",
+ "access": "Access",
+ "accessDescription": "Autorización y separación por rol.",
+ "workingTitle": "Estamos trabajando en esto",
+ "workingDescription": "El módulo de Vault está en construcción. Pronto podrás administrar secretos, políticas y controles de acceso directamente desde aquí."
+ }
+ },
+ "projectSettings": {
+ "users": {
+ "title": "Usuarios del proyecto",
+ "descriptionPrefix": "Asigna usuarios existentes de la organización a",
+ "descriptionSuffix": "."
+ },
+ "roles": {
+ "title": "Roles y permisos del proyecto",
+ "description": "Gestiona roles y políticas de acceso granulares dentro de este proyecto.",
+ "addRole": "Añadir rol del proyecto"
+ },
+ "audit": {
+ "title": "Auditoría",
+ "description": "Historial de cambios y actividad relevante de cada proyecto.",
+ "comingSoon": "Próximamente",
+ "comingSoonDescription": "El registro de auditoría por proyecto todavía no está disponible."
+ },
+ "serverAccessKeys": {
+ "title": "Claves de acceso del servidor",
+ "descriptionPrefix": "Credenciales para que herramientas externas (CI/CD) reporten análisis de Code Report a este proyecto vía",
+ "createKey": "Crear key",
+ "copyTokenNow": "Copia este token ahora. No se volverá a mostrar.",
+ "noKeys": "Todavía no hay keys para este proyecto.",
+ "created": "Creada",
+ "expires": "Expira",
+ "state": "Estado",
+ "revoked": "Revocada",
+ "expired": "Expirada",
+ "active": "Activa",
+ "revoke": "Revocar",
+ "createServerAccessKey": "Crear server access key",
+ "expiration": "Expiración",
+ "copy": "Copiar",
+ "copied": "Copiado",
+ "copyToken": "Copiar token",
+ "createServerAccessKeyShort": "Crear key de acceso del servidor",
+ "cancel": "Cancelar",
+ "never": "Nunca",
+ "prefix": "Prefijo",
+ "days7": "7 días",
+ "days30": "30 días",
+ "days90": "90 días",
+ "days365": "365 días"
+ },
+ "overview": {
+ "codeReport": "Code Report",
+ "stateIac": "State IaC",
+ "gitopsCliDescription": "Conecta este proyecto con gitops project use {slug}.",
+ "gitopsBotDescription": "Automatiza análisis y PRs para este proyecto.",
+ "copyFailed": "No se pudo copiar el slug.",
+ "nameRequired": "El nombre del proyecto es obligatorio.",
+ "updated": "Proyecto actualizado.",
+ "updateFailed": "No se pudo actualizar el proyecto.",
+ "reactivated": "Proyecto reactivado.",
+ "archived": "Proyecto archivado.",
+ "statusUpdateFailed": "No se pudo actualizar el estado del proyecto.",
+ "deleteFailed": "No se pudo eliminar el proyecto.",
+ "archivedBadge": "Archivado",
+ "copySlug": "Copiar slug del proyecto",
+ "slugCopied": "Slug copiado",
+ "modules": "Módulos",
+ "modulesDescription": "Pulsa en una card para activar o desactivar el módulo.",
+ "moduleActive": "Activo",
+ "moduleDisabled": "Desactivado",
+ "open": "Abrir",
+ "integrations": "Integraciones",
+ "integrationsDescription": "Conecta este proyecto con las herramientas GitOps.",
+ "dangerZone": "Zona de peligro",
+ "transferToOrganization": "Transferir a organización",
+ "transferDescription": "Mueve este proyecto a otra organización.",
+ "transfer": "Transferir",
+ "activateProject": "Activar proyecto",
+ "archiveProject": "Archivar proyecto",
+ "activateDescription": "El proyecto volverá a estado activo y se listará de nuevo.",
+ "archiveDescription": "El proyecto pasará a estado inactivo y dejará de listarse como activo.",
+ "activate": "Activar",
+ "archive": "Archivar",
+ "deleteProject": "Eliminar proyecto",
+ "deleteDescription": "Esta acción no se puede deshacer.",
+ "closeArchiveModal": "Cerrar modal de archivado del proyecto",
+ "archiveModal": "Modal de archivado del proyecto",
+ "activateProjectModal": "Activar proyecto",
+ "archiveProjectModal": "Archivar proyecto",
+ "activateConfirmationStart": "¿Seguro que quieres activar",
+ "activateConfirmationEnd": "? Se marcará como activo de nuevo.",
+ "archiveConfirmationStart": "¿Seguro que quieres archivar",
+ "archiveConfirmationEnd": "? Se marcará como inactivo.",
+ "activating": "Activando...",
+ "archiving": "Archivando...",
+ "closeDeleteModal": "Cerrar modal de eliminación del proyecto",
+ "deleteModal": "Modal de eliminación del proyecto",
+ "deleteConfirmationStart": "¿Seguro que quieres eliminar",
+ "deleteConfirmationEnd": "? Esta acción no se puede deshacer.",
+ "deleting": "Eliminando...",
+ "saveChanges": "Guardar cambios",
+ "title": "Configuración",
+ "copyProjectSlug": "Copiar slug del proyecto",
+ "optionalDescription": "Descripción opcional",
+ "comingSoon": "Próximamente",
+ "transferSoon": "Próximamente"
+ }
+ },
+ "codeReport": {
+ "dashboard": {
+ "title": "Panel",
+ "services": "Servicios",
+ "analysesCompleted": "con al menos un análisis completado",
+ "criticalAndHighCves": "CVEs críticos + altos",
+ "totalCvesDetected": "de {count} CVEs detectados en total",
+ "exposedSecrets": "Secretos expuestos",
+ "gitleaksDetected": "detectados en los últimos análisis de gitleaks",
+ "remediationCoverage": "Cobertura de remediación",
+ "fixVersionAvailable": "CVEs con una versión corregida disponible",
+ "severityDistribution": "Distribución de severidad",
+ "severityDistributionDescription": "Vulnerabilidades del último análisis de cada servicio.",
+ "noVulnerabilities": "No se han detectado vulnerabilidades.",
+ "total": "Total",
+ "securityPolicy": "Política de seguridad",
+ "manage": "Gestionar",
+ "activePoliciesSummary": "{active} políticas activas sobre {evaluated} servicios evaluados.",
+ "servicesFailing": "servicios incumpliendo · {violations} reglas superadas",
+ "servicesSuffix": "servicios",
+ "ok": "OK",
+ "servicesCompliant": "servicios cumplen todas las políticas",
+ "noActivePolicies": "Todavía no hay políticas activas.",
+ "createFirstPolicy": "Crea la primera",
+ "insufficientAnalyses": "Sin análisis suficientes para evaluar las políticas activas.",
+ "topCves": "CVEs más críticos",
+ "noProjectCves": "No se han detectado CVEs en este proyecto.",
+ "serviceCount": "servicio(s)",
+ "viewAllCves": "Ver todos los CVEs",
+ "riskiestServices": "Servicios con más riesgo",
+ "noRiskyServices": "Ningún servicio tiene vulnerabilidades detectadas.",
+ "staleServices": "Servicios sin análisis recientes",
+ "staleServicesDescription": "Sin un escaneo completado en los últimos 30 días.",
+ "allRecent": "Todos los servicios tienen análisis recientes.",
+ "lastScan": "Último escaneo",
+ "critical": "crítica",
+ "high": "alta",
+ "medium": "media",
+ "low": "baja",
+ "unknown": "desconocida"
+ },
+ "services": {
+ "searchPlaceholder": "Buscar servicios por nombre, slug o tag...",
+ "addService": "Añadir servicio",
+ "empty": "Todavía no hay servicios en este proyecto.",
+ "emptySearch": "Sin resultados para tu búsqueda.",
+ "lastScan": "Último escaneo",
+ "noAnalysis": "Sin análisis de vulnerabilidades todavía.",
+ "slugHelp": "(opcional, se genera del nombre)",
+ "tags": "Tags",
+ "tagPlaceholder": "Añade un tag y pulsa Enter",
+ "creating": "Creando...",
+ "createService": "Crear servicio",
+ "name": "Nombre",
+ "description": "Descripción",
+ "cancel": "Cancelar",
+ "severity": {
+ "critical": "Crítica",
+ "high": "Alta",
+ "medium": "Media",
+ "low": "Baja"
+ }
+ },
+ "serviceDetail": {
+ "backToServices": "Volver a servicios",
+ "viewHistory": "Ver histórico",
+ "deleteService": "Borrar servicio",
+ "deleteDescriptionStart": "Vas a borrar",
+ "deleteDescriptionEnd": "y todos sus análisis. Esta acción no se puede deshacer.",
+ "deleting": "Borrando...",
+ "deleteServiceAndAnalyses": "Borrar servicio y análisis",
+ "deleteTitle": "Borrar servicio",
+ "cancel": "Cancelar"
+ },
+ "cves": {
+ "title": "CVEs de Code Report",
+ "infoMessage": "Este listado muestra los CVEs detectados en el último análisis de cada servicio. Los servicios sin un análisis reciente completado no aparecen reflejados aquí.",
+ "emptyMessage": "Todavía no se han detectado CVEs en este proyecto."
+ },
+ "history": {
+ "allStatuses": "Todos los estados",
+ "completed": "Completado",
+ "inProgress": "En progreso",
+ "failed": "Fallido",
+ "critical": "Crítico",
+ "high": "Alto",
+ "medium": "Medio",
+ "low": "Bajo",
+ "noRisk": "Sin riesgo",
+ "allServices": "Todos los servicios",
+ "title": "Histórico de análisis",
+ "description": "Consulta todos los informes del proyecto y abre cualquier ejecución.",
+ "searchPlaceholder": "Buscar servicio o herramienta...",
+ "filterByDate": "Filtrar por fecha",
+ "reportSingular": "informe",
+ "reportPlural": "informes",
+ "noReports": "No hay informes que coincidan con los filtros.",
+ "serviceDeleted": "Servicio eliminado",
+ "serviceLabel": "Servicio",
+ "idLabel": "ID",
+ "risk": "Riesgo",
+ "vulnerabilities": "vulnerabilidades",
+ "backToServices": "Volver a servicios",
+ "backToHistory": "Volver al histórico",
+ "reportViewed": "Informe consultado"
+ },
+ "securityPolicy": {
+ "title": "Políticas de seguridad",
+ "searchPlaceholder": "Buscar políticas por nombre o slug...",
+ "allTypes": "Todos los tipos",
+ "newPolicy": "Nueva política",
+ "empty": "Todavía no hay políticas de seguridad en este proyecto.",
+ "emptySearch": "Sin resultados para tu búsqueda.",
+ "createFirstPolicy": "Crear la primera política",
+ "active": "Activa",
+ "inactive": "Inactiva",
+ "scope": "Alcance",
+ "disablePolicy": "Desactivar política",
+ "activatePolicy": "Activar política",
+ "backToPolicies": "Volver a políticas",
+ "createPolicy": "Crear política",
+ "editing": "Editar",
+ "cancelEditing": "Cancelar edición",
+ "delete": "Borrar",
+ "evaluating": "Analizando...",
+ "evaluateServices": "Analizar servicios",
+ "servicesReevaluated": "servicios reevaluados",
+ "analysesUpdated": "análisis actualizados",
+ "failingPolicy": "incumplen esta política.",
+ "noneFailPolicy": "Ninguno incumple esta política.",
+ "detailTab": "Detalle",
+ "affectedServicesTab": "Servicios afectados",
+ "affectedServices": "Servicios afectados",
+ "affectedServicesDescription": "Servicios con análisis evaluados contra esta política.",
+ "failing": "incumpliendo",
+ "noEvaluations": "Ningún análisis se ha evaluado contra esta política todavía. Usa \"Analizar servicios\" para evaluarlos.",
+ "analysesEvaluated": "análisis evaluados",
+ "lastWith": "último con",
+ "onDate": "el",
+ "compliant": "Cumple",
+ "nonCompliant": "Incumple",
+ "analysesAffected": "análisis afectados",
+ "type": "Tipo",
+ "application": "Aplicación",
+ "rules": "Reglas",
+ "createdOn": "Creada el",
+ "updatedOn": "Actualizada el",
+ "deletePolicy": "Borrar política",
+ "deleteDescriptionStart": "Vas a borrar",
+ "deleteDescriptionEnd": ". Esta acción no se puede deshacer.",
+ "deleting": "Borrando..."
+ },
+ "settings": {
+ "title": "Ajustes de Code Report",
+ "tabsLabel": "Pestañas de ajustes de Code Report",
+ "general": "General",
+ "tools": "Herramientas",
+ "notifications": "Notificaciones",
+ "reportBot": "GitOps Report Bot",
+ "webhooks": "Webhooks",
+ "soon": "Próximamente",
+ "comingSoon": "Próximamente",
+ "generalTitle": "General",
+ "generalDescription": "Parámetros globales del módulo para puntuar riesgo y clasificar findings en este proyecto.",
+ "riskMultipliers": "Multiplicadores de riesgo de seguridad",
+ "formulaDescription": "Fórmula aplicada en el detalle de servicio: (Critical × M_c) + (High × M_h) + (Medium × M_m) + (Low × M_l).",
+ "critical": "Critical",
+ "high": "High",
+ "medium": "Medium",
+ "low": "Low",
+ "example": "Ejemplo actual: (Critical × 10) + (High × 6) + (Medium × 3) + (Low × 1) = 561 puntos.",
+ "ranges": "Rangos: bajo 1-7, medio 8-19, alto 20-39, crítico 40+ o cualquier vulnerabilidad Critical.",
+ "moreSettings": "Más ajustes",
+ "moreSettingsDescription": "Próximamente: baseline por servicio, severidades mínimas para alertas y excepciones temporales de CVEs.",
+ "toolsTitle": "Herramientas de análisis",
+ "toolsDescription": "Gestiona las categorías de análisis habilitadas para este proyecto. Lo que actives aquí se guarda en los ajustes del proyecto y se devolverá en la API de scan.",
+ "enabled": "Habilitada",
+ "disabled": "Deshabilitada"
+ },
+ "servicesTitle": "Servicios de Code Report"
+ },
+ "orgSettings": {
+ "title": "Ajustes",
+ "users": {
+ "title": "Usuarios de la organización",
+ "description": "Crea usuarios y dales acceso a esta organización."
+ },
+ "roles": {
+ "title": "Roles y permisos de la organización",
+ "description": "Gestiona roles y políticas de acceso granulares en esta organización.",
+ "addRole": "Añadir rol de la organización"
+ },
+ "audit": {
+ "title": "Auditoría",
+ "description": "Historial de cambios registrados en los datos de esta organización."
+ },
+ "global": {
+ "notWired": "La configuración global de autenticación todavía no está conectada a una acción del servidor.",
+ "title": "Configuración global",
+ "description": "Configura métodos de autenticación y valores de seguridad predeterminados para toda la organización.",
+ "authentication": "Autenticación",
+ "authenticationDescription": "El acceso local siempre está habilitado. Opcionalmente conecta GCP Workspace y SAML como proveedores adicionales.",
+ "localAuthAlwaysOn": "Autenticación local: siempre activada",
+ "localAuthDescription": "El acceso con usuario/contraseña sigue disponible incluso cuando los proveedores externos están habilitados.",
+ "googleDescription": "Permite que los usuarios se autentiquen con cuentas de Google Workspace.",
+ "googleClientId": "Google Client ID",
+ "googleClientSecret": "Google Client Secret",
+ "samlDescription": "Conecta un proveedor de identidad empresarial mediante SAML.",
+ "samlEntryPoint": "Punto de entrada SAML",
+ "samlIssuer": "Emisor SAML",
+ "samlCertificate": "Certificado SAML (PEM)",
+ "saved": "Configuración global guardada.",
+ "saving": "Guardando...",
+ "save": "Guardar configuración global",
+ "encryption": "Cifrado",
+ "encryptionDescription": "Aquí se gestionarán los controles de cifrado de la organización.",
+ "comingSoon": "Próximamente",
+ "comingSoonDescription": "La rotación de claves, la política de cifrado y la protección de secretos por ámbito están previstas para una futura versión.",
+ "saveNotWired": "La configuración global de autenticación aún no está conectada a una acción del servidor.",
+ "localAuthTitle": "Autenticación local: siempre ACTIVA"
+ },
+ "projects": {
+ "title": "Proyectos",
+ "description": "Crear, organizar y gestionar los proyectos.",
+ "searchPlaceholder": "Buscar por nombre, slug o descripción...",
+ "allStatuses": "Todos los estados",
+ "nameRequired": "El nombre del proyecto es obligatorio.",
+ "noOrganizationSelected": "No hay ninguna organización seleccionada.",
+ "created": "Proyecto creado.",
+ "createFailed": "No se pudo crear el proyecto.",
+ "deleted": "Proyecto eliminado.",
+ "deleteFailed": "No se pudo eliminar el proyecto.",
+ "empty": "No se encontraron proyectos.",
+ "emptyFiltered": "Ningún proyecto coincide con tus filtros.",
+ "newProject": "Nuevo proyecto",
+ "viewProject": "Ver proyecto",
+ "createProject": "Crear proyecto",
+ "closeCreateModal": "Cerrar modal de crear proyecto",
+ "createModal": "Modal de crear proyecto",
+ "closeDeleteModal": "Cerrar confirmación de eliminar proyecto",
+ "deleteModal": "Modal de eliminar proyecto",
+ "deleteProject": "Eliminar proyecto",
+ "deleteConfirmationStart": "¿Seguro que quieres eliminar",
+ "deleteConfirmationEnd": "? Esta acción no se puede deshacer.",
+ "deleting": "Eliminando...",
+ "creating": "Creando...",
+ "new": "Nuevo proyecto",
+ "noOrganization": "No hay una organización seleccionada.",
+ "createModalTitle": "Nuevo proyecto",
+ "slugPlaceholder": "platform-core (se genera automáticamente si se deja vacío)",
+ "descriptionPlaceholder": "Descripción opcional",
+ "deleteConfirmTitle": "Eliminar proyecto",
+ "deleteConfirmStart": "¿Seguro que quieres eliminar ",
+ "deleteConfirmEnd": "? Esta acción no se puede deshacer."
+ },
+ "serverAccessKeys": {
+ "title": "Claves de acceso del servidor",
+ "description": "Gestiona credenciales de máquina a máquina para integraciones del servidor.",
+ "comingSoonDescription": "Esta sección alojará los flujos de emisión, rotación y revocación de claves de servidor."
+ },
+ "systemBackup": {
+ "title": "Sistema y respaldo",
+ "description": "Configura el comportamiento del sistema, las exportaciones y el ciclo de vida de las copias de seguridad.",
+ "comingSoonDescription": "Los horarios de respaldo, la retención y los controles de importación/exportación estarán disponibles aquí."
+ }
+ },
+ "usersComponent": {
+ "defaultTitle": "Usuarios",
+ "defaultDescription": "Gestiona el acceso de los usuarios.",
+ "actionFailed": "La acción de usuario falló.",
+ "roleRequired": "El rol es obligatorio.",
+ "usernamePasswordRequired": "El usuario y la contraseña son obligatorios.",
+ "userRequired": "El usuario es obligatorio.",
+ "userAssigned": "Usuario asignado.",
+ "userCreated": "Usuario creado.",
+ "addFailed": "No se pudo añadir el usuario.",
+ "emailRequired": "El correo electrónico es obligatorio.",
+ "invitationSent": "Invitación enviada.",
+ "inviteFailed": "No se pudo invitar al usuario.",
+ "roleUpdated": "Rol actualizado.",
+ "updateAccessFailed": "No se pudo actualizar el acceso del usuario.",
+ "accessRemoved": "Acceso del usuario eliminado.",
+ "removeAccessFailed": "No se pudo eliminar el acceso del usuario.",
+ "invitationResent": "Invitación reenviada.",
+ "resendFailed": "No se pudo reenviar la invitación.",
+ "inviteUser": "Invitar usuario",
+ "addUser": "Añadir usuario",
+ "newUser": "Nuevo usuario",
+ "searchPlaceholder": "Buscar por usuario, correo o rol...",
+ "empty": "No se encontraron usuarios.",
+ "emptySearch": "Ningún usuario coincide con tu búsqueda.",
+ "organizations": "Organizaciones",
+ "user": "Usuario",
+ "added": "Añadido",
+ "resendInvitation": "Reenviar invitación",
+ "removeAccess": "Eliminar acceso",
+ "closeAddModal": "Cerrar modal de añadir usuario",
+ "addModal": "Modal de añadir usuario",
+ "selectRole": "Seleccionar rol",
+ "invited": "Invitado",
+ "sending": "Enviando...",
+ "closeInviteModal": "Cerrar modal de invitar usuario",
+ "inviteModal": "Modal de invitar usuario",
+ "inviteModalTitle": "Invitar usuario",
+ "inviteModalDescription": "Si la cuenta aún no existe la crearemos y enviaremos la invitación por correo. Las cuentas activas existentes obtendrán acceso inmediatamente.",
+ "sendInvitation": "Enviar invitación",
+ "closeRemoveModal": "Cerrar confirmación de eliminación de acceso",
+ "removeModal": "Confirmación de eliminación de acceso",
+ "removeModalTitle": "Eliminar acceso",
+ "removeModalDescriptionStart": "Eliminar el acceso de",
+ "removeModalDescriptionEnd": "? Esto revocará la asignación de este alcance.",
+ "removing": "Eliminando...",
+ "adding": "Añadiendo..."
+ },
+ "rolePermissions": {
+ "defaultTitle": "Roles y permisos",
+ "defaultDescription": "Gestiona roles de usuario y políticas de acceso granulares.",
+ "addRole": "Añadir rol",
+ "empty": "No se encontraron roles."
+ },
+ "roleDetail": {
+ "edit": "Editar",
+ "actionFailed": "La acción del rol falló.",
+ "saved": "Rol guardado.",
+ "saveFailed": "No se pudo guardar el rol.",
+ "deleteFailed": "No se pudo eliminar el rol.",
+ "orgRoleDetails": "Detalle del rol de organización",
+ "projectRoleDetails": "Detalle del rol de proyecto",
+ "clusterRoleDetails": "Detalle del rol de clúster",
+ "roleId": "ID del rol",
+ "developerPlaceholder": "Developer",
+ "newRole": "Nuevo rol",
+ "roleSuffix": "rol",
+ "permissions": "Permisos",
+ "deleting": "Eliminando...",
+ "saving": "Guardando...",
+ "resource": "Recurso",
+ "permission": "Permiso",
+ "collapseSection": "Contraer sección",
+ "expandSection": "Expandir sección",
+ "noAccess": "Sin acceso",
+ "readOnly": "Solo lectura",
+ "fullAccess": "Acceso completo",
+ "custom": "Personalizado",
+ "sectionGroup": "Grupo de secciones",
+ "addClusterRole": "Añadir rol del clúster",
+ "addOrganizationRole": "Añadir rol de la organización",
+ "addProjectRole": "Añadir rol del proyecto"
+ },
+ "auditLog": {
+ "defaultTitle": "Registro de auditoría",
+ "defaultDescription": "Historial de cambios registrados en el repositorio de datos.",
+ "allTime": "Todo el tiempo",
+ "today": "Hoy",
+ "last7Days": "Últimos 7 días",
+ "last30Days": "Últimos 30 días",
+ "last3Months": "Últimos 3 meses",
+ "customRange": "Rango personalizado...",
+ "loadFailed": "No se pudieron cargar los cambios.",
+ "searchPlaceholder": "Buscar por entidad, acción, autor o commit...",
+ "fromDate": "Fecha desde",
+ "toDate": "Fecha hasta",
+ "allOrganizations": "Todas las organizaciones",
+ "filter": "Filtrar",
+ "clear": "Limpiar",
+ "emptyFiltered": "Ningún evento de auditoría coincide con tus filtros.",
+ "empty": "No se encontraron eventos de auditoría.",
+ "author": "Autor",
+ "commit": "Commit",
+ "viewCommit": "Ver commit en el repositorio",
+ "viewChanges": "Ver cambios",
+ "perPage": "por página",
+ "previous": "Anterior",
+ "next": "Siguiente",
+ "page": "Página",
+ "closeChangesModal": "Cerrar modal de cambios",
+ "changeDetails": "Detalle del cambio",
+ "by": "por",
+ "loadingChanges": "Cargando cambios...",
+ "noChanges": "No se detectaron cambios.",
+ "before": "Antes",
+ "after": "Después",
+ "actions": {
+ "insert": "creación",
+ "update": "actualización",
+ "delete": "eliminación",
+ "other": "otro"
+ },
+ "actionsLabel": "Acción",
+ "entity": "Entidad"
+ },
+ "subNavbar": {
+ "defaultLabel": "Estado",
+ "defaultRootLabel": "Proyectos",
+ "select": "Seleccionar",
+ "notAvailable": "N/D"
+ }
+}
diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte
index 0925a3c..f77e28d 100644
--- a/src/routes/+error.svelte
+++ b/src/routes/+error.svelte
@@ -2,6 +2,7 @@
import '../app.css';
import { page } from '$app/stores';
import { ShieldAlert, FileQuestion, ServerCrash, ArrowLeft, Home } from '@lucide/svelte';
+ import { _ } from 'svelte-i18n';
$: status = $page.status;
$: message = $page.error?.message;
@@ -10,21 +11,21 @@
status === 404
? {
icon: FileQuestion,
- title: 'Página no encontrada',
- description: 'La página que buscas no existe o fue movida a otra ubicación.',
+ title: $_('error.notFoundTitle'),
+ description: $_('error.notFoundDescription'),
accent: 'slate',
}
: status === 403
? {
icon: ShieldAlert,
- title: 'No tienes permisos',
- description: 'No cuentas con los permisos necesarios para acceder a este recurso.',
+ title: $_('error.forbiddenTitle'),
+ description: $_('error.forbiddenDescription'),
accent: 'amber',
}
: {
icon: ServerCrash,
- title: 'Algo salió mal',
- description: message || 'Ocurrió un error inesperado. Intenta nuevamente más tarde.',
+ title: $_('error.genericTitle'),
+ description: message || $_('error.genericDescription'),
accent: 'red',
};
@@ -43,7 +44,7 @@