diff --git a/api/user_setting.go b/api/user_setting.go
index d8320075a..23001f0b7 100644
--- a/api/user_setting.go
+++ b/api/user_setting.go
@@ -34,7 +34,7 @@ func (key UserSettingKey) String() string {
}
var (
- UserSettingLocaleValue = []string{"en", "zh", "vi", "fr", "nl", "sv", "de"}
+ UserSettingLocaleValue = []string{"en", "zh", "vi", "fr", "nl", "sv", "de", "es"}
UserSettingAppearanceValue = []string{"system", "light", "dark"}
UserSettingMemoVisibilityValue = []Visibility{Private, Protected, Public}
UserSettingMemoDisplayTsOptionKeyValue = []string{"created_ts", "updated_ts"}
diff --git a/web/src/components/Settings/PreferencesSection.tsx b/web/src/components/Settings/PreferencesSection.tsx
index 90444a071..1ab16a9df 100644
--- a/web/src/components/Settings/PreferencesSection.tsx
+++ b/web/src/components/Settings/PreferencesSection.tsx
@@ -36,6 +36,10 @@ const localeSelectorItems = [
text: "German",
value: "de",
},
+ {
+ text: "Spanish",
+ value: "es",
+ },
];
const PreferencesSection = () => {
diff --git a/web/src/i18n.ts b/web/src/i18n.ts
index 066a10889..069780414 100644
--- a/web/src/i18n.ts
+++ b/web/src/i18n.ts
@@ -7,6 +7,7 @@ import frLocale from "./locales/fr.json";
import nlLocale from "./locales/nl.json";
import svLocale from "./locales/sv.json";
import deLocale from "./locales/de.json";
+import esLocale from "./locales/es.json";
i18n.use(initReactI18next).init({
resources: {
@@ -31,6 +32,9 @@ i18n.use(initReactI18next).init({
de: {
translation: deLocale,
},
+ es: {
+ translation: esLocale,
+ },
},
lng: "nl",
fallbackLng: "en",
diff --git a/web/src/locales/es.json b/web/src/locales/es.json
new file mode 100644
index 000000000..59eaca4cc
--- /dev/null
+++ b/web/src/locales/es.json
@@ -0,0 +1,214 @@
+{
+ "common": {
+ "about": "Acerca de",
+ "email": "Email",
+ "password": "Contraseña",
+ "repeat-password-short": "Repetir",
+ "repeat-password": "Repetir la contraseña",
+ "new-password": "Nueva contraseña",
+ "repeat-new-password": "Repetir la nueva contraseña",
+ "username": "Usuario",
+ "nickname": "Apodo",
+ "save": "Guardar",
+ "close": "Cerrar",
+ "cancel": "Cancelar",
+ "create": "Crear",
+ "change": "Cambiar",
+ "confirm": "Confirmar",
+ "reset": "Restablecer",
+ "language": "Idioma",
+ "version": "Versión",
+ "pin": "Enganchar",
+ "unpin": "Desenganchar",
+ "edit": "Editar",
+ "restore": "Restaurar",
+ "delete": "Eliminar",
+ "null": "Nulo",
+ "share": "Compartir",
+ "archive": "Archivar",
+ "basic": "Básico",
+ "admin": "Admin",
+ "explore": "Explorar",
+ "sign-in": "Iniciar sesión",
+ "sign-up": "Registrarse",
+ "sign-out": "Cerrar sesión",
+ "back-to-home": "Volver al Inicio",
+ "type": "Tipo",
+ "shortcuts": "Atajos",
+ "title": "Título",
+ "filter": "Filtros",
+ "tags": "Etiquetas",
+ "yourself": "Tu",
+ "archived-at": "Archivado en",
+ "changed": "cambiado",
+ "update-on": "Actualización de",
+ "fold": "Fold",
+ "expand": "Expandir",
+ "image": "Imagen",
+ "link": "Enlace",
+ "vacuum": "Vaciar"
+ },
+ "slogan": "Un código abierto, centro de notas autoalojado con la gestión del conocimiento y la socialización.",
+ "auth": {
+ "signup-as-host": "Registrarse como Anfitrión",
+ "host-tip": "Te estás registrando como Anfitrión del Sitio.",
+ "not-host-tip": "Si no tienes una cuenta, ponte en contacto con el anfitrión del sitio."
+ },
+ "sidebar": {
+ "daily-review": "Análisis diario",
+ "resources": "Recursos",
+ "setting": "Configuración",
+ "archived": "Archivado"
+ },
+ "daily-review": {
+ "oops-nothing": "Oops, no hay nada."
+ },
+ "resources": {
+ "description": "Visualiza tus recursos estáticos en notas. p.ej., imágenes",
+ "no-resources": "Sin recursos.",
+ "fetching-data": "obteniendo datos...",
+ "upload": "Subir",
+ "preview": "Vista previa",
+ "copy-link": "Copiar Enlace",
+ "delete-resource": "Borrar Recurso",
+ "warning-text": "Seguro que quieres eliminar este recurso? ESTA ACCIÓN ES IRREVERSIBLE❗.",
+ "linked-amount": "Importe de la nota vinculado",
+ "rename": "Renombrar",
+ "clear-unused-resources": "Borrar los recursos no utilizados",
+ "warning-text-unused": "Seguro que quieres eliminar estos recursos no utilizados? ESTA ACCIÓN ES IRREVERSIBLE❗.",
+ "no-unused-resources": "No hay recursos sin utilizar"
+ },
+ "archived": {
+ "archived-memos": "Notas Archivadas",
+ "no-archived-memos": "No hay notas archivadas.",
+ "fetching-data": "obteniendo datos..."
+ },
+ "editor": {
+ "editing": "Editando...",
+ "cancel-edit": "Cancelar edición",
+ "save": "Guardar",
+ "placeholder": "Alguna idea...",
+ "only-image-supported": "Solo se admiten archivos de imagen.",
+ "cant-empty": "El contenido no puede estar vacío",
+ "local": "Local",
+ "resources": "Recursos"
+ },
+ "memo": {
+ "view-detail": "Ver Detalles",
+ "copy": "Copiar",
+ "visibility": {
+ "private": "Solo visible para ti",
+ "protected": "Visible para los miembros",
+ "public": "Todo el mundo lo puede ver"
+ }
+ },
+ "memo-list": {
+ "fetching-data": "obteniendo datos...",
+ "fetch-more": "Click aqui para obtener más información"
+ },
+ "shortcut-list": {
+ "shortcut-title": "título del atajo",
+ "create-shortcut": "Crear Atajo",
+ "edit-shortcut": "Editar Atajo",
+ "eligible-memo": "nota elegible",
+ "fill-previous": "Introduce el valor del filtro anterior",
+ "title-required": "El título es obligatorio",
+ "value-required": "El valor del filtro es obligatorio"
+ },
+ "filter": {
+ "new-filter": "Nuevo Filtro",
+ "operator": {
+ "contains": "Contiene",
+ "not-contains": "No contiene",
+ "is": "Es",
+ "is-not": "No Es",
+ "before": "Antes",
+ "after": "Después"
+ },
+ "value": {
+ "not-tagged": "Sin etiquetas",
+ "linked": "Tiene enlaces"
+ },
+ "text-placeholder": "Empieza por ^ para usar regex"
+ },
+ "tag-list": {
+ "tip-text": "Introduce `#etiqueta ` para crearla"
+ },
+ "search": {
+ "quickly-filter": "Filtro rápido"
+ },
+ "setting": {
+ "my-account": "Mi Cuenta",
+ "preference": "Preferencias",
+ "member": "Miembros",
+ "member-list": "Lista de miembros",
+ "system": "Sistema",
+ "account-section": {
+ "title": "Información de la Cuenta",
+ "update-information": "Actualizar Información",
+ "change-password": "Cambiar Contraseña"
+ },
+ "preference-section": {
+ "default-memo-visibility": "Visibilidad predeterminada de las notas",
+ "enable-folding-memo": "Habilitar nota plegable",
+ "editor-font-style": "Estilo de fuente del editor",
+ "mobile-editor-style": "Estilo del editor móvil",
+ "default-memo-sort-option": "Hora de visualización de la nota",
+ "created_ts": "Hora de Creación",
+ "updated_ts": "Hora de Actualización"
+ },
+ "member-section": {
+ "create-a-member": "Crear un miembro"
+ },
+ "system-section": {
+ "database-file-size": "Tamaño de la Base de Datos",
+ "allow-user-signup": "Permitir el registro de usuarios",
+ "additional-style": "Estilo adicional",
+ "additional-script": "Script adicional",
+ "additional-style-placeholder": "Códigos CSS adicionales",
+ "additional-script-placeholder": "Códigos JavaScript adicionales"
+ },
+ "apperance-option": {
+ "system": "Según el sistema",
+ "light": "Siempre claro",
+ "dark": "Siempre oscuro"
+ }
+ },
+ "amount-text": {
+ "memo": "NOTA",
+ "tag": "ETIQUETA",
+ "day": "DÍA"
+ },
+ "message": {
+ "no-memos": "no hay notas 🌃",
+ "memos-ready": "todos las notas están listos 🎉",
+ "restored-successfully": "Restaurado con éxito",
+ "memo-updated-datetime": "Fecha de creación de la nota modificada.",
+ "invalid-created-datetime": "Fecha de creación no válida.",
+ "change-memo-created-time": "Cambiar la hora de creación de la nota",
+ "memo-not-found": "Nota no encontrado.",
+ "fill-all": "Rellena todos los campos.",
+ "password-not-match": "Las contraseñas no coinciden.",
+ "new-password-not-match": "Las nuevas contraseñas no coinciden.",
+ "image-load-failed": "Error al subir la imagen",
+ "fill-form": "Rellena este formulario",
+ "login-failed": "Error al iniciar sesión",
+ "signup-failed": "Error al registrarse",
+ "user-not-found": "Usuario no encontrado",
+ "password-changed": "Contraseña cambiada",
+ "private-only": "Esta nota es privada.",
+ "copied": "Copiado",
+ "succeed-copy-content": "Contenido copiado al portapapeles.",
+ "succeed-copy-link": "Enlace copiado al portapapeles.",
+ "change-resource-filename": "Cambiar el nombre de un archivo de recursos",
+ "resource-filename-updated": "El nombre del archivo de recursos se ha cambiado correctamente..",
+ "invalid-resource-filename": "Nombre de archivo de recursos no válido.",
+ "click-to-save-the-image": "Haz clic para guardar la imagen",
+ "generating-the-screenshot": "Generando la captura de pantalla...",
+ "count-selected-resources": "Total seleccionado",
+ "too-short": "Demasiado corto",
+ "too-long": "Demasiado largo",
+ "not-allow-space": "No se admiten espacios",
+ "not-allow-chinese": "El chino no está permitido"
+ }
+}
\ No newline at end of file
diff --git a/web/src/pages/Auth.tsx b/web/src/pages/Auth.tsx
index 71d247f2b..eb2943b83 100644
--- a/web/src/pages/Auth.tsx
+++ b/web/src/pages/Auth.tsx
@@ -179,6 +179,7 @@ const Auth = () => {
+
diff --git a/web/src/types/i18n.d.ts b/web/src/types/i18n.d.ts
index cf1c31284..445546a29 100644
--- a/web/src/types/i18n.d.ts
+++ b/web/src/types/i18n.d.ts
@@ -1 +1 @@
-type Locale = "en" | "zh" | "vi" | "fr" | "nl" | "sv" | "de";
+type Locale = "en" | "zh" | "vi" | "fr" | "nl" | "sv" | "de" | "es";