diff --git a/frontend/app/locales/es.json b/frontend/app/locales/es.json
new file mode 100644
index 00000000..de432d35
--- /dev/null
+++ b/frontend/app/locales/es.json
@@ -0,0 +1,168 @@
+{
+ "anonymousLoginForm.length-limit": "El nombre de usuario debe ser de al menos 3 caracteres de largo",
+ "anonymousLoginForm.log-in": "Acceder",
+ "anonymousLoginForm.symbol-limit": "El nombre de usuario debe comenzar con una letra y contener solamente letras latinas, números, guión bajo o espacio",
+ "anonymousLoginForm.user-name": "Nombre de usuario",
+ "authPanel.anonymous-provider": "Anónimo",
+ "authPanel.disable-comments": "Deshabilitar comentarios",
+ "authPanel.disabled-cookies": "Deshabilita las cookies de terceros que bloquean el acceso o abre los comentarios en una",
+ "authPanel.enable-comments": "Habilitar comentarios",
+ "authPanel.enable-cookies": "Habilitar cookies para acceder y comentar",
+ "authPanel.hide-settings": "Ocultar opciones",
+ "authPanel.logged-as": "Accediste como",
+ "authPanel.login": "Acceder:",
+ "authPanel.logout": "¿Salir?",
+ "authPanel.or-provider": "o",
+ "authPanel.other-provider": "Otro",
+ "authPanel.read-only": "Solo lectura",
+ "authPanel.request-to-delete-data": "Solicitar la eliminación de mis datos",
+ "authPanel.show-settings": "Mostrar opciones",
+ "blockingDuration.day": "Por un día",
+ "blockingDuration.month": "Por un mes",
+ "blockingDuration.permanently": "Permanentemente",
+ "blockingDuration.week": "Por una semana",
+ "comment.block": "Bloquear",
+ "comment.block-user": "¿Quieres bloquear a {userName} {duration}?",
+ "comment.blocked-user": "Bloqueado",
+ "comment.blocking-period": "Período de bloqueo",
+ "comment.cancel": "Cancelar",
+ "comment.controversy": "Controversia: {value}",
+ "comment.copied": "¡Copiado!",
+ "comment.copy": "Copiar",
+ "comment.delete": "Eliminar",
+ "comment.delete-message": "¿Quieres eliminar este comentario?",
+ "comment.deleted-comment": "Este comentario fue eliminado",
+ "comment.deleted-user": "Eliminado",
+ "comment.edit": "Editar",
+ "comment.expired-time": "El tiempo de edición ha expirado.",
+ "comment.go-to-parent": "Ir al comentario padre",
+ "comment.hide": "Ocultar",
+ "comment.hide-user-comment": "¿Quieres ocultar los comentarios de {userName}?",
+ "comment.pin": "Anclar",
+ "comment.pin-comment": "¿Quieres anclar este comentario?",
+ "comment.reply": "Responder",
+ "comment.time": "{day} a las {time}",
+ "comment.toggle-verification": "Alternar verificación",
+ "comment.unblock": "Desbloquear",
+ "comment.unblock-user": "¿Quieres desbloquear a este usuario?",
+ "comment.unpin": "Desanclar",
+ "comment.unpin-comment": "¿Quieres desanclar este comentario?",
+ "comment.unverified-user": "Usuario no verificado",
+ "comment.unverify-user": "¿Quieres quitar la verificación a {userName}?",
+ "comment.verified-user": "Usuario verificado",
+ "comment.verify-user": "¿Quieres verificar a {userName}?",
+ "comment.vote-error": "Error al votar: {voteErrorMessage}",
+ "commentForm.anonymous-uploading-disabled": "La subida de imágenes está deshabilitada para usuarios no autenticados. Deberías acceder antes de subir imágenes.",
+ "commentForm.exceeded-size": "{fileName} excede el tamaño máximo de {maxImageSize}",
+ "commentForm.input-placeholder": "Tu comentario aquí",
+ "commentForm.new-comment": "Nuevo comentario",
+ "commentForm.notice-about-styling": "El formato con Markdown está soportado",
+ "commentForm.preview": "Pre-visualizar",
+ "commentForm.reply": "Responder",
+ "commentForm.save": "Guardar",
+ "commentForm.send": "Enviar",
+ "commentForm.subscribe-by": "Suscribirse por",
+ "commentForm.subscribe-or": "o",
+ "commentForm.unexpected-error": "Algo salió mal. Por favor vuelve a intentar más tarde.",
+ "commentForm.upload-file-fail": "la subida de {fileName} falló con \"{errorMessage}\"",
+ "commentForm.uploading": "Subiendo...",
+ "commentForm.uploading-file": "subiendo {fileName}...",
+ "commentSort.sort-by": "Ordernar por",
+ "commentsSort.best": "Mejor",
+ "commentsSort.least-controversial": "Menos controversial",
+ "commentsSort.least-recently-updated": "Actualizado menos recientemente",
+ "commentsSort.most-controversial": "Más controversial",
+ "commentsSort.newest": "Más nuevo",
+ "commentsSort.oldest": "Más antiguo",
+ "commentsSort.recently-updated": "Actualizado más recientemente",
+ "commentsSort.worst": "Peor",
+ "emailLoginForm.back": "Volver",
+ "emailLoginForm.confirm": "Confirmar",
+ "emailLoginForm.email-address": "Dirección de correo electrónico",
+ "emailLoginForm.empty-token": "El campo de token no debe ser vacío",
+ "emailLoginForm.expired-token": "El token ha expirado",
+ "emailLoginForm.invalid-email": "La dirección de correo electrónica no es válida",
+ "emailLoginForm.loading": "Cargando...",
+ "emailLoginForm.send-verification": "Enviar verificación",
+ "emailLoginForm.token": "Token",
+ "emailLoginForm.user-not-found": "No se encontró el usuario",
+ "errors.0": "Algo salió mal. Por favor vuelve a intentar más tarde.",
+ "errors.1": "No se ha encontrado el comentario. Por favor refresca la página y vuelve a intentar.",
+ "errors.10": "Es muy tarde para editar el comentario.",
+ "errors.11": "El comentario ya tiene una respuesta. No es posible editarlo.",
+ "errors.12": "No se ha podido guardar el resultado del voto. Por favor vuelve a intentar más tarde.",
+ "errors.13": "No puedes votar tu propio comentario.",
+ "errors.14": "Ya has votado el comentario.",
+ "errors.15": "Demasiados votos para el comentario.",
+ "errors.16": "Ya se ha alcanzado el puntaje mínimo para el comentario.",
+ "errors.17": "Acción rechazada. Por favor vuelve a intentar más tarde.",
+ "errors.18": "No se ha encontrado el archivo solicitado.",
+ "errors.2": "No se ha podido deserializar la petición entrante.",
+ "errors.3": "No tienes permisos para esta operación.",
+ "errors.4": "Datos de comentario inválidos.",
+ "errors.5": "El comentario no se ha encontrado. Por favor refresca la página y vuelve a intentar.",
+ "errors.6": "El sitio no se ha encontrado. Por favor refresca la página y vuelve a intentar.",
+ "errors.7": "El usuario ha sido bloqueado.",
+ "errors.8": "El usuario ha sido bloqueado.",
+ "errors.9": "No se ha podido cambiar el comentario. Por favor vuelve a intentar más tarde.",
+ "errors.failed-fetch": "No se ha podido obtener. Por favor revisa tu conexión a internet o vuelve a intentar más tarde",
+ "errors.forbidden": "Prohibido.",
+ "errors.not-authorized": "No autorizado.",
+ "errors.to-many-request": "Has llegado al límite de peticiones.",
+ "errors.unexpected-error": "Algo salió mal.",
+ "root.pinned-comments": "Comentarios anclados",
+ "root.powered-by": "Powered by Remark42",
+ "root.show-more": "Mostrar más",
+ "settings.block": "bloquear",
+ "settings.block-time": "hasta el {day} a las {time}",
+ "settings.block-user": "¿Quieres bloquear a {userName}?",
+ "settings.blocked-users-header": "Usuarios bloqueados:",
+ "settings.blocked-users-title": "Usuarios bloqueados",
+ "settings.hidden-user-header": "Usuarios ocultos:",
+ "settings.hidden-users-title": "Usuarios ocultos",
+ "settings.hide": "ocultar",
+ "settings.no-blocked-users": "No hay usuarios bloqueados.",
+ "settings.no-hidden-users": "No hay usuarios ocultos.",
+ "settings.permanently": "permanentemente",
+ "settings.show": "mostrar",
+ "settings.unblock": "desbloquear",
+ "settings.unblock-user": "¿Quieres desbloquear a {userName}?",
+ "settings.unknown": "desconocido",
+ "subscribeByEmail.back": "Volver",
+ "subscribeByEmail.close": "Cerrar",
+ "subscribeByEmail.email": "Correo electrónico",
+ "subscribeByEmail.expired-token": "Token expirado",
+ "subscribeByEmail.have-been-subscribed": "Has sido suscripto a actualizaciones por correo electrónico",
+ "subscribeByEmail.have-been-unsubscribed": "Has sido de-suscripto a actualizaciones por correo electrónico",
+ "subscribeByEmail.only-registered-users": "Disponible solo para usuarios registrados",
+ "subscribeByEmail.submit": "Enviar",
+ "subscribeByEmail.subscribe": "Suscribir",
+ "subscribeByEmail.subscribe-by-email": "Suscribir por correo electrónico",
+ "subscribeByEmail.subscribe-to-replies": "Suscribir a respuestas",
+ "subscribeByEmail.subscribed": "Estás suscripto a actualizaciones por correo electrónico",
+ "subscribeByEmail.token": "Token",
+ "subscribeByEmail.unsubscribe": "De-suscribir",
+ "subscribeByRSS.button-title": "Suscribir por RSS",
+ "subscribeByRSS.replies": "Respuestas",
+ "subscribeByRSS.site": "Sitio",
+ "subscribeByRSS.thread": "Hilo",
+ "subscribeByRSS.title": "RSS",
+ "toolbar.attach-image": "Adjunta la imágen, arrastra y suelta, o pega desde el portapapeles",
+ "toolbar.bold": "Agrega texto en negrita ",
+ "toolbar.code": "Inserta un código",
+ "toolbar.header": "Agrega un título",
+ "toolbar.italic": "Agrega texto en cursiva ",
+ "toolbar.link": "Agrega un link ",
+ "toolbar.ordered-list": "Agrega una lista numerada",
+ "toolbar.quote": "Inserta una cita",
+ "toolbar.unordered-list": "Agrega una lista sin numerar",
+ "user-info.last-comments": "Últimos comentarios de {userName}",
+ "user-info.unexpected-error": "Algo salió mal",
+ "vote.anonymous": "Los usuarios anónimos no puede votar",
+ "vote.deleted": "No se puede votar un comentario eliminado",
+ "vote.guest": "Accede para votar",
+ "vote.only-positive": "El puntaje debe ser positivo",
+ "vote.only-post-page": "Solo se puede votar en la página de la publicación",
+ "vote.own-comment": "No puedes votar tu propio comentario",
+ "vote.readonly": "No se puede votar en tópicos de solo lectura"
+}
diff --git a/frontend/app/utils/loadLocale.ts b/frontend/app/utils/loadLocale.ts
index 6c0a6dd2..e81fdf8d 100644
--- a/frontend/app/utils/loadLocale.ts
+++ b/frontend/app/utils/loadLocale.ts
@@ -18,6 +18,11 @@ export async function loadLocale(locale: string): Promise
.then(res => res.default)
.catch(() => enMessages);
}
+ if (locale === 'es') {
+ return import(/* webpackChunkName: "es" */ '../locales/es.json')
+ .then(res => res.default)
+ .catch(() => enMessages);
+ }
return enMessages;
}
diff --git a/frontend/tasks/supportedLocales.json b/frontend/tasks/supportedLocales.json
index e6ef2bd8..8b10181c 100644
--- a/frontend/tasks/supportedLocales.json
+++ b/frontend/tasks/supportedLocales.json
@@ -1 +1 @@
-["en", "ru", "de", "fi"]
+["en", "ru", "de", "fi", "es"]