@mdguggenbichler/slugbase-core 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/frontend/index.tsx +3 -3
  2. package/frontend/public/favicon.svg +1 -0
  3. package/frontend/public/slugbase_icon_blue.svg +1 -0
  4. package/frontend/public/slugbase_icon_white.png +0 -0
  5. package/frontend/public/slugbase_icon_white.svg +1 -0
  6. package/frontend/src/App.tsx +179 -0
  7. package/frontend/src/api/client.ts +134 -0
  8. package/frontend/src/components/AppSidebar.tsx +214 -0
  9. package/frontend/src/components/EmptyState.tsx +33 -0
  10. package/frontend/src/components/Favicon.tsx +76 -0
  11. package/frontend/src/components/FilterChips.tsx +60 -0
  12. package/frontend/src/components/FolderIcon.tsx +207 -0
  13. package/frontend/src/components/GlobalSearch.tsx +275 -0
  14. package/frontend/src/components/Layout.tsx +60 -0
  15. package/frontend/src/components/PageHeader.tsx +31 -0
  16. package/frontend/src/components/ScopeSegmentedControl.tsx +42 -0
  17. package/frontend/src/components/SentryDebug.tsx +32 -0
  18. package/frontend/src/components/StatCard.tsx +66 -0
  19. package/frontend/src/components/TopBar.tsx +63 -0
  20. package/frontend/src/components/UserDropdown.tsx +86 -0
  21. package/frontend/src/components/admin/AdminAI.tsx +207 -0
  22. package/frontend/src/components/admin/AdminOIDCProviders.tsx +183 -0
  23. package/frontend/src/components/admin/AdminSettings.tsx +413 -0
  24. package/frontend/src/components/admin/AdminTeams.tsx +177 -0
  25. package/frontend/src/components/admin/AdminUsers.tsx +225 -0
  26. package/frontend/src/components/bookmarks/BookmarkCard.tsx +312 -0
  27. package/frontend/src/components/bookmarks/BookmarkListItem.tsx +159 -0
  28. package/frontend/src/components/bookmarks/BookmarkTableView.tsx +419 -0
  29. package/frontend/src/components/bookmarks/BulkActionModals.tsx +162 -0
  30. package/frontend/src/components/bookmarks/FilterChips.tsx +5 -0
  31. package/frontend/src/components/modals/BookmarkModal.tsx +493 -0
  32. package/frontend/src/components/modals/FolderModal.tsx +306 -0
  33. package/frontend/src/components/modals/ImportModal.tsx +232 -0
  34. package/frontend/src/components/modals/OIDCProviderModal.tsx +284 -0
  35. package/frontend/src/components/modals/SharingModal.tsx +96 -0
  36. package/frontend/src/components/modals/TagModal.tsx +101 -0
  37. package/frontend/src/components/modals/TeamAssignmentModal.tsx +354 -0
  38. package/frontend/src/components/modals/TeamModal.tsx +117 -0
  39. package/frontend/src/components/modals/UserModal.tsx +225 -0
  40. package/frontend/src/components/profile/CreateTokenModal.tsx +172 -0
  41. package/frontend/src/components/sharing/ShareResourceDialog.tsx +422 -0
  42. package/frontend/src/components/ui/Autocomplete.tsx +155 -0
  43. package/frontend/src/components/ui/Button.tsx +68 -0
  44. package/frontend/src/components/ui/ConfirmDialog.tsx +79 -0
  45. package/frontend/src/components/ui/FormFieldWrapper.tsx +36 -0
  46. package/frontend/src/components/ui/ModalFooterActions.tsx +49 -0
  47. package/frontend/src/components/ui/ModalSection.tsx +34 -0
  48. package/frontend/src/components/ui/PageLoadingSkeleton.tsx +24 -0
  49. package/frontend/src/components/ui/Select.tsx +61 -0
  50. package/frontend/src/components/ui/SharingField.tsx +298 -0
  51. package/frontend/src/components/ui/Toast.tsx +47 -0
  52. package/frontend/src/components/ui/Tooltip.tsx +21 -0
  53. package/frontend/src/components/ui/alert-dialog.tsx +139 -0
  54. package/frontend/src/components/ui/badge.tsx +36 -0
  55. package/frontend/src/components/ui/button-base.tsx +57 -0
  56. package/frontend/src/components/ui/card.tsx +76 -0
  57. package/frontend/src/components/ui/command.tsx +161 -0
  58. package/frontend/src/components/ui/dialog.tsx +120 -0
  59. package/frontend/src/components/ui/dropdown-menu.tsx +199 -0
  60. package/frontend/src/components/ui/input.tsx +22 -0
  61. package/frontend/src/components/ui/label.tsx +24 -0
  62. package/frontend/src/components/ui/popover.tsx +33 -0
  63. package/frontend/src/components/ui/progress.tsx +26 -0
  64. package/frontend/src/components/ui/scroll-area.tsx +48 -0
  65. package/frontend/src/components/ui/select-base.tsx +159 -0
  66. package/frontend/src/components/ui/separator.tsx +29 -0
  67. package/frontend/src/components/ui/sheet.tsx +140 -0
  68. package/frontend/src/components/ui/sidebar.tsx +783 -0
  69. package/frontend/src/components/ui/skeleton.tsx +15 -0
  70. package/frontend/src/components/ui/sonner.tsx +46 -0
  71. package/frontend/src/components/ui/switch.tsx +28 -0
  72. package/frontend/src/components/ui/table.tsx +120 -0
  73. package/frontend/src/components/ui/tooltip-base.tsx +30 -0
  74. package/frontend/src/config/api.ts +16 -0
  75. package/frontend/src/config/mode.ts +6 -0
  76. package/frontend/src/contexts/AppConfigContext.tsx +39 -0
  77. package/frontend/src/contexts/AuthContext.tsx +137 -0
  78. package/frontend/src/contexts/SearchCommandContext.tsx +28 -0
  79. package/frontend/src/hooks/use-mobile.tsx +19 -0
  80. package/frontend/src/hooks/useConfirmDialog.ts +63 -0
  81. package/frontend/src/hooks/useMarketingTheme.ts +47 -0
  82. package/frontend/src/i18n.ts +39 -0
  83. package/frontend/src/index.css +117 -0
  84. package/frontend/src/instrument.ts +20 -0
  85. package/frontend/src/lib/utils.ts +6 -0
  86. package/frontend/src/locales/de.json +899 -0
  87. package/frontend/src/locales/en.json +937 -0
  88. package/frontend/src/locales/es.json +884 -0
  89. package/frontend/src/locales/fr.json +550 -0
  90. package/frontend/src/locales/it.json +535 -0
  91. package/frontend/src/locales/ja.json +535 -0
  92. package/frontend/src/locales/nl.json +550 -0
  93. package/frontend/src/locales/pl.json +535 -0
  94. package/frontend/src/locales/pt.json +535 -0
  95. package/frontend/src/locales/ru.json +535 -0
  96. package/frontend/src/locales/zh.json +535 -0
  97. package/frontend/src/main.tsx +44 -0
  98. package/frontend/src/pages/Bookmarks.tsx +1004 -0
  99. package/frontend/src/pages/Dashboard.tsx +427 -0
  100. package/frontend/src/pages/Folders.tsx +578 -0
  101. package/frontend/src/pages/GoPreferences.tsx +134 -0
  102. package/frontend/src/pages/Login.tsx +196 -0
  103. package/frontend/src/pages/PasswordReset.tsx +242 -0
  104. package/frontend/src/pages/Profile.tsx +593 -0
  105. package/frontend/src/pages/SearchEngineGuide.tsx +135 -0
  106. package/frontend/src/pages/Setup.tsx +210 -0
  107. package/frontend/src/pages/Signup.tsx +199 -0
  108. package/frontend/src/pages/Tags.tsx +421 -0
  109. package/frontend/src/pages/VerifyEmail.tsx +254 -0
  110. package/frontend/src/pages/admin/AdminAIPage.tsx +5 -0
  111. package/frontend/src/pages/admin/AdminLayout.tsx +40 -0
  112. package/frontend/src/pages/admin/AdminMembersPage.tsx +5 -0
  113. package/frontend/src/pages/admin/AdminOIDCPage.tsx +5 -0
  114. package/frontend/src/pages/admin/AdminSettingsPage.tsx +5 -0
  115. package/frontend/src/pages/admin/AdminTeamsPage.tsx +5 -0
  116. package/frontend/src/utils/favicon.ts +36 -0
  117. package/frontend/src/utils/formatRelativeTime.ts +37 -0
  118. package/frontend/src/utils/safeHref.ts +31 -0
  119. package/frontend/src/vite-env.d.ts +10 -0
  120. package/package.json +9 -1
@@ -0,0 +1,884 @@
1
+ {
2
+ "app": {
3
+ "name": "SlugBase",
4
+ "tagline": "Tus enlaces. Tu estructura. Tu idioma. Tus reglas."
5
+ },
6
+ "contact": {
7
+ "title": "Contacto",
8
+ "subtitle": "Escríbenos.",
9
+ "trustParagraph": "¿Dudas sobre self-hosting, equipos o facturación? Solemos responder en pocos días laborables.",
10
+ "linksDocs": "Docs",
11
+ "linksGitHub": "GitHub",
12
+ "linksPricing": "Precios",
13
+ "linksDemo": "Probar SlugBase",
14
+ "name": "Nombre",
15
+ "email": "Correo electrónico",
16
+ "message": "Mensaje",
17
+ "send": "Enviar",
18
+ "success": "Mensaje enviado. Te contestamos pronto.",
19
+ "error": "Algo falló. Vuelve a intentarlo o escríbenos.",
20
+ "privacyNotice": "Al enviar aceptas el tratamiento de tus datos según nuestra Política de Privacidad."
21
+ },
22
+ "auth": {
23
+ "login": "Iniciar sesión",
24
+ "logout": "Cerrar sesión",
25
+ "loginWith": "Iniciar sesión con {{provider}}",
26
+ "notAuthenticated": "No autenticado",
27
+ "authFailed": "Error de autenticación",
28
+ "loginFailed": "Error al iniciar sesión",
29
+ "oidcAuthFailed": "Error de autenticación OIDC. Por favor, inténtalo de nuevo.",
30
+ "oidcAutoCreateDisabled": "La creación automática de usuarios está deshabilitada para este proveedor OIDC. Por favor, contacta con un administrador.",
31
+ "noProviders": "No hay proveedores OIDC configurados",
32
+ "noProvidersDescription": "Configura un proveedor OIDC en ajustes de admin para poder entrar con OIDC.",
33
+ "email": "Correo electrónico",
34
+ "emailPlaceholder": "tu@email.com",
35
+ "password": "Contraseña",
36
+ "passwordPlaceholder": "Contraseña",
37
+ "forgotPassword": "¿Olvidaste tu contraseña?",
38
+ "or": "O continuar con",
39
+ "verifyEmailRequired": "Confirma tu correo antes de entrar. Mira la bandeja de entrada por el enlace.",
40
+ "createAccount": "Crear cuenta",
41
+ "signUp": "Registrarse"
42
+ },
43
+ "invitations": {
44
+ "tokenRequired": "Falta el token de invitación",
45
+ "notAvailable": "Las invitaciones de organización no están disponibles",
46
+ "invalidOrExpired": "Esta invitación no es válida o ha caducado",
47
+ "verifying": "Comprobando invitación…",
48
+ "accepting": "Aceptando invitación…",
49
+ "accepted": "Invitación aceptada",
50
+ "redirecting": "Redirigiendo…",
51
+ "error": "No se pudo aceptar",
52
+ "loginRequired": "Inicia sesión para aceptar",
53
+ "loginRequiredDescription": "Entra con el correo al que enviamos la invitación para unirte a {{org}}."
54
+ },
55
+ "signup": {
56
+ "title": "Crea tu cuenta",
57
+ "subtitle": "Regístrate con correo y contraseña.",
58
+ "email": "Correo electrónico",
59
+ "name": "Nombre",
60
+ "namePlaceholder": "Tu nombre",
61
+ "password": "Contraseña",
62
+ "passwordHint": "Al menos 8 caracteres",
63
+ "confirmPassword": "Confirmar contraseña",
64
+ "submit": "Registrarse",
65
+ "successTitle": "Revisa tu correo",
66
+ "successMessage": "Te enviamos un enlace de verificación. Haz clic para activar la cuenta y luego entra.",
67
+ "backToLogin": "Volver a iniciar sesión",
68
+ "alreadyHaveAccount": "¿Ya tienes cuenta?",
69
+ "logIn": "Entrar",
70
+ "noAccount": "¿Sin cuenta?",
71
+ "acceptTermsPrefix": "He leído y acepto los ",
72
+ "acceptTermsTerms": "Términos y condiciones",
73
+ "acceptTermsAnd": " y la ",
74
+ "acceptTermsPrivacy": "Política de privacidad",
75
+ "acceptTermsSuffix": ".",
76
+ "acceptTermsRequired": "Tienes que aceptar los términos y la política de privacidad para registrarte."
77
+ },
78
+ "setup": {
79
+ "title": "Configuración inicial",
80
+ "description": "¡Bienvenido a SlugBase! Crea tu primer usuario administrador para comenzar.",
81
+ "email": "Correo electrónico",
82
+ "emailPlaceholder": "admin@example.com",
83
+ "name": "Nombre",
84
+ "namePlaceholder": "Usuario administrador",
85
+ "password": "Contraseña",
86
+ "passwordPlaceholder": "Mínimo 8 caracteres",
87
+ "confirmPassword": "Confirmar contraseña",
88
+ "confirmPasswordPlaceholder": "Vuelve a ingresar tu contraseña",
89
+ "passwordMismatch": "Las contraseñas no coinciden",
90
+ "passwordTooShort": "La contraseña debe tener al menos 8 caracteres",
91
+ "adminNote": "Este usuario se creará como administrador. Puedes configurar proveedores OIDC más adelante en la configuración de administrador.",
92
+ "submit": "Crear usuario administrador",
93
+ "alreadyInitialized": "El sistema ya está inicializado",
94
+ "success": "¡Configuración completada con éxito!",
95
+ "redirecting": "Redirigiendo al inicio de sesión...",
96
+ "redirectingToDashboard": "Redirigiendo al panel..."
97
+ },
98
+ "bookmarks": {
99
+ "title": "Marcadores",
100
+ "create": "Crear marcador",
101
+ "edit": "Editar marcador",
102
+ "delete": "Eliminar marcador",
103
+ "deleteBookmark": "Eliminar marcador",
104
+ "sharingSummary": "{{teamCount}} {{teams}}, {{userCount}} {{users}}",
105
+ "name": "Título",
106
+ "url": "URL",
107
+ "slug": "Slug",
108
+ "slugOptionalHint": "Déjalo vacío si no necesitas un slug personalizado",
109
+ "forwardingEnabled": "Habilitar reenvío",
110
+ "forwardingUrl": "URL de reenvío",
111
+ "copyUrl": "Copiar URL",
112
+ "copied": "¡Copiado!",
113
+ "folder": "Carpeta",
114
+ "folders": "Carpetas",
115
+ "tags": "Etiquetas",
116
+ "noFolder": "Sin carpeta",
117
+ "noFoldersAvailable": "Aún no hay carpetas. Créalas para organizar tus marcadores.",
118
+ "foldersDescription": "Una o más carpetas para este marcador",
119
+ "noTags": "Sin etiquetas",
120
+ "save": "Guardar",
121
+ "cancel": "Cancelar",
122
+ "deleteConfirm": "¿Eliminar este marcador?",
123
+ "deleteConfirmWithName": "¿Eliminar \"{{name}}\"?",
124
+ "empty": "Aún no hay marcadores. Crea el primero.",
125
+ "emptyDescription": "Crea tu primer marcador o importa algunos.",
126
+ "emptyCreateFirst": "Crear primer marcador",
127
+ "emptyImport": "Importar marcadores",
128
+ "emptyLearnForwarding": "Aprende cómo funciona el reenvío",
129
+ "filterByFolder": "Filtrar por carpeta",
130
+ "filterByTag": "Filtrar por etiqueta",
131
+ "allFolders": "Todas las carpetas",
132
+ "allTags": "Todas las etiquetas",
133
+ "open": "Abrir",
134
+ "shareWithTeams": "Compartir con equipos",
135
+ "shareWithTeamsDescription": "Elige equipos que puedan ver este marcador.",
136
+ "shareAllTeams": "Compartir con todos mis equipos",
137
+ "shareAllTeamsDescription": "Compartir con todos los equipos de los que eres miembro",
138
+ "shareWithUsers": "Compartir con usuarios",
139
+ "shareWithUsersDescription": "Elige con qué usuarios compartir",
140
+ "sharedWith": "Compartido con:",
141
+ "users": "usuarios",
142
+ "shared": "Compartido",
143
+ "sharedWithTeam": "Compartido con equipo",
144
+ "sharedWithTeams": "Compartido · {{count}} {{teams}}",
145
+ "teams": "equipos",
146
+ "optional": "Opcional",
147
+ "slugRequired": "El slug es obligatorio cuando el reenvío está habilitado",
148
+ "slugAlreadyExists": "El slug ya existe. Los slugs deben ser únicos en todos los marcadores.",
149
+ "searchEngineNote": "¿Quieres acceder rápidamente a tus marcadores desde la barra de direcciones de tu navegador?",
150
+ "searchEngineGuideLink": "Aprende cómo configurar un motor de búsqueda personalizado",
151
+ "viewMode": "Modo de vista",
152
+ "viewCard": "Vista de tarjetas",
153
+ "viewList": "Vista de lista",
154
+ "compactMode": "Modo compacto",
155
+ "sortBy": "Ordenar por",
156
+ "sortRecentlyAdded": "Agregados recientemente",
157
+ "sortAlphabetical": "Alfabético",
158
+ "sortMostUsed": "Más usados",
159
+ "sortRecentlyAccessed": "Accedidos recientemente",
160
+ "resetFilters": "Restablecer filtros",
161
+ "forwardingPreview": "URL de reenvío",
162
+ "forwardingPreviewDescription": "Esta es la URL que redirigirá a tu marcador",
163
+ "bulkSelect": "Seleccionar múltiples",
164
+ "bulkActions": "Acciones en masa",
165
+ "bulkMoveToFolder": "Mover a carpeta",
166
+ "bulkAddTags": "Agregar etiquetas",
167
+ "bulkShare": "Compartir con equipos",
168
+ "bulkDelete": "Eliminar seleccionados",
169
+ "selectedCount": "{{count}} seleccionados",
170
+ "selectAll": "Seleccionar todo",
171
+ "deselectAll": "Deseleccionar todo",
172
+ "selectAllOnPageAndRemaining": "{{pageCount}} de esta página seleccionados. ¿Seleccionar los {{total}} marcadores?",
173
+ "selectAllRemaining": "Seleccionar los {{total}}",
174
+ "allSelected": "{{total}} seleccionados",
175
+ "aiSuggesting": "IA sugiriendo…",
176
+ "aiSuggestionsLabel": "Sugerido:",
177
+ "paginationShowing": "Mostrando {{from}}-{{to}} de {{total}}",
178
+ "paginationPrevious": "Anterior",
179
+ "paginationNext": "Siguiente",
180
+ "pinned": "Fijado",
181
+ "favorites": "Favoritos",
182
+ "import": "Importar",
183
+ "export": "Exportar",
184
+ "importBrowser": "Importar marcadores del navegador",
185
+ "importJson": "Importar JSON",
186
+ "importHtml": "Importar HTML",
187
+ "exportJson": "Exportar como JSON",
188
+ "exportHtml": "Exportar como HTML",
189
+ "importDescription": "Importa marcadores desde un archivo JSON o HTML. Los archivos JSON deben contener un array de objetos de marcadores con campos title y url.",
190
+ "selectFile": "Seleccionar archivo",
191
+ "supportedFormats": "Formatos soportados: JSON, HTML (formato de marcadores Netscape)",
192
+ "importSuccess": "Importados {{success}} marcador(es), {{failed}} fallaron"
193
+ },
194
+ "folders": {
195
+ "title": "Carpetas",
196
+ "create": "Crear carpeta",
197
+ "edit": "Editar carpeta",
198
+ "delete": "Eliminar carpeta",
199
+ "deleteFolder": "Eliminar carpeta",
200
+ "name": "Nombre",
201
+ "folderName": "Nombre de carpeta",
202
+ "icon": "Icono",
203
+ "searchIcons": "Buscar iconos por nombre...",
204
+ "noIcon": "Sin icono",
205
+ "selectedIcon": "Icono seleccionado",
206
+ "clearIcon": "Limpiar icono",
207
+ "showingPopular": "Mostrando {{count}} iconos populares",
208
+ "showingAllIcons": "Mostrando todos los {{count}} iconos",
209
+ "showAllIcons": "Mostrar todos los iconos",
210
+ "showPopularOnly": "Mostrar solo populares",
211
+ "noIconsFound": "No se encontraron iconos que coincidan con tu búsqueda",
212
+ "useIcon": "Usar icono",
213
+ "typeIconName": "Nombre del icono (cualquier icono Lucide)",
214
+ "empty": "Aún no hay carpetas",
215
+ "emptyDescription": "Crea carpetas para agrupar tus marcadores.",
216
+ "deleteConfirm": "¿Eliminar esta carpeta?",
217
+ "deleteConfirmWithName": "¿Eliminar \"{{name}}\"?",
218
+ "sharedWith": "Compartido con:",
219
+ "shareWithTeams": "Compartir con equipos",
220
+ "shareWithTeamsDescription": "Elige equipos; todos los marcadores de esta carpeta se comparten con ellos.",
221
+ "shared": "Compartido",
222
+ "viewCard": "Vista de tarjetas",
223
+ "viewList": "Vista de lista",
224
+ "compactMode": "Modo compacto",
225
+ "sortAlphabetical": "Alfabético",
226
+ "sortRecentlyAdded": "Agregados recientemente"
227
+ },
228
+ "tags": {
229
+ "title": "Etiquetas",
230
+ "create": "Crear etiqueta",
231
+ "edit": "Editar etiqueta",
232
+ "delete": "Eliminar etiqueta",
233
+ "deleteTag": "Eliminar etiqueta",
234
+ "name": "Nombre",
235
+ "tagName": "Nombre de etiqueta",
236
+ "empty": "Aún no hay etiquetas",
237
+ "emptyDescription": "Crea etiquetas para organizar y filtrar marcadores.",
238
+ "deleteConfirm": "¿Eliminar esta etiqueta?",
239
+ "deleteConfirmWithName": "¿Eliminar \"{{name}}\"?",
240
+ "viewCard": "Vista de tarjetas",
241
+ "viewList": "Vista de lista",
242
+ "compactMode": "Modo compacto",
243
+ "sortAlphabetical": "Alfabético",
244
+ "sortRecentlyAdded": "Agregados recientemente"
245
+ },
246
+ "profile": {
247
+ "title": "Perfil",
248
+ "description": "Configuración y preferencias de tu cuenta",
249
+ "accountInformation": "Información de la cuenta",
250
+ "preferences": "Preferencias",
251
+ "quickAccess": "Acceso rápido",
252
+ "quickAccessDescription": "Usa /go/<slug> en el navegador para ir al marcador. Aquí gestionas tu elección cuando varios marcadores comparten el mismo slug.",
253
+ "yourOrganizations": "Tus organizaciones",
254
+ "current": "Actual",
255
+ "switch": "Cambiar",
256
+ "orgSwitched": "Organización cambiada",
257
+ "userKey": "Clave de usuario",
258
+ "userKeyDescription": "Tu identificador único para el reenvío de marcadores. Comparte esto con otros para permitirles acceder a tus marcadores compartidos.",
259
+ "email": "Correo electrónico",
260
+ "emailPlaceholder": "tu@email.com",
261
+ "name": "Nombre",
262
+ "namePlaceholder": "Tu nombre",
263
+ "language": "Idioma",
264
+ "theme": "Tema",
265
+ "themeAuto": "Automático",
266
+ "themeLight": "Claro",
267
+ "themeDark": "Oscuro",
268
+ "save": "Guardar configuración",
269
+ "languageEnglish": "Inglés",
270
+ "languageGerman": "Alemán",
271
+ "languageFrench": "Francés",
272
+ "languageSpanish": "Español",
273
+ "languageItalian": "Italiano",
274
+ "languagePortuguese": "Portugués",
275
+ "languageDutch": "Holandés",
276
+ "languageRussian": "Ruso",
277
+ "languageJapanese": "Japonés",
278
+ "languageChinese": "Chino",
279
+ "languagePolish": "Polaco",
280
+ "emailManagedByOIDC": "El correo electrónico está gestionado por tu proveedor de identidad y no se puede cambiar aquí.",
281
+ "apiAccess": "Acceso API",
282
+ "apiAccessDescription": "Crea y gestiona tokens API personales para autenticación REST API.",
283
+ "apiTokenWarning": "Los tokens API dan acceso total a tu cuenta. Guárdalos bien y no los compartas.",
284
+ "createToken": "Crear token",
285
+ "tokenName": "Nombre del token",
286
+ "tokenNamePlaceholder": "ej. CLI, CI/CD",
287
+ "tokenCreated": "Token creado",
288
+ "tokenRevealWarning": "Este token solo se muestra una vez. Cópialo ya.",
289
+ "copyToken": "Copiar token",
290
+ "revokeToken": "Revocar",
291
+ "revokeTokenConfirm": "¿Revocar este token? Dejará de funcionar al instante.",
292
+ "lastUsed": "Último uso",
293
+ "neverUsed": "Nunca usado",
294
+ "createdAt": "Creado",
295
+ "viewApiDocs": "Ver documentación API",
296
+ "noTokens": "Sin tokens API",
297
+ "noTokensDescription": "Crea un token para autenticarte con la API REST desde scripts, CLI o CI/CD.",
298
+ "yourTokens": "Tus tokens",
299
+ "aiSuggestions": "Sugerencias con IA",
300
+ "aiSuggestionsDescription": "Sugerir título, etiquetas y slug al crear marcadores"
301
+ },
302
+ "common": {
303
+ "loading": "Cargando...",
304
+ "reload": "Recargar",
305
+ "error": "Ocurrió un error",
306
+ "notFoundOrNoAccess": "No encontrado o sin acceso",
307
+ "success": "Éxito",
308
+ "close": "Cerrar",
309
+ "delete": "Eliminar",
310
+ "edit": "Editar",
311
+ "create": "Crear",
312
+ "save": "Guardar",
313
+ "cancel": "Cancelar",
314
+ "clearFilter": "Limpiar filtro",
315
+ "yes": "Sí",
316
+ "no": "No",
317
+ "view": "Ver",
318
+ "confirm": "Confirmar",
319
+ "back": "Atrás",
320
+ "bookmark": "marcador",
321
+ "bookmarks": "marcadores",
322
+ "tag": "etiqueta",
323
+ "tags": "etiquetas",
324
+ "folder": "carpeta",
325
+ "folders": "carpetas",
326
+ "user": "usuario",
327
+ "users": "usuarios",
328
+ "team": "equipo",
329
+ "teams": "equipos",
330
+ "setting": "configuración",
331
+ "settings": "configuraciones",
332
+ "provider": "proveedor",
333
+ "providers": "proveedores",
334
+ "search": "Buscar",
335
+ "searchPlaceholder": "Buscar marcadores, carpetas, etiquetas...",
336
+ "searchShortcut": "Ctrl+K",
337
+ "searchShortcutHint": "Buscar (Ctrl+K)",
338
+ "noResults": "No se encontraron resultados",
339
+ "copy": "Copiar",
340
+ "copied": "¡Copiado!",
341
+ "goTo": "Ir a",
342
+ "open": "Abrir",
343
+ "remove": "Quitar",
344
+ "actions": "Acciones",
345
+ "navigation": "Navegación",
346
+ "quickActions": "Acciones rápidas",
347
+ "collapseSidebar": "Contraer barra lateral",
348
+ "expandSidebar": "Expandir barra lateral"
349
+ },
350
+ "sharing": {
351
+ "shareBookmark": "Compartir marcador",
352
+ "shareFolder": "Compartir carpeta",
353
+ "inviteDescription": "Invita a gente o comparte con un equipo.",
354
+ "peopleWithAccess": "Quién tiene acceso",
355
+ "addAccess": "Añadir acceso",
356
+ "people": "Personas",
357
+ "teams": "Equipos",
358
+ "notSharedYet": "Aún no compartido",
359
+ "emailNotAssociated": "Este correo no está en SlugBase todavía.",
360
+ "removeAccess": "Quitar acceso",
361
+ "add": "Añadir"
362
+ },
363
+ "plan": {
364
+ "limitBookmarks": "Límite del plan Gratis ({{limit}} marcadores) alcanzado. Sube de plan para más.",
365
+ "shareToTeam": "Compartir con equipos está en el plan Team.",
366
+ "folderSharing": "Compartir carpetas está en el plan Team.",
367
+ "upgradeCta": "Subir de plan",
368
+ "bookmarksUsed": "Marcadores: {{count}}/{{limit}}",
369
+ "importLimitWarning": "Puedes importar {{remaining}} marcadores más (límite Gratis: {{limit}}).",
370
+ "gracePeriodBanner": "Tienes {{count}} marcadores (límite Gratis: {{limit}}). Borra o sube de plan antes del {{date}}.",
371
+ "gracePeriodExpired": "El periodo de gracia terminó. Borra marcadores o sube de plan."
372
+ },
373
+ "dashboard": {
374
+ "searchPlaceholder": "Buscar un marcador o navegar por SlugBase",
375
+ "bookmarksDescription": "Administra tus marcadores",
376
+ "foldersDescription": "Organiza con carpetas",
377
+ "tagsDescription": "Etiqueta tus marcadores",
378
+ "overview": "Resumen",
379
+ "overviewSubtitle": "Acceso rápido y actividad reciente",
380
+ "newBookmarkHint": "Añade un enlace para guardarlo y abrirlo luego",
381
+ "yourLibrary": "Tu biblioteca",
382
+ "sharedWithYou": "Compartido contigo",
383
+ "totalBookmarks": "Total de marcadores",
384
+ "totalFolders": "Total de carpetas",
385
+ "totalTags": "Total de etiquetas",
386
+ "sharedBookmarks": "Marcadores compartidos",
387
+ "sharedFolders": "Carpetas compartidas",
388
+ "recentBookmarks": "Marcadores recientes",
389
+ "topTags": "Etiquetas más usadas",
390
+ "noRecentBookmarks": "Aún no hay marcadores",
391
+ "noRecentBookmarksHint": "Crea un marcador para verlo aquí.",
392
+ "noTags": "Aún no hay etiquetas",
393
+ "noTagsHint": "Las etiquetas aparecen cuando etiquetas marcadores.",
394
+ "goToBookmarks": "Ir a marcadores",
395
+ "editBookmark": "Editar marcador",
396
+ "openBookmark": "Abrir enlace",
397
+ "copyUrl": "Copiar enlace",
398
+ "deleteBookmark": "Eliminar marcador",
399
+ "shareBookmark": "Compartir",
400
+ "lastOpened": "Abierto hace {{time}}",
401
+ "filterByTagHint": "Clic para filtrar por esta etiqueta",
402
+ "tagBookmarkCount": "{{count}} marcadores",
403
+ "denseView": "Vista compacta",
404
+ "createFolder": "Crear carpeta",
405
+ "createTag": "Crear etiqueta",
406
+ "quickAccess": "Acceso rápido",
407
+ "viewAll": "Ver todo",
408
+ "noQuickAccessBookmarks": "Aún no hay marcadores con atajos",
409
+ "noQuickAccessBookmarksHint": "Añade un slug a un marcador para verlo aquí y usar go/slug en el navegador.",
410
+ "statsBookmarks": "marcadores",
411
+ "statsFolders": "carpetas",
412
+ "statsTags": "etiquetas",
413
+ "proTipBody": "Consejo: Configura SlugBase como motor de búsqueda en tu navegador y escribe go github en la barra de direcciones para abrir marcadores al instante.",
414
+ "proTipLink": "Configurar motor de búsqueda",
415
+ "dismiss": "Cerrar",
416
+ "onboardingTitle": "Primeros pasos",
417
+ "onboardingImport": "Importar marcadores del navegador",
418
+ "onboardingSearchEngine": "Configurar atajo de búsqueda en el navegador",
419
+ "onboardingFolder": "Crear tu primera carpeta",
420
+ "onboardingTag": "Etiquetar un marcador",
421
+ "onboardingDismiss": "Ocultar lista"
422
+ },
423
+ "apiDocs": {
424
+ "title": "Documentación de la API",
425
+ "description": "Referencia completa de la API para SlugBase. Todos los endpoints requieren autenticación mediante tokens JWT excepto donde se indique."
426
+ },
427
+ "admin": {
428
+ "title": "Administrador",
429
+ "description": "Administra usuarios, grupos, proveedores OIDC y configuración del sistema",
430
+ "users": "Usuarios",
431
+ "teams": "Equipos",
432
+ "userGroups": "Equipos",
433
+ "oidcProviders": "Proveedores OIDC",
434
+ "settings": "Configuración",
435
+ "addUser": "Agregar usuario",
436
+ "editUser": "Editar usuario",
437
+ "addTeam": "Agregar equipo",
438
+ "editTeam": "Editar equipo",
439
+ "addGroup": "Agregar equipo",
440
+ "editGroup": "Editar equipo",
441
+ "addProvider": "Agregar proveedor",
442
+ "editProvider": "Editar proveedor",
443
+ "addSetting": "Agregar configuración",
444
+ "admin": "Administrador",
445
+ "user": "Usuario",
446
+ "oidcUser": "Usuario OIDC",
447
+ "teamName": "Nombre del equipo",
448
+ "groupName": "Nombre del equipo",
449
+ "description": "Descripción",
450
+ "providerKey": "Clave del proveedor",
451
+ "issuerUrl": "URL del emisor",
452
+ "clientId": "ID del cliente",
453
+ "clientIdRequired": "El ID del cliente es obligatorio al crear un nuevo proveedor",
454
+ "clientSecret": "Secreto del cliente",
455
+ "scopes": "Ámbitos",
456
+ "callbackUrl": "URL de devolución de llamada",
457
+ "customEndpoints": "Puntos de conexión OIDC personalizados",
458
+ "customEndpointsDescription": "Reemplaza las rutas de punto de conexión OIDC predeterminadas. Déjalo vacío para usar rutas estándar basadas en la URL del emisor.",
459
+ "authorizationUrl": "URL de autorización",
460
+ "tokenUrl": "URL del token",
461
+ "userinfoUrl": "URL de información de usuario",
462
+ "autoCreate": "Crear usuarios automáticamente",
463
+ "defaultRole": "Rol predeterminado",
464
+ "settingKey": "Clave",
465
+ "settingValue": "Valor",
466
+ "leaveBlank": "Déjalo en blanco para mantener el actual",
467
+ "leaveBlankToKeep": "Déjalo en blanco para mantener el valor actual",
468
+ "confirmDeleteUser": "¿Eliminar este usuario?",
469
+ "confirmDeleteTeam": "¿Eliminar este equipo?",
470
+ "confirmDeleteGroup": "¿Eliminar este equipo?",
471
+ "confirmDeleteProvider": "¿Eliminar este proveedor?",
472
+ "confirmDeleteSetting": "¿Eliminar esta configuración?",
473
+ "manageMembers": "Administrar miembros",
474
+ "currentMembers": "Miembros actuales",
475
+ "currentTeams": "Equipos actuales",
476
+ "addMembers": "Agregar miembros",
477
+ "addTeams": "Agregar equipos",
478
+ "noMembers": "No hay miembros en este equipo",
479
+ "noTeams": "No hay equipos asignados a este usuario",
480
+ "noTeamsYet": "Aún no hay equipos",
481
+ "add": "Agregar",
482
+ "members": "Miembros",
483
+ "manageTeams": "Administrar equipos",
484
+ "searchTeams": "Buscar equipos por nombre o descripción...",
485
+ "createUserWith": "Crear usuario con",
486
+ "sendInviteEmail": "Enviar invitación por correo",
487
+ "setPassword": "Establecer contraseña",
488
+ "inviteSent": "Invitación enviada",
489
+ "userCreatedInviteSent": "Usuario creado; invitación enviada.",
490
+ "userCreatedInviteNotSent": "Usuario creado; no se pudo enviar la invitación (compruebe SMTP).",
491
+ "searchUsers": "Buscar usuarios por nombre o correo electrónico...",
492
+ "noTeamsAvailable": "Todos los equipos ya están asignados",
493
+ "noUsersAvailable": "Todos los usuarios ya son miembros",
494
+ "noSearchResults": "No hay resultados que coincidan con tu búsqueda",
495
+ "apiDocsNote": "La documentación de la API está disponible como una página independiente",
496
+ "viewApiDocs": "Ver documentación de la API",
497
+ "noUserEmailAvailable": "No hay correo electrónico de usuario disponible",
498
+ "manageTeamsTitle": "Administrar equipos - {{userName}}",
499
+ "manageMembersTitle": "Administrar miembros - {{teamName}}",
500
+ "billing": "Facturación y plan",
501
+ "billingCurrentPlan": "Plan actual",
502
+ "billingUpgrade": "Subir de plan",
503
+ "billingManageSubscription": "Gestionar suscripción",
504
+ "billingOrgMembers": "Miembros de la organización",
505
+ "billingSeatsUsed": "{{count}} de {{total}} plazas usadas",
506
+ "seatsUsed": "{{used}} de {{total}} plazas",
507
+ "billingInviteMember": "Invitar miembro",
508
+ "billingUpgradeToInvite": "Sube al plan Team para invitar a más.",
509
+ "billingTeamAtLimit": "Límite de 5 miembros. Plazas extra 1 €/usuario/mes.",
510
+ "billingNotConfigured": "Facturación no configurada. Contacta soporte para subir de plan.",
511
+ "billingPersonalMonthly": "Personal (mensual)",
512
+ "billingPersonalYearly": "Personal (anual)",
513
+ "billingTeamMonthly": "Team (mensual)",
514
+ "billingTeamYearly": "Team (anual)",
515
+ "billingEarlySupporter": "Early Supporter (pago único)",
516
+ "billingInvoices": "Historial de facturas",
517
+ "billingInvoicesEmpty": "Aún no hay facturas",
518
+ "billingInvoiceDownload": "Descargar PDF",
519
+ "billingInvoiceView": "Ver",
520
+ "billingInvoiceDate": "Fecha",
521
+ "billingInvoiceNumber": "Factura",
522
+ "billingInvoiceAmount": "Importe",
523
+ "billingInvoiceStatus": "Estado",
524
+ "ai": {
525
+ "nav": "Sugerencias IA",
526
+ "title": "Sugerencias de marcadores con IA",
527
+ "description": "La IA sugiere título, etiquetas y slug al crear marcadores. Usa OpenAI GPT-4o-mini.",
528
+ "enabled": "Activar sugerencias IA",
529
+ "provider": "Proveedor",
530
+ "apiKey": "API Key",
531
+ "apiKeyPlaceholder": "Nueva key para cambiar",
532
+ "apiKeyHint": "Consigue tu API key en platform.openai.com",
533
+ "apiKeyChangeHint": "Dejar en blanco para mantener la key actual",
534
+ "model": "Modelo",
535
+ "orgTitle": "Sugerencias IA",
536
+ "orgDescription": "Activar sugerencias de título, etiquetas y slug. Los usuarios pueden desactivarlo en su perfil.",
537
+ "orgEnabled": "Activar sugerencias IA para la organización"
538
+ }
539
+ },
540
+ "passwordReset": {
541
+ "title": "Restablecer contraseña",
542
+ "description": "Tu correo y te enviamos un enlace para restablecer la contraseña",
543
+ "email": "Correo electrónico",
544
+ "emailPlaceholder": "tu@email.com",
545
+ "requestReset": "Enviar enlace de restablecimiento",
546
+ "resetToken": "Token de restablecimiento",
547
+ "newPassword": "Nueva contraseña",
548
+ "confirmPassword": "Confirmar contraseña",
549
+ "resetPassword": "Restablecer contraseña",
550
+ "requestSent": "Si existe una cuenta con este correo electrónico, se ha enviado un enlace de restablecimiento de contraseña.",
551
+ "resetSuccess": "¡Contraseña restablecida con éxito! Ahora puedes iniciar sesión con tu nueva contraseña.",
552
+ "invalidToken": "Token de restablecimiento inválido o expirado",
553
+ "passwordMismatch": "Las contraseñas no coinciden",
554
+ "backToLogin": "Volver al inicio de sesión"
555
+ },
556
+ "emailVerification": {
557
+ "verifying": "Verificando correo electrónico",
558
+ "verifyingDescription": "Verificando tu correo, un momento…",
559
+ "success": "Correo electrónico verificado",
560
+ "successDescription": "Tu dirección de correo electrónico se ha cambiado con éxito a {{email}}.",
561
+ "error": "Error de verificación",
562
+ "errorDescription": "El enlace de verificación es inválido o ha expirado.",
563
+ "tokenRequired": "Se requiere un token de verificación",
564
+ "invalidToken": "Token de verificación inválido o expirado",
565
+ "verifyFailed": "Error al verificar el token",
566
+ "confirmFailed": "Error al confirmar la verificación del correo electrónico",
567
+ "redirecting": "Redirigiendo al perfil...",
568
+ "backToProfile": "Volver al perfil",
569
+ "emailSent": "¡Correo de verificación enviado! Por favor revisa tu nueva dirección de correo electrónico.",
570
+ "pendingTitle": "Verificación de correo electrónico pendiente",
571
+ "pendingDescription": "Hemos enviado un correo de verificación a {{email}}. Revisa la bandeja y haz clic en el enlace.",
572
+ "signupSuccess": "Correo verificado. Ya puedes entrar.",
573
+ "signupSuccessDescription": "Cuenta verificada. Redirigiendo al inicio de sesión…",
574
+ "invalidLink": "Este enlace de verificación no es válido o ha caducado.",
575
+ "alreadyVerified": "Esta cuenta ya está verificada. Puedes entrar.",
576
+ "resendTitle": "Reenviar correo de verificación",
577
+ "resendDescription": "Tu enlace caducó. Corrige el correo si te equivocaste y te enviamos otro.",
578
+ "resendNoTokenDescription": "Escribe el correo con el que te registraste. Te enviamos un nuevo enlace.",
579
+ "editEmailLabel": "Correo electrónico",
580
+ "resendButton": "Reenviar correo de verificación",
581
+ "resendSuccess": "Correo de verificación enviado",
582
+ "resendSuccessDescription": "Revisa la bandeja; el enlace puede tardar unos minutos."
583
+ },
584
+ "smtp": {
585
+ "title": "Configuración de correo SMTP",
586
+ "description": "Configura SMTP para enviar correos (p. ej. restablecer contraseña)",
587
+ "enabled": "Habilitar SMTP",
588
+ "host": "Servidor SMTP",
589
+ "hostPlaceholder": "smtp.gmail.com",
590
+ "port": "Puerto",
591
+ "portPlaceholder": "587",
592
+ "secure": "Usar TLS/SSL",
593
+ "user": "Usuario/Correo electrónico",
594
+ "userPlaceholder": "tu-email@gmail.com",
595
+ "password": "Contraseña",
596
+ "passwordPlaceholder": "Ingresa la contraseña para establecer o cambiar",
597
+ "passwordChangeHint": "Ingresa una nueva contraseña para cambiarla, o déjalo vacío para mantener la contraseña actual",
598
+ "from": "Correo remitente",
599
+ "fromPlaceholder": "noreply@example.com",
600
+ "fromName": "Nombre del remitente",
601
+ "fromNamePlaceholder": "SlugBase",
602
+ "testEmail": "Correo de prueba",
603
+ "testEmailPlaceholder": "test@example.com",
604
+ "sendTest": "Enviar correo de prueba",
605
+ "testSent": "¡Correo de prueba enviado con éxito!",
606
+ "testFailed": "Error al enviar correo de prueba",
607
+ "save": "Guardar configuración SMTP"
608
+ },
609
+ "shared": {
610
+ "title": "Compartido",
611
+ "description": "Marcadores y carpetas compartidos contigo",
612
+ "bookmarks": "Marcadores",
613
+ "folders": "Carpetas",
614
+ "noBookmarks": "Aún no hay marcadores compartidos",
615
+ "noFolders": "Aún no hay carpetas compartidas",
616
+ "unknownUser": "Usuario desconocido",
617
+ "sharedWithYou": "Compartido contigo"
618
+ },
619
+ "goPreferences": {
620
+ "title": "Elecciones de slug guardadas",
621
+ "description": "Gestiona tus preferencias para /go. Cuando varios marcadores comparten el mismo slug, aquí eliges cuál se abre.",
622
+ "empty": "Sin preferencias guardadas. Visita /go/<slug> cuando coincidan varios marcadores y elige uno para guardarlo."
623
+ },
624
+ "searchEngineGuide": {
625
+ "title": "Guía de configuración de motor de búsqueda personalizado",
626
+ "description": "Aprende cómo configurar un motor de búsqueda personalizado en tu navegador para acceder rápidamente a tus marcadores",
627
+ "howItWorks": "Cómo funciona",
628
+ "howItWorksDescription": "Al configurar un motor de búsqueda personalizado, puedes escribir una palabra clave (como 'go') seguida de un slug de marcador en la barra de direcciones de tu navegador para navegar instantáneamente a ese marcador.",
629
+ "yourSearchUrl": "Tu URL de búsqueda",
630
+ "urlNote": "Usa esta plantilla de URL al configurar tu motor de búsqueda personalizado. El %s será reemplazado con el slug de tu marcador.",
631
+ "chromiumTitle": "Navegadores basados en Chromium (Chrome, Edge, Brave, etc.)",
632
+ "chromiumDescription": "Sigue estos pasos para agregar SlugBase como motor de búsqueda personalizado:",
633
+ "chromiumStep1": "Abre la configuración de tu navegador",
634
+ "chromiumStep2": "Navega a la configuración de 'Motor de búsqueda' o 'Búsqueda'",
635
+ "chromiumStep3": "Haz clic en 'Administrar motores de búsqueda' o 'Agregar'",
636
+ "chromiumStep4": "Completa el formulario con:",
637
+ "chromiumStep4a": "Nombre: SlugBase (o cualquier nombre que prefieras)",
638
+ "chromiumStep4b": "Palabra clave: go (o cualquier palabra clave que prefieras)",
639
+ "chromiumStep4c": "URL: Usa la URL de búsqueda mostrada arriba",
640
+ "chromiumStep5": "Haz clic en 'Agregar' o 'Guardar' para completar la configuración",
641
+ "firefoxTitle": "Firefox",
642
+ "firefoxDescription": "Sigue estos pasos para agregar SlugBase como motor de búsqueda personalizado:",
643
+ "firefoxStep1": "Abre la configuración de Firefox",
644
+ "firefoxStep2": "Navega a 'Búsqueda' en el menú de configuración",
645
+ "firefoxStep3": "Desplázate hacia abajo y haz clic en 'Agregar' en 'Motores de búsqueda con un clic'",
646
+ "firefoxStep4": "Completa el formulario con:",
647
+ "firefoxStep4a": "Nombre: SlugBase (o cualquier nombre que prefieras)",
648
+ "firefoxStep4b": "Palabra clave: go (o cualquier palabra clave que prefieras)",
649
+ "firefoxStep4c": "URL: Usa la URL de búsqueda mostrada arriba",
650
+ "firefoxStep5": "Haz clic en 'Agregar' para completar la configuración",
651
+ "usageExample": "Ejemplo de uso",
652
+ "usageStep1": "Después de la configuración, simplemente escribe en la barra de direcciones de tu navegador:",
653
+ "usageStep2": "Presiona Enter y serás redirigido al marcador con el slug 'test'",
654
+ "usageNote": "¡Reemplaza 'test' con cualquier slug de marcador que hayas creado en SlugBase!"
655
+ },
656
+ "landing": {
657
+ "heroHeadline": "El sistema de marcadores para usuarios avanzados y equipos.",
658
+ "heroSubheadline": "Encuentra enlaces rápido. Menos caos. Tú mandas. Carpetas, etiquetas y atajos—sin líos.",
659
+ "heroBadges": "Open source • Self-hosted o Cloud • Para equipos • Sin tarjeta",
660
+ "ctaStartFree": "Empieza gratis",
661
+ "ctaSignUp": "Registrarse",
662
+ "ctaLogin": "Entrar",
663
+ "exampleSnippet": "tukey/gh tukey/docs tukey/vite tukey/notion tukey/figma",
664
+ "proofOpenSource": "Open Source",
665
+ "proofApiDocs": "API documentada",
666
+ "trustOpenSource": "Open source en GitHub",
667
+ "trustDocs": "Docs",
668
+ "trustActiveDev": "Desarrollo activo",
669
+ "trustApiDocs": "Documentación API disponible",
670
+ "howItWorksTitle": "Cómo funciona",
671
+ "howItWorksStep1": "Guarda una vez",
672
+ "howItWorksStep1Detail": "Organiza con carpetas y etiquetas.",
673
+ "howItWorksStep2": "Crea tu atajo",
674
+ "howItWorksStep2Detail": "Tu key/slug redirige al marcador.",
675
+ "howItWorksStep3": "Úsalo donde sea",
676
+ "howItWorksStep3Detail": "Barra del navegador, móvil o compartido con equipos.",
677
+ "problemTitle": "Por qué los marcadores del navegador no bastan",
678
+ "problem1": "Compartir es un rollo",
679
+ "problem2": "Sin estructura entre dispositivos",
680
+ "problem3": "Sin atajos ni URLs",
681
+ "solutionTitle": "SlugBase lo soluciona",
682
+ "solution1": "Comparte con equipos y personas",
683
+ "solution2": "La misma estructura en todos lados",
684
+ "solution3": "URLs cortas tuyas",
685
+ "featuresTitle": "¿Por qué SlugBase?",
686
+ "feature1Title": "Encuentra más rápido",
687
+ "feature1Desc": "No vuelvas a preguntarte dónde guardaste ese enlace.",
688
+ "feature2Title": "Comparte sin fallos",
689
+ "feature2Desc": "Escribe dos palabras. Llegas justo donde quieres.",
690
+ "feature3Title": "Control total",
691
+ "feature3Desc": "Tus datos y tu infraestructura.",
692
+ "featureAiTitle": "Sugerencias de título, etiqueta y slug con IA",
693
+ "featureAiDesc": "Los planes de pago incluyen sugerencias al añadir marcadores: pega una URL y listo.",
694
+ "footerPricing": "Precios",
695
+ "footerContact": "Contacto",
696
+ "footerDocs": "Documentación",
697
+ "footerApp": "App",
698
+ "footerCopyright": "© 2024–2025 SlugBase",
699
+ "pricingTitle": "Precios claros",
700
+ "pricingSubtitle": "Empieza gratis. Sube cuando lo necesites.",
701
+ "pricingUpgradeHint": "¿Cuándo subir?",
702
+ "pricingUpgradeBenefits": "Marcadores ilimitados, URLs de reenvío, copias y soporte por correo.",
703
+ "viewAllPlans": "Ver todos los planes",
704
+ "pricingTeaser": "Empieza gratis. Sube cuando la estructura te importe.",
705
+ "useCaseTitle": "Hecho para curros modernos",
706
+ "useCaseDevTitle": "Desarrolladores con docs, dashboards y repos a diario",
707
+ "useCaseDevDesc": "Acceso directo a docs, dashboards y repos. Atajos con una palabra en el navegador.",
708
+ "useCaseProductTitle": "Producto y Ops compartiendo herramientas internas",
709
+ "useCaseProductDesc": "Directorios de enlaces ordenados. Menos caos en Slack.",
710
+ "useCaseFounderTitle": "Fundadores ordenando investigación y proveedores",
711
+ "useCaseFounderDesc": "Organiza una vez. Accede desde cualquier sitio.",
712
+ "useCaseSelfHostTitle": "Self-hosters que quieren control",
713
+ "useCaseSelfHostDesc": "Control total de tus datos. Despliega en tu infra."
714
+ },
715
+ "pricing": {
716
+ "title": "Precios",
717
+ "subtitle": "Planes simples para ti y para equipos.",
718
+ "positioning": "Planes simples para individuos y equipos.",
719
+ "docsPlans": "Detalles y límites de cada plan en la documentación.",
720
+ "billingMonthly": "Mensual",
721
+ "billingYearly": "Anual",
722
+ "mostPopular": "Más popular",
723
+ "free": "Gratis",
724
+ "freePrice": "0 €",
725
+ "freeUsers": "1 usuario",
726
+ "freeWorkspace": "1 espacio",
727
+ "freeBookmarks": "50 marcadores",
728
+ "freeFeatures": "Funciones básicas",
729
+ "freeSupport": "Soporte comunidad",
730
+ "freeValue1": "Hasta 50 marcadores con carpetas, etiquetas y búsqueda.",
731
+ "freeValue2": "Soporte comunidad",
732
+ "freeValue3": "Funciones básicas",
733
+ "personal": "Personal",
734
+ "personalPrice": "3 €/mes",
735
+ "personalYearly": "o 30 €/año",
736
+ "personalUsers": "1 usuario",
737
+ "personalBookmarks": "Marcadores ilimitados",
738
+ "personalFeatures": "Copias, soporte por correo",
739
+ "personalUpdates": "Actualizaciones prioritarias",
740
+ "personalValue1": "Marcadores ilimitados",
741
+ "personalValue2": "URLs de reenvío propias",
742
+ "personalValue3": "Copias y soporte prioritario",
743
+ "personalValue4": "Sugerencias de título, etiqueta y slug con IA",
744
+ "team": "Team",
745
+ "teamPrice": "9 €/mes",
746
+ "teamPriceYearly": "90 €/año",
747
+ "teamUsers": "5 usuarios incluidos",
748
+ "teamExtraUser": "+1 € por usuario extra/mes",
749
+ "teamExtraUserYearly": "+10 € por usuario extra/año",
750
+ "teamFeatures": "Compartir en equipo, roles, carpetas compartidas",
751
+ "teamAudit": "Registro de auditoría básico",
752
+ "teamValue1": "Carpetas compartidas",
753
+ "teamValue2": "Roles y permisos",
754
+ "teamValue3": "Registro de auditoría. Pensado para colaborar.",
755
+ "teamValue4": "Sugerencias con IA",
756
+ "earlySupporter": "Early Supporter",
757
+ "earlySupporterLifetime": "De por vida",
758
+ "earlySupporterPrice": "69 € pago único",
759
+ "earlySupporterSeats": "Plazas limitadas",
760
+ "earlySupporterIncludes": "Plan Personal de por vida",
761
+ "earlySupporterValue4": "Sugerencias con IA incluidas",
762
+ "earlySupporterHelp": "Ayuda a dar forma a SlugBase",
763
+ "earlySupporterNote": "Sin Team, sin SLA. Facturación en camino.",
764
+ "ctaSignUp": "Registrarse",
765
+ "ctaStartFree": "Empieza gratis",
766
+ "ctaChoosePlan": "Elegir plan",
767
+ "ctaContact": "Contacto",
768
+ "ctaBecomeEarlySupporter": "Hazte early supporter",
769
+ "comparisonTitle": "Qué incluye",
770
+ "comparisonFree": "Gratis: Básico, 50 marcadores.",
771
+ "comparisonPersonal": "Personal: Ilimitados, compartir con personas, copias, IA.",
772
+ "comparisonTeam": "Team: 5 plazas, + por plaza extra. Compartir, roles, registro, IA.",
773
+ "comparisonEarlySupporter": "Early Supporter: Personal de por vida, plazas limitadas."
774
+ },
775
+ "legal": {
776
+ "imprintTitle": "Aviso legal",
777
+ "imprintProviderTitle": "Prestador de servicios (ECG §5)",
778
+ "imprintChamber": "Miembro de {{chamber}}",
779
+ "imprintCourtTitle": "Tribunal competente",
780
+ "imprintCourtBody": "Jurisdicción para disputas: Landesgericht Linz, Austria. Se aplica la ley austriaca.",
781
+ "imprintOdrTitle": "Resolución de litigios en línea de la UE",
782
+ "imprintOdrBody": "La Comisión Europea ofrece una plataforma de resolución de litigios en línea. Los consumidores pueden acceder en",
783
+ "imprintAppliesTo": "La información anterior se aplica tanto al uso por consumidores como por empresas.",
784
+ "uid": "UID",
785
+ "backToHome": "Volver al inicio",
786
+ "termsTitle": "Términos y condiciones",
787
+ "termsScopeTitle": "Ámbito",
788
+ "termsScopeBody": "Estos Términos y Condiciones (\"Términos\") se aplican al uso de SlugBase Cloud (el \"Servicio\") en slugbase.app. Al registrarse o usar el Servicio acepta estos Términos. Si es consumidor, sus derechos legales imperativos no se ven afectados.",
789
+ "termsScopeB2BBody": "Si utiliza el Servicio en el ejercicio de su actividad comercial o profesional (\"usuario profesional\"), no es consumidor; las secciones específicas para consumidores no le aplican.",
790
+ "termsB2BBindingBody": "Si es usuario profesional, declara tener autoridad para vincular a su organización y, al usar el Servicio o crear una cuenta en su nombre, acepta estos Términos en nombre de la misma.",
791
+ "termsServiceTitle": "Descripción del servicio",
792
+ "termsServiceBody": "SlugBase Cloud es un servicio de gestión de marcadores y redirección de enlaces. Permite guardar, organizar y compartir marcadores; crear carpetas y etiquetas; y opcionalmente exponer marcadores como URLs cortas. El servicio se ofrece como SaaS en https://slugbase.app.",
793
+ "termsPlansTitle": "Planes",
794
+ "termsPlansBody": "SlugBase Cloud ofrece varios planes: Free (uso limitado para probar), Personal, Team y Early Supporter Lifetime (pago único). Los detalles, límites y precios actuales figuran en la página de precios y en la aplicación.",
795
+ "termsUserContentTitle": "Contenido del usuario y propiedad",
796
+ "termsUserContentBody": "Conserva todos los derechos sobre los marcadores y el contenido que almacene en el Servicio. SlugBase solo recibe una licencia limitada para procesar, almacenar y transmitir su contenido con el fin de prestar el Servicio. No revisamos ni controlamos el contenido de las URL almacenadas. Es responsable de que el contenido que almacene, comparta o redirija sea lícito.",
797
+ "termsAccountTitle": "Cuenta y elegibilidad",
798
+ "termsAccountBody": "Debe proporcionar información veraz al crear una cuenta. Es responsable de mantener sus credenciales seguras. El Servicio está destinado al uso lícito por particulares y equipos.",
799
+ "termsUseTitle": "Uso del Servicio",
800
+ "termsUseBody": "Puede usar SlugBase para guardar, organizar y compartir marcadores y para usar enlaces cortos (redirección). No debe usar el Servicio para:",
801
+ "termsUseProhibited1": "Phishing, campañas de spam, redirecciones engañosas o inducir a error a usuarios",
802
+ "termsUseProhibited2": "Distribuir malware o software dañino",
803
+ "termsUseProhibited3": "Vulnerar derechos de terceros (propiedad intelectual, marcas, privacidad, etc.)",
804
+ "termsUseProhibited4": "Acoso, abuso o contenido ilegal",
805
+ "termsUseProhibited5": "Intentar eludir medidas de seguridad o límites de uso",
806
+ "termsUseProhibited6": "Alojar o distribuir contenido ilegal mediante enlaces de redirección",
807
+ "termsUseAction": "Podemos investigar posibles abusos y actuar, incluyendo suspender redirecciones, eliminar enlaces concretos o dar de baja cuentas.",
808
+ "termsShortLinksTitle": "Enlaces cortos y redirección",
809
+ "termsShortLinksBody": "Los enlaces cortos (ej. /go/su-slug) redirigen a la URL que configure. La redirección es opcional y controlada por el usuario. SlugBase no es responsable del contenido de las páginas de destino; debe asegurarse de que las URL de destino sean lícitas y no engañosas. Podemos desactivar redirecciones, eliminar enlaces o suspender cuentas por abuso. Abusos: hello@slugbase.app o página de Contacto.",
810
+ "termsAvailabilityTitle": "Disponibilidad y mantenimiento",
811
+ "termsAvailabilityBody": "El Servicio puede no estar disponible por mantenimiento, actualizaciones o fallos. No hay garantía de tiempo de actividad ni SLA salvo acuerdo expreso por escrito. Podemos realizar mantenimiento programado y lo comunicaremos cuando sea posible. No somos responsables de interrupciones o fallos de proveedores externos (hosting, base de datos, pagos).",
812
+ "termsDataLossTitle": "Pérdida de datos y copias de seguridad",
813
+ "termsDataLossBody": "No garantizamos la disponibilidad permanente del contenido almacenado. Es responsable de sus propias exportaciones y copias. Realizamos esfuerzos razonables para mantener copias pero no garantizamos la restauración en caso de pérdida.",
814
+ "termsLifetimeTitle": "Plan Early Supporter Lifetime",
815
+ "termsLifetimeBody": "\"Lifetime\" se refiere a la vida del servicio SlugBase Cloud, no a la del usuario. Los beneficios del plan aplican mientras el servicio se ofrezca. Si el servicio se discontinuara, no estamos obligados a continuarlo; no hay reembolsos salvo donde la ley lo exija. No hay derecho a paridad de funciones con planes futuros ni a funciones futuras; podemos cambiar estructuras y precios; los beneficios lifetime existentes se mantienen como se describen.",
816
+ "termsBillingTitle": "Facturación y pago",
817
+ "termsBillingBody": "Los planes de pago se facturan por adelantado (mensual o anual). El pago es exigible al emitir la factura. El plan Early Supporter Lifetime es pago único. Los pagos los procesa Stripe. Los cambios de precio se comunicarán con antelación y aplican desde el siguiente período de facturación.",
818
+ "termsThirdPartyTitle": "Servicios de terceros",
819
+ "termsThirdPartyBody": "SlugBase Cloud utiliza los siguientes servicios para operar: (1) Fly.io: hosting de la aplicación (solo UE). (2) Neon: base de datos PostgreSQL (UE). (3) Stripe: procesamiento de pagos. (4) All Quiet (UE): incidencias y alertas. (5) Sentry: seguimiento de errores (previsto). (6) OpenAI: sugerencias con IA en planes de pago (cuando el usuario las activa). Algunos servicios pueden estar fuera del EEE.",
820
+ "termsBetaTitle": "Funciones beta y experimentales",
821
+ "termsBetaBody": "Las funciones beta o experimentales pueden cambiar o discontinuarse. Se ofrecen \"tal cual\". No dependa de ellas para usos críticos.",
822
+ "termsCancellationTitle": "Cancelación y renovación",
823
+ "termsCancellationBody": "Puede cancelar su suscripción en cualquier momento. La cancelación surte efecto al final del período de facturación actual. No hay compromiso mínimo. En suscripciones renovables, puede cancelar antes de cada fecha de renovación para evitar cargos del período siguiente.",
824
+ "termsWithdrawalTitle": "Derecho de desistimiento (consumidores)",
825
+ "termsWithdrawalBody": "Si es consumidor (Verbraucher) según la ley austriaca, tiene un derecho de desistimiento de 14 días sin indicar motivos. El período comienza el día de la celebración del contrato. Para ejercerlo, infórmenos (p. ej. por correo a hello@slugbase.app). Si solicita el inicio del servicio durante el período de desistimiento, acepta que la prestación comience antes de su fin y que perderá su derecho una vez prestado el servicio completamente.",
826
+ "termsWithdrawalB2BNote": "Este derecho de desistimiento solo aplica a consumidores; los usuarios profesionales no tienen derecho legal de desistimiento según estos Términos.",
827
+ "termsIPTitle": "Propiedad intelectual",
828
+ "termsIPBody": "El software SlugBase, el servicio, la interfaz, la marca y la documentación son propiedad del prestador o licenciantes. Usted recibe un derecho limitado a usar el Servicio durante la vigencia de su suscripción. No debe copiar, revender ni intentar ingeniería inversa del Servicio más allá de lo necesario para interoperabilidad.",
829
+ "termsIndemnifyTitle": "Indemnización",
830
+ "termsIndemnifyBody": "Usted indemnizará y mantendrá indemne al prestador frente a reclamaciones de terceros derivadas de su contenido, uso indebido del Servicio, actividad ilegal o enlaces de redirección (incl. phishing, spam o infracción). En la medida permitida por la ley.",
831
+ "termsLiabilityTitle": "Limitación de responsabilidad",
832
+ "termsLiabilityBody": "En la medida permitida por la ley, el Servicio se proporciona \"tal cual\". No somos responsables de daños indirectos, incidentales o consecuentes, lucro cesante o pérdida de datos, salvo dolo o negligencia grave o cuando la ley lo exija (p. ej. responsabilidad por productos). La responsabilidad legal imperativa para consumidores no se ve afectada. Nuestra responsabilidad se limita al importe de las tasas pagadas por usted en los 12 meses anteriores a la reclamación, cuando sea válido legalmente.",
833
+ "termsLiabilityB2BNote": "Para usuarios profesionales, los límites y exclusiones de responsabilidad de estos Términos aplican en la máxima medida permitida por la ley.",
834
+ "termsTerminationTitle": "Suspensión y rescisión por nuestra parte",
835
+ "termsTerminationBody": "Podemos suspender o rescindir su cuenta de inmediato si incumple gravemente estos Términos, usa el Servicio ilegalmente o no paga cantidades debidas. Le avisaremos cuando sea posible. Al rescindir, finaliza su derecho de uso. Puede exportar sus datos antes o al rescindir. Los datos se eliminan según nuestra Política de Privacidad (normalmente en 30 días). Conservamos datos cuando la ley lo exija.",
836
+ "termsChangesTitle": "Cambios en los Términos",
837
+ "termsChangesBody": "Podemos actualizar estos Términos. Los cambios importantes se comunicarán por el Servicio o por correo. El uso continuado tras la fecha de entrada en vigor se considera aceptación. Si no está de acuerdo, puede cancelar su suscripción.",
838
+ "termsForceMajeureTitle": "Fuerza mayor",
839
+ "termsForceMajeureBody": "No somos responsables del incumplimiento o retraso por causas ajenas a nuestro control razonable (fuerza mayor, desastres naturales, guerra, pandemia, huelgas, fallos de terceros o infraestructura crítica).",
840
+ "termsLawTitle": "Ley aplicable",
841
+ "termsLawBody": "En la medida permitida por la ley, estos términos se rigen por la ley de Austria. Las disputas serán competencia de los tribunales de Austria.",
842
+ "termsSeverabilityTitle": "Divisibilidad",
843
+ "termsSeverabilityBody": "Si alguna disposición de estos Términos fuera inválida o inaplicable, las demás seguirán en vigor.",
844
+ "termsContactTitle": "Contacto",
845
+ "termsContactBody": "Para preguntas sobre estos términos, contáctenos en hello@slugbase.app o en la dirección del Aviso legal.",
846
+ "privacyTitle": "Política de privacidad",
847
+ "privacyScopeTitle": "Ámbito",
848
+ "privacyScopeBody": "Esta Política de Privacidad se aplica a SlugBase Cloud en https://slugbase.app. Describe cómo procesamos sus datos personales al usar el servicio SaaS alojado. No se aplica si autoaloja SlugBase; en ese caso usted es el responsable. Basada en el RGPD y la ley austriaca de protección de datos (DSG).",
849
+ "privacyB2BTitle": "Usuarios profesionales (B2B)",
850
+ "privacyB2BBody": "Cuando el Servicio se usa en el ámbito profesional o empresarial (p. ej. en nombre de una empresa), esa organización puede ser el responsable del tratamiento y SlugBase el encargado. Un contrato de encargo de tratamiento (DPA) está disponible bajo petición (p. ej. hello@slugbase.app).",
851
+ "privacyControllerTitle": "Responsable",
852
+ "privacyControllerBody": "Responsable: Guggernbichler Michael David, Linzer Str. 17, 4100 Ottensheim, Austria. Contacto: hello@slugbase.app (véase Aviso legal).",
853
+ "privacyDataTitle": "Datos que procesamos",
854
+ "privacyDataBody": "Procesamos: datos de cuenta (email, nombre, contraseña hasheada, identificador OIDC si aplica); contenido (marcadores, carpetas, etiquetas); uso (sesión, IP, logs); y datos de contacto si usa el formulario. No vendemos datos ni los usamos para publicidad.",
855
+ "privacyRecipientsTitle": "Destinatarios",
856
+ "privacyRecipientsBody": "Los datos se procesan en nuestra infraestructura y por encargados necesarios para operar el servicio. No compartimos sus datos con terceros para sus propios fines.",
857
+ "privacyProcessorsTitle": "Encargados y proveedores de servicios",
858
+ "privacyProcessorsBody": "Utilizamos: (1) Fly.io: hosting de la aplicación (solo UE). (2) Neon: base de datos PostgreSQL (UE). (3) Stripe: procesamiento de pagos; los datos de tarjeta los gestiona Stripe. (4) All Quiet (UE): incidencias y alertas. (5) Sentry: seguimiento de errores (previsto). (6) OpenAI: sugerencias con IA en planes de pago (véase \"Sugerencias IA\"). Algunos encargados pueden estar fuera del EEE. Hay DPAs cuando la ley lo exige.",
859
+ "privacyAITitle": "Sugerencias IA (OpenAI)",
860
+ "privacyAIBody": "Con la función IA activada, solo se usa la URL que proporcione y, opcionalmente, títulos y descripciones de página (meta tags). SlugBase no rastrea ni extrae contenido de páginas. Las sugerencias IA son opcionales y controladas por el usuario; guardar marcadores no depende de ellas.",
861
+ "privacyTransfersTitle": "Transferencias internacionales",
862
+ "privacyTransfersBody": "Buscamos alojamiento en la UE/EEE. Algunos encargados pueden tener sede fuera del EEE (p. ej. EE. UU.). Para transferencias fuera del EEE usamos garantías adecuadas cuando la ley lo exija (p. ej. cláusulas tipo de la Comisión Europea).",
863
+ "privacyBasisTitle": "Base legal",
864
+ "privacyBasisBody": "Procesamos según: ejecución de contrato (Art. 6.1.b RGPD), intereses legítimos (Art. 6.1.f), consentimiento (Art. 6.1.a) cuando corresponda, y obligación legal (Art. 6.1.c) cuando la ley lo requiera.",
865
+ "privacyRetentionTitle": "Conservación",
866
+ "privacyRetentionBody": "Los datos de cuenta y contenido se conservan mientras exista su cuenta. Tras la eliminación, borramos o anonimizamos en un plazo razonable (p. ej. 30 días). Los logs de seguridad y acceso se conservan lo necesario, normalmente 30–90 días. La ley austriaca puede exigir conservar ciertos registros hasta 7 años.",
867
+ "privacySecurityTitle": "Seguridad",
868
+ "privacySecurityBody": "Usamos TLS en tránsito, hasheamos contraseñas (bcrypt), controles de acceso y límites de tasa, y mantenemos actualizaciones y copias de seguridad. No almacenamos datos de tarjeta; los pagos los gestiona nuestro proveedor.",
869
+ "privacyRightsTitle": "Sus derechos",
870
+ "privacyRightsBody": "Según el RGPD y la ley austriaca tiene derecho de acceso (Art. 15), rectificación (Art. 16), supresión (Art. 17), limitación (Art. 18), portabilidad (Art. 20), oposición (Art. 21) y a no ser objeto de decisiones automatizadas con efectos jurídicos (Art. 22). Puede exportar sus datos con las herramientas integradas (JSON/HTML) en Marcadores o solicitarnos una copia. Puede retirar el consentimiento en cualquier momento. Contacto: hello@slugbase.app. Puede presentar reclamación ante la autoridad austriaca (véase abajo).",
871
+ "privacyDPATitle": "Contrato de encargo de tratamiento (B2B)",
872
+ "privacyDPABody": "Un contrato de encargo de tratamiento (DPA) está disponible bajo petición para usuarios Team o profesionales. En contextos de equipo, su organización puede ser el responsable y SlugBase el encargado del contenido almacenado.",
873
+ "privacyAutomatedTitle": "Decisiones automatizadas",
874
+ "privacyAutomatedBody": "No utilizamos decisiones automatizadas que produzcan efectos jurídicos o similares (Art. 22 RGPD).",
875
+ "privacyCookiesTitle": "Cookies y autenticación",
876
+ "privacyCookiesBody": "Usamos cookies de sesión y medios similares para autenticación y seguridad. No usamos cookies publicitarias de terceros.",
877
+ "privacyHostingTitle": "Alojamiento (CLOUD vs autoalojado)",
878
+ "privacyHostingBody": "En slugbase.app (CLOUD) alojamos sus datos en nuestra infraestructura en la UE/EEE. Si autoaloja SlugBase, usted es responsable y controla el almacenamiento y procesamiento.",
879
+ "privacySupervisoryTitle": "Autoridad de control",
880
+ "privacySupervisoryBody": "Puede presentar reclamación ante la Österreichische Datenschutzbehörde, Barichgasse 40-42, 1030 Viena, Austria (dsb@dsb.gv.at). Según el DSG austriaco, las reclamaciones suelen tramitarse en un plazo de un año desde el conocimiento del hecho.",
881
+ "privacyChangesTitle": "Cambios",
882
+ "privacyChangesBody": "Podemos actualizar esta política. Los cambios sustanciales se comunicarán por el servicio o por correo. La versión actual está disponible en esta página. El uso continuado tras cambios implica aceptación."
883
+ }
884
+ }