diff --git a/messages/en-US.json b/messages/en-US.json
index f1c0aadc..3ed3a265 100644
--- a/messages/en-US.json
+++ b/messages/en-US.json
@@ -296,7 +296,8 @@
"Locale": {
"en-US": "English",
"fi": "Suomi",
- "fr-FR": "French"
+ "fr-FR": "Français",
+ "es": "Español"
},
"Share": {
"title": "Share",
diff --git a/messages/es.json b/messages/es.json
new file mode 100644
index 00000000..6626264f
--- /dev/null
+++ b/messages/es.json
@@ -0,0 +1,393 @@
+{
+ "Homepage": {
+ "title": "Comparte Gastos con Amigos y Familia",
+ "description": "¡Bienvenido a tu nueva instancia de Spliit!",
+ "button": {
+ "groups": "Ir a grupos",
+ "github": "GitHub"
+ }
+ },
+ "Header": {
+ "groups": "Grupos"
+ },
+ "Footer": {
+ "madeIn": "Hecho en Montréal, Québec 🇨🇦",
+ "builtBy": "Construido por Sebastien Castiel y "
+ },
+ "Expenses": {
+ "title": "Gastos",
+ "description": "Aqui encontraras los gastos que has creado para tu grupo.",
+ "create": "Crear gasto",
+ "createFirst": "Crea el primero",
+ "noExpenses": "Tu grupo aun no tiene gastos.",
+ "exportJson": "Exportar a JSON",
+ "searchPlaceholder": "Busca un gasto…",
+ "ActiveUserModal": {
+ "title": "¿Quién es usted?",
+ "description": "Dinos qué participante eres para que podamos personalizar cómo se muestra la información.",
+ "nobody": "No quiero seleccionar a nadie",
+ "save": "Guardar cambios",
+ "footer": "Esta configuración puede modificarse posteriormente en los ajustes del grupo."
+ },
+ "Groups": {
+ "upcoming": "Próximamente",
+ "thisWeek": "Esta semana",
+ "earlierThisMonth": "A principios de este mes",
+ "lastMonth": "El mes pasado",
+ "earlierThisYear": "A principios de este año",
+ "lastYera": "El año pasado",
+ "older": "Más antiguos"
+ }
+ },
+ "ExpenseCard": {
+ "paidBy": "Pagado por {paidBy} para ",
+ "receivedBy": "Recibido por {paidBy} para ",
+ "yourBalance": "Tu balance:"
+ },
+ "Groups": {
+ "myGroups": "Mis grupos",
+ "create": "Crear",
+ "loadingRecent": "Cargando grupos recientes…",
+ "NoRecent": {
+ "description": "No has visitado ningun grupo recientemente.",
+ "create": "Crea uno",
+ "orAsk": "o pídele a un amigo que te envíe el enlace a uno ya existente.."
+ },
+ "recent": "Grupos recientes",
+ "starred": "Grupos favoritos",
+ "archived": "Grupos archivados",
+ "archive": "Archivar grupo",
+ "unarchive": "Desarchivar groupo",
+ "removeRecent": "Remove from recent groups",
+ "RecentRemovedToast": {
+ "title": "El grupo fue eliminado",
+ "description": "El grupo ha sido eliminado de tu lista de grupos recientes.",
+ "undoAlt": "Deshacer la eliminación del grupo",
+ "undo": "Deshacer"
+ },
+ "AddByURL": {
+ "button": "Añadir mediante url",
+ "title": "Añadir grupo mediante url",
+ "description": "Si te han compartido un grupo, puedes pegar aquí su URL para añadirlo a tu lista.",
+ "error": "Oops, no somos capaces de encontrar el grupo desde la URL que has proporcionado..."
+ },
+ "NotFound": {
+ "text": "Este grupo no existe.",
+ "link": "Ir a los últimos grupos visitados"
+ }
+ },
+ "GroupForm": {
+ "title": "Información del grupo",
+ "NameField": {
+ "label": "Nombre del grupo",
+ "placeholder": "Vacaciones en Barcelona",
+ "description": "Inserta un nombre para tu nuevo grupo."
+ },
+ "InformationField": {
+ "label": "Información del grupo",
+ "placeholder": "Qué información es relevante para los participantes del grupo?"
+ },
+ "CurrencyField": {
+ "label": "Símbolo de divisa",
+ "placeholder": "$, €, £…",
+ "description": "Lo usaremos para mostrar balances."
+ },
+ "Participants": {
+ "title": "Participantes",
+ "description": "Ingresa el nombre de cada participante.",
+ "protectedParticipant": "Estos participantes forman parte de gastos y no pueden ser eliminados.",
+ "new": "Nuevo",
+ "add": "Añadir participante",
+ "John": "Juan",
+ "Jane": "Maria",
+ "Jack": "Sergio"
+ },
+ "Settings": {
+ "title": "Ajustes locales",
+ "description": "Estos ajustes se establecen por dispositivo y se utilizan para personalizar su experiencia.",
+ "ActiveUserField": {
+ "label": "Usuario activo",
+ "placeholder": "Selecciona un participante...",
+ "none": "Ninguno",
+ "description": "Usuario que paga los gastos por defecto."
+ },
+ "save": "Guardar",
+ "saving": "Guardando",
+ "create": "Crear",
+ "creating": "Creando",
+ "cancel": "Cancelar"
+ }
+ },
+ "ExpenseForm": {
+ "Income": {
+ "create": "Crear ingreso",
+ "edit": "Editar ingreso",
+ "TitleField": {
+ "label": "Título del ingreso",
+ "placeholder": "Comida Hamburgeseria",
+ "description": "Introduce una descripción para este ingreso."
+ },
+ "DateField": {
+ "label": "Fecha del ingreso",
+ "description": "Ingresa la fecha en que se recibio el ingreso."
+ },
+ "categoryFieldDescription": "Seleccione la categoría de ingresos.",
+ "paidByField": {
+ "label": "Recibido por",
+ "description": "Seleccione el participante que recibió los ingresos."
+ },
+ "paidFor": {
+ "title": "Recibido para for",
+ "description": "Seleccione para quién se recibió el ingreso."
+ },
+ "splitModeDescription": "Seleccione como quieres dividir el ingreso.",
+ "attachDescription": "Ver y adjuntar tickets para el ingreso."
+ },
+ "Expense": {
+ "create": "Crear gasto",
+ "edit": "Editar gasto",
+ "TitleField": {
+ "label": "Título del gasto",
+ "placeholder": "Monday evening restaurant",
+ "description": "Enter a description for the expense."
+ },
+ "DateField": {
+ "label": "Fecha del gasto",
+ "description": "Ingresa la fecha en que se recibio el gasto."
+ },
+ "categoryFieldDescription": "Select the expense category.",
+ "paidByField": {
+ "label": "Pagado por",
+ "description": "Seleccione el participante que pagó el gasto."
+ },
+ "paidFor": {
+ "title": "Pagado para",
+ "description": "Seleccione para quién se pagó el gasto."
+ },
+ "splitModeDescription": "Seleccione como quieres dividir el gasto.",
+ "attachDescription": "Ver y adjuntar tickets para el gasto."
+ },
+ "amountField": {
+ "label": "Cantidad"
+ },
+ "isReimbursementField": {
+ "label": "Esto es un reembolso"
+ },
+ "categoryField": {
+ "label": "Categoria"
+ },
+ "notesField": {
+ "label": "Notas"
+ },
+ "selectNone": "Seleccionar ninguno",
+ "selectAll": "Seleccionar todos",
+ "shares": "partes",
+ "advancedOptions": "Opciones avanzadas",
+ "SplitModeField": {
+ "label": "Modo de división",
+ "evenly": "Uniformemente",
+ "byShares": "Desigualmente – Por partes",
+ "byPercentage": "Desigualmente – por porcentaje",
+ "byAmount": "Desigualmente – por cantidad",
+ "saveAsDefault": "Guardar como modo preferido"
+ },
+ "DeletePopup": {
+ "label": "Borrar",
+ "title": "Borrar gasto?",
+ "description": "Seguro que quieres borrar este gasto? Esta acción es irreversible.",
+ "yes": "Si",
+ "cancel": "Cancelar"
+ },
+ "attachDocuments": "Adjuntar documentos",
+ "create": "Crear",
+ "creating": "Creando",
+ "save": "Guardar",
+ "saving": "Guardando",
+ "cancel": "Cancelar"
+ },
+ "ExpenseDocumentsInput": {
+ "TooBigToast": {
+ "title": "El archivo es demasiado grande",
+ "description": "El tamaño máximo de archivo que puede cargar es {maxSize}. El tuyo pesa ${size}."
+ },
+ "ErrorToast": {
+ "title": "Error al cargar el documento",
+ "description": "Ha ocurrido un error al cargar el documento. Vuelva a intentarlo más tarde o seleccione otro archivo.",
+ "retry": "Reintentar"
+ }
+ },
+ "CreateFromReceipt": {
+ "Dialog": {
+ "triggerTitle": "Crear gasto desde ticket",
+ "title": "Crear desde ticket",
+ "description": "Extraer la información de gastos de una foto de recibo.",
+ "body": "Sube la foto de un recibo y lo escanearemos para extraer la información del gasto si podemos.",
+ "selectImage": "Seleccionar imagen…",
+ "titleLabel": "Titulo:",
+ "categoryLabel": "Categoria:",
+ "amountLabel": "Cantidad:",
+ "dateLabel": "Fecha:",
+ "editNext": "A continuación podrá editar la información de los gastos.",
+ "continue": "Continuar"
+ },
+ "unknown": "Desconocido",
+ "TooBigToast": {
+ "title": "El archivo es demasiado grande",
+ "description": "El tamaño máximo de archivo que puede cargar es {maxSize}. El tuyo pesa ${size}."
+ },
+ "ErrorToast": {
+ "title": "Error al cargar el documento",
+ "description": "Ha ocurrido un error al cargar el documento. Vuelva a intentarlo más tarde o seleccione otro archivo.",
+ "retry": "Reintentar"
+ }
+ },
+ "Balances": {
+ "title": "Balances",
+ "description": "Se trata del importe que ha pagado o ha recibido cada participante.",
+ "Reimbursements": {
+ "title": "Reembolsos propuestos",
+ "description": "He aquí algunas sugerencias para optimizar los reembolsos entre los participantes.",
+ "noImbursements": "Parece que tu grupo no necesita ningún reembolso 😁",
+ "owes": "{from} debe {to}",
+ "markAsPaid": "Marcar como pagado"
+ }
+ },
+ "Stats": {
+ "title": "Estadísticas",
+ "Totals": {
+ "title": "Totales",
+ "description": "Resumen de gastos de todo el grupo.",
+ "groupSpendings": "Gastos de todo el grupo",
+ "groupEarnings": "Ingresos de todo el grupo",
+ "yourSpendings": "Tus gastos totales",
+ "yourEarnings": "Tus ingresos totales",
+ "yourShare": "Tu parte final"
+ }
+ },
+ "Activity": {
+ "title": "Actividad",
+ "description": "Aquí encontrarás todas las actividades recientes en tu grupo.",
+ "noActivity": "No hay actividad reciente en este grupo.",
+ "someone": "Alguien",
+ "settingsModified": "Los ajustes del grupo fueron modificados por {participant}.",
+ "expenseCreated": "Gasto {expense} creado por {participant}.",
+ "expenseUpdated": "Gasto {expense} actualizado por {participant}.",
+ "expenseDeleted": "Gasto {expense} borrado por {participant}.",
+ "Groups": {
+ "today": "Hoy",
+ "yesterday": "Ayer",
+ "earlierThisWeek": "A principios de esta semana",
+ "lastWeek": "La semana pasada",
+ "earlierThisMonth": "A principios de este mes",
+ "lastMonth": "El mes pasado",
+ "earlierThisYear": "A principios de este año",
+ "lastYear": "El ultimo año",
+ "older": "Más antiguos"
+ }
+ },
+ "Information": {
+ "title": "Información",
+ "description": "Utilice este lugar para añadir cualquier información que pueda ser relevante para los participantes del grupo.",
+ "empty": "Aún no hay información sobre el grupo."
+ },
+ "Settings": {
+ "title": "Ajustes"
+ },
+ "Locale": {
+ "en-US": "English",
+ "fi": "Suomi",
+ "fr-FR": "Français",
+ "es": "Español"
+ },
+ "Share": {
+ "title": "Compartir",
+ "description": "Para que otros participantes puedan ver el grupo y añadir gastos, compárteles su URL.",
+ "warning": "Cuidado!",
+ "warningHelp": "Todas las personas que tengan la URL del grupo podrán ver y editar los gastos. ¡Comparte con precaución!"
+ },
+ "SchemaErrors": {
+ "min1": "Introduzca al menos un carácter.",
+ "min2": "Introduzca al menos dos carácter.",
+ "max5": "Introduzca al menos cinco carácter.",
+ "max50": "Introduzca al menos treinta carácter.",
+ "duplicateParticipantName": "Otro participante ya tiene este nombre",
+ "titleRequired": "Por favor, introduzca un título",
+ "invalidNumber": "Número inválido",
+ "amountRequired": "Debe introducir un importe",
+ "amountNotZero": "El importe no debe ser cero.",
+ "amountTenMillion": "El importe debe ser inferior a 10.000.000.",
+ "paidByRequired": "Debe seleccionar un participante",
+ "paidForMin1": "El gasto debe ser pagado por al menos un participante",
+ "noZeroShares": "Todas las participaciones deben ser superiores a 0",
+ "amountSum": "La suma de los importes debe ser igual al importe del gasto",
+ "percentageSum": "Suma de porcentajes debe ser igual a 100"
+ },
+ "Categories": {
+ "search": "Buscar categoría...",
+ "noCategory": "Categoría no encontrada!",
+ "Uncategorized": {
+ "heading": "Sin categoría",
+ "General": "General",
+ "Payment": "Pago"
+ },
+ "Entertainment": {
+ "heading": "Ocio",
+ "Entertainment": "Ocio",
+ "Games": "Juegos",
+ "Movies": "Películas",
+ "Music": "Musica",
+ "Sports": "Deportes"
+ },
+ "Food and Drink": {
+ "heading": "Comida y bebida",
+ "Food and Drink": "Comida y bebida",
+ "Dining Out": "Comer fuera",
+ "Groceries": "Comestibles",
+ "Liquor": "Licores"
+ },
+ "Home": {
+ "heading": "Hogar",
+ "Home": "Hogar",
+ "Electronics": "Electrónica",
+ "Furniture": "Muebles",
+ "Household Supplies": "Suministros del hogar",
+ "Maintenance": "Mantenimiento",
+ "Mortgage": "Hipoteca",
+ "Pets": "Mascotas",
+ "Rent": "Alquiler",
+ "Services": "Servicios"
+ },
+ "Life": {
+ "heading": "Vida",
+ "Childcare": "Cuidado de niños",
+ "Clothing": "Ropa",
+ "Education": "Educación",
+ "Gifts": "Regalos",
+ "Insurance": "Seguro",
+ "Medical Expenses": "Gastos médicos",
+ "Taxes": "Impuestos"
+ },
+ "Transportation": {
+ "heading": "Transporte",
+ "Transportation": "Transporte",
+ "Bicycle": "Bicicleta",
+ "Bus/Train": "Autobús/Tren",
+ "Car": "Coche",
+ "Gas/Fuel": "Gasolina/Combustible",
+ "Hotel": "Hotel",
+ "Parking": "Parking",
+ "Plane": "Avión",
+ "Taxi": "Taxi"
+ },
+ "Utilities": {
+ "heading": "Utilidades",
+ "Utilities": "Utilidades",
+ "Cleaning": "Limpieza",
+ "Electricity": "Electricidad",
+ "Heat/Gas": "Calefacción/Gas",
+ "Trash": "Basura",
+ "TV/Phone/Internet": "TV/Teléfono/Internet",
+ "Water": "Agua"
+ }
+ }
+}
diff --git a/messages/fi.json b/messages/fi.json
index f6cdf3a5..264fcb61 100644
--- a/messages/fi.json
+++ b/messages/fi.json
@@ -296,7 +296,8 @@
"Locale": {
"en-US": "English",
"fi": "Suomi",
- "fr-FR": "French"
+ "fr-FR": "Français",
+ "es": "Español"
},
"Share": {
"title": "Jaa",
diff --git a/messages/fr-FR.json b/messages/fr-FR.json
index 9bd936b7..078c6f37 100644
--- a/messages/fr-FR.json
+++ b/messages/fr-FR.json
@@ -294,9 +294,10 @@
"title": "Paramètres"
},
"Locale": {
- "en-US": "Anglais",
- "fi": "Finnois",
- "fr-FR": "Français"
+ "en-US": "English",
+ "fi": "Suomi",
+ "fr-FR": "Français",
+ "es": "Español"
},
"Share": {
"title": "Partager",
diff --git a/src/i18n.ts b/src/i18n.ts
index 27065896..dbf8cfe9 100644
--- a/src/i18n.ts
+++ b/src/i18n.ts
@@ -1,7 +1,7 @@
import { getRequestConfig } from 'next-intl/server'
import { getUserLocale } from './lib/locale'
-export const locales = ['en-US', 'fi', 'fr-FR'] as const
+export const locales = ['en-US', 'fi', 'fr-FR', 'es'] as const
export type Locale = (typeof locales)[number]
export type Locales = ReadonlyArray
export const defaultLocale: Locale = 'en-US'