From 3a183918c5306b868fdb8b7d653bdef709143b5b Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 4 Aug 2022 11:34:46 +0200 Subject: [PATCH 01/33] Change checkOptInCode to check if emailChecked before changing optInState. --- backend/src/graphql/resolver/UserResolver.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index a89a8cb0b..bd1fff918 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -187,7 +187,7 @@ const newEmailOptIn = (userId: number): LoginEmailOptIn => { // if optIn does not exits, it is created export const checkOptInCode = async ( optInCode: LoginEmailOptIn | undefined, - userId: number, + user: DbUser, optInType: OptInType = OptInType.EMAIL_OPT_IN_REGISTER, ): Promise => { logger.info(`checkOptInCode... ${optInCode}`) @@ -207,15 +207,18 @@ export const checkOptInCode = async ( optInCode.updatedAt = new Date() optInCode.resendCount++ } else { - logger.trace('create new OptIn for userId=' + userId) - optInCode = newEmailOptIn(userId) + logger.trace('create new OptIn for userId=' + user.id) + optInCode = newEmailOptIn(user.id) + } + + if (user.emailChecked) { + optInCode.emailOptInTypeId = optInType } - optInCode.emailOptInTypeId = optInType await LoginEmailOptIn.save(optInCode).catch(() => { logger.error('Unable to save optin code= ' + optInCode) throw new Error('Unable to save optin code.') }) - logger.debug(`checkOptInCode...successful: ${optInCode} for userid=${userId}`) + logger.debug(`checkOptInCode...successful: ${optInCode} for userid=${user.id}`) return optInCode } @@ -493,7 +496,7 @@ export class UserResolver { userId: user.id, }) - optInCode = await checkOptInCode(optInCode, user.id, OptInType.EMAIL_OPT_IN_RESET_PASSWORD) + optInCode = await checkOptInCode(optInCode, user, OptInType.EMAIL_OPT_IN_RESET_PASSWORD) logger.info(`optInCode for ${email}=${optInCode}`) // eslint-disable-next-line @typescript-eslint/no-unused-vars const emailSent = await sendResetPasswordEmailMailer({ From f42ba0557295453104bd9b619a16b3e3915381aa Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 4 Aug 2022 11:35:34 +0200 Subject: [PATCH 02/33] Change call of checkOptInCode since signature changed. --- backend/src/graphql/resolver/AdminResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 84ae09cf8..b7ac63842 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -501,7 +501,7 @@ export class AdminResolver { order: { updatedAt: 'DESC' }, }) - optInCode = await checkOptInCode(optInCode, user.id) + optInCode = await checkOptInCode(optInCode, user) // eslint-disable-next-line @typescript-eslint/no-unused-vars const emailSent = await sendAccountActivationEmail({ From 6c748fdb30e30251a74150b8cb9b7a2c1a92b47f Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 4 Aug 2022 11:46:48 +0200 Subject: [PATCH 03/33] Add new logger for klicktipp. --- backend/log4js-config.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/backend/log4js-config.json b/backend/log4js-config.json index 451da56ab..848a4fa79 100644 --- a/backend/log4js-config.json +++ b/backend/log4js-config.json @@ -25,6 +25,14 @@ "keepFileExt" : true, "fileNameSep" : "_" }, + "klicktipp": + { + "type": "dateFile", + "filename": "../logs/backend/klicktipp.log", + "pattern": "%d{ISO8601} %p %c %X{user} %f:%l %m", + "keepFileExt" : true, + "fileNameSep" : "_" + }, "errorFile": { "type": "dateFile", @@ -90,6 +98,17 @@ "level": "debug", "enableCallStack": true }, + "klicktipp": + { + "appenders": + [ + "klicktipp", + "out", + "errors" + ], + "level": "debug", + "enableCallStack": true + }, "http": { "appenders": From 87055e732c5242791ced8b158d3d9c2f2b331514 Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 4 Aug 2022 11:47:10 +0200 Subject: [PATCH 04/33] Define klicktipp logger. --- backend/src/server/logger.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/server/logger.ts b/backend/src/server/logger.ts index cbc8c9b9b..0cfa5689b 100644 --- a/backend/src/server/logger.ts +++ b/backend/src/server/logger.ts @@ -12,7 +12,8 @@ log4js.configure(options) const apolloLogger = log4js.getLogger('apollo') const backendLogger = log4js.getLogger('backend') +const klickTippLogger = log4js.getLogger('klicktipp') backendLogger.addContext('user', 'unknown') -export { apolloLogger, backendLogger } +export { apolloLogger, backendLogger, klickTippLogger } From 174d592d5a6b4140f1af164aae7dcc00555bed4e Mon Sep 17 00:00:00 2001 From: elweyn Date: Thu, 4 Aug 2022 11:47:55 +0200 Subject: [PATCH 05/33] Log error for klicktipp for not found users. --- backend/src/middleware/klicktippMiddleware.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/src/middleware/klicktippMiddleware.ts b/backend/src/middleware/klicktippMiddleware.ts index b3699f29b..5f0c28477 100644 --- a/backend/src/middleware/klicktippMiddleware.ts +++ b/backend/src/middleware/klicktippMiddleware.ts @@ -2,6 +2,7 @@ import { MiddlewareFn } from 'type-graphql' import { /* klicktippSignIn, */ getKlickTippUser } from '@/apis/KlicktippController' import { KlickTipp } from '@model/KlickTipp' import CONFIG from '@/config' +import { klickTippLogger as logger } from '@/server/logger' // export const klicktippRegistrationMiddleware: MiddlewareFn = async ( // // Only for demo @@ -29,7 +30,9 @@ export const klicktippNewsletterStateMiddleware: MiddlewareFn = async ( if (klickTippUser) { klickTipp = new KlickTipp(klickTippUser) } - } catch (err) {} + } catch (err) { + logger.info(`Their is no user for (email='${result.email}') ${err}`) + } } result.klickTipp = klickTipp return result From 19b21aa14567b19d9ee30d52559ee2e6c5e39956 Mon Sep 17 00:00:00 2001 From: ogerly Date: Sun, 7 Aug 2022 22:38:09 +0200 Subject: [PATCH 06/33] =?UTF-8?q?add=20language=20Espa=C3=B1ol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/LanguageSwitchSelect.vue | 1 + frontend/src/i18n.js | 7 + frontend/src/locales/de.json | 1 + frontend/src/locales/en.json | 1 + frontend/src/locales/es.json | 320 ++++++++++++++++++ frontend/src/locales/index.js | 6 + 6 files changed, 336 insertions(+) create mode 100644 frontend/src/locales/es.json diff --git a/frontend/src/components/LanguageSwitchSelect.vue b/frontend/src/components/LanguageSwitchSelect.vue index 545cef4e9..5803a6300 100644 --- a/frontend/src/components/LanguageSwitchSelect.vue +++ b/frontend/src/components/LanguageSwitchSelect.vue @@ -16,6 +16,7 @@ export default { options: [ { value: 'de', text: this.$t('settings.language.de') }, { value: 'en', text: this.$t('settings.language.en') }, + { value: 'es', text: this.$t('settings.language.es') }, ], } }, diff --git a/frontend/src/i18n.js b/frontend/src/i18n.js index 3136c6d80..3fc9552a1 100644 --- a/frontend/src/i18n.js +++ b/frontend/src/i18n.js @@ -3,6 +3,7 @@ import VueI18n from 'vue-i18n' import en from 'vee-validate/dist/locale/en' import de from 'vee-validate/dist/locale/de' +import es from 'vee-validate/dist/locale/es' Vue.use(VueI18n) @@ -26,6 +27,12 @@ function loadLocaleMessages() { ...messages[locale], } } + if (locale === 'es') { + messages[locale] = { + validations: es, + ...messages[locale], + } + } } }) return messages diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 422a445bd..d6424f5a4 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -243,6 +243,7 @@ "changeLanguage": "Sprache ändern", "de": "Deutsch", "en": "English", + "es": "Español", "success": "Deine Sprache wurde erfolgreich geändert." }, "name": { diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 89c18a106..63a4244ed 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -243,6 +243,7 @@ "changeLanguage": "Change language", "de": "Deutsch", "en": "English", + "es": "Español", "success": "Your language has been successfully updated." }, "name": { diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json new file mode 100644 index 000000000..a62db9c95 --- /dev/null +++ b/frontend/src/locales/es.json @@ -0,0 +1,320 @@ +{ + "100": "100%", + "1000thanks": "1000 Gracias, por estar con nosotros!", + "125": "125%", + "85": "85%", + "advanced-calculation": "Proyección", + "auth": { + "left": { + "dignity": "Dignidad", + "donation": "Donación", + "gratitude": "Gratitud", + "hasAccount": "Ya estas registrado?", + "hereLogin": "Registrate aquí", + "learnMore": "Informate aquí …", + "oneDignity": "Damos los unos a los otros y agradecemos con Gradido.", + "oneDonation": "Eres un regalo para la comunidad. 1000 gracias por estar con nosotros.", + "oneGratitude": "Por los demás, por toda la humanidad, por la naturaleza." + }, + "navbar": { + "aboutGradido": "Sobre Gradido" + } + }, + "back": "Volver", + "community": { + "choose-another-community": "Escoger otra comunidad", + "community": "Comunidad", + "continue-to-registration": "Continuar con el registro", + "current-community": "Comunidad actual", + "myContributions": "Mis contribuciones al bien común", + "other-communities": "Otras comunidades", + "submitContribution": "Aportar una contribución", + "switch-to-this-community": "cambiar a esta comunidad" + }, + "contribution": { + "activity": "Actividad", + "alert": { + "communityNoteList": "Aquí encontrarás todas las contribuciones enviadas y confirmadas de todos los miembros de esta comunidad..", + "confirm": "confirmado", + "myContributionNoteList": "Puedes editar o eliminar las contribuciones enviadas que aún no han sido confirmadas en cualquier momento..", + "myContributionNoteSupport": "Pronto existirá la posibilidad de que puedas dialogar con los moderadores. Si tienes algún problema ahora, ponte en contacto con el equipo de asistencia..", + "pending": "Enviado y a la espera de confirmación", + "rejected": "rechazado" + }, + "date": "Contribución para:", + "delete": "Eliminar la contribución. ¿Estás seguro?", + "deleted": "¡La contribución ha sido borrada! Pero seguirá siendo visible.", + "formText": { + "bringYourTalentsTo": "¡Contribuye a la comunidad con tus talentos! Premiamos tu compromiso voluntario con 20 GDD por hora hasta un máximo de 1.000 GDD al mes..", + "describeYourCommunity": "¡Describe tu contribución al bien-común con detalles de las horas e introduce una cantidad de 20 GDD por hora! Tras la confirmación de un moderador, el importe se abonará en tu cuenta.", + "maxGDDforMonth": "Sólo puede presentar un máximo de {amount} GDD para el mes seleccionado..", + "openAmountForMonth": "Para {monthAndYear} aún puedes presentar {creation} GDD.", + "yourContribution": "Tu contribución a la comunidad." + }, + "noDateSelected": "Elige cualquier fecha del mes.", + "selectDate": "¿Cuando fue tu contribución?", + "submit": "Enviar", + "submitted": "Tu contribución ha sido enviada.", + "updated": "La contribución se modificó." + }, + "contribution-link": { + "thanksYouWith": "agradecidos con" + }, + "decay": { + "before_startblock_transaction": "Esta transacción no implica disminución en su valor.", + "calculation_decay": "Cálculo de la disminución gradual del valor", + "calculation_total": "Cálculo de la suma total", + "decay": "Disminución gradual del valor", + "decay_introduced": "La disminución gradual empezó el:", + "decay_since_last_transaction": "Disminución gradual", + "last_transaction": "Transacción anterior", + "past_time": "Tiempo transcurrido", + "Starting_block_decay": "Startblock disminución gradual", + "total": "Total", + "types": { + "creation": "Creado", + "noDecay": "sin disminución gradual", + "receive": "Recibido", + "send": "Enviado" + } + }, + "delete": "Eliminar", + "em-dash": "—", + "error": { + "email-already-sent": "Ya te hemos enviado un correo electrónico hace menos de 10 minutos.", + "empty-transactionlist": "Ha habido un error en la transmisión del número de sus transacciones.", + "error": "Error!", + "no-account": "Lamentablemente no hemos podido encontrar una cuenta (activada) con estos datos.", + "no-transactionlist": "Lamentablemente, hubo un error. No se ha transmitido ninguna transacción desde el servidor.", + "no-user": "No hay usuario con estas referencias.", + "session-expired": "La sesión se cerró por razones de seguridad.", + "unknown-error": "Error desconocido: " + }, + "followUs": "sigue nos:", + "footer": { + "app_version": "App version {version}", + "copyright": { + "link": "Gradido-Akademie", + "year": "© {year}" + }, + "imprint": "Impressum", + "privacy_policy": "Protección de Datos", + "short_hash": "({shortHash})", + "whitepaper": "Whitepaper" + }, + "form": { + "amount": "Monto", + "at": "am", + "cancel": "Cancelar", + "change": "Cambiar", + "check_now": "Revisar", + "close": "Cerrar", + "current_balance": "Saldo de cuenta actual", + "date": "Fecha", + "description": "Descripción", + "email": "E-Mail", + "firstname": "Nombre", + "from": "De", + "generate_now": "crear ahora", + "lastname": "Apellido", + "memo": "Mensaje", + "message": "Notcia", + "new_balance": "Saldo de cuenta nuevo depués de confirmación", + "no_gdd_available": "No dispones de GDD para enviar.", + "password": "Contraseña", + "passwordRepeat": "Repetir contraseña", + "password_new": "contraseña nueva", + "password_new_repeat": "Repetir contraseña nueva", + "password_old": "contraseña antigua", + "recipient": "Destinatario", + "reset": "Restablecer", + "save": "Guardar", + "scann_code": "QR Code Scanner - Escanea el código QR de tu pareja", + "sender": "Remitente", + "send_check": "Confirma tu transacción. Por favor revisa toda la información nuevamente!", + "send_now": "Enviar ahora", + "send_transaction_error": "Desafortunadamente, la transacción no se pudo ejecutar!", + "send_transaction_success": "Su transacción fue ejecutada con éxito", + "sorry": "Disculpa", + "thx": "Gracias", + "time": "Tiempo", + "to": "hasta", + "to1": "para", + "validation": { + "gddSendAmount": "El campo {_field_} debe ser un número entre {min} y {max} con un máximo de dos decimales", + "is-not": "No es posible transferirte Gradidos a ti mismo", + "usernmae-regex": "El nombre de usuario debe comenzar con una letra seguida de al menos dos caracteres alfanuméricos.", + "usernmae-unique": "Este nombre de usuario ya está adjudicado." + }, + "your_amount": "Tu monto" + }, + "GDD": "GDD", + "gdd_per_link": { + "choose-amount": "Selecciona una cantidad que te gustaría enviar a través de un enlace. También puedes ingresar un mensaje. Cuando haces clic en 'Generar ahora', se crea un enlace que puedes enviar.", + "copy-link": "Copiar enlace", + "copy-link-with-text": "Copiar texto y enlace", + "created": "El enlace ha sido creado", + "credit-your-gradido": "Para que se te acrediten los Gradidos, haz clic en el enlace!", + "decay-14-day": "Disminución gradual por 14 días", + "delete-the-link": "Eliminar el enlace?", + "deleted": "El enlace ha sido eliminado!", + "expiredOn": "Vencido el:", + "has-account": "Ya tienes una cuenta Gradido?", + "header": "Transferir Gradidos por medio de un enlace", + "isFree": "Gradido es gratis en todo el mundoi.", + "link-and-text-copied": "El enlace y su mensaje se han copiado en el portapapeles. Ahora puedes ponerlo en un correo electrónico o mensaje einfügen.", + "link-copied": "El enlace se ha copiado en el portapapeles. Ahora puedes pegarlo en un correo electrónico o mensaje.", + "link-deleted": "El enlace se eliminó el {date}.", + "link-expired": "El enlace ya no es válido. La validez expiró el {date}.", + "link-overview": "Resumen de enlaces", + "links_count": "Enlaces activos", + "links_sum": "Enlaces abiertos y códigos QR", + "no-account": "Aún no tienes una cuenta de Gradido?", + "no-redeem": "No puedes canjear tu propio enlace!", + "not-copied": "¡Desafortunadamente, su dispositivo no permite copiar! Copie el enlace manualmente!", + "redeem": "Canjear", + "redeem-text": "¿Quieres canjear el importe ahora?", + "redeemed": "¡Canjeado con éxito! Tu cuenta ha sido acreditada con {n} GDD.", + "redeemed-at": "El enlace ya se canjeó el {date}.", + "redeemed-title": "canjeado", + "to-login": "iniciar sesión", + "to-register": "Registre una nueva cuenta.", + "validUntil": "Válido hasta", + "validUntilDate": "El enlace es válido hasta el {date} ." + }, + "gdt": { + "calculation": "Cálculo del Gradido Transform", + "contribution": "Monto", + "conversion": "Conversión", + "conversion-gdt-euro": "Conversión Euro / Gradido Transform (GDT)", + "credit": "Abono", + "factor": "Factor", + "formula": "Formula de cálculo", + "funding": "Las donaciones", + "gdt": "Gradido Transform", + "gdt-received": "Gradido Transform (GDT) recibido", + "no-transactions": "Aún no tienes un Gradido Transform (GDT).", + "not-reachable": "No es posible acceder al servidor GDT.", + "publisher": "Tu nuevo miembro referido ha pagado la cuota", + "raise": "Aumento", + "recruited-member": "Miembro invitado" + }, + "language": "Idioma", + "link-load": "recargar el último enlace |recargar los últimos {n} enlaces | descargar más {n} enlaces", + "login": "iniciar sesión", + "math": { + "aprox": "~", + "minus": "−", + "pipe": "|" + }, + "message": { + "activateEmail": "Tu cuenta aún no ha sido activada. Por favor revisa tu correo electrónico y haz clic en el enlace de activación o solicita uno nuevo Aktivierungslink über die Password Reset Seite an.", + "checkEmail": "Tu correo electrónico ha sido verificado con éxito. Puedes registrarte ahora.", + "email": "Te hemos enviado un correo electrónico.", + "errorTitle": "Atención!", + "register": "Ya estás registrado, por favor revisa tu correo electrónico y haz clic en el enlace de activación.", + "reset": "Tu contraseña ha sido cambiada.", + "title": "Gracias!", + "unsetPassword": "Tu contraseña aún no ha sido configurada. Por favor reinícialo." + }, + "navigation": { + "admin_area": "Área de administración", + "community": "Comunidad", + "logout": "Salir", + "members_area": "Área de afiliados", + "overview": "Resumen", + "profile": "Mi Perfil", + "send": "Enviar", + "support": "Soporte", + "transactions": "Transacciones" + }, + "qrCode": "Código QR", + "send_gdd": "Enviar GDD", + "send_per_link": "Enviar GDD mediante un enlace", + "session": { + "extend": "Permanecer en sesión iniciada", + "lightText": "Si no has realizado ninguna acción durante más de 10 minutos, se cerrará tu sesión por razones de seguridad.", + "logoutIn": "Cerrar sesión en ", + "warningText": "Aún estas?" + }, + "settings": { + "language": { + "changeLanguage": "Cambiar idioma", + "de": "Deutsch", + "en": "English", + "es": "Español", + "success": "Tu idioma ha sido cambiado con éxito." + }, + "name": { + "change-name": "Cambiar nombre", + "change-success": "Tu nombre ha sido cambiado con éxito." + }, + "newsletter": { + "newsletter": "Informaciones por correo electrónico", + "newsletterFalse": "No recibirás informaciones por correo electrónico.", + "newsletterTrue": "Recibirás informaciones por correo electrónico." + }, + "password": { + "change-password": "Cambiar contraseña", + "forgot_pwd": "Olvide la contraseña?", + "resend_subtitle": "Su enlace de activación ha caducado. Puedes solicitar uno nuevo aquí.", + "reset": "Restablecer contraseña", + "reset-password": { + "text": "Ahora introduce una nueva contraseña con la que quieras acceder a tu cuenta de Gradido en el futuro.." + }, + "send_now": "Enviar", + "set": "Establecer contraseña", + "set-password": { + "text": "Ahora guarda tu nueva contraseña, que podrás utilizar para acceder a tu cuenta de Gradido en el futuro." + }, + "subtitle": "Si has olvidado tu contraseña, puedes restablecerla aquí." + } + }, + "signin": "Iniciar sesión", + "signup": "Registrarse", + "site": { + "forgotPassword": { + "heading": "Por favor, introduce la dirección de correo electrónico con la que estas registrado en Gradido." + }, + "login": { + "heading": "Inicia sesión con tus datos de acceso. Manténlos seguros en todo momento!" + }, + "resetPassword": { + "heading": "Por favor, introduce tu contraseña y repítela." + }, + "signup": { + "agree": "Acepto la Política de privacidad.", + "dont_match": "Las contraseñas no coinciden.", + "heading": "Regístrate introduciendo todos los datos completos y en los campos correctos.", + "lowercase": "Se requiere una letra minúscula.", + "minimum": "Al menos 8 caracteres.", + "no-whitespace": "Sin espacios ni tabulaciones.", + "one_number": "Se requiere un número.", + "special-char": "Caracteres especiales requeridos (por ejemplo, _ o &)", + "uppercase": "Letra mayúscula requerida." + } + }, + "success": "Lo lograste", + "time": { + "days": "Dias", + "hours": "Horas", + "minutes": "Minutos", + "month": "Mes", + "months": "Meses", + "seconds": "Segundos", + "years": "Año" + }, + "transaction": { + "gdd-text": "Transacciones Gradido", + "gdt-text": "Transacciones GradidoTransform ", + "nullTransactions": "Todavía no tienes ninguna transacción en tu cuenta.", + "receiverDeleted": "La cuenta del destinatario ha sido eliminada.", + "receiverNotFound": "Destinatario no encontrado", + "show_all": "Ver todas las transacciones de {count}" + }, + "transaction-link": { + "send_you": "te envía" + }, + "via_link": "atraves de un enlace", + "welcome": "Bienvenido a la comunidad." +} diff --git a/frontend/src/locales/index.js b/frontend/src/locales/index.js index 4cb375b40..f36121c90 100644 --- a/frontend/src/locales/index.js +++ b/frontend/src/locales/index.js @@ -11,6 +11,12 @@ const locales = [ iso: 'de-DE', enabled: true, }, + { + name: 'Espanol', + code: 'es', + iso: 'es-ES', + enabled: true, + }, ] export default locales From 5e241c124c2a5276659ca76d1f64ea0d54bed94e Mon Sep 17 00:00:00 2001 From: ogerly Date: Sun, 7 Aug 2022 22:40:47 +0200 Subject: [PATCH 07/33] add math equal to locales es --- frontend/src/locales/es.json | 1 + frontend/src/locales/index.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index a62db9c95..31541447a 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -204,6 +204,7 @@ "login": "iniciar sesión", "math": { "aprox": "~", + "equal": "=", "minus": "−", "pipe": "|" }, diff --git a/frontend/src/locales/index.js b/frontend/src/locales/index.js index f36121c90..17d41cad2 100644 --- a/frontend/src/locales/index.js +++ b/frontend/src/locales/index.js @@ -12,7 +12,7 @@ const locales = [ enabled: true, }, { - name: 'Espanol', + name: 'Español', code: 'es', iso: 'es-ES', enabled: true, From 2c06fbdbd0338db2387bfab8830be5e3fac88b2f Mon Sep 17 00:00:00 2001 From: ogerly Date: Sun, 7 Aug 2022 22:41:26 +0200 Subject: [PATCH 08/33] add orginal file espanol exel in docu --- docu/Locales/GRADIDO_register_page_spanish.xlsx | Bin 0 -> 21840 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docu/Locales/GRADIDO_register_page_spanish.xlsx diff --git a/docu/Locales/GRADIDO_register_page_spanish.xlsx b/docu/Locales/GRADIDO_register_page_spanish.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6b6ec70c0f4895fc8850d21957403138ceee4098 GIT binary patch literal 21840 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

0iQpMuDu0WbY;&!~UT>As4Fyv&#T% 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 Date: Sun, 7 Aug 2022 22:41:57 +0200 Subject: [PATCH 09/33] refactor UserResolver.ts --- backend/src/graphql/resolver/UserResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index a89a8cb0b..47aefe12d 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -43,7 +43,7 @@ const isPassword = (password: string): boolean => { return !!password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9 \\t\\n\\r]).{8,}$/) } -const LANGUAGES = ['de', 'en'] +const LANGUAGES = ['de', 'en', 'es'] const DEFAULT_LANGUAGE = 'de' const isLanguage = (language: string): boolean => { return LANGUAGES.includes(language) From 9f9395c7ab8244a1f288b499479b2e8ef5c60164 Mon Sep 17 00:00:00 2001 From: ogerly Date: Sun, 7 Aug 2022 23:05:34 +0200 Subject: [PATCH 10/33] fix test for frontend --- .../src/components/LanguageSwitch.spec.js | 32 ++++++++++++++++--- .../src/components/LanguageSwitch2.spec.js | 28 +++++++++++++--- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/frontend/src/components/LanguageSwitch.spec.js b/frontend/src/components/LanguageSwitch.spec.js index cf7c4a35e..1843155e1 100644 --- a/frontend/src/components/LanguageSwitch.spec.js +++ b/frontend/src/components/LanguageSwitch.spec.js @@ -45,7 +45,7 @@ describe('LanguageSwitch', () => { expect(wrapper.find('div.language-switch').exists()).toBeTruthy() }) - describe('with locales en and de', () => { + describe('with locales en, de and es', () => { describe('empty store', () => { describe('navigator language is "en-US"', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') @@ -69,11 +69,22 @@ describe('LanguageSwitch', () => { }) }) - describe('navigator language is "es-ES" (not supported)', () => { + describe('navigator language is "es-ES"', () => { + const languageGetter = jest.spyOn(navigator, 'language', 'get') + + it('shows Español as language ', async () => { + languageGetter.mockReturnValue('es-ES') + wrapper.vm.setCurrentLanguage() + await wrapper.vm.$nextTick() + expect(wrapper.find('button.dropdown-toggle').text()).toBe('Español - es') + }) + }) + + describe('navigator language is "fr-FR" (not supported)', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') it('shows English as language ', async () => { - languageGetter.mockReturnValue('es-ES') + languageGetter.mockReturnValue('fr-FR') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() expect(wrapper.find('button.dropdown-toggle').text()).toBe('English - en') @@ -101,9 +112,18 @@ describe('LanguageSwitch', () => { }) }) + describe('language "es" in store', () => { + it('shows Español as language', async () => { + wrapper.vm.$store.state.language = 'es' + wrapper.vm.setCurrentLanguage() + await wrapper.vm.$nextTick() + expect(wrapper.find('button.dropdown-toggle').text()).toBe('Español - es') + }) + }) + describe('dropdown menu', () => { it('has English and German as languages to choose', () => { - expect(wrapper.findAll('li')).toHaveLength(2) + expect(wrapper.findAll('li')).toHaveLength(3) }) it('has English as first language to choose', () => { @@ -113,6 +133,10 @@ describe('LanguageSwitch', () => { it('has German as second language to choose', () => { expect(wrapper.findAll('li').at(1).text()).toBe('Deutsch') }) + + it('has Español as second language to choose', () => { + expect(wrapper.findAll('li').at(2).text()).toBe('Español') + }) }) }) diff --git a/frontend/src/components/LanguageSwitch2.spec.js b/frontend/src/components/LanguageSwitch2.spec.js index 600e2513e..85a8afa45 100644 --- a/frontend/src/components/LanguageSwitch2.spec.js +++ b/frontend/src/components/LanguageSwitch2.spec.js @@ -66,10 +66,19 @@ describe('LanguageSwitch', () => { expect(wrapper.findAll('span.locales').at(1).text()).toBe('Deutsch') }) }) - describe('navigator language is "es-ES" (not supported)', () => { + describe('navigator language is "es-ES"', () => { + const languageGetter = jest.spyOn(navigator, 'language', 'get') + it('shows Español as language ', async () => { + languageGetter.mockReturnValue('es-ES') + wrapper.vm.setCurrentLanguage() + await wrapper.vm.$nextTick() + expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español') + }) + }) + describe('navigator language is "fr-FR" (not supported)', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') it('shows English as language ', async () => { - languageGetter.mockReturnValue('es-ES') + languageGetter.mockReturnValue('fr-FR') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() expect(wrapper.findAll('span.locales').at(0).text()).toBe('English') @@ -93,9 +102,17 @@ describe('LanguageSwitch', () => { expect(wrapper.findAll('span.locales').at(1).text()).toBe('Deutsch') }) }) + describe('language "es" in store', () => { + it('shows Español as language', async () => { + wrapper.vm.$store.state.language = 'es' + wrapper.vm.setCurrentLanguage() + await wrapper.vm.$nextTick() + expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español') + }) + }) describe('language menu', () => { - it('has English and German as languages to choose', () => { - expect(wrapper.findAll('span.locales')).toHaveLength(2) + it('has English, German and Español as languages to choose', () => { + expect(wrapper.findAll('span.locales')).toHaveLength(3) }) it('has English as first language to choose', () => { expect(wrapper.findAll('span.locales').at(0).text()).toBe('English') @@ -103,6 +120,9 @@ describe('LanguageSwitch', () => { it('has German as second language to choose', () => { expect(wrapper.findAll('span.locales').at(1).text()).toBe('Deutsch') }) + it('has Español as third language to choose', () => { + expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español') + }) }) }) From 56bd17a265c8d80d7ebd9e6c055ff3a8f88d3c2e Mon Sep 17 00:00:00 2001 From: ogerly Date: Sun, 7 Aug 2022 23:08:44 +0200 Subject: [PATCH 11/33] fix test for backend --- backend/src/graphql/resolver/UserResolver.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index a2a499224..14e86fa1c 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -198,7 +198,7 @@ describe('UserResolver', () => { it('sets "de" as default language', async () => { await mutate({ mutation: createUser, - variables: { ...variables, email: 'bibi@bloxberg.de', language: 'es' }, + variables: { ...variables, email: 'bibi@bloxberg.de', language: 'fr' }, }) await expect(User.find()).resolves.toEqual( expect.arrayContaining([ From aa91e2b41007104fe838887def58d90bab2b9208 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 8 Aug 2022 10:48:09 +0200 Subject: [PATCH 12/33] Add RIGHTS.LIST_CONTRIBUTION_LINKS to ROLE_USER --- backend/src/auth/RIGHTS.ts | 2 +- backend/src/auth/ROLES.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index d5e2cc7ce..1e38eab7f 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -30,6 +30,7 @@ export enum RIGHTS { LIST_CONTRIBUTIONS = 'LIST_CONTRIBUTIONS', LIST_ALL_CONTRIBUTIONS = 'LIST_ALL_CONTRIBUTIONS', UPDATE_CONTRIBUTION = 'UPDATE_CONTRIBUTION', + LIST_CONTRIBUTION_LINKS = 'LIST_CONTRIBUTION_LINKS', // Admin SEARCH_USERS = 'SEARCH_USERS', SET_USER_ROLE = 'SET_USER_ROLE', @@ -45,7 +46,6 @@ export enum RIGHTS { CREATION_TRANSACTION_LIST = 'CREATION_TRANSACTION_LIST', LIST_TRANSACTION_LINKS_ADMIN = 'LIST_TRANSACTION_LINKS_ADMIN', CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK', - LIST_CONTRIBUTION_LINKS = 'LIST_CONTRIBUTION_LINKS', DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK', UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK', } diff --git a/backend/src/auth/ROLES.ts b/backend/src/auth/ROLES.ts index 9dcba0a4b..500c8bec4 100644 --- a/backend/src/auth/ROLES.ts +++ b/backend/src/auth/ROLES.ts @@ -28,6 +28,7 @@ export const ROLE_USER = new Role('user', [ RIGHTS.LIST_CONTRIBUTIONS, RIGHTS.LIST_ALL_CONTRIBUTIONS, RIGHTS.UPDATE_CONTRIBUTION, + RIGHTS.LIST_CONTRIBUTION_LINKS, ]) export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights From 7201fb6fc3f326e959616f41b6c65fb623ee1393 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 8 Aug 2022 10:57:56 +0200 Subject: [PATCH 13/33] A User has now the right to get listContributionLinks. --- .../src/graphql/resolver/AdminResolver.test.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/AdminResolver.test.ts b/backend/src/graphql/resolver/AdminResolver.test.ts index 7b1c6ffcd..69a68ead0 100644 --- a/backend/src/graphql/resolver/AdminResolver.test.ts +++ b/backend/src/graphql/resolver/AdminResolver.test.ts @@ -1861,7 +1861,22 @@ describe('AdminResolver', () => { it('returns an error', async () => { await expect(query({ query: listContributionLinks })).resolves.toEqual( expect.objectContaining({ - errors: [new GraphQLError('401 Unauthorized')], + data: { + createContributionLink: expect.objectContaining({ + id: expect.any(Number), + amount: '200', + code: expect.stringMatching(/^[0-9a-f]{24,24}$/), + link: expect.stringMatching(/^.*?\/CL-[0-9a-f]{24,24}$/), + createdAt: expect.any(String), + name: 'Dokumenta 2022', + memo: 'Danke für deine Teilnahme an der Dokumenta 2022', + validFrom: expect.any(String), + validTo: expect.any(String), + maxAmountPerMonth: '200', + cycle: 'once', + maxPerCycle: 1, + }), + }, }), ) }) From 5fb491572dbed5377ef7aa5715a6e7b9ee4fa5dd Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 8 Aug 2022 11:04:24 +0200 Subject: [PATCH 14/33] Change test for listCOntributionLinks to get empty object as user without admin rights. --- .../graphql/resolver/AdminResolver.test.ts | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.test.ts b/backend/src/graphql/resolver/AdminResolver.test.ts index 69a68ead0..c0531a96c 100644 --- a/backend/src/graphql/resolver/AdminResolver.test.ts +++ b/backend/src/graphql/resolver/AdminResolver.test.ts @@ -1858,24 +1858,14 @@ describe('AdminResolver', () => { }) describe('listContributionLinks', () => { - it('returns an error', async () => { + it('returns an empty object', async () => { await expect(query({ query: listContributionLinks })).resolves.toEqual( expect.objectContaining({ data: { - createContributionLink: expect.objectContaining({ - id: expect.any(Number), - amount: '200', - code: expect.stringMatching(/^[0-9a-f]{24,24}$/), - link: expect.stringMatching(/^.*?\/CL-[0-9a-f]{24,24}$/), - createdAt: expect.any(String), - name: 'Dokumenta 2022', - memo: 'Danke für deine Teilnahme an der Dokumenta 2022', - validFrom: expect.any(String), - validTo: expect.any(String), - maxAmountPerMonth: '200', - cycle: 'once', - maxPerCycle: 1, - }), + listContributionLinks: { + count: 0, + links: [], + }, }, }), ) From 9a7073415c51fc21bb3595f9429b5259aa9b2839 Mon Sep 17 00:00:00 2001 From: elweyn Date: Mon, 8 Aug 2022 11:14:11 +0200 Subject: [PATCH 15/33] Add TODO for listContributionLinks test of user without admin rights. --- backend/src/graphql/resolver/AdminResolver.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/graphql/resolver/AdminResolver.test.ts b/backend/src/graphql/resolver/AdminResolver.test.ts index c0531a96c..f0ce064b4 100644 --- a/backend/src/graphql/resolver/AdminResolver.test.ts +++ b/backend/src/graphql/resolver/AdminResolver.test.ts @@ -1857,6 +1857,7 @@ describe('AdminResolver', () => { }) }) + // TODO: Set this test in new location to have datas describe('listContributionLinks', () => { it('returns an empty object', async () => { await expect(query({ query: listContributionLinks })).resolves.toEqual( From 0284ecb9265acdb0f29167c5f94e4ab705828cef Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 9 Aug 2022 08:54:04 +0200 Subject: [PATCH 16/33] add missing values --- frontend/src/locales/es.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 31541447a..d9eb9dbf6 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -55,7 +55,8 @@ "selectDate": "¿Cuando fue tu contribución?", "submit": "Enviar", "submitted": "Tu contribución ha sido enviada.", - "updated": "La contribución se modificó." + "updated": "La contribución se modificó.", + "yourActivity": "¡Por favor, introduzca una actividad!" }, "contribution-link": { "thanksYouWith": "agradecidos con" @@ -117,6 +118,7 @@ "from": "De", "generate_now": "crear ahora", "lastname": "Apellido", + "mandatoryField": "campo obligatorio", "memo": "Mensaje", "message": "Notcia", "new_balance": "Saldo de cuenta nuevo depués de confirmación", @@ -204,6 +206,7 @@ "login": "iniciar sesión", "math": { "aprox": "~", + "asterisk": "*", "equal": "=", "minus": "−", "pipe": "|" From 506ba5b625858a6d2acffad2cdc1c02766b33e4e Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:22:36 +0200 Subject: [PATCH 17/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index d9eb9dbf6..1eaabb3b6 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -36,7 +36,7 @@ "alert": { "communityNoteList": "Aquí encontrarás todas las contribuciones enviadas y confirmadas de todos los miembros de esta comunidad..", "confirm": "confirmado", - "myContributionNoteList": "Puedes editar o eliminar las contribuciones enviadas que aún no han sido confirmadas en cualquier momento..", + "myContributionNoteList": "Puedes editar o eliminar las contribuciones enviadas que aún no han sido confirmadas en cualquier momento.", "myContributionNoteSupport": "Pronto existirá la posibilidad de que puedas dialogar con los moderadores. Si tienes algún problema ahora, ponte en contacto con el equipo de asistencia..", "pending": "Enviado y a la espera de confirmación", "rejected": "rechazado" From 08b439a53d44fd542b12a0c5907e249abd2bbd23 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:22:47 +0200 Subject: [PATCH 18/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 1eaabb3b6..078834d54 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -93,7 +93,7 @@ }, "followUs": "sigue nos:", "footer": { - "app_version": "App version {version}", + "app_version": "App versión {version}", "copyright": { "link": "Gradido-Akademie", "year": "© {year}" From 7e94822d94591086c5da56791728f06384483e40 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:23:01 +0200 Subject: [PATCH 19/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 078834d54..4ec4409a2 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -120,7 +120,7 @@ "lastname": "Apellido", "mandatoryField": "campo obligatorio", "memo": "Mensaje", - "message": "Notcia", + "message": "Noticia", "new_balance": "Saldo de cuenta nuevo depués de confirmación", "no_gdd_available": "No dispones de GDD para enviar.", "password": "Contraseña", From a1a103bb6d84c4765272e4d33f769850de659b67 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:23:14 +0200 Subject: [PATCH 20/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 4ec4409a2..d2eaaf658 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -98,7 +98,7 @@ "link": "Gradido-Akademie", "year": "© {year}" }, - "imprint": "Impressum", + "imprint": "Aviso legal", "privacy_policy": "Protección de Datos", "short_hash": "({shortHash})", "whitepaper": "Whitepaper" From 262bde615c456b875000503c2e692b2184290d44 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:23:35 +0200 Subject: [PATCH 21/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index d2eaaf658..d3b507841 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -56,7 +56,7 @@ "submit": "Enviar", "submitted": "Tu contribución ha sido enviada.", "updated": "La contribución se modificó.", - "yourActivity": "¡Por favor, introduzca una actividad!" + "yourActivity": "¡Por favor, introduce una actividad!" }, "contribution-link": { "thanksYouWith": "agradecidos con" From 05fb34fc801eb55c71d1bfcdaee7caff5b18719d Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:23:45 +0200 Subject: [PATCH 22/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index d3b507841..15064a16b 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -163,7 +163,7 @@ "expiredOn": "Vencido el:", "has-account": "Ya tienes una cuenta Gradido?", "header": "Transferir Gradidos por medio de un enlace", - "isFree": "Gradido es gratis en todo el mundoi.", + "isFree": "Gradido es gratis en todo el mundo.", "link-and-text-copied": "El enlace y su mensaje se han copiado en el portapapeles. Ahora puedes ponerlo en un correo electrónico o mensaje einfügen.", "link-copied": "El enlace se ha copiado en el portapapeles. Ahora puedes pegarlo en un correo electrónico o mensaje.", "link-deleted": "El enlace se eliminó el {date}.", From 36e86438b1ce3eede004134098468eabb5e6fd66 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:23:57 +0200 Subject: [PATCH 23/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 15064a16b..c491d50a0 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -34,7 +34,7 @@ "contribution": { "activity": "Actividad", "alert": { - "communityNoteList": "Aquí encontrarás todas las contribuciones enviadas y confirmadas de todos los miembros de esta comunidad..", + "communityNoteList": "Aquí encontrarás todas las contribuciones enviadas y confirmadas de todos los miembros de esta comunidad.", "confirm": "confirmado", "myContributionNoteList": "Puedes editar o eliminar las contribuciones enviadas que aún no han sido confirmadas en cualquier momento.", "myContributionNoteSupport": "Pronto existirá la posibilidad de que puedas dialogar con los moderadores. Si tienes algún problema ahora, ponte en contacto con el equipo de asistencia..", From 99d23990dd03abe52cce45a90a80fc8f3f93bbea Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:24:07 +0200 Subject: [PATCH 24/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index c491d50a0..936c7576e 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -11,7 +11,7 @@ "gratitude": "Gratitud", "hasAccount": "Ya estas registrado?", "hereLogin": "Registrate aquí", - "learnMore": "Informate aquí …", + "learnMore": "Infórmate aquí …", "oneDignity": "Damos los unos a los otros y agradecemos con Gradido.", "oneDonation": "Eres un regalo para la comunidad. 1000 gracias por estar con nosotros.", "oneGratitude": "Por los demás, por toda la humanidad, por la naturaleza." From 81fd9910aab0148bea37f045fcb520f41b5b7f2c Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:24:56 +0200 Subject: [PATCH 25/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 936c7576e..ed4277cd3 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -164,7 +164,7 @@ "has-account": "Ya tienes una cuenta Gradido?", "header": "Transferir Gradidos por medio de un enlace", "isFree": "Gradido es gratis en todo el mundo.", - "link-and-text-copied": "El enlace y su mensaje se han copiado en el portapapeles. Ahora puedes ponerlo en un correo electrónico o mensaje einfügen.", + "link-and-text-copied": "El enlace y su mensaje se han copiado en el portapapeles. Ahora puedes ponerlo en un correo electrónico o mensaje.", "link-copied": "El enlace se ha copiado en el portapapeles. Ahora puedes pegarlo en un correo electrónico o mensaje.", "link-deleted": "El enlace se eliminó el {date}.", "link-expired": "El enlace ya no es válido. La validez expiró el {date}.", From 200af0ebd7e6dd9044bbc6953cfada989e449d1c Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:25:09 +0200 Subject: [PATCH 26/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index ed4277cd3..100c35413 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -37,7 +37,7 @@ "communityNoteList": "Aquí encontrarás todas las contribuciones enviadas y confirmadas de todos los miembros de esta comunidad.", "confirm": "confirmado", "myContributionNoteList": "Puedes editar o eliminar las contribuciones enviadas que aún no han sido confirmadas en cualquier momento.", - "myContributionNoteSupport": "Pronto existirá la posibilidad de que puedas dialogar con los moderadores. Si tienes algún problema ahora, ponte en contacto con el equipo de asistencia..", + "myContributionNoteSupport": "Pronto existirá la posibilidad de que puedas dialogar con los moderadores. Si tienes algún problema ahora, ponte en contacto con el equipo de asistencia.", "pending": "Enviado y a la espera de confirmación", "rejected": "rechazado" }, From dce0038169c6e1f9cc312895a751939beb127f64 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:25:29 +0200 Subject: [PATCH 27/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 100c35413..cc8cd34f3 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -47,7 +47,7 @@ "formText": { "bringYourTalentsTo": "¡Contribuye a la comunidad con tus talentos! Premiamos tu compromiso voluntario con 20 GDD por hora hasta un máximo de 1.000 GDD al mes..", "describeYourCommunity": "¡Describe tu contribución al bien-común con detalles de las horas e introduce una cantidad de 20 GDD por hora! Tras la confirmación de un moderador, el importe se abonará en tu cuenta.", - "maxGDDforMonth": "Sólo puede presentar un máximo de {amount} GDD para el mes seleccionado..", + "maxGDDforMonth": "Sólo puede presentar un máximo de {amount} GDD para el mes seleccionado.", "openAmountForMonth": "Para {monthAndYear} aún puedes presentar {creation} GDD.", "yourContribution": "Tu contribución a la comunidad." }, From a72c6cc8272398fe3700eb984d377def046916ea Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:25:38 +0200 Subject: [PATCH 28/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index cc8cd34f3..48cc5cef4 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -45,7 +45,7 @@ "delete": "Eliminar la contribución. ¿Estás seguro?", "deleted": "¡La contribución ha sido borrada! Pero seguirá siendo visible.", "formText": { - "bringYourTalentsTo": "¡Contribuye a la comunidad con tus talentos! Premiamos tu compromiso voluntario con 20 GDD por hora hasta un máximo de 1.000 GDD al mes..", + "bringYourTalentsTo": "¡Contribuye a la comunidad con tus talentos! Premiamos tu compromiso voluntario con 20 GDD por hora hasta un máximo de 1.000 GDD al mes.", "describeYourCommunity": "¡Describe tu contribución al bien-común con detalles de las horas e introduce una cantidad de 20 GDD por hora! Tras la confirmación de un moderador, el importe se abonará en tu cuenta.", "maxGDDforMonth": "Sólo puede presentar un máximo de {amount} GDD para el mes seleccionado.", "openAmountForMonth": "Para {monthAndYear} aún puedes presentar {creation} GDD.", From 6ee5734499fc5e1df9ec8ae16dcadf277f565e5b Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 9 Aug 2022 14:26:10 +0200 Subject: [PATCH 29/33] Update frontend/src/locales/es.json Co-authored-by: Moriz Wahl --- frontend/src/locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index 48cc5cef4..f61a052da 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -10,7 +10,7 @@ "donation": "Donación", "gratitude": "Gratitud", "hasAccount": "Ya estas registrado?", - "hereLogin": "Registrate aquí", + "hereLogin": "Regístrate aquí", "learnMore": "Infórmate aquí …", "oneDignity": "Damos los unos a los otros y agradecemos con Gradido.", "oneDonation": "Eres un regalo para la comunidad. 1000 gracias por estar con nosotros.", From 6d2cbfbab1e1cec8fbc64e2c28637ad00445097b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 10 Aug 2022 15:57:13 +0200 Subject: [PATCH 30/33] add number and date formats for locale es --- frontend/src/i18n.js | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/frontend/src/i18n.js b/frontend/src/i18n.js index 3fc9552a1..488012ce2 100644 --- a/frontend/src/i18n.js +++ b/frontend/src/i18n.js @@ -65,6 +65,19 @@ const numberFormats = { useGrouping: false, }, }, + es: { + decimal: { + style: 'decimal', + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }, + ungroupedDecimal: { + style: 'decimal', + minimumFractionDigits: 2, + maximumFractionDigits: 2, + useGrouping: false, + }, + }, } const dateTimeFormats = { @@ -124,6 +137,34 @@ const dateTimeFormats = { year: 'numeric', }, }, + es: { + short: { + day: 'numeric', + month: 'numeric', + year: 'numeric', + }, + long: { + day: 'numeric', + month: 'long', + year: 'numeric', + weekday: 'long', + hour: 'numeric', + minute: 'numeric', + }, + monthShort: { + month: 'short', + }, + month: { + month: 'long', + }, + year: { + year: 'numeric', + }, + monthAndYear: { + month: 'long', + year: 'numeric', + }, + }, } export default new VueI18n({ From f98f38773d665b717903c6093a8d041de83c7db5 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 10 Aug 2022 15:57:30 +0200 Subject: [PATCH 31/33] fix missing translations --- frontend/src/locales/es.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index f61a052da..fa2cd31a9 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -104,7 +104,7 @@ "whitepaper": "Whitepaper" }, "form": { - "amount": "Monto", + "amount": "Importe", "at": "am", "cancel": "Cancelar", "change": "Cambiar", @@ -148,7 +148,7 @@ "usernmae-regex": "El nombre de usuario debe comenzar con una letra seguida de al menos dos caracteres alfanuméricos.", "usernmae-unique": "Este nombre de usuario ya está adjudicado." }, - "your_amount": "Tu monto" + "your_amount": "Tu importe" }, "GDD": "GDD", "gdd_per_link": { @@ -186,7 +186,7 @@ }, "gdt": { "calculation": "Cálculo del Gradido Transform", - "contribution": "Monto", + "contribution": "Importe", "conversion": "Conversión", "conversion-gdt-euro": "Conversión Euro / Gradido Transform (GDT)", "credit": "Abono", @@ -212,7 +212,7 @@ "pipe": "|" }, "message": { - "activateEmail": "Tu cuenta aún no ha sido activada. Por favor revisa tu correo electrónico y haz clic en el enlace de activación o solicita uno nuevo Aktivierungslink über die Password Reset Seite an.", + "activateEmail": "Tu cuenta aún no ha sido activada. Por favor revisa tu correo electrónico y haz clic en el enlace de activación o solicita uno nuevo enlace de activación a través de la página restablecer contraseña.", "checkEmail": "Tu correo electrónico ha sido verificado con éxito. Puedes registrarte ahora.", "email": "Te hemos enviado un correo electrónico.", "errorTitle": "Atención!", @@ -300,7 +300,7 @@ }, "success": "Lo lograste", "time": { - "days": "Dias", + "days": "Días", "hours": "Horas", "minutes": "Minutos", "month": "Mes", From ad9202efeda70539223812d214c9aee9dd0dbcc2 Mon Sep 17 00:00:00 2001 From: Hannes Heine Date: Thu, 11 Aug 2022 14:57:17 +0200 Subject: [PATCH 32/33] Update backend/src/middleware/klicktippMiddleware.ts Co-authored-by: Moriz Wahl --- backend/src/middleware/klicktippMiddleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/middleware/klicktippMiddleware.ts b/backend/src/middleware/klicktippMiddleware.ts index 5f0c28477..5bd1484d1 100644 --- a/backend/src/middleware/klicktippMiddleware.ts +++ b/backend/src/middleware/klicktippMiddleware.ts @@ -31,7 +31,7 @@ export const klicktippNewsletterStateMiddleware: MiddlewareFn = async ( klickTipp = new KlickTipp(klickTippUser) } } catch (err) { - logger.info(`Their is no user for (email='${result.email}') ${err}`) + logger.info(`There is no user for (email='${result.email}') ${err}`) } } result.klickTipp = klickTipp From d4cd6c2b30735b2c902d2676cb5c2f748bbbf71d Mon Sep 17 00:00:00 2001 From: Hannes Heine Date: Thu, 11 Aug 2022 15:07:48 +0200 Subject: [PATCH 33/33] Update klicktippMiddleware.ts Change log level from info to error --- backend/src/middleware/klicktippMiddleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/middleware/klicktippMiddleware.ts b/backend/src/middleware/klicktippMiddleware.ts index 5bd1484d1..6bdaa63fd 100644 --- a/backend/src/middleware/klicktippMiddleware.ts +++ b/backend/src/middleware/klicktippMiddleware.ts @@ -31,7 +31,7 @@ export const klicktippNewsletterStateMiddleware: MiddlewareFn = async ( klickTipp = new KlickTipp(klickTippUser) } } catch (err) { - logger.info(`There is no user for (email='${result.email}') ${err}`) + logger.error(`There is no user for (email='${result.email}') ${err}`) } } result.klickTipp = klickTipp