diff --git a/public/components/oikos-locale-picker.js b/public/components/oikos-locale-picker.js index fe8fd8c..40babe3 100644 --- a/public/components/oikos-locale-picker.js +++ b/public/components/oikos-locale-picker.js @@ -10,6 +10,7 @@ import { t, setLocale, getLocale, getSupportedLocales } from '/i18n.js'; const LOCALE_LABELS = { de: 'Deutsch', en: 'English', + es: 'Español', it: 'Italiano', sv: 'Svenska', }; diff --git a/public/i18n.js b/public/i18n.js index 3d09c56..7d494ee 100644 --- a/public/i18n.js +++ b/public/i18n.js @@ -5,7 +5,7 @@ * Dependencies: none (vanilla JS, Fetch API, Intl API) */ -const SUPPORTED_LOCALES = ['de', 'en', 'it', 'sv']; +const SUPPORTED_LOCALES = ['de', 'en', 'es', 'it', 'sv']; const DEFAULT_LOCALE = 'de'; const STORAGE_KEY = 'oikos-locale'; diff --git a/public/locales/es.json b/public/locales/es.json new file mode 100644 index 0000000..5452eea --- /dev/null +++ b/public/locales/es.json @@ -0,0 +1,599 @@ +{ + "common": { + "save": "Guardar", + "cancel": "Cancelar", + "delete": "Eliminar", + "edit": "Editar", + "close": "Cerrar", + "create": "Crear", + "add": "Añadir", + "back": "Atrás", + "next": "Siguiente", + "loading": "Cargando…", + "saving": "Guardando…", + "required": "Este campo es obligatorio.", + "error": "Error", + "allFieldsRequired": "Por favor, rellena todos los campos.", + "today": "Hoy", + "tomorrow": "Mañana", + "skipToContent": "Saltar al contenido", + "reload": "Recargar", + "errorOccurred": "Algo ha salido mal.", + "unexpectedError": "Se ha producido un error inesperado.", + "errorGeneric": "Se ha producido un error.", + "updateAvailable": "Actualización disponible - recarga la página para obtener la última versión.", + "titleRequired": "El título es obligatorio", + "nameRequired": "El nombre es obligatorio", + "contentRequired": "El contenido es obligatorio", + "all": "Todo", + "unknownError": "Error desconocido", + "confirm": "Confirmar", + "undo": "Deshacer" + }, + + "nav": { + "dashboard": "Inicio", + "tasks": "Tareas", + "calendar": "Calendario", + "meals": "Comidas", + "shopping": "Compras", + "notes": "Notas", + "contacts": "Contactos", + "budget": "Presupuesto", + "settings": "Ajustes", + "main": "Navegación principal", + "navigation": "Navegación", + "quickActions": "Acciones rápidas" + }, + + "dashboard": { + "title": "Inicio", + "greetingMorning": "Buenos días, {{name}}", + "greetingDay": "Buenas tardes, {{name}}", + "greetingEvening": "Buenas noches, {{name}}", + "allDone": "Todo listo", + "noEvents": "Sin eventos", + "noPinnedNotes": "Sin notas fijadas", + "todayMeals": "Comidas de hoy", + "allLink": "Todo", + "weekLink": "Semana", + "urgentTasksChip": "{{count}} tarea urgente", + "urgentTasksChipPlural": "{{count}} tareas urgentes", + "eventsChip": "{{count}} evento hoy", + "eventsChipPlural": "{{count}} eventos hoy", + "todayMealChip": "Hoy: {{title}}", + "loadError": "No se pudo cargar el panel completamente.", + "weatherRefresh": "Actualizar tiempo", + "weatherRefreshTitle": "Actualizar", + "weatherUpdated": "Tiempo actualizado", + "weatherFeelsLike": "Sensación {{temp}}° · {{humidity}}% · Viento {{wind}} km/h", + "fabTaskLabel": "Añadir tarea", + "fabCalendarLabel": "Añadir evento", + "fabShoppingLabel": "Añadir compra", + "fabNoteLabel": "Añadir nota", + "fabTask": "Tarea", + "fabCalendar": "Evento", + "fabShopping": "Compra", + "fabNote": "Nota", + "overdue": "Vencida", + "dueSoon": "Vence hoy", + "dueTomorrow": "Vence mañana", + "allDay": "Todo el día", + "shoppingMore": "+{{count}} más" + }, + + "tasks": { + "title": "Tareas", + "newTask": "Nueva tarea", + "editTask": "Editar tarea", + "emptyTitle": "Sin tareas - ¿todo hecho?", + "emptyDescription": "Crea nuevas tareas con el botón +.", + "titleLabel": "Título *", + "titlePlaceholder": "¿Qué hay que hacer?", + "descriptionLabel": "Nota", + "descriptionPlaceholder": "Detalles opcionales…", + "priorityLabel": "Prioridad", + "categoryLabel": "Categoría", + "dueDateLabel": "Fecha límite", + "dueTimeLabel": "Hora", + "assignedLabel": "Asignado a", + "assignedNobody": "- Nadie -", + "statusLabel": "Estado", + "priorityUrgent": "Urgente", + "priorityHigh": "Alta", + "priorityMedium": "Media", + "priorityLow": "Baja", + "priorityNone": "Ninguna", + "statusOpen": "Abierta", + "statusInProgress": "En progreso", + "statusDone": "Completada", + "categoryHousehold": "Hogar", + "categorySchool": "Escuela", + "categoryShopping": "Compras", + "categoryRepair": "Reparación", + "categoryHealth": "Salud", + "categoryFinance": "Finanzas", + "categoryLeisure": "Ocio", + "categoryMisc": "Otros", + "overdue": "Vencida", + "overdueDay": "{{count}}d de retraso", + "dueToday": "Vence hoy", + "dueTomorrow": "Vence mañana", + "groupOverdue": "Vencidas", + "groupToday": "Hoy", + "groupThisWeek": "Esta semana", + "groupNextWeek": "Próxima semana", + "groupLater": "Más tarde", + "groupNoDate": "Sin fecha", + "markDone": "Marcar {{title}} como completada", + "editButton": "Editar tarea", + "swipeOpen": "Abrir", + "swipeDone": "Completar", + "swipeEdit": "Editar", + "subtaskAdd": "+ Añadir subtarea", + "subtaskToggle": "Mostrar subtareas", + "subtaskMarkDone": "Marcar {{title}} como completada", + "deleteConfirm": "¿Eliminar tarea y todas sus subtareas?", + "savedToast": "Tarea guardada.", + "createdToast": "Tarea creada.", + "deletedToast": "Tarea eliminada.", + "loadError": "No se pudo cargar la tarea.", + "subtaskPrompt": "Subtarea:", + "kanbanOpen": "Abierta", + "kanbanInProgress": "En progreso", + "kanbanDone": "Completada", + "kanbanMoveToInProgress": "Mover a en progreso", + "kanbanMoveToDone": "Marcar como completada", + "kanbanMoveToOpen": "Reabrir", + "recurring": "Recurrente", + "listView": "Vista de lista", + "kanbanView": "Vista Kanban" + }, + + "shopping": { + "title": "Compras", + "noLists": "Sin listas", + "noListsDescription": "Crea una lista con el botón +.", + "emptyList": "La lista está vacía", + "emptyListDescription": "Añade artículos en el campo de arriba.", + "newListPrompt": "Nombre de la nueva lista:", + "newListButton": "Crear nueva lista", + "renameListPrompt": "Nuevo nombre de lista:", + "deleteListConfirm": "¿Eliminar lista «{{name}}» y todos sus artículos?", + "deletedListToast": "Lista eliminada.", + "itemDeletedToast": "«{{name}}» eliminado.", + "itemsRemovedToast": "{{count}} artículos eliminados.", + "clearChecked": "Eliminar marcados ({{count}})", + "itemNamePlaceholder": "Añadir artículo…", + "itemQtyPlaceholder": "Cantidad", + "itemNameLabel": "Nombre del artículo", + "itemQtyLabel": "Cantidad", + "categoryLabel": "Categoría", + "addItemLabel": "Añadir artículo", + "renameListLabel": "Renombrar lista", + "deleteListLabel": "Eliminar lista", + "swipeBack": "Atrás", + "swipeCheck": "Marcar", + "swipeDelete": "Eliminar", + "markDoneLabel": "Marcar {{name}}", + "markUndoneLabel": "Desmarcar {{name}}", + "deleteItemLabel": "Eliminar {{name}}", + "listsLoadError": "No se pudieron cargar las listas.", + "itemsLoadError": "No se pudieron cargar los artículos.", + "catFruitVeg": "Frutas y verduras", + "catBakery": "Panadería", + "catDairy": "Lácteos", + "catMeatFish": "Carne y pescado", + "catFrozen": "Congelados", + "catDrinks": "Bebidas", + "catHousehold": "Hogar", + "catDrugstore": "Droguería", + "catMisc": "Otros" + }, + + "meals": { + "title": "Plan de comidas", + "noMealPlanned": "Sin comida planificada", + "addMeal": "Añadir {{type}}", + "editMeal": "Editar comida", + "addMealTitle": "Añadir comida", + "deleteMeal": "Eliminar comida", + "transferToShoppingList": "Ingredientes a la lista de compras", + "today": "Hoy", + "prevWeek": "Semana anterior", + "nextWeek": "Semana siguiente", + "loadError": "No se pudo cargar el plan de comidas.", + "typeBreakfast": "Desayuno", + "typeLunch": "Almuerzo", + "typeDinner": "Cena", + "typeSnack": "Merienda", + "dayMo": "Lu", + "dayDi": "Ma", + "dayMi": "Mi", + "dayDo": "Ju", + "dayFr": "Vi", + "daySa": "Sá", + "daySo": "Do", + "dateLabel": "Fecha", + "mealTypeLabel": "Comida", + "titleLabel": "Título *", + "titlePlaceholder": "Ej. Espagueti a la boloñesa", + "notesLabel": "Notas", + "notesPlaceholder": "Opcional…", + "ingredientsLabel": "Ingredientes", + "addIngredient": "Añadir ingrediente", + "ingredientNamePlaceholder": "Ingrediente", + "ingredientQtyPlaceholder": "Cantidad", + "removeIngredient": "Eliminar ingrediente", + "transferLabel": "Transferir ingredientes a la lista de compras", + "transferNow": "Transferir ahora", + "noShoppingLists": "No hay listas de compras", + "transferSuccess": "{{count}} ingrediente transferido", + "transferSuccessPlural": "{{count}} ingredientes transferidos", + "transferAlreadyDone": "Todos los ingredientes ya han sido transferidos", + "ingredientCount": "{{count}} ingrediente", + "ingredientCountPlural": "{{count}} ingredientes", + "titleRequired": "El título es obligatorio", + "loadingIndicator": "Cargando…", + "recipeUrlLabel": "Enlace a la receta (opcional)", + "recipeUrlPlaceholder": "https://…", + "openRecipe": "Abrir receta" + }, + + "calendar": { + "title": "Calendario", + "newEvent": "Nuevo evento", + "editEvent": "Editar evento", + "addEvent": "Añadir evento", + "deleteEvent": "Eliminar evento", + "noEvents": "Sin eventos en el período seleccionado.", + "today": "Hoy", + "back": "Atrás", + "forward": "Siguiente", + "viewMonth": "Mes", + "viewWeek": "Semana", + "viewDay": "Día", + "viewAgenda": "Agenda", + "allDay": "Todo el día", + "allDayShort": "todo el día", + "moreEvents": "+{{count}} más", + "weekNumberLabel": "Sem. {{week}} · {{month}} {{year}}", + "agendaFrom": "Desde {{date}}", + "titleLabel": "Título *", + "titlePlaceholder": "Ej. Dentista", + "allDayToggle": "Todo el día", + "startDateLabel": "Fecha de inicio", + "startTimeLabel": "Hora de inicio", + "endDateLabel": "Fecha de fin", + "endTimeLabel": "Hora de fin", + "fromLabel": "De", + "toLabel": "A", + "locationLabel": "Lugar", + "locationPlaceholder": "Opcional", + "assignedLabel": "Asignado a", + "assignedNobody": "- Nadie -", + "colorLabel": "Color", + "descriptionLabel": "Descripción", + "descriptionPlaceholder": "Opcional…", + "popupEdit": "Editar", + "deleteConfirm": "¿Eliminar «{{title}}»?", + "createdToast": "Evento creado", + "savedToast": "Evento guardado", + "deletedToast": "Evento eliminado", + "loadError": "No se pudieron cargar los eventos.", + "saveError": "Error al guardar", + "deleteError": "Error al eliminar", + "titleRequired": "El título es obligatorio", + "monthJanuary": "Enero", + "monthFebruary": "Febrero", + "monthMarch": "Marzo", + "monthApril": "Abril", + "monthMay": "Mayo", + "monthJune": "Junio", + "monthJuly": "Julio", + "monthAugust": "Agosto", + "monthSeptember": "Septiembre", + "monthOctober": "Octubre", + "monthNovember": "Noviembre", + "monthDecember": "Diciembre", + "dayShortSunday": "Do", + "dayShortMonday": "Lu", + "dayShortTuesday": "Ma", + "dayShortWednesday": "Mi", + "dayShortThursday": "Ju", + "dayShortFriday": "Vi", + "dayShortSaturday": "Sá", + "dayLongSunday": "Domingo", + "dayLongMonday": "Lunes", + "dayLongTuesday": "Martes", + "dayLongWednesday": "Miércoles", + "dayLongThursday": "Jueves", + "dayLongFriday": "Viernes", + "dayLongSaturday": "Sábado", + "timeSuffix": "", + "colorLabel": "Color {{color}}" + }, + + "notes": { + "title": "Notas", + "newNote": "Nueva nota", + "editNote": "Editar nota", + "addNoteLabel": "Nueva nota", + "searchPlaceholder": "Buscar notas…", + "emptyTitle": "Sin notas todavía", + "emptyDescription": "Crea una nueva nota con el botón +.", + "noResultsTitle": "Sin resultados", + "noResultsDescription": "Ninguna nota contiene «{{query}}».", + "titleLabel": "Título (opcional)", + "titlePlaceholder": "Sin título", + "contentLabel": "Contenido", + "contentMarkdownHint": "(se admite formato Markdown)", + "contentPlaceholder": "Escribe una nota…", + "colorLabel": "Color", + "pinnedLabel": "Fijar (aparece en el panel)", + "pinAction": "Fijar", + "unpinAction": "Desfijar", + "deleteLabel": "Eliminar nota", + "deleteConfirm": "¿Eliminar nota?", + "createdToast": "Nota creada", + "savedToast": "Nota guardada", + "deletedToast": "Nota eliminada", + "loadError": "No se pudieron cargar las notas.", + "formatBold": "Negrita (Ctrl+B)", + "formatItalic": "Cursiva (Ctrl+I)", + "formatUnderline": "Subrayado (Ctrl+U)", + "formatStrikethrough": "Tachado", + "formatHeading": "Encabezado", + "formatList": "Lista", + "formatOrderedList": "Lista numerada", + "formatChecklist": "Lista de verificación", + "formatLink": "Enlace", + "formatCode": "Código", + "formatQuote": "Cita", + "formatDivider": "Separador" + }, + + "contacts": { + "title": "Contactos", + "newContact": "Nuevo contacto", + "editContact": "Editar contacto", + "addButton": "Nuevo", + "newContactLabel": "Nuevo contacto", + "searchPlaceholder": "Buscar nombre, teléfono o email…", + "importButton": "Importar", + "importLabel": "Importar contacto desde vCard", + "importTooltip": "Importar vCard", + "emptyTitle": "Sin contactos todavía", + "emptyDescription": "Añade nuevos contactos con el botón +.", + "filterAll": "Todos", + "nameLabel": "Nombre *", + "namePlaceholder": "Nombre completo", + "categoryLabel": "Categoría", + "phoneLabel": "Teléfono", + "phonePlaceholder": "+34 …", + "emailLabel": "Email", + "emailPlaceholder": "nombre@ejemplo.es", + "addressLabel": "Dirección", + "addressPlaceholder": "Calle, código postal, ciudad", + "notesLabel": "Notas", + "notesPlaceholder": "Opcional…", + "callLabel": "Llamar", + "emailActionLabel": "Email", + "mapsLabel": "Abrir en Maps", + "exportLabel": "Exportar como vCard", + "exportTooltip": "Exportar vCard", + "deleteLabel": "Eliminar contacto", + "deleteConfirm": "¿Eliminar contacto?", + "deletePersonConfirm": "¿Eliminar «{{name}}»?", + "savedToast": "Contacto guardado", + "updatedToast": "Contacto actualizado", + "deletedToast": "Contacto eliminado", + "importedToast": "{{name}} importado.", + "importError": "Error al importar: {{error}}", + "vcardNoName": "La vCard no contiene nombre.", + "catDoctor": "Médico", + "catSchool": "Escuela/Guardería", + "catAuthority": "Administración", + "catInsurance": "Seguro", + "catCraftsman": "Artesano", + "catEmergency": "Emergencia", + "catMisc": "Otros", + "categoryDoctor": "Médico", + "categorySchool": "Escuela/Guardería", + "categoryAuthority": "Administración", + "categoryInsurance": "Seguro", + "categoryCraftsman": "Artesano", + "categoryEmergency": "Emergencia", + "categoryOther": "Otros" + }, + + "budget": { + "title": "Presupuesto", + "newEntry": "Nueva entrada", + "editEntry": "Editar entrada", + "addEntryLabel": "Añadir entrada", + "newEntryFabLabel": "Nueva entrada", + "currentMonth": "Este mes", + "prevMonth": "Mes anterior", + "nextMonth": "Mes siguiente", + "income": "Ingresos", + "expenses": "Gastos", + "balance": "Saldo", + "byCategory": "Por categoría", + "transactions": "Transacciones", + "emptyTitle": "Sin entradas este mes", + "emptyDescription": "Añade entradas de presupuesto con el botón +.", + "csvExport": "CSV", + "typeExpense": "Gasto", + "typeIncome": "Ingreso", + "titleLabel": "Título *", + "titlePlaceholder": "Ej. Supermercado", + "amountLabel": "Importe *", + "amountPlaceholder": "0,00", + "categoryLabel": "Categoría", + "dateLabel": "Fecha *", + "recurringLabel": "Recurrente", + "deleteLabel": "Eliminar entrada", + "deleteConfirm": "¿Eliminar entrada?", + "deletePersonConfirm": "¿Eliminar «{{title}}»?", + "addedToast": "Entrada añadida", + "savedToast": "Entrada guardada", + "deletedToast": "Entrada eliminada", + "loadError": "No se pudo cargar el presupuesto.", + "trendNeutral": "- como {{month}}", + "validAmountRequired": "Introduce un importe válido", + "dateRequired": "La fecha es obligatoria", + "catFood": "Alimentación", + "catRent": "Alquiler", + "catInsurance": "Seguro", + "catMobility": "Movilidad", + "catLeisure": "Ocio", + "catClothing": "Ropa", + "catHealth": "Salud", + "catEducation": "Educación", + "catMisc": "Otros", + "loadingIndicator": "Cargando…" + }, + + "settings": { + "title": "Ajustes", + "sectionDesign": "Diseño", + "sectionShopping": "Compras", + "shoppingCategoriesLabel": "Categorías de compra", + "shoppingCategoriesHint": "Añade, renombra, elimina u ordena las categorías.", + "shoppingCategoryPlaceholder": "Nueva categoría…", + "shoppingCategoryRenameHint": "Haz clic para renombrar", + "shoppingCategoryRenamePrompt": "Nuevo nombre de categoría:", + "shoppingCategoryMoveUp": "Subir categoría", + "shoppingCategoryMoveDown": "Bajar categoría", + "shoppingCategoryDelete": "Eliminar categoría", + "shoppingCategoryDeleteConfirm": "¿Eliminar categoría «{{name}}»? Los artículos existentes se asignarán a la siguiente categoría.", + "shoppingCategoryAdded": "Categoría añadida.", + "shoppingCategoryRenamed": "Categoría renombrada.", + "shoppingCategoryDeleted": "Categoría eliminada.", + "sectionAccount": "Mi cuenta", + "sectionCalendarSync": "Sincronización de calendario", + "sectionFamily": "Miembros de la familia", + "cardAppearance": "Apariencia", + "themeSystem": "Sistema", + "themeSysLabel": "Usar configuración del sistema", + "themeLight": "Claro", + "themeLightLabel": "Tema claro", + "themeDark": "Oscuro", + "themeDarkLabel": "Tema oscuro", + "changePassword": "Cambiar contraseña", + "currentPasswordLabel": "Contraseña actual", + "newPasswordLabel": "Nueva contraseña", + "confirmPasswordLabel": "Confirmar nueva contraseña", + "savePassword": "Guardar contraseña", + "passwordMismatch": "Las contraseñas no coinciden.", + "passwordSavedToast": "Contraseña cambiada correctamente.", + "googleCalendar": "Google Calendar", + "appleCalendar": "Apple Calendar (iCloud)", + "syncNow": "Sincronizar ahora", + "disconnect": "Desconectar", + "connectGoogle": "Conectar con Google", + "connected": "Conectado", + "connectedLastSync": "Conectado · Última: {{date}}", + "notConnected": "No conectado", + "notConfigured": "No configurado (faltan variables .env)", + "configured": "Configurado (via .env)", + "configuredLastSync": "Configurado (via .env) · Última: {{date}}", + "syncSuccess": "{{provider}} sincronizado.", + "disconnectedToast": "{{provider}} desconectado.", + "googleOnlyAdmin": "Solo el administrador puede conectar Google Calendar.", + "appleOnlyAdmin": "Solo el administrador puede conectar Apple Calendar.", + "caldavUrlLabel": "URL del servidor CalDAV", + "caldavUrlPlaceholder": "https://caldav.icloud.com", + "appleIdLabel": "Apple ID (email)", + "applePasswordLabel": "Contraseña específica de app", + "applePasswordHint": "Crea la contraseña en appleid.apple.com → Seguridad.", + "appleConnectBtn": "Conectar y probar", + "appleConnecting": "Conectando…", + "appleConnectedToast": "Apple Calendar conectado.", + "syncSuccessGoogle": "Sincronización de calendario con Google conectada correctamente.", + "syncSuccessApple": "Sincronización de calendario con Apple conectada correctamente.", + "syncErrorGoogle": "Error al conectar con Google. Por favor, inténtalo de nuevo.", + "syncErrorApple": "Error al conectar con Apple. Por favor, inténtalo de nuevo.", + "addMember": "+ Añadir miembro", + "newMemberTitle": "Nuevo miembro de la familia", + "usernameLabel": "Nombre de usuario", + "displayNameLabel": "Nombre para mostrar", + "memberPasswordLabel": "Contraseña", + "colorLabel": "Color", + "roleLabel": "Rol", + "roleMember": "Miembro", + "roleAdmin": "Administrador", + "createMember": "Crear", + "cancelAddMember": "Cancelar", + "memberAddedToast": "{{name}} añadido.", + "deleteMemberConfirm": "¿Eliminar a {{name}}?", + "memberDeletedToast": "{{name}} eliminado.", + "deleteMemberLabel": "Eliminar", + "logout": "Cerrar sesión", + "synchronizing": "Sincronizando…", + "googleDisconnectConfirm": "¿Desconectar Google Calendar?", + "appleDisconnectConfirm": "¿Desconectar Apple Calendar?", + "localeSystem": "Sistema", + "localeLabel": "Idioma", + "languageTitle": "Idioma", + "sectionMeals": "Plan de comidas", + "mealTypesLabel": "Comidas visibles", + "mealTypesHint": "Solo se mostrarán los tipos de comida seleccionados.", + "mealTypesSaved": "Ajustes del plan de comidas guardados.", + "mealTypesMinOne": "Al menos un tipo de comida debe estar activo.", + "sectionBudget": "Presupuesto", + "currencyLabel": "Moneda", + "currencyHint": "Establece la moneda para toda la sección de presupuesto.", + "currencySaved": "Moneda guardada." + }, + + "login": { + "tagline": "Planificación familiar. Segura. Privada. Código abierto.", + "usernameLabel": "Nombre de usuario", + "usernamePlaceholder": "usuario", + "passwordLabel": "Contraseña", + "passwordPlaceholder": "••••••••", + "loginButton": "Iniciar sesión", + "loggingIn": "Iniciando sesión…", + "tooManyAttempts": "Demasiados intentos. Por favor, espera un momento.", + "invalidCredentials": "Credenciales incorrectas." + }, + + "install": { + "title": "Instalar Oikos", + "subtitle": "Añadir a la pantalla de inicio", + "iosTip1": "Toca ", + "iosTip2": " → «Añadir a pantalla de inicio»", + "installButton": "Instalar", + "dismissLabel": "Cerrar" + }, + + "modal": { + "closeLabel": "Cerrar" + }, + + "rrule": { + "freqNone": "Sin repetición", + "freqDaily": "Diariamente", + "freqWeekly": "Semanalmente", + "freqMonthly": "Mensualmente", + "dayMo": "Lu", + "dayTu": "Ma", + "dayWe": "Mi", + "dayTh": "Ju", + "dayFr": "Vi", + "daySa": "Sá", + "daySu": "Do", + "labelRepeat": "Repetición", + "labelEvery": "Cada", + "labelOnDays": "En estos días", + "labelUntil": "Termina el (opcional)", + "unitDay": "día", + "unitDays": "días", + "unitWeek": "semana", + "unitWeeks": "semanas", + "unitMonth": "mes", + "unitMonths": "meses" + } +}