Merge branch 'master' into 2072-feature-usecase-contribution-messaging

This commit is contained in:
clauspeterhuebner 2022-08-19 15:51:30 +02:00 committed by GitHub
commit 43aac4dfcb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 961 additions and 57 deletions

View File

@ -206,7 +206,7 @@ describe('UserResolver', () => {
it('sets "de" as default language', async () => { it('sets "de" as default language', async () => {
await mutate({ await mutate({
mutation: createUser, mutation: createUser,
variables: { ...variables, email: 'bibi@bloxberg.de', language: 'fr' }, variables: { ...variables, email: 'bibi@bloxberg.de', language: 'it' },
}) })
await expect(User.find()).resolves.toEqual( await expect(User.find()).resolves.toEqual(
expect.arrayContaining([ expect.arrayContaining([

View File

@ -48,7 +48,7 @@ const isPassword = (password: string): boolean => {
return !!password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9 \\t\\n\\r]).{8,}$/) return !!password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9 \\t\\n\\r]).{8,}$/)
} }
const LANGUAGES = ['de', 'en', 'es'] const LANGUAGES = ['de', 'en', 'es', 'fr', 'nl']
const DEFAULT_LANGUAGE = 'de' const DEFAULT_LANGUAGE = 'de'
const isLanguage = (language: string): boolean => { const isLanguage = (language: string): boolean => {
return LANGUAGES.includes(language) return LANGUAGES.includes(language)

View File

@ -80,11 +80,33 @@ describe('LanguageSwitch', () => {
}) })
}) })
describe('navigator language is "fr-FR" (not supported)', () => { describe('navigator language is "fr-FR"', () => {
const languageGetter = jest.spyOn(navigator, 'language', 'get')
it('shows French as language ', async () => {
languageGetter.mockReturnValue('fr-FR')
wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick()
expect(wrapper.find('button.dropdown-toggle').text()).toBe('Français - fr')
})
})
describe('navigator language is "nl-NL"', () => {
const languageGetter = jest.spyOn(navigator, 'language', 'get')
it('shows Dutch as language ', async () => {
languageGetter.mockReturnValue('nl-NL')
wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick()
expect(wrapper.find('button.dropdown-toggle').text()).toBe('Holandés - nl')
})
})
describe('navigator language is "it-IT" (not supported)', () => {
const languageGetter = jest.spyOn(navigator, 'language', 'get') const languageGetter = jest.spyOn(navigator, 'language', 'get')
it('shows English as language ', async () => { it('shows English as language ', async () => {
languageGetter.mockReturnValue('fr-FR') languageGetter.mockReturnValue('it-IT')
wrapper.vm.setCurrentLanguage() wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick() await wrapper.vm.$nextTick()
expect(wrapper.find('button.dropdown-toggle').text()).toBe('English - en') expect(wrapper.find('button.dropdown-toggle').text()).toBe('English - en')
@ -121,9 +143,27 @@ describe('LanguageSwitch', () => {
}) })
}) })
describe('language "fr" in store', () => {
it('shows French as language', async () => {
wrapper.vm.$store.state.language = 'fr'
wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick()
expect(wrapper.find('button.dropdown-toggle').text()).toBe('Français - fr')
})
})
describe('language "nl" in store', () => {
it('shows Dutch as language', async () => {
wrapper.vm.$store.state.language = 'nl'
wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick()
expect(wrapper.find('button.dropdown-toggle').text()).toBe('Holandés - nl')
})
})
describe('dropdown menu', () => { describe('dropdown menu', () => {
it('has English and German as languages to choose', () => { it('has English and German as languages to choose', () => {
expect(wrapper.findAll('li')).toHaveLength(3) expect(wrapper.findAll('li')).toHaveLength(5)
}) })
it('has English as first language to choose', () => { it('has English as first language to choose', () => {
@ -137,6 +177,14 @@ describe('LanguageSwitch', () => {
it('has Español as second language to choose', () => { it('has Español as second language to choose', () => {
expect(wrapper.findAll('li').at(2).text()).toBe('Español') expect(wrapper.findAll('li').at(2).text()).toBe('Español')
}) })
it('has French as second language to choose', () => {
expect(wrapper.findAll('li').at(3).text()).toBe('Français')
})
it('has Dutch as second language to choose', () => {
expect(wrapper.findAll('li').at(4).text()).toBe('Holandés')
})
}) })
}) })
@ -162,6 +210,39 @@ describe('LanguageSwitch', () => {
}), }),
) )
}) })
it("with locale 'es'", () => {
wrapper.findAll('li').at(2).find('a').trigger('click')
expect(updateUserInfosMutationMock).toBeCalledWith(
expect.objectContaining({
variables: {
locale: 'es',
},
}),
)
})
it("with locale 'fr'", () => {
wrapper.findAll('li').at(3).find('a').trigger('click')
expect(updateUserInfosMutationMock).toBeCalledWith(
expect.objectContaining({
variables: {
locale: 'fr',
},
}),
)
})
it("with locale 'nl'", () => {
wrapper.findAll('li').at(4).find('a').trigger('click')
expect(updateUserInfosMutationMock).toBeCalledWith(
expect.objectContaining({
variables: {
locale: 'nl',
},
}),
)
})
}) })
}) })
}) })

View File

@ -75,10 +75,28 @@ describe('LanguageSwitch', () => {
expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español') expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español')
}) })
}) })
describe('navigator language is "fr-FR" (not supported)', () => { describe('navigator language is "fr-FR"', () => {
const languageGetter = jest.spyOn(navigator, 'language', 'get')
it('shows French as language ', async () => {
languageGetter.mockReturnValue('fr-FR')
wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick()
expect(wrapper.findAll('span.locales').at(3).text()).toBe('Français')
})
})
describe('navigator language is "nl-NL"', () => {
const languageGetter = jest.spyOn(navigator, 'language', 'get')
it('shows Dutch as language ', async () => {
languageGetter.mockReturnValue('nl-NL')
wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick()
expect(wrapper.findAll('span.locales').at(4).text()).toBe('Holandés')
})
})
describe('navigator language is "it-IT" (not supported)', () => {
const languageGetter = jest.spyOn(navigator, 'language', 'get') const languageGetter = jest.spyOn(navigator, 'language', 'get')
it('shows English as language ', async () => { it('shows English as language ', async () => {
languageGetter.mockReturnValue('fr-FR') languageGetter.mockReturnValue('it-IT')
wrapper.vm.setCurrentLanguage() wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick() await wrapper.vm.$nextTick()
expect(wrapper.findAll('span.locales').at(0).text()).toBe('English') expect(wrapper.findAll('span.locales').at(0).text()).toBe('English')
@ -99,7 +117,7 @@ describe('LanguageSwitch', () => {
wrapper.vm.$store.state.language = 'de' wrapper.vm.$store.state.language = 'de'
wrapper.vm.setCurrentLanguage() wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick() await wrapper.vm.$nextTick()
expect(wrapper.findAll('span.locales').at(1).text()).toBe('Deutsch') expect(wrapper.findAll('span.locales').at(1).text()).toBe('English')
}) })
}) })
describe('language "es" in store', () => { describe('language "es" in store', () => {
@ -107,47 +125,54 @@ describe('LanguageSwitch', () => {
wrapper.vm.$store.state.language = 'es' wrapper.vm.$store.state.language = 'es'
wrapper.vm.setCurrentLanguage() wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick() await wrapper.vm.$nextTick()
expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español') expect(wrapper.findAll('span.locales').at(2).text()).toBe('Deutsch')
})
})
describe('language "fr" in store', () => {
it('shows French as language', async () => {
wrapper.vm.$store.state.language = 'fr'
wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick()
expect(wrapper.findAll('span.locales').at(3).text()).toBe('Español')
})
})
describe('language "nl" in store', () => {
it('shows Dutch as language', async () => {
wrapper.vm.$store.state.language = 'nl'
wrapper.vm.setCurrentLanguage()
await wrapper.vm.$nextTick()
expect(wrapper.findAll('span.locales').at(4).text()).toBe('Français')
}) })
}) })
describe('language menu', () => { describe('language menu', () => {
it('has English, German and Español as languages to choose', () => { it('has English, German and Español as languages to choose', () => {
expect(wrapper.findAll('span.locales')).toHaveLength(3) expect(wrapper.findAll('span.locales')).toHaveLength(5)
}) })
it('has English as first language to choose', () => { it('has English as first language to choose', () => {
expect(wrapper.findAll('span.locales').at(0).text()).toBe('English') expect(wrapper.findAll('span.locales').at(0).text()).toBe('Holandés')
}) })
it('has German as second language to choose', () => { it('has German as second language to choose', () => {
expect(wrapper.findAll('span.locales').at(1).text()).toBe('Deutsch') expect(wrapper.findAll('span.locales').at(1).text()).toBe('English')
}) })
it('has Español as third language to choose', () => { it('has Español as third language to choose', () => {
expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español') expect(wrapper.findAll('span.locales').at(2).text()).toBe('Deutsch')
})
it('has French as third language to choose', () => {
expect(wrapper.findAll('span.locales').at(3).text()).toBe('Español')
})
it('has Dutch as third language to choose', () => {
expect(wrapper.findAll('span.locales').at(4).text()).toBe('Français')
}) })
}) })
}) })
describe('calls the API', () => { describe('calls the API', () => {
it("with locale 'de'", () => { it("with locale 'de'", () => {
wrapper.findAll('span.locales').at(1).trigger('click') wrapper.findAll('span.locales').at(2).trigger('click')
expect(updateUserInfosMutationMock).toBeCalledWith( expect(updateUserInfosMutationMock).toBeCalledWith(
expect.objectContaining({ expect.objectContaining({ variables: { locale: 'de' } }),
variables: {
locale: 'de',
},
}),
) )
}) })
// it("with locale 'en'", () => {
// wrapper.findAll('span.locales').at(0).trigger('click')
// expect(updateUserInfosMutationMock).toBeCalledWith(
// expect.objectContaining({
// variables: {
// locale: 'en',
// },
// }),
// )
// })
}) })
}) })
}) })

View File

@ -1,15 +1,37 @@
<template> <template>
<div class="language-switch"> <div class="language-switch">
<span
v-for="lang in locales"
:key="lang.code"
class="pointer"
:class="$store.state.language === lang.code ? 'c-grey' : 'c-blau'"
>
<span v-if="lang.code === $store.state.language" class="locales mr-1">{{ lang.name }}</span>
</span>
<b-icon v-b-toggle.collapse-1 icon="caret-down-fill" aria-hidden="true"></b-icon>
<b-collapse id="collapse-1" class="mt-4">
<span <span
v-for="(lang, index) in locales" v-for="(lang, index) in locales"
@click.prevent="saveLocale(lang.code)" @click.prevent="saveLocale(lang.code)"
:key="lang.code" :key="lang.code"
class="pointer pr-2" class="pointer"
:class="$store.state.language === lang.code ? 'c-grey' : 'c-blau'" :class="$store.state.language === lang.code ? 'c-grey' : 'c-blau'"
> >
<span class="locales">{{ lang.name }}</span> <span v-if="lang.code !== $store.state.language" v-b-toggle.collapse-1 class="locales">
<span class="ml-3">{{ locales.length - 1 > index ? $t('math.pipe') : '' }}</span> {{ lang.name }}
</span> </span>
<span
v-if="
lang.code !== $store.state.language &&
(indexOfSelectedLocale !== indexOfLastLocale ||
(indexOfSelectedLocale === indexOfLastLocale && index !== indexOfSecondLastLocale))
"
class="ml-3 mr-3"
>
{{ locales.length - 1 > index ? $t('math.pipe') : '' }}
</span>
</span>
</b-collapse>
</div> </div>
</template> </template>
@ -68,6 +90,17 @@ export default {
this.currentLanguage = object this.currentLanguage = object
}, },
}, },
computed: {
indexOfSelectedLocale() {
return this.locales.findIndex((element) => element.code === this.$store.state.language)
},
indexOfSecondLastLocale() {
return this.locales.length - 2
},
indexOfLastLocale() {
return this.locales.length - 1
},
},
created() { created() {
this.setCurrentLanguage() this.setCurrentLanguage()
}, },

View File

@ -17,6 +17,8 @@ export default {
{ value: 'de', text: this.$t('settings.language.de') }, { value: 'de', text: this.$t('settings.language.de') },
{ value: 'en', text: this.$t('settings.language.en') }, { value: 'en', text: this.$t('settings.language.en') },
{ value: 'es', text: this.$t('settings.language.es') }, { value: 'es', text: this.$t('settings.language.es') },
{ value: 'fr', text: this.$t('settings.language.fr') },
{ value: 'nl', text: this.$t('settings.language.nl') },
], ],
} }
}, },

View File

@ -1,10 +1,6 @@
import Vue from 'vue' import Vue from 'vue'
import VueI18n from 'vue-i18n' 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) Vue.use(VueI18n)
function loadLocaleMessages() { function loadLocaleMessages() {
@ -14,24 +10,9 @@ function loadLocaleMessages() {
const matched = key.match(/([A-Za-z0-9-_]+)\./i) const matched = key.match(/([A-Za-z0-9-_]+)\./i)
if (matched && matched.length > 1) { if (matched && matched.length > 1) {
const locale = matched[1] const locale = matched[1]
messages[locale] = locales(key)
if (locale === 'de') {
messages[locale] = { messages[locale] = {
validations: de, validations: require(`vee-validate/dist/locale/${locale}`),
...messages[locale], ...locales(key),
}
}
if (locale === 'en') {
messages[locale] = {
validations: en,
...messages[locale],
}
}
if (locale === 'es') {
messages[locale] = {
validations: es,
...messages[locale],
}
} }
} }
}) })
@ -78,6 +59,32 @@ const numberFormats = {
useGrouping: false, useGrouping: false,
}, },
}, },
fr: {
decimal: {
style: 'decimal',
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
ungroupedDecimal: {
style: 'decimal',
minimumFractionDigits: 2,
maximumFractionDigits: 2,
useGrouping: false,
},
},
nl: {
decimal: {
style: 'decimal',
minimumFractionDigits: 2,
maximumFractionDigits: 2,
},
ungroupedDecimal: {
style: 'decimal',
minimumFractionDigits: 2,
maximumFractionDigits: 2,
useGrouping: false,
},
},
} }
const dateTimeFormats = { const dateTimeFormats = {
@ -165,6 +172,62 @@ const dateTimeFormats = {
year: 'numeric', year: 'numeric',
}, },
}, },
fr: {
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',
},
},
nl: {
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({ export default new VueI18n({

View File

@ -254,6 +254,8 @@
"de": "Deutsch", "de": "Deutsch",
"en": "English", "en": "English",
"es": "Español", "es": "Español",
"fr": "Français",
"nl": "Dutch",
"success": "Deine Sprache wurde erfolgreich geändert." "success": "Deine Sprache wurde erfolgreich geändert."
}, },
"name": { "name": {

View File

@ -254,6 +254,8 @@
"de": "Deutsch", "de": "Deutsch",
"en": "English", "en": "English",
"es": "Español", "es": "Español",
"fr": "Français",
"nl": "Holandés",
"success": "Your language has been successfully updated." "success": "Your language has been successfully updated."
}, },
"name": { "name": {

View File

@ -254,6 +254,8 @@
"de": "Deutsch", "de": "Deutsch",
"en": "English", "en": "English",
"es": "Español", "es": "Español",
"fr": "Francés",
"nl": "Holandés",
"success": "Tu idioma ha sido cambiado con éxito." "success": "Tu idioma ha sido cambiado con éxito."
}, },
"name": { "name": {

View File

@ -0,0 +1,341 @@
{
"100": "100%",
"1000thanks": "1000 mercis d'être avec nous!",
"125": "125%",
"85": "85%",
"advanced-calculation": "Calcul avancé",
"auth": {
"left": {
"dignity": "Dignité",
"donation": "Donation",
"gratitude": "Gratitude",
"hasAccount": "Avez-vous déjà un compte?",
"hereLogin": "Connectez-vous ici",
"learnMore": "Pour plus de détails …",
"oneDignity": "Nous nous donnons mutuellement et rendons grâce avec Gradido.",
"oneDonation": "Vous êtes précieux pour la communauté. 1000 mercis dêtre parmi nous.",
"oneGratitude": "Les uns pour les autres, pour tout le monde, pour la nature."
},
"navbar": {
"aboutGradido": "À propos de Gradido"
}
},
"back": "Retour",
"community": {
"choose-another-community": "Choisissez une autre communauté",
"community": "Communauté",
"continue-to-registration": "Continuez l´inscription",
"current-community": "Communauté actuelle",
"members": "Membres",
"moderators": "Modérateurs",
"myContributions": "Mes contributions aux biens communs",
"openContributionLinks": "liste de liens de contribution publique",
"openContributionLinkText": "Les {count} créations automatiques suivantes sont actuellement fournies par la communauté \"{name}\".",
"other-communities": "Autres communautés",
"statistic": "Statistiques",
"submitContribution": "Donner une contribution",
"switch-to-this-community": "Passer à cette communauté"
},
"contribution": {
"activity": "Activité",
"alert": {
"communityNoteList": "Vous trouverez ci-contre toutes les contributions versées et certifiées de tous les membres de cette communauté.",
"confirm": " Approuvé",
"myContributionNoteList": "À tout moment vous pouvez éditer ou supprimer les données qui n´ont pas été confirmées.",
"myContributionNoteSupport": "Vous aurez bientôt la possibilité de dialoguer avec un médiateur. Si vous rencontrez un problème maintenant, merci de contacter l´aide en ligne.",
"pending": "Inscription en attente de validation",
"rejected": "supprimé"
},
"date": "Contribution pour:",
"delete": "Supprimer la contribution! Êtes-vous sûr?",
"deleted": "La contribution a été supprimée! Mais elle restera visible.",
"formText": {
"bringYourTalentsTo": "Apportez vos talents à la communauté! Votre participation bénévole sera récompensée de 20 GDD/heure jusqu´à un plafond de 1000 GDD/mois.",
"describeYourCommunity": "Décrivez votre activité/service à la communauté en mentionnant le nombre d´heures, et calculez le montant à raison de 20 GDD/heure! Après confirmation par l´un de nos collaborateurs, le montant sera crédité sur votre compte.",
"maxGDDforMonth": "Vous pouvez seulement déclarer un montant maximum de (montant) GDD pour le mois sélectionné.",
"openAmountForMonth": "Pour <b>{monthAndYear}</b>, vous pouvez encore déclarer <b>{creation}</b> GDD.",
"yourContribution": "Votre contribution au bien commun"
},
"noDateSelected": "Choisissez n´importe quelle date du mois",
"selectDate": "Quand a été effectuée votre contribution?",
"submit": "Soumettre",
"submitted": "La contribution a été soumise.",
"updated": "La contribution a été modifiée.",
"yourActivity": "Veuillez saisir une activité!"
},
"contribution-link": {
"thanksYouWith": "vous remercie avec",
"unique": "(unique)"
},
"decay": {
"before_startblock_transaction": "Cette transaction n´est pas péremptoire.",
"calculation_decay": "Calcul de la décroissance",
"calculation_total": "Calcul du montant total",
"decay": "Décroissance",
"decay_introduced": "Décroissance engagée le:",
"decay_since_last_transaction": "Décroissance depuis la dernière transaction",
"last_transaction": "Dernière transaction:",
"past_time": "Le temps a expiré",
"Starting_block_decay": "Début de la décroissance",
"total": "Total",
"types": {
"creation": "Créé",
"noDecay": "Aucun déclin",
"receive": "Reçu",
"send": "Envoyé"
}
},
"delete": "Supprimer",
"em-dash": "—",
"error": {
"email-already-sent": "Nous vous avons déjà envoyé un email il y a moins de 10 minutes.",
"empty-transactionlist": "Il y a eu une erreur lors de la transmission du numéro de votre transaction.",
"error": "Erreur!",
"no-account": "Malheureusement nous n´avons pas pu trouver de compte (actif) correspondant aux données transmises.",
"no-transactionlist": "Il y a malheureusement eu une erreur. Aucune transaction n´a été envoyée depuis l`serveur.",
"no-user": "Pas d`utilisateur pour cet identifiant.",
"session-expired": "La session a expiré pour des raisons de sécurité.",
"unknown-error": "Erreur inconnue: "
},
"followUs": "Suivez-nous:",
"footer": {
"app_version": "Version de l'application {version}",
"copyright": {
"link": "Académie Gradido",
"year": "© {year}"
},
"imprint": "Notification légale",
"privacy_policy": "Politique de confidentialité",
"short_hash": "({shortHash})",
"whitepaper": "Papier blanc"
},
"form": {
"amount": "Montant",
"at": "à",
"cancel": "Annuler",
"change": "Changer",
"check_now": "Vérifier maintenant",
"close": "Fermer",
"current_balance": "Solde actuel",
"date": "Date",
"description": "Description",
"email": "Email",
"firstname": " Prénom",
"from": "de",
"generate_now": "Produire maintenant",
"lastname": "Nom",
"mandatoryField": "champ obligatoire",
"memo": "Note",
"message": "Message",
"new_balance": "Montant du solde après confirmation",
"no_gdd_available": "Vous n´avez pas de GDD à envoyer.",
"password": "Mot de passe",
"passwordRepeat": "Répétez le mot de passe",
"password_new": "Nouveau mot de passe",
"password_new_repeat": "Répétez le nouveau mot de passe",
"password_old": "Ancien mot de passe",
"recipient": "Destinataire",
"reset": "Réinitialiser",
"save": "Sauvegarder",
"scann_code": "<strong>QR Code Scanner</strong> - Scannez le QR code de votre partenaire",
"sender": "Expéditeur",
"send_check": "Confirmez la transaction. Veuillez revérifier toutes les données svp!",
"send_now": "Envoyez maintenant",
"send_transaction_error": "Malheureusement, la transaction n´a pas pu être effectuée!",
"send_transaction_success": "Votre transaction a été effectuée avec succès",
"sorry": "Désolé",
"thx": "Merci",
"time": "Heure",
"to": "à",
"to1": "à",
"validation": {
"gddSendAmount": "L´espace {_field_} doit comprendre un nombre entre {min} et {max} avec un maximum de deux chiffres après la virgule",
"is-not": "Vous ne pouvez pas vous envoyer de Gradido à vous-même",
"usernmae-regex": "Le nom d´utilisateur doit commencer par une lettre, suivi d´au moins deux caractères alphanumériques.",
"usernmae-unique": "Ce nom d´utilisateur est déjà pris."
},
"your_amount": "Votre montant"
},
"GDD": "GDD",
"gdd_per_link": {
"choose-amount": "Sélectionnez le montant que vous souhaitez envoyer via lien. Vous pouvez également joindre un message. Cliquez sur créer maintenant pour établir un lien que vous pourrez partager.",
"copy-link": "Copier le lien",
"copy-link-with-text": "Copier le lien et le texte",
"created": "Le lien a été créé!",
"credit-your-gradido": "Pour l´accréditation du Gradido, cliquer sur le lien!",
"decay-14-day": "Perte sur 14 jours",
"delete-the-link": "Supprimer le lien?",
"deleted": "Le lien a été supprimé!",
"expiredOn": "A expiré le",
"has-account": "Vous avez déjà un compte Gradido?",
"header": "Envoyer des Gradidos via lien",
"isFree": "Gradido est gratuit mondialement.",
"link-and-text-copied": "Le lien et votre message ont été copiés dans le presse-papier. Vous pouvez maintenant le joindre à un email ou à un message..",
"link-copied": "Le lien a été copié dans le presse-papier. Vous pouvez désormais le coller dans votre email ou votre message.",
"link-deleted": "Le lien a été supprimé le on {date}.",
"link-expired": "Le lien n´est plus valide. Sa validité a expiré le {date}.",
"link-overview": "Aperçu du lien",
"links_count": "Liens actifs",
"links_sum": "Ouvrir les liens et les QR codes",
"no-account": "Vous n´avez pas encore de compte Gradido?",
"no-redeem": "Vous n´êtes pas autorisé à percevoir votre propre lien!",
"not-copied": "Malheureusement votre appareil ne permet pas de copier! Veuillez copier le lien manuellement svp!",
"redeem": "Encaisser",
"redeem-text": "Voulez-vous percevoir le montant maintenant?",
"redeemed": "Encaissé avec succès! Votre compte est crédité de {n} GDD.",
"redeemed-at": "Le lien a déjà été perçu le {date}.",
"redeemed-title": "encaisser",
"to-login": "Connexion",
"to-register": "Enregistrer un nouveau compte.",
"validUntil": "Valide jusqu´au",
"validUntilDate": "Le lien est valide jusqu´au {date}."
},
"gdt": {
"calculation": "Calcul de Gradido Transform",
"contribution": "Contribution",
"conversion": "Conversion",
"conversion-gdt-euro": "Conversion Euro / Gradido Transform (GDT)",
"credit": "Crédit",
"factor": "Coefficient",
"formula": "Formule de calcul",
"funding": "Aux contributions au financement",
"gdt": "Gradido Transform",
"gdt-received": "Gradido Transform (GDT) perçu",
"no-transactions": "Vous ne possédez pas encore Gradido Transform (GDT).",
"not-reachable": "Le Serveur GDT n´est pas accessible.",
"publisher": "Un membre que vous avez référé a apporté un contribution",
"raise": "Augmentation",
"recruited-member": "Membre invité"
},
"language": "Langage",
"link-load": "Enregistrer le dernier lien | Enregistrer les derniers {n} liens | Enregistrer plus de {n} liens",
"login": "Connexion",
"math": {
"aprox": "~",
"asterisk": "*",
"equal": "=",
"minus": "",
"pipe": "|"
},
"message": {
"activateEmail": "Votre compte n´a pas encore été activé. Veuillez vérifier vos emails et cliquer sur le lien d´activation ou faites la demande d´un nouveau lien en utilisant la page qui permet de générer un nouveau mot de passe.",
"checkEmail": "Votre email a bien été vérifié. Vous pouvez vous enregistrer maintenant.",
"email": "Nous vous avons envoyé un email.",
"errorTitle": "Attention!",
"register": "Vous êtes enregistré maintenant, merci de vérifier votre boîte mail et cliquer sur le lien d´activation.",
"reset": "Votre mot de passe a été modifié.",
"title": "Merci!",
"unsetPassword": "Votre mot de passe n´a pas été accepté. Merci de le réinitialiser."
},
"navigation": {
"admin_area": "Partie administrative",
"community": "Communauté",
"info": "Information",
"logout": "Déconnexion",
"members_area": "Partie réservée aux membres",
"overview": "Aperçu",
"profile": "Mon profile",
"send": "Envoyer",
"support": "Aide",
"transactions": "Transactions"
},
"qrCode": "QR Code",
"send_gdd": "Envoyer GDD",
"send_per_link": "Envoyer GDD via lien",
"session": {
"extend": "Rester connecter",
"lightText": "S´il n´apparaît aucune activité pendant plus de 10 minutes, la session expirera pour des raisons de sécurité.",
"logoutIn": "Se déconnecter ",
"warningText": "Êtes-vous toujours connecté?"
},
"settings": {
"language": {
"changeLanguage": "Changer la langue",
"de": "Allemand",
"en": "Anglais",
"es": "Espagnol",
"fr": "Français",
"nl": "Néerlandais",
"success": "Votre langue de préférence a bien été actualisée."
},
"name": {
"change-name": "Changer le nom",
"change-success": "Votre nom a bien été changé."
},
"newsletter": {
"newsletter": "Information par email",
"newsletterFalse": "Vous ne recevrez aucune information par email.",
"newsletterTrue": "Vous recevrez de l´information par email."
},
"password": {
"change-password": "Changer le mot de passe",
"forgot_pwd": "Mot de passe oublié?",
"resend_subtitle": "Votre lien d´activation a expiré, vous pouvez en obtenir un nouveau ici.",
"reset": "Réinitialiser le mot de passe",
"reset-password": {
"text": "Entrez un nouveau mot de passe que vous utiliserez dans le futur pour vous connecter à votre compte Gradido.."
},
"send_now": "Envoyer maintenant",
"set": "Définir le mot de passe",
"set-password": {
"text": "Sauvegardez votre nouveau mot de passe maintenant, que vous pourrez utiliser pour vous connecter à votre compte Gradido dans le futur."
},
"subtitle": "Si vous avez oublié votre mot de passe, vous pouvez le réinitialiser ici."
}
},
"signin": "S´identifier",
"signup": "S´inscrire",
"site": {
"forgotPassword": {
"heading": "Veuillez entrer l´adresse email sous laquelle vous êtes enregistré ici svp."
},
"login": {
"heading": "Vous connecter avec vos données d´accès. Gardez les en sécurité!"
},
"resetPassword": {
"heading": "Entrez votre mot de passe et répétez l´action svp."
},
"signup": {
"agree": "J´accepte le <a href='https://gradido.net/en/datenschutz/' target='_blank' > politique de confidentialité </a>.",
"dont_match": "Les mots de passe ne correspondent pas.",
"heading": "Vous enregistrer en entrant toutes les données demandées dans les champs requis.",
"lowercase": "Une lettre minuscule est requise.",
"minimum": "8 caractères minimum.",
"no-whitespace": "Pas d´espace ni d´onglet",
"one_number": "Un chiffre requis.",
"special-char": "Un caractère spécial requis (e.g. _ or ä)",
"uppercase": "Une lettre majuscule requise."
}
},
"statistic": {
"activeUsers": "Membres actifs",
"deletedUsers": "Membres supprimés",
"totalGradidoAvailable": "GDD total en circulation",
"totalGradidoCreated": "GDD total puisé",
"totalGradidoDecayed": "Total de GDD écoulé",
"totalGradidoUnbookedDecayed": "Total GDD non comptabilisé écoulé"
},
"success": "Avec succès",
"time": {
"days": "Jours",
"hours": "Heures",
"minutes": "Minutes",
"month": "Moi",
"months": "Mois",
"seconds": "Secondes",
"years": "Année"
},
"transaction": {
"gdd-text": "Transactions Gradido",
"gdt-text": "Transactions de GradidoTransform",
"nullTransactions": "Vous n´avez pas encore de transaction effectuée sur votre compte.",
"receiverDeleted": "Le compte du destinataire n´existe plus",
"receiverNotFound": "Destinataire inconnu",
"show_all": "Voir toutes les <strong>{count}</strong> transactions."
},
"transaction-link": {
"send_you": "veut vous envoyer"
},
"via_link": "par lien",
"welcome": "Bienvenu dans la communauté"
}

View File

@ -17,6 +17,18 @@ const locales = [
iso: 'es-ES', iso: 'es-ES',
enabled: true, enabled: true,
}, },
{
name: 'Français',
code: 'fr',
iso: 'fr-FR',
enabled: true,
},
{
name: 'Holandés',
code: 'nl',
iso: 'nl-NL',
enabled: true,
},
] ]
export default locales export default locales

View File

@ -0,0 +1,341 @@
{
"100": "100%",
"1000thanks": "1000 dank, omdat je bij ons bent!",
"125": "125%",
"85": "85%",
"advanced-calculation": "Voorcalculatie",
"auth": {
"left": {
"dignity": "Waardigheid",
"donation": "Gift",
"gratitude": "Dankbaarheid",
"hasAccount": "Je hebt al een rekening?",
"hereLogin": "Hier aanmelden",
"learnMore": "Meer ervaren …",
"oneDignity": "We geven aan elkaar en bedanken met Gradido.",
"oneDonation": "Jij bent een geschenk voor de gemeenschap. 1000 dank dat je bij ons bent.",
"oneGratitude": "Voor elkaar, voor alle mensen, voor de natuur."
},
"navbar": {
"aboutGradido": "Over Gradido"
}
},
"back": "Terug",
"community": {
"choose-another-community": "Kies een andere gemeenschap",
"community": "Gemeenschap",
"continue-to-registration": "Verder ter registratie",
"current-community": "Actuele gemeenschap",
"members": "Leden",
"moderators": "Moderators",
"myContributions": "Mijn bijdragen voor het algemeen belang",
"openContributionLinks": "openbare lijst van bijdragen",
"openContributionLinkText": "De volgende {count} automatische creaties worden momenteel aangeboden door de gemeenschap \"{name}\".",
"other-communities": "Verdere gemeenschappen",
"statistic": "Statistieken",
"submitContribution": "Bijdrage indienen",
"switch-to-this-community": "naar deze gemeenschap wisselen"
},
"contribution": {
"activity": "Activiteit",
"alert": {
"communityNoteList": "Hier vind je alle ingediende en bevestigde bijdragen van alle leden uit deze gemeenschap.",
"confirm": "bevestigt",
"myContributionNoteList": "Ingediende bijdragen, die nog niet bevestigd zijn, kun je op elk moment wijzigen of verwijderen.",
"myContributionNoteSupport": "Hier heb je binnenkort de mogelijkheid een gesprek met een moderator te voeren. Mocht je nu problemen hebben, dan neem alsjeblieft contact op met Support.",
"pending": "Ingediend en wacht op bevestiging",
"rejected": "afgewezen"
},
"date": "Bijdrage voor:",
"delete": "Bijdrage verwijderen! Weet je het zeker?",
"deleted": "De bijdrage werd verwijderd! Blijft echter zichtbaar.",
"formText": {
"bringYourTalentsTo": "Bied je met jouw talenten in de gemeenschap aan! Jouw vrijwillige inzet belonen we met 20 GGD per uur, tot maximaal 1.000 GGD per maand.",
"describeYourCommunity": "Beschrijf jouw activiteit voor het algemeen belang met vermelding van het aantal uren en registreer een bedrag van 20 GDD per uur! Na bevestiging door een moderator wordt het bedrag op jouw rekening bijgeschreven.",
"maxGDDforMonth": "Je kunt voor de geselecteerde maand nog maximaal {amount} GDD indienen.",
"openAmountForMonth": "Voor <b>{monthAndYear}</b> kun je nog <b>{creation}</b> GDD indienen.",
"yourContribution": "Jouw bijdrage voor het algemeen belang"
},
"noDateSelected": "Kies een willekeurige datum in de maand",
"selectDate": "Wanneer was jouw bijdrage?",
"submit": "Indienen",
"submitted": "De bijdrage werd ingediend.",
"updated": "De bijdrage werd veranderd.",
"yourActivity": "Voer een activiteit in!"
},
"contribution-link": {
"thanksYouWith": "bedankt jou met",
"unique": "(uniek)"
},
"decay": {
"before_startblock_transaction": "Deze transactie heeft geen vergankelijkheid.",
"calculation_decay": "Berekening van de vergankelijkheid",
"calculation_total": "Berekening van het totaalbedrag",
"decay": "Vergankelijkheid",
"decay_introduced": "De vergankelijkheid werd ingevoerd op:",
"decay_since_last_transaction": "Vergankelijkheid sinds de laatste transactie",
"last_transaction": "Laatste transactie",
"past_time": "Verlopen tijd",
"Starting_block_decay": "Startblok vergankelijkheid",
"total": "Totaal",
"types": {
"creation": "Gecreëerd",
"noDecay": "Geen vergankelijkheid",
"receive": "Ontvangen",
"send": "Verstuurd"
}
},
"delete": "Verwijderen",
"em-dash": "—",
"error": {
"email-already-sent": "Wij hebben jou minder dan 10 minuten geleden een email gestuurd.",
"empty-transactionlist": "Er was een fout met de overdracht van het aantal van jouw transacties.",
"error": "Fout!",
"no-account": "Helaas kunnen we geen (geactiveerde) rekening met deze gegevens vinden.",
"no-transactionlist": " Helaas was er een fout. Door de server werden er geen transacties overgedragen.",
"no-user": "Geen gebruiker met deze login gegevens.",
"session-expired": "De sessie werd om veiligheidsredenen beëindigd.",
"unknown-error": "Onbekende fout: "
},
"followUs": "volg ons:",
"footer": {
"app_version": "app versie {version}",
"copyright": {
"link": "Gradido-Academie",
"year": "© {year}"
},
"imprint": "Colofon",
"privacy_policy": "Privacyverklaring",
"short_hash": "({shortHash})",
"whitepaper": "Witboek"
},
"form": {
"amount": "Bedrag",
"at": "op",
"cancel": "Annuleren",
"change": "Wijzigen",
"check_now": "Nu controleren",
"close": "Sluiten",
"current_balance": "Actueel banksaldo",
"date": "Datum",
"description": "Beschrijving",
"email": "Email",
"firstname": "Voornaam",
"from": "Van",
"generate_now": "Nu genereren",
"lastname": "Achternaam",
"mandatoryField": "verplicht veld",
"memo": "Memo",
"message": "Bericht",
"new_balance": "Nieuw banksaldo na bevestiging",
"no_gdd_available": "Je hebt geen GDD om te versturen.",
"password": "Wachtwoord",
"passwordRepeat": "Wachtwoord herhalen",
"password_new": "Nieuw wachtwoord",
"password_new_repeat": "Nieuw wachtwoord herhalen",
"password_old": "Oud wachtwoord",
"recipient": "Ontvanger",
"reset": "Resetten",
"save": "Opslaan",
"scann_code": "<strong>QR Code Scanner</strong> - Scan de QR Code van uw partner",
"sender": "Afzender",
"send_check": "Bevestig jouw transactie. Controleer alsjeblieft nogmaals alle gegevens!",
"send_now": "Nu versturen",
"send_transaction_error": "Helaas kon de transactie niet uitgevoerd worden!",
"send_transaction_success": " Jouw transactie werd succesvol uitgevoerd ",
"sorry": "Sorry",
"thx": "Dankjewel",
"time": "Tijd",
"to": "tot",
"to1": "aan",
"validation": {
"gddSendAmount": "Het veld {_field_} moet een getal tussen {min} en {max} met maximaal twee cijfers achter de komma zijn",
"is-not": "Je kunt geen Gradidos aan jezelf overmaken",
"usernmae-regex": "De gebruikersnaam moet met een letter beginnen, waarop minimaal twee alfanumerieke tekens dienen te volgen.",
"usernmae-unique": "De gebruikersnaam is al bezet."
},
"your_amount": "Jouw bijdrage"
},
"GDD": "GDD",
"gdd_per_link": {
"choose-amount": "Kies een bedrag dat je per link versturen wil. Je kunt ook nog een bericht invullen. Wanneer je „Nu genereren“ klikt, wordt er een link gecreëerd die je kunt versturen.",
"copy-link": "Link kopiëren",
"copy-link-with-text": "Link en tekst kopiëren",
"created": "De link werd gecreëerd!",
"credit-your-gradido": "Om de Gradidos bijgeschreven te krijgen, klik op de link!",
"decay-14-day": "Vergankelijkheid voor 14 dagen",
"delete-the-link": "De link verwijderen?",
"deleted": "De link werd verwijderd!",
"expiredOn": "Afgelopen op",
"has-account": "Heb je al een Gradido rekening?",
"header": "Gradidos per link versturen",
"isFree": "Gradido is gratis wereldwijd.",
"link-and-text-copied": "De link en jouw bericht werden naar het klembord gekopieerd. Je kunt ze nu in een email of bericht invoegen.",
"link-copied": "Link werd naar het klembord gekopieerd. Je kunt deze nu in een email of bericht invoegen.",
"link-deleted": "De link werd op {date} verwijderd.",
"link-expired": "De link is niet meer geldig. De geldigheid is op {date} afgelopen.",
"link-overview": "Overzicht links",
"links_count": "Actieve links",
"links_sum": "Open links en QR-Codes",
"no-account": "Je hebt nog geen Gradido rekening?",
"no-redeem": "Je mag je eigen link niet inwisselen!",
"not-copied": "Jouw apparaat laat het kopiëren helaas niet toe! Kopieer de link alsjeblieft met de hand!",
"redeem": "Inwisselen",
"redeem-text": "Wil je het bedrag nu inwisselen?",
"redeemed": "Succesvol ingewisseld! Op jouw rekening werden {n} GDD bijgeschreven.",
"redeemed-at": "De link werd al op {date} ingewisseld.",
"redeemed-title": "ingewisseld",
"to-login": "Inloggen",
"to-register": "Registreer een nieuwe rekening.",
"validUntil": "Geldig tot",
"validUntilDate": "De link is geldig tot {date}."
},
"gdt": {
"calculation": "Berekening van de Gradido Transform",
"contribution": "Bedrag",
"conversion": "Omrekening",
"conversion-gdt-euro": "Omrekening Euro / Gradido Transform (GDT)",
"credit": "Krediet",
"factor": "Factor",
"formula": "Berekeningsformule",
"funding": "Naar de donaties",
"gdt": "Gradido Transform",
"gdt-received": "Gradido Transform (GDT) ontvangen",
"no-transactions": "Je hebt nog geen Gradido Transform (GDT).",
"not-reachable": "De GDT server is niet bereikbaar.",
"publisher": "Jouw geworven lid heeft een bijdrage betaald ",
"raise": "Verhoging",
"recruited-member": "Uitgenodigd lid"
},
"language": "Taal",
"link-load": "de laatste link herladen | de laatste links herladen | verdere {n} links herladen",
"login": "Aanmelding",
"math": {
"aprox": "~",
"asterisk": "*",
"equal": "=",
"minus": "",
"pipe": "|"
},
"message": {
"activateEmail": "Jouw rekening werd nog niet geactiveerd. Controleer aljeblieft jouw email en klik de activeringslink. Of vraag een nieuwe activeringlink via de Wachtwoord-Reset-Pagina aan.",
"checkEmail": "Jouw email werd succesvol geverifieerd. Je kunt je nu aanmelden.",
"email": "We hebben jou een email gestuurd.",
"errorTitle": "Opgelet!",
"register": "Je bent nu geregistreerd. Controleer alsjeblieft je emails en klik op de activeringslink.",
"reset": "Jouw wachtwoord werd gewijzigd.",
"title": "Dankjewel!",
"unsetPassword": "Jouw wachtwoord werd nog niet ingesteld. Doe het alsjeblieft opnieuw."
},
"navigation": {
"admin_area": "Beheerder",
"community": "Gemeenschap",
"info": "Informatie",
"logout": "Afmelden",
"members_area": "Ledenbestand",
"overview": "Overzicht",
"profile": "Mijn profiel",
"send": "Sturen",
"support": "Support",
"transactions": "Transacties"
},
"qrCode": "QR Code",
"send_gdd": "GDD sturen",
"send_per_link": "GDD per link versturen",
"session": {
"extend": "Aangemeld blijven",
"lightText": "Wanneer je langer dan 10 minuten geen actie ondernomen hebt, word je om veiligheidsredenen afgemeld.",
"logoutIn": "Afmelden in ",
"warningText": "Ben je er nog?"
},
"settings": {
"language": {
"changeLanguage": "Taal veranderen",
"de": "Duits",
"en": "Engels",
"es": "Spaans",
"fr": "Frans",
"nl": "Nederlands",
"success": "Jouw taal werd succesvol veranderd."
},
"name": {
"change-name": "Naam veranderen",
"change-success": "Jouw naam werd succesvol veranderd."
},
"newsletter": {
"newsletter": "Informatie per email",
"newsletterFalse": "Je ontvangt geen informatie per email.",
"newsletterTrue": "Je ontvangt informatie per email."
},
"password": {
"change-password": "Wachtwoord veranderen",
"forgot_pwd": "Wachtwoord vergeten?",
"resend_subtitle": "Jouw activeringslink is afgelopen. Je kunt hier een nieuwe aanvragen.",
"reset": "Wachtwoord opnieuw instellen",
"reset-password": {
"text": "Stel een nieuw wachtwoord in, waarmee je je voortaan in jouw Gradido-rekening wilt aanmelden."
},
"send_now": "Nu versturen",
"set": "Wachtwoord instellen",
"set-password": {
"text": "Sla nu je nieuwe wachtwoord, waarmee je je voortaan in jouw Gradido-rekening kunt aanmelden, op."
},
"subtitle": "Wanneer je het wachtwoord hebt vergeten, kun je het hier opnieuw instellen."
}
},
"signin": "Aanmelden",
"signup": "Registreren",
"site": {
"forgotPassword": {
"heading": "Geef alsjeblieft jouw email, waarmee je bij Gradido aangemeld bent."
},
"login": {
"heading": "Meld je met jouw inloggegevens aan. Sla deze altijd veilig op!"
},
"resetPassword": {
"heading": "Vul alsjeblieft jouw wachtwoord in, en herhaal het."
},
"signup": {
"agree": "Ik ga akkoord met <a href='https://gradido.net/de/datenschutz/' target='_blank' >Datenschutzerklärung</a>.",
"dont_match": "De wachtwoorden zijn niet gelijk.",
"heading": "Schrijf je in door alle gegevens volledig en in de juiste velden in te vullen.",
"lowercase": "Een kleine letter is noodzakelijk.",
"minimum": "Minstens 8 tekens.",
"no-whitespace": "Geen spaties en tabs",
"one_number": "Getal noodzakelijk.",
"special-char": "Speciaal teken noodzakelijk (bijv. _ of é)",
"uppercase": "Hoofdletter noodzakelijk."
}
},
"statistic": {
"activeUsers": "Actieve leden",
"deletedUsers": "Verwijderde leden",
"totalGradidoAvailable": "Totaal GDD in omloop",
"totalGradidoCreated": "Totaal GDD geschept",
"totalGradidoDecayed": "Totaal GDD vervallen",
"totalGradidoUnbookedDecayed": "Totaal niet geboekte GDD vervallen"
},
"success": "Succes",
"time": {
"days": "Dagen",
"hours": "Uren",
"minutes": "Minuten",
"month": "Maand",
"months": "Maanden",
"seconds": "Seconden",
"years": "Jaar"
},
"transaction": {
"gdd-text": "Gradido transacties",
"gdt-text": "GradidoTransform transacties",
"nullTransactions": "Je hebt nog geen transacties op jouw rekening.",
"receiverDeleted": "De rekening van de ontvanger werd verwijderd",
"receiverNotFound": "Ontvanger niet gevonden",
"show_all": "Alle <strong>{count}</strong> Transacties bekijken."
},
"transaction-link": {
"send_you": "stuurt jou"
},
"via_link": "via een link",
"welcome": "Welkom in de gemeenschap"
}