From c0892842d1d24e4f0842a2dbee3221eccde0b3d0 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 7 Jul 2022 15:52:55 +0200 Subject: [PATCH 01/64] setup community statistics --- backend/src/auth/RIGHTS.ts | 1 + .../src/graphql/model/CommunityStatistics.ts | 26 +++++++++++++++++++ .../graphql/resolver/StatisticsResolver.ts | 26 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 backend/src/graphql/model/CommunityStatistics.ts create mode 100644 backend/src/graphql/resolver/StatisticsResolver.ts diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index 1e38eab7f..a58d0aa2b 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -48,4 +48,5 @@ export enum RIGHTS { CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK', DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK', UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK', + COMMUNITY_STATISTICS = 'COMMUNITY_STATISTICS', } diff --git a/backend/src/graphql/model/CommunityStatistics.ts b/backend/src/graphql/model/CommunityStatistics.ts new file mode 100644 index 000000000..61354115c --- /dev/null +++ b/backend/src/graphql/model/CommunityStatistics.ts @@ -0,0 +1,26 @@ +import { ObjectType, Field } from 'type-graphql' +import Decimal from 'decimal.js-light' + +@ObjectType() +export class CommunityStatistics { + @Field(() => Number) + totalUsers: number + + @Field(() => Number) + activeUsers: number + + @Field(() => Number) + deletedUsers: number + + @Field(() => Decimal) + totalGradidoCreated: Decimal + + @Field(() => Decimal) + totalGradidoDecayed: Decimal + + @Field(() => Decimal) + totalGradidoAvailable: Decimal + + @Field(() => Decimal) + totalGradidoUnbookedDecayed: Decimal +} diff --git a/backend/src/graphql/resolver/StatisticsResolver.ts b/backend/src/graphql/resolver/StatisticsResolver.ts new file mode 100644 index 000000000..a90d42f75 --- /dev/null +++ b/backend/src/graphql/resolver/StatisticsResolver.ts @@ -0,0 +1,26 @@ +import { Resolver, Query, Arg, Args, Authorized, Ctx, Int } from 'type-graphql' +import { RIGHTS } from '@/auth/RIGHTS' +import { CommunityStatistics } from '@model/CommunityStatistics' +import { User as DbUser } from '@entity/User' +import { getConnection } from '@dbTools/typeorm' +import Decimal from 'decimal.js-light' + +@Resolver() +export class StatisticsResolver { + @Authorized([RIGHTS.COMMUNITY_STATISTICS]) + @Query(() => CommunityStatistics) + async communityStatistics(): Promise { + const totalUsers = await DbUser.find({ withDeleted: true }) + console.log(totalUsers.length) + + return { + totalUsers: 12, + activeUsers: 6, + deletedUsers: 1, + totalGradidoCreated: new Decimal(3000), + totalGradidoDecayed: new Decimal(200), + totalGradidoAvailable: new Decimal(2800), + totalGradidoUnbookedDecayed: new Decimal(200), + } + } +} From f4b34da4151e3eca9015c0349f29e298b2a94ed9 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 7 Jul 2022 17:27:50 +0200 Subject: [PATCH 02/64] get basic statistics from database --- .../graphql/resolver/StatisticsResolver.ts | 71 ++++++++++++++++--- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/backend/src/graphql/resolver/StatisticsResolver.ts b/backend/src/graphql/resolver/StatisticsResolver.ts index a90d42f75..4c1500839 100644 --- a/backend/src/graphql/resolver/StatisticsResolver.ts +++ b/backend/src/graphql/resolver/StatisticsResolver.ts @@ -1,26 +1,77 @@ -import { Resolver, Query, Arg, Args, Authorized, Ctx, Int } from 'type-graphql' +import { Resolver, Query, Authorized } from 'type-graphql' import { RIGHTS } from '@/auth/RIGHTS' import { CommunityStatistics } from '@model/CommunityStatistics' import { User as DbUser } from '@entity/User' +import { Transaction as DbTransaction } from '@entity/Transaction' import { getConnection } from '@dbTools/typeorm' import Decimal from 'decimal.js-light' +import { calculateDecay } from '@/util/decay' @Resolver() export class StatisticsResolver { @Authorized([RIGHTS.COMMUNITY_STATISTICS]) @Query(() => CommunityStatistics) async communityStatistics(): Promise { - const totalUsers = await DbUser.find({ withDeleted: true }) - console.log(totalUsers.length) + const allUsers = await DbUser.find({ withDeleted: true }) + + let totalUsers = 0 + let activeUsers = 0 + let deletedUsers = 0 + + let totalGradidoAvailable: Decimal = new Decimal(0) + let totalGradidoUnbookedDecayed: Decimal = new Decimal(0) + + const receivedCallDate = new Date() + + for (let i = 0; i < allUsers.length; i++) { + if (allUsers[i].deletedAt) { + deletedUsers++ + } else { + totalUsers++ + const lastTransaction = await DbTransaction.findOne({ + where: { userId: allUsers[i].id }, + order: { balanceDate: 'DESC' }, + }) + if (lastTransaction) { + activeUsers++ + const decay = calculateDecay( + lastTransaction.balance, + lastTransaction.balanceDate, + receivedCallDate, + ) + if (decay) { + totalGradidoAvailable = totalGradidoAvailable.plus(decay.balance.toString()) + totalGradidoUnbookedDecayed = totalGradidoUnbookedDecayed.plus(decay.decay.toString()) + } + } + } + } + + const queryRunner = getConnection().createQueryRunner() + await queryRunner.connect() + + const { totalGradidoCreated } = await queryRunner.manager + .createQueryBuilder() + .select('SUM(transaction.amount) AS totalGradidoCreated') + .from(DbTransaction, 'transaction') + .where('transaction.typeId = 1') + .getRawOne() + + const { totalGradidoDecayed } = await queryRunner.manager + .createQueryBuilder() + .select('SUM(transaction.decay) AS totalGradidoDecayed') + .from(DbTransaction, 'transaction') + .where('transaction.decay IS NOT NULL') + .getRawOne() return { - totalUsers: 12, - activeUsers: 6, - deletedUsers: 1, - totalGradidoCreated: new Decimal(3000), - totalGradidoDecayed: new Decimal(200), - totalGradidoAvailable: new Decimal(2800), - totalGradidoUnbookedDecayed: new Decimal(200), + totalUsers, + activeUsers, + deletedUsers, + totalGradidoCreated, + totalGradidoDecayed, + totalGradidoAvailable, + totalGradidoUnbookedDecayed, } } } From 0e37fe283c784fd41417207f024999bbb02b3462 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 7 Jul 2022 17:29:09 +0200 Subject: [PATCH 03/64] add query for communty statistics --- admin/src/graphql/communityStatistics.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 admin/src/graphql/communityStatistics.js diff --git a/admin/src/graphql/communityStatistics.js b/admin/src/graphql/communityStatistics.js new file mode 100644 index 000000000..868bfd02a --- /dev/null +++ b/admin/src/graphql/communityStatistics.js @@ -0,0 +1,15 @@ +import gql from 'graphql-tag' + +export const communityStatistics = gql` + query { + communityStatistics { + totalUsers + activeUsers + deletedUsers + totalGradidoCreated + totalGradidoDecayed + totalGradidoAvailable + totalGradidoUnbookedDecayed + } + } +` From 73cf9bc8cc2c5a9c58adcc59077dc5d04b45fccd Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 16 Aug 2022 11:54:11 +0200 Subject: [PATCH 04/64] add dutch and frence --- .../src/graphql/resolver/UserResolver.test.ts | 2 +- backend/src/graphql/resolver/UserResolver.ts | 2 +- ...tzung_-_Translate_-_Bank_Details_D_NL.docx | Bin 0 -> 35658 bytes ...etzung_-_Translate_-_Bank_Details_E_F.docx | Bin 0 -> 36347 bytes .../src/components/LanguageSwitch.spec.js | 26 +- .../src/components/LanguageSwitch2.spec.js | 22 +- frontend/src/components/LanguageSwitch2.vue | 21 +- .../src/components/LanguageSwitchSelect.vue | 2 + frontend/src/i18n.js | 96 ++++++ frontend/src/locales/de.json | 2 + frontend/src/locales/en.json | 4 +- frontend/src/locales/es.json | 2 + frontend/src/locales/fr.json | 326 ++++++++++++++++++ frontend/src/locales/index.js | 12 + frontend/src/locales/nl.json | 326 ++++++++++++++++++ 15 files changed, 834 insertions(+), 9 deletions(-) create mode 100644 docu/Locales/Vertaling_-_Ubersetzung_-_Translate_-_Bank_Details_D_NL.docx create mode 100644 docu/Locales/Vertaling_-_Ubersetzung_-_Translate_-_Bank_Details_E_F.docx create mode 100644 frontend/src/locales/fr.json create mode 100644 frontend/src/locales/nl.json diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 14e86fa1c..7ecde55b4 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: 'fr' }, + variables: { ...variables, email: 'bibi@bloxberg.de', language: 'it' }, }) await expect(User.find()).resolves.toEqual( expect.arrayContaining([ diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index a31abbf5e..74b867ad0 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', 'es'] +const LANGUAGES = ['de', 'en', 'es', 'fr', 'nl'] const DEFAULT_LANGUAGE = 'de' const isLanguage = (language: string): boolean => { return LANGUAGES.includes(language) diff --git a/docu/Locales/Vertaling_-_Ubersetzung_-_Translate_-_Bank_Details_D_NL.docx b/docu/Locales/Vertaling_-_Ubersetzung_-_Translate_-_Bank_Details_D_NL.docx new file mode 100644 index 0000000000000000000000000000000000000000..f4d9da730d72ff755e8e79142ab838916d7efd24 GIT binary patch literal 35658 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

EAuw5bW>ap93p>cVhw7JX zi>{TW#x&L2J408Q#;0g7HhrzKEmy6!(_MnXZ{3Q?xQ_RU-sH>|;H?0}wH4 z!Whz40AuS{A3In2#${;$J7I)wM&Dyqy$UYf1pV?}b-DhCQo6AJHlkn!o z-(LI+OE0`r435K6+mok!+@8;&xjH|8KYdIMA>!k0eU895m{{+T(oT8YY#jaIeF1xa z-e1E+>?$7|WBzC&;D5hQW+?TW=4Wxt{Bi&ESQL}><9&r-i@)607KVqqFXSsZ$_A;p zS=P{YN?5ohCwAD~1eRDzlBpGWPCxXb2KD}<(tftB4AU6E<(?t30kehOj-lSZAJHD# z79=GPS25cRGk|O!<2+OM@iqTXjDSB@s zl*8nbNzVW;E|4;R>jqSay1h-f1a(RK6qf#3Er%P;nXv+HBsTh&MVj<#A=AFG#sSOz zTG+&;_54ox=oy{EF>wwJV;Q5*w-nUDGq+qjEi#8tLluN4`0`w85=h0JWP9Ec!Z{*+ zyn8^ijfGz^U{9KoF9;B$rQcua(+BAlC_UuJ?jR1^BiDB!H=u^h(Om@MizD9!@CCvQ z>W7rky^`C$>@Gc$a)(ZahK=UDeqk)8 zNE4=@n$$N3({-i^fPln=u{tE|Sr}3h4S*`Dwyg5h_(sVxlOsZvY^U|LFR_*t-{oTz zpDq0b%b-NqpkWM@yFEALZcdD7Pz^ne#k$f=6qci`HjyS(?)pMGVWC0ZbWw%95L?Bm z9-aOSDczAXu-y(GBEn2)k8l}QFhO-^xk|au9Fhg)xOollz?@0Fc^GX33X*i}=YuDo zxO04dyUHQnjL)*cwD^!>uFCAMX#3#Yn& z^r}u-%lhxwn7Kyw-~eW?D8=E{d0dHcp=R6L#A@Ro7A)!XS;lpV+=py}U+DR*){pR9 z+z8PXto5;1W*Mt$QS`zVjV^R;gwz;D{b1O*($Q%w<=||`VM6oLHJI^Hbra*Yab{}j zVz3i$!-x%#z{Sn_$qfjEUz|()`GFJdw)C+C`MWQEMK`)1#5pcH9dI)R)a|7dAWt5v zG?{IVVAw#FRQK>Cj)QJdTeDAQY@yHHV(v?}M1Go99^Zpi5~zS=02A1RfQz*%u4Z-; z9Cizti@bOGW(4dY6k{~+1TD!a*@;_!z&aFvu4UFSf7k4zQn;8yf`&Q!84gC|DIit& zB7>|lwMb7BXYBu7G;ut!gw<070UFl=L2JRXErgiTxsMzh9&3H%#WAZ60Vl{KUh$GW zWF)*{>7l!;EN4!$_GYD-?<9QBbA!7D(g&2$T zp6!1%ZQ{7Yy^CN#K+u5B2>;vrz|q*r$=t@&@sC-nSJkv#V?*;HsQ%PDcCQrGrmK+A zKZ|Spwx~b(AR|#P9f$@V-njSn^5qm|0TwVh9*j=cr(E5h-#+?KP3us9(xKmv3SC)Q zik&Jb)o)gn^Ap@Y&!#oNETNm^lGB_CX`J;nU_hjJDbpj9kW zU7$p4L?;Ib)#i+l!AcA^n{TCm@=cL99VtDQRVmADIqtIjl+g7Gr%foW{x=$$+KQkgVFrUH zWi{mKMtJ@5wM;US=1V&2+CK3@e7hRuT;MX)U=U$bC^-o)h-6KPvKXORQ+b;4MtFKb z4jhuNICG8qPt4eb@vac!2h1KE!k3#L48-VkOs|+{x4vZb=s$&Dz$||HM={adq{~77 zLV)f&+j}$>-J7mzd~X4b!EqF*N=7g}(NXFLS&*Mq1${a6Z4idU8qWb;|MgAa&X*84 z0ehtsmV^_nt6<7VTQw`DBG-@kiONOulQ0x(bWdX+VR(+d!4ohz6iL|I>GATuHnZuBW)qMK^yAzT;6Z1AoW($S-$%z>S z(|8f6+?1eC$9b3KQE+mEv`q8nLBBmz-3xia&?8BQ_-nnF>poT^A zDC8e@OFFJN1u~a7Olnoa%d3SlOVHWYBBpyGfU-^=sL!c@V?3n08IL10jMZJGq!v5l zV|;Vw7wjonkUgM7LEAYRHYc#_S8SO0lo9TEOmv6nNT} z65ubT@G)=gh0o-5k+RG8Ehiq-B1fOwRqOFslKM3HsJWorw1B^S8>xgHyR2E4wTFZ? zPXGyeenXMEBOtad;9&D^tm~Kl1dBR}T?&{q)F|T~6?gZfZOl`JuRo(%sHyDym5$^%69>m8BXVV>MgXf1x_X=#tWr0{eP#b28oNgYu3-opE$KYk-pvNH?|{hrkal zN{Vg^dayrLi9md3)Pro+4fuj*JGfhmbt3SB%%i89du@e^T((EO;b*crU)1-dUM)+8}5<{+1a{3qf#+IK%>sudX7!j<=pd>M` z%1~@M^LLVFhi!U6JqFM+b-t=ixoIs^4HtIPN#LncWPM3|{Wr0AM(eE9a!GL!oYxH) zdmXLZNJ7mgYvQq+_v;VPkwOUxt~{*W}YAvdj8ViL1ckj&?PCEa|U#=ql5G zSCKo}2sz@o&2&qGO&x!`xe2?vA&t%XhHvumzEPCN@5P`>3$0Fy%6F&hcKO5Y^VRl> z4YS1~%(Ze|M=hF=&RmRoP?zxe>lzYfegz;Wvv({K48UaYE1yZuF z{%+xUw;j@4e3r*8u}qxJlgkhaHLS~wO@_=u+?3JhJjZV~bs9|^d@GpWeDYSf~Y?urT?Z!VJ#eY}2w5C_Xhq8x+ z0;Z_}3ecsG*Lu2!H*IMh2VZ+WknC!>OD9xCw~{t22cOPlr_Uw1o__^`cD z7fObBz>o?E-h?TA#wU+joiwl*w8 zEPx>EkJm;wj-#3<;@;S^B)QI%a*^Rrotu5Wqn(H67+HwnpaFqORPf6zS?SF@p0_*B z?Ggx*W3ul@zuWME=KaBxoFauSYwid6ic8W$K9k}M(;G6VX(pXe?;<}vgTBw7Z3>}& zk!J-mOx`~;|AA`yF5P}&+lyw~)sph?2+~OJ&0=7gr;zxRPmR62TQ=Euvc^kRCjPaw z*ij_Uj7$8hMLqx_1t8Sfjv^#G86-H*7kD$@jy92jS++}6XG&7x=X*O*sr@IH1zYW9 z=g}ty+KjP1ht*ndooFiBIuMiY?uB-=SUGs{k{lByI(p7ieuim7K(ahfacI|Qb@R1L z6(7xSolHbOa-vr2U&MMCMpPlkuY{jl={F(6K1qrZO|^4>Sg}ZAeQJ9+wpATFRhnva zg@+{G>Jb!c+7vCjkL5Q_1vY#t@0%bzxZK?($+br2Ik;^qBwq}6-N=>iIanaI{d632 z6iTy1860?5bShMw*XqxZKL*nis=n~Y_pgb$-eSXS_0BMi{A@)3Vn(pjWvvCd%6?zN z-(@tb)kmPfGk=>Fw{)2pY1F7Cet>h_-c1!H?ARn6&r+Q7}<&i81)YYPY zn(!-vP8^zg-$@O zGplhNsGe{h|7A#{^pf{?evrFbVmjD|R-7YZk;`iBZMB6c?~0H3uzlB{IMV47FtpIS z29aQK0UzLXi%N=J(HC}ce+=xg%81lj;dpmR@;cPq24BAya)Zx>T8}l$oE3It>U}WQ zS8}1CUl|$}5hW6uzNmSZ*YN!G7#Qe<3e@ZJI_L zZY1@?R(9VjdU1)2baLKGuL4W2#h`w!=$Wg&O%$Jd4vv24+CciU1DI!%w*y8xukXRl zG1kdZ5|SRvLC9f+YeyF9>&7Me`X9*q&ITPbUOTde5gSLL%1#s#@m>$KGT_WyCAVCS zx@ofT>EK49Gz@Lgi<=`fDFa_@6CXZJOi^5TupKoGxF|elnt4DP+5#XlF%HBgRF3|3 z6w+VF$Mq!!Ho_(p9WySTV%Z;IZ?^v_^dH7dAAe&U?FdEZ;BTSvheVN~<1ZQTs71p5 zDB)kMPZ6(de(nIqCa&vYYJjl~M8ZatDgJX#h3DR}UL0l!`8OTR`=0)}^pCi5A=7`v zB2rBGCu>3@6=X7LfJ%^O7y;7VhqyKk+g*#9{ao2j(FkG}3XO!MQ2KKohwz@nn2gAc zDT>w%2lAZE=2`H?_*G8|O``_(6wlxe@d)MqcoLiGZyX3VkaXJ}{3Jgrj_6wbT3;YA ztzdu*Z658^m7>U%7y(r@$IA|V`O$jYxeUt~WnY-Dlhy9GCcJPabSMZQBwkX+e*XXtIonh1_Rpcs2i z308#=lQL6(KBbd!Aey*R&-bB`Xv=|Tv$?J#U7kx5FMi9W@Z7Ts!SeE6=Y(VjYidUn zpS8Uq{vb8rfUQrOU?(@}rgTi=+ZJ&x=J<9SXu)~Ue%zY8P~P-NVgMIR%Q=wr}Fz|3aSc`Q=og@9tMMYddW(q-UR36ToO zI2?)}y3fe$IoeJX6CGTwEDAMTBjjBE&O&7<1<-=Xl!YyFuP7ah>26`fMxOzWZ zFfCo5Gilp*?F#bL=l=Vx(p3dke1=ye(HOjQGbH_0EF|4moXCUktB3ri$=Q%cKxw3r z`u8Lz^?9n1BXgNy@#K?3uccABSi{;MNOS5LCY-5TC=9-g@v%=2uS);j5oPJ;i4z7m zqBdMWK#2e8i2fBlN#Alz|A+Va0U7)_Uz0Jo^nF7nO=oSqzN22|Fw;2JP#f5ukbUI+ zzDWa^NN?OGTb7BxK1=)JlxF3pPFF_^$yL#~LqU82zqkFlCo{BDaok$L56AbNW5lho zsBc2ZCnEIkkg2b>TW=q0XKi)sJR;1G-2!o013j}_IPsa%Ok(EOhK(VjxTjyE8M87Q8!Q@(Cx|iU_D1 zTN5!g_#$|;AuapHKJA!;usIgBEK1&#yrQh4g`xU%6d?2caw8**NA47-6%DQ*#>$&Z z*5RNJmCC^}lcwfzXR)*4Q6e@yt-+OA>7yUz?z8()7MbpSMZ*24*W-F$hcs^OHuHNl zUuT(T?eCq%iP24sfQ^wzj=pg3R?V&gKKMqe0v%q`bO zih;@FURpNbJ7;0Lm1DzVgyO_R8g(~n_AKXX;b0n2#3a51-p%%w_R)mNY}(|HGSz{J z#K;8-^x)a(*xLc4GNI>36>|0#ID)Gmuf7L5YH+{lnYKSpK<@AlcCsG*zFX&jFd(xP z=~{zQqJI;J3P8A+&ttz73kYZbr2DCu+|ZFwf#&kv^Y~K`Nvs1GE^Q_B6gXQusp@Wr zTqZc(jdL9gvE>kHFRMqR=C#8!^uC`IMEZjr0KD@9=v`h?u zNag|%5CDR*xt5!_wTV&Tgl~lmg;r^TK2gK|4fItb_1o$LB)A!u+-dm8KpRSG^Mpw2 z{khVr(`&3+rHiGoBl^MbXM+~zR2dsjPou-&o;p^5@3#@I)zeyBbY=?L_OV*&*dCJ# z<0;ReebZpjTQIyybxw`qw|+{Qkm^czr7ebi(Pd$Ku!!C<3IF}f)VYmy(;`CAhT*(E zZ?4U=cjdF(;XEK9;G~`;fp0G#FB4GetLcV;S*fl09H-Y}fBuA%WC9+n)vY-~#wvU@ zpqU*e9Y_+&rgb~S_W}B&Z6wHc>o8@vD?L2ZJZrlvy*bmI;B3#%XGQW3zq8OIf2Tn& zW&`%iiB(<1DAP0zBJ2ZHB~m@oazJyfEJ_%-Cm8=v*()BX?R4A%nUxl|d3lJS3 z98;g)Oo!Lta5#gF`ydJ$F{eU^D4dd5g_GO4a*0FBX@DcZZr`M;U8<} zb6vri&SvfMKi^Jc?69PYl54E2%oL6|MW4Fkca!(eAezZ~n_DLE2< zVfJz`s$QNyu}PRBjpCVk#XBhMPO8r96!t zx_stP8l=o{@pw{RTai<+=4gVeSOXe~7)QJvI@`WK9q2D)XLkb;TecmVwvkOKO#{;w z1WI?uYoSWO`G(wgd3Aff@@b;@*W>i)4nq@3D7#;;jGSgWG@6S`YkzuouPR64w4Snp zxLy>=CfGE`t~AhpB6c^IA(0fDU>KUX)Y26Z?7;m=Auvk+7{shk=Vnm;b8H}8K%b(R zZu5`e@PZW>C14obg77M20IJSjs$l=1feB~}yc=?nuhDL(0(+tCz<(iq18oG%nQo|R zR@TK|8|XK|kTmhB<+R(O2^-nY(QWY}yR`nu>A$)won2iwhcqvF1V!uOk5euQ_+QJD zdjPWT&`g2b|D_J({}me^^U7z~ZC6^arXgo`z7;T{m3#3&l~JwQZXfyPa6|q_(-8n& zOv(t$(cF+%13p$$mylEsA_LS1>sSq-dKzUB;0Wh1|D)r7aQ}bmBD4bDC5!GHlgw5& z!vzi4IZLpm%n$CDGiewMEyx=^J9B`ca_tY-VF5jCqJU+2{CT7;^Y^|y>+?)kG$`zX z#h5fmlip!`o&Yano0z~R^X%-rS`s zNek2E$!{#vzTlDuHnE|N3zl`-=*)8#AZK~kLG4w-R#@_t0n5}L^D5Ad5BX72h0ksT z2i)zsTPICjZW#a7m6*%KtXuZ~?*5G)s6Af++`me2ARv_gv9~6+Hcm?V23CLhfA#Sj z(W{I|L02^QUx>FD?1dge%=#=uBj(d}l-3{_0in7Vid(GOc5e!oVI3gqdW+axyFtFR zXQ#vG1MM;+2E1>U)NvD(5`jC7NhX>`F|aF0{P^Z5Nib}-S7~1( zP15pY@GJwn*Y`dT9TdGNK*P<^dcV|szqpW5rvXLSOaLO*_ zt4jiciW_gtx^${@fGpbXPtxK!t$KTF<> zELox?mJ@@+RFz4L)Ra6K?WI2F>p4`{Y@CX1!IX zrNW9hy!et{{u~l8@j*q#^aAa{4c)Jrd*c{^5qI~Zj=uYWr2dxr?RQJ&@aW|)G#fn! zzd;fdwLmYpui@!tW}2|3lVJHjuX6daqU&f6_x3-N!RMOE&p|?n;F-{cxop`IV{EpBlkBECGD7(v_{|w1I9-B)_Y3k5>Ix5-MlMUCvFs ztI5t`!O{SNx7;G_sE0x#IF7ldFHl>sDE7AOE+ms6~vYW-xBYbJ2xzbjnCzP4`<;)g)J2!!Q_;g1T$#ju&>Ex6IPP~ly*b7mO1wA-bAqrA+~lULu2ZrpLC_n zyBC%FVb(QQ`$PspzJ+lh<3{$K^iyFC39sIT$YZlO)QD^$_=)hYQL7A_!m%W|-`r3V z0ZxgdAP@6v@N4vkrWa)6q&^}Xs6}x6$W7FbLVD|~z?HeZJmQcaA&^VUYfdax_?hH& z6Z|F3+T29uy!X!o&(1!e>hOzBG|RIJF{oQ8cH+UF8JPvIOt@Atyq}n}%Df1=w17u& z!hJ$mxDJoe24%xO0n6h*@*Kb*bby=&1P~P9mnQ;(CJpiT1Kc0cfbUWNXEOZnSyLFW zkQ&=K=_z3XcS0}j zWKLqh$Sr`&@cx5v6Yyl!Ur$v1gBq}*ceVxy@n`h^%8A8|`RZ03Fd!++Un%QiVINaO)j{yHI8S-~N{~1jA7Z)I)D>opZ|0}feck;h)e*eY5$MZkL_-`}m z@0R>u#Fzg6B>oS({`bNEbE*FqH4qSd(7(z4&xK!33LG%afPmlt01cReG@*Y!{U1a0 BSxW!_ literal 0 HcmV?d00001 diff --git a/docu/Locales/Vertaling_-_Ubersetzung_-_Translate_-_Bank_Details_E_F.docx b/docu/Locales/Vertaling_-_Ubersetzung_-_Translate_-_Bank_Details_E_F.docx new file mode 100644 index 0000000000000000000000000000000000000000..63756c317f6860a98e6194dbfd3298c915d1bb39 GIT binary patch literal 36347 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 J!8=_b9sm; { }) }) - describe('navigator language is "fr-FR" (not supported)', () => { + describe('navigator language is "fr-FR"', () => { + const languageGetter = jest.spyOn(navigator, 'language', 'get') + + it('shows France as language ', async () => { + languageGetter.mockReturnValue('fr-FR') + wrapper.vm.setCurrentLanguage() + await wrapper.vm.$nextTick() + expect(wrapper.find('button.dropdown-toggle').text()).toBe('France - fr') + }) + }) + + describe('navigator language is "nl-NL"', () => { + const languageGetter = jest.spyOn(navigator, 'language', 'get') + + it('shows France as language ', async () => { + languageGetter.mockReturnValue('nl-NL') + wrapper.vm.setCurrentLanguage() + await wrapper.vm.$nextTick() + expect(wrapper.find('button.dropdown-toggle').text()).toBe('Niederland - nl') + }) + }) + + describe('navigator language is "it-IT" (not supported)', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') it('shows English as language ', async () => { - languageGetter.mockReturnValue('fr-FR') + languageGetter.mockReturnValue('it-IT') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() expect(wrapper.find('button.dropdown-toggle').text()).toBe('English - en') diff --git a/frontend/src/components/LanguageSwitch2.spec.js b/frontend/src/components/LanguageSwitch2.spec.js index 85a8afa45..4b07c4d5b 100644 --- a/frontend/src/components/LanguageSwitch2.spec.js +++ b/frontend/src/components/LanguageSwitch2.spec.js @@ -75,10 +75,28 @@ describe('LanguageSwitch', () => { 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 Español as language ', async () => { + languageGetter.mockReturnValue('fr-FR') + wrapper.vm.setCurrentLanguage() + await wrapper.vm.$nextTick() + expect(wrapper.findAll('span.locales').at(3).text()).toBe('France') + }) + }) + describe('navigator language is "nl-NL"', () => { + const languageGetter = jest.spyOn(navigator, 'language', 'get') + it('shows Español as language ', async () => { + languageGetter.mockReturnValue('nl-NL') + wrapper.vm.setCurrentLanguage() + await wrapper.vm.$nextTick() + expect(wrapper.findAll('span.locales').at(4).text()).toBe('Niederlande') + }) + }) + describe('navigator language is "it-IT" (not supported)', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') it('shows English as language ', async () => { - languageGetter.mockReturnValue('fr-FR') + languageGetter.mockReturnValue('it-IT') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() expect(wrapper.findAll('span.locales').at(0).text()).toBe('English') diff --git a/frontend/src/components/LanguageSwitch2.vue b/frontend/src/components/LanguageSwitch2.vue index e88050047..52c9654ac 100644 --- a/frontend/src/components/LanguageSwitch2.vue +++ b/frontend/src/components/LanguageSwitch2.vue @@ -7,9 +7,26 @@ class="pointer pr-2" :class="$store.state.language === lang.code ? 'c-grey' : 'c-blau'" > - {{ lang.name }} - {{ locales.length - 1 > index ? $t('math.pipe') : '' }} + {{ lang.name }} + + {{ locales.length - 1 > index ? $t('math.pipe') : '' }} + + + + + {{ lang.name }} + + {{ locales.length - 1 > index ? $t('math.pipe') : '' }} + + + diff --git a/frontend/src/components/LanguageSwitchSelect.vue b/frontend/src/components/LanguageSwitchSelect.vue index 5803a6300..109c020ff 100644 --- a/frontend/src/components/LanguageSwitchSelect.vue +++ b/frontend/src/components/LanguageSwitchSelect.vue @@ -17,6 +17,8 @@ export default { { value: 'de', text: this.$t('settings.language.de') }, { value: 'en', text: this.$t('settings.language.en') }, { value: 'es', text: this.$t('settings.language.es') }, + { value: 'fr', text: this.$t('settings.language.fr') }, + { value: 'nl', text: this.$t('settings.language.nl') }, ], } }, diff --git a/frontend/src/i18n.js b/frontend/src/i18n.js index 488012ce2..144085eab 100644 --- a/frontend/src/i18n.js +++ b/frontend/src/i18n.js @@ -4,6 +4,8 @@ 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' +import fr from 'vee-validate/dist/locale/fr' +import nl from 'vee-validate/dist/locale/nl' Vue.use(VueI18n) @@ -33,6 +35,18 @@ function loadLocaleMessages() { ...messages[locale], } } + if (locale === 'fr') { + messages[locale] = { + validations: fr, + ...messages[locale], + } + } + if (locale === 'nl') { + messages[locale] = { + validations: nl, + ...messages[locale], + } + } } }) return messages @@ -78,6 +92,32 @@ const numberFormats = { 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 = { @@ -165,6 +205,62 @@ const dateTimeFormats = { 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({ diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index bea2b5c98..317754674 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -247,6 +247,8 @@ "de": "Deutsch", "en": "English", "es": "Español", + "fr": "French", + "nl": "Dutch", "success": "Deine Sprache wurde erfolgreich geändert." }, "name": { diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index da9ae4abf..98d4d1237 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -246,7 +246,9 @@ "changeLanguage": "Change language", "de": "Deutsch", "en": "English", - "es": "Español", + "es": "Spanish", + "fr": "French", + "nl": "Dutch", "success": "Your language has been successfully updated." }, "name": { diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json index fa2cd31a9..81fca252b 100644 --- a/frontend/src/locales/es.json +++ b/frontend/src/locales/es.json @@ -247,6 +247,8 @@ "de": "Deutsch", "en": "English", "es": "Español", + "fr": "Francés", + "nl": "Holandés", "success": "Tu idioma ha sido cambiado con éxito." }, "name": { diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json new file mode 100644 index 000000000..c37f5777b --- /dev/null +++ b/frontend/src/locales/fr.json @@ -0,0 +1,326 @@ +{ + "100": "100%", + "1000thanks": "1000 mercis pour être avec nous!", + "125": "125%", + "85": "85%", + "advanced-calculation": "Calcul avancé", + "auth": { + "left": { + "dignity": "Dignité", + "donation": "Donation", + "gratitude": "Gratitude", + "hasAccount": "Vous avez 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", + "myContributions": "Mes contributions aux biens communs", + "other-communities": "Autres communautés", + "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 {monthAndYear}, vous pouvez encore déclarer {creation} 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" + }, + "decay": { + "before_startblock_transaction": "Cette transaction n´est pas péremptoire.", + "calculation_decay": "Calcul de la perte", + "calculation_total": "Calcul du montant total", + "decay": "Perte", + "decay_introduced": "Perte engagée le:", + "decay_since_last_transaction": "Perte depuis la dernière transaction", + "last_transaction": "Dernière transaction:", + "past_time": "Le temps a expiré", + "Starting_block_decay": "Départ de la perte", + "total": "Total", + "types": { + "creation": "Créé", + "noDecay": "Aucune perte", + "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 application {version}", + "copyright": { + "link": "Académie Gradido", + "year": "© {year}" + }, + "imprint": "Notification légale", + "privacy_policy": "Politique privée", + "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 à envoyer de GDD.", + "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": "QR Code Scanner - Scannez le code QR 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 le 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 codes QR", + "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é", + "logout": "Déconnexion", + "members_area": "Partie réservée aux membres", + "overview": "Aperçu", + "profile": "Mon profile", + "send": "Envoyer", + "support": "Aide", + "transactions": "Transactions" + }, + "qrCode": "Code QR", + "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 politique de confidentialité .", + "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." + } + }, + "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 {count} transactions." + }, + "transaction-link": { + "send_you": "veut vous envoyer" + }, + "via_link": "par lien", + "welcome": "Bienvenu dans la communauté" +} diff --git a/frontend/src/locales/index.js b/frontend/src/locales/index.js index 17d41cad2..64448acc7 100644 --- a/frontend/src/locales/index.js +++ b/frontend/src/locales/index.js @@ -17,6 +17,18 @@ const locales = [ iso: 'es-ES', enabled: true, }, + { + name: 'French', + code: 'fr', + iso: 'fr-FR', + enabled: true, + }, + { + name: 'Dutch', + code: 'nl', + iso: 'nl-NL', + enabled: true, + }, ] export default locales diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json new file mode 100644 index 000000000..b433065c6 --- /dev/null +++ b/frontend/src/locales/nl.json @@ -0,0 +1,326 @@ +{ + "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", + "myContributions": "Mijn bijdragen voor het algemeen belang", + "other-communities": "Verdere gemeenschappen", + "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 {monthAndYear} kun je nog {creation} 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" + }, + "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": "QR Code Scanner - 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", + "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 Datenschutzerklärung.", + "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." + } + }, + "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 {count} Transacties bekijken " + }, + "transaction-link": { + "send_you": "stuurt jou" + }, + "via_link": "via een link", + "welcome": "Welkom in de gemeenschap" +} From d54a04f825b82140c4c06a25ec468b42708f8f06 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 16 Aug 2022 13:53:36 +0200 Subject: [PATCH 05/64] remove statistics files --- admin/src/graphql/communityStatistics.js | 15 ---- backend/src/auth/RIGHTS.ts | 1 - .../src/graphql/model/CommunityStatistics.ts | 26 ------- .../graphql/resolver/StatisticsResolver.ts | 77 ------------------- 4 files changed, 119 deletions(-) delete mode 100644 admin/src/graphql/communityStatistics.js delete mode 100644 backend/src/graphql/model/CommunityStatistics.ts delete mode 100644 backend/src/graphql/resolver/StatisticsResolver.ts diff --git a/admin/src/graphql/communityStatistics.js b/admin/src/graphql/communityStatistics.js deleted file mode 100644 index 868bfd02a..000000000 --- a/admin/src/graphql/communityStatistics.js +++ /dev/null @@ -1,15 +0,0 @@ -import gql from 'graphql-tag' - -export const communityStatistics = gql` - query { - communityStatistics { - totalUsers - activeUsers - deletedUsers - totalGradidoCreated - totalGradidoDecayed - totalGradidoAvailable - totalGradidoUnbookedDecayed - } - } -` diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index a58d0aa2b..1e38eab7f 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -48,5 +48,4 @@ export enum RIGHTS { CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK', DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK', UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK', - COMMUNITY_STATISTICS = 'COMMUNITY_STATISTICS', } diff --git a/backend/src/graphql/model/CommunityStatistics.ts b/backend/src/graphql/model/CommunityStatistics.ts deleted file mode 100644 index 61354115c..000000000 --- a/backend/src/graphql/model/CommunityStatistics.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ObjectType, Field } from 'type-graphql' -import Decimal from 'decimal.js-light' - -@ObjectType() -export class CommunityStatistics { - @Field(() => Number) - totalUsers: number - - @Field(() => Number) - activeUsers: number - - @Field(() => Number) - deletedUsers: number - - @Field(() => Decimal) - totalGradidoCreated: Decimal - - @Field(() => Decimal) - totalGradidoDecayed: Decimal - - @Field(() => Decimal) - totalGradidoAvailable: Decimal - - @Field(() => Decimal) - totalGradidoUnbookedDecayed: Decimal -} diff --git a/backend/src/graphql/resolver/StatisticsResolver.ts b/backend/src/graphql/resolver/StatisticsResolver.ts deleted file mode 100644 index 4c1500839..000000000 --- a/backend/src/graphql/resolver/StatisticsResolver.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Resolver, Query, Authorized } from 'type-graphql' -import { RIGHTS } from '@/auth/RIGHTS' -import { CommunityStatistics } from '@model/CommunityStatistics' -import { User as DbUser } from '@entity/User' -import { Transaction as DbTransaction } from '@entity/Transaction' -import { getConnection } from '@dbTools/typeorm' -import Decimal from 'decimal.js-light' -import { calculateDecay } from '@/util/decay' - -@Resolver() -export class StatisticsResolver { - @Authorized([RIGHTS.COMMUNITY_STATISTICS]) - @Query(() => CommunityStatistics) - async communityStatistics(): Promise { - const allUsers = await DbUser.find({ withDeleted: true }) - - let totalUsers = 0 - let activeUsers = 0 - let deletedUsers = 0 - - let totalGradidoAvailable: Decimal = new Decimal(0) - let totalGradidoUnbookedDecayed: Decimal = new Decimal(0) - - const receivedCallDate = new Date() - - for (let i = 0; i < allUsers.length; i++) { - if (allUsers[i].deletedAt) { - deletedUsers++ - } else { - totalUsers++ - const lastTransaction = await DbTransaction.findOne({ - where: { userId: allUsers[i].id }, - order: { balanceDate: 'DESC' }, - }) - if (lastTransaction) { - activeUsers++ - const decay = calculateDecay( - lastTransaction.balance, - lastTransaction.balanceDate, - receivedCallDate, - ) - if (decay) { - totalGradidoAvailable = totalGradidoAvailable.plus(decay.balance.toString()) - totalGradidoUnbookedDecayed = totalGradidoUnbookedDecayed.plus(decay.decay.toString()) - } - } - } - } - - const queryRunner = getConnection().createQueryRunner() - await queryRunner.connect() - - const { totalGradidoCreated } = await queryRunner.manager - .createQueryBuilder() - .select('SUM(transaction.amount) AS totalGradidoCreated') - .from(DbTransaction, 'transaction') - .where('transaction.typeId = 1') - .getRawOne() - - const { totalGradidoDecayed } = await queryRunner.manager - .createQueryBuilder() - .select('SUM(transaction.decay) AS totalGradidoDecayed') - .from(DbTransaction, 'transaction') - .where('transaction.decay IS NOT NULL') - .getRawOne() - - return { - totalUsers, - activeUsers, - deletedUsers, - totalGradidoCreated, - totalGradidoDecayed, - totalGradidoAvailable, - totalGradidoUnbookedDecayed, - } - } -} From 4e69e4de88c2dee8f070e7a33746a4d05e311ec5 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 16 Aug 2022 14:25:37 +0200 Subject: [PATCH 06/64] fix test --- .../src/components/LanguageSwitch.spec.js | 65 ++++++++++++++++++- .../src/components/LanguageSwitch2.spec.js | 23 +++---- 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/frontend/src/components/LanguageSwitch.spec.js b/frontend/src/components/LanguageSwitch.spec.js index c647072cb..0fd9be1dc 100644 --- a/frontend/src/components/LanguageSwitch.spec.js +++ b/frontend/src/components/LanguageSwitch.spec.js @@ -87,7 +87,7 @@ describe('LanguageSwitch', () => { languageGetter.mockReturnValue('fr-FR') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.find('button.dropdown-toggle').text()).toBe('France - fr') + expect(wrapper.find('button.dropdown-toggle').text()).toBe('French - fr') }) }) @@ -98,7 +98,7 @@ describe('LanguageSwitch', () => { languageGetter.mockReturnValue('nl-NL') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.find('button.dropdown-toggle').text()).toBe('Niederland - nl') + expect(wrapper.find('button.dropdown-toggle').text()).toBe('Dutch - nl') }) }) @@ -143,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('French - 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('Dutch - nl') + }) + }) + describe('dropdown menu', () => { 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', () => { @@ -159,6 +177,14 @@ describe('LanguageSwitch', () => { it('has Español as second language to choose', () => { 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('French') + }) + + it('has Dutch as second language to choose', () => { + expect(wrapper.findAll('li').at(4).text()).toBe('Dutch') + }) }) }) @@ -184,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', + }, + }), + ) + }) }) }) }) diff --git a/frontend/src/components/LanguageSwitch2.spec.js b/frontend/src/components/LanguageSwitch2.spec.js index 4b07c4d5b..05edb99a2 100644 --- a/frontend/src/components/LanguageSwitch2.spec.js +++ b/frontend/src/components/LanguageSwitch2.spec.js @@ -81,7 +81,7 @@ describe('LanguageSwitch', () => { languageGetter.mockReturnValue('fr-FR') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.findAll('span.locales').at(3).text()).toBe('France') + expect(wrapper.findAll('span.locales').at(3).text()).toBe('French') }) }) describe('navigator language is "nl-NL"', () => { @@ -90,7 +90,7 @@ describe('LanguageSwitch', () => { languageGetter.mockReturnValue('nl-NL') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.findAll('span.locales').at(4).text()).toBe('Niederlande') + expect(wrapper.findAll('span.locales').at(4).text()).toBe('Dutch') }) }) describe('navigator language is "it-IT" (not supported)', () => { @@ -130,7 +130,7 @@ describe('LanguageSwitch', () => { }) describe('language menu', () => { 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', () => { expect(wrapper.findAll('span.locales').at(0).text()).toBe('English') @@ -141,6 +141,12 @@ describe('LanguageSwitch', () => { it('has Español as third language to choose', () => { expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español') }) + it('has French as third language to choose', () => { + expect(wrapper.findAll('span.locales').at(3).text()).toBe('French') + }) + it('has Dutch as third language to choose', () => { + expect(wrapper.findAll('span.locales').at(4).text()).toBe('Dutch') + }) }) }) @@ -155,17 +161,6 @@ describe('LanguageSwitch', () => { }), ) }) - - // it("with locale 'en'", () => { - // wrapper.findAll('span.locales').at(0).trigger('click') - // expect(updateUserInfosMutationMock).toBeCalledWith( - // expect.objectContaining({ - // variables: { - // locale: 'en', - // }, - // }), - // ) - // }) }) }) }) From a1f6ca39d3e157d3daa4639c6d37910f11ac5ad9 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 16 Aug 2022 14:27:24 +0200 Subject: [PATCH 07/64] fix test 2 --- frontend/src/components/LanguageSwitch.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/LanguageSwitch.spec.js b/frontend/src/components/LanguageSwitch.spec.js index 0fd9be1dc..7bdce0586 100644 --- a/frontend/src/components/LanguageSwitch.spec.js +++ b/frontend/src/components/LanguageSwitch.spec.js @@ -83,7 +83,7 @@ describe('LanguageSwitch', () => { describe('navigator language is "fr-FR"', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') - it('shows France as language ', async () => { + it('shows French as language ', async () => { languageGetter.mockReturnValue('fr-FR') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() @@ -94,7 +94,7 @@ describe('LanguageSwitch', () => { describe('navigator language is "nl-NL"', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') - it('shows France as language ', async () => { + it('shows Dutch as language ', async () => { languageGetter.mockReturnValue('nl-NL') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() From 95779bb09f5d316b580ea1a91def2c5b6a5ed163 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 16 Aug 2022 14:34:06 +0200 Subject: [PATCH 08/64] fix test 3 --- .../src/components/LanguageSwitch2.spec.js | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/LanguageSwitch2.spec.js b/frontend/src/components/LanguageSwitch2.spec.js index 05edb99a2..be7498138 100644 --- a/frontend/src/components/LanguageSwitch2.spec.js +++ b/frontend/src/components/LanguageSwitch2.spec.js @@ -77,7 +77,7 @@ describe('LanguageSwitch', () => { }) describe('navigator language is "fr-FR"', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') - it('shows Español as language ', async () => { + it('shows French as language ', async () => { languageGetter.mockReturnValue('fr-FR') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() @@ -86,7 +86,7 @@ describe('LanguageSwitch', () => { }) describe('navigator language is "nl-NL"', () => { const languageGetter = jest.spyOn(navigator, 'language', 'get') - it('shows Español as language ', async () => { + it('shows Dutch as language ', async () => { languageGetter.mockReturnValue('nl-NL') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() @@ -128,6 +128,22 @@ describe('LanguageSwitch', () => { expect(wrapper.findAll('span.locales').at(2).text()).toBe('Español') }) }) + 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('French') + }) + }) + 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('Dutch') + }) + }) describe('language menu', () => { it('has English, German and Español as languages to choose', () => { expect(wrapper.findAll('span.locales')).toHaveLength(5) From debbc64c8182f99e1d579c92e0c5dda86447bf41 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 16 Aug 2022 14:44:25 +0200 Subject: [PATCH 09/64] change login local switch style --- frontend/src/components/LanguageSwitch2.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/LanguageSwitch2.vue b/frontend/src/components/LanguageSwitch2.vue index 52c9654ac..299748416 100644 --- a/frontend/src/components/LanguageSwitch2.vue +++ b/frontend/src/components/LanguageSwitch2.vue @@ -7,13 +7,13 @@ class="pointer pr-2" :class="$store.state.language === lang.code ? 'c-grey' : 'c-blau'" > - {{ lang.name }} - + {{ lang.name }} + {{ locales.length - 1 > index ? $t('math.pipe') : '' }} - + - {{ lang.name }} - + {{ lang.name }} + {{ locales.length - 1 > index ? $t('math.pipe') : '' }} From 01b4aa11cadbe420eb6804b3d0960f91371136ff Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:21:59 +0200 Subject: [PATCH 10/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index c37f5777b..5bd2cccbd 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -1,6 +1,6 @@ { "100": "100%", - "1000thanks": "1000 mercis pour être avec nous!", + "1000thanks": "1000 mercis d'être avec nous!", "125": "125%", "85": "85%", "advanced-calculation": "Calcul avancé", From 6f1f2b7f8b12789f585c6b99970354aa89d73adc Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:22:05 +0200 Subject: [PATCH 11/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 5bd2cccbd..eea397c9e 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -9,7 +9,7 @@ "dignity": "Dignité", "donation": "Donation", "gratitude": "Gratitude", - "hasAccount": "Vous avez déjà un compte?", + "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.", From f9f100b28baa6cc58508eda48f9715b1b1dfbbd7 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:22:12 +0200 Subject: [PATCH 12/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index eea397c9e..ecda5fe8b 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -43,7 +43,7 @@ }, "date": "Contribution pour:", "delete": "Supprimer la contribution ! Êtes-vous sûr?", - "deleted": "La contribution a été supprimée ! Mais elle restera visible.", + "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.", From 2a5c812964e7d810de3a7badfe0a15e9487e42e5 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:22:20 +0200 Subject: [PATCH 13/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index ecda5fe8b..ee4e35d40 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -178,7 +178,7 @@ "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 ", + "redeemed-title": "encaisser", "to-login": "Connexion", "to-register": "Enregistrer un nouveau compte.", "validUntil": "Valide jusqu´au", From 3f62f2e706fbb0a2c51068f27cd3bd178f47d664 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:22:30 +0200 Subject: [PATCH 14/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index ee4e35d40..cbdc962f9 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -232,7 +232,7 @@ "support": "Aide", "transactions": "Transactions" }, - "qrCode": "Code QR", + "qrCode": "QR Code", "send_gdd": "Envoyer GDD", "send_per_link": "Envoyer GDD via lien", "session": { From 5dca2a0e52f84163011ef1e180798461d51b3b1e Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:22:36 +0200 Subject: [PATCH 15/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index cbdc962f9..15d26e7bc 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -238,7 +238,7 @@ "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 ", + "logoutIn": "Se déconnecter", "warningText": "Êtes-vous toujours connecté?" }, "settings": { From 242268289e826d9a0157c601ebd56e374abb60b0 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:22:44 +0200 Subject: [PATCH 16/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 15d26e7bc..0c87c15fc 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -237,7 +237,7 @@ "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é.", + "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é?" }, From d8b7b0aa856744f998d3c17ba0ff98b7a46b2875 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:22:51 +0200 Subject: [PATCH 17/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 0c87c15fc..b7de558a5 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -176,7 +176,7 @@ "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": "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", From e7319b8250f9fcccd358346ce4a1fd7f92d550dd Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:22:58 +0200 Subject: [PATCH 18/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index b7de558a5..dbcfea995 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -45,7 +45,7 @@ "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.", + "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 {monthAndYear}, vous pouvez encore déclarer {creation} GDD.", From 8f9704f40a8a022ed2f1c2e0829e1d05fb054947 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:23:05 +0200 Subject: [PATCH 19/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index dbcfea995..6b6d24197 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -42,7 +42,7 @@ "rejected": "supprimé" }, "date": "Contribution pour:", - "delete": "Supprimer la contribution ! Êtes-vous sûr?", + "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.", From 4fab1c7991dd3c659ee2a9983781a7351eaf88e9 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:23:19 +0200 Subject: [PATCH 20/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 6b6d24197..05391f665 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -46,7 +46,7 @@ "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.", + "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 {monthAndYear}, vous pouvez encore déclarer {creation} GDD.", "yourContribution": "Votre contribution au bien commun" From 6fdbe0fd12a4589b0ca707d846740a12e56b63d0 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:23:37 +0200 Subject: [PATCH 21/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 05391f665..e2a3a0382 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -63,7 +63,7 @@ }, "decay": { "before_startblock_transaction": "Cette transaction n´est pas péremptoire.", - "calculation_decay": "Calcul de la perte", + "calculation_decay": "Calcul de la décroissance", "calculation_total": "Calcul du montant total", "decay": "Perte", "decay_introduced": "Perte engagée le:", From 434ce9c07a3845df30276e2efcae630adbb9fbb0 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:23:51 +0200 Subject: [PATCH 22/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index e2a3a0382..7f9f7f109 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -65,7 +65,7 @@ "before_startblock_transaction": "Cette transaction n´est pas péremptoire.", "calculation_decay": "Calcul de la décroissance", "calculation_total": "Calcul du montant total", - "decay": "Perte", + "decay": "Décroissance", "decay_introduced": "Perte engagée le:", "decay_since_last_transaction": "Perte depuis la dernière transaction", "last_transaction": "Dernière transaction:", From 06442588553cb1e421695d6b6b1ffbebb2c4ca9e Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:24:05 +0200 Subject: [PATCH 23/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 7f9f7f109..49f0af8a5 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -66,7 +66,7 @@ "calculation_decay": "Calcul de la décroissance", "calculation_total": "Calcul du montant total", "decay": "Décroissance", - "decay_introduced": "Perte engagée le:", + "decay_introduced": "Décroissance engagée le:", "decay_since_last_transaction": "Perte depuis la dernière transaction", "last_transaction": "Dernière transaction:", "past_time": "Le temps a expiré", From be532149c2c0719a636efbb1edb56f2b5f7e4234 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:24:16 +0200 Subject: [PATCH 24/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 49f0af8a5..81c0d72d6 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -67,7 +67,7 @@ "calculation_total": "Calcul du montant total", "decay": "Décroissance", "decay_introduced": "Décroissance engagée le:", - "decay_since_last_transaction": "Perte depuis la dernière transaction", + "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épart de la perte", From 8a41aa33d242e0642b518eb63f4d808cac8e855a Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:24:29 +0200 Subject: [PATCH 25/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 81c0d72d6..837cd65f2 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -70,7 +70,7 @@ "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épart de la perte", + "Starting_block_decay": "Début de la décroissance", "total": "Total", "types": { "creation": "Créé", From 84b7d7db7d4049d135f0194a1afad76c122378de Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:24:40 +0200 Subject: [PATCH 26/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 837cd65f2..bda1bc5f6 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -74,7 +74,7 @@ "total": "Total", "types": { "creation": "Créé", - "noDecay": "Aucune perte", + "noDecay": "Aucun déclin", "receive": "Reçu", "send": "Envoyé" } From 093508cd102a3eb91f2024351527b902cf7091e9 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:24:52 +0200 Subject: [PATCH 27/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index bda1bc5f6..b81d13f96 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -93,7 +93,7 @@ }, "followUs": "Suivez-nous:", "footer": { - "app_version": "Version application {version}", + "app_version": "Version de l'application {version}", "copyright": { "link": "Académie Gradido", "year": "© {year}" From 1f91f53103e3f63123d026d9003d4d7e133f97ad Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:25:03 +0200 Subject: [PATCH 28/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index b81d13f96..cbade533a 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -99,7 +99,7 @@ "year": "© {year}" }, "imprint": "Notification légale", - "privacy_policy": "Politique privée", + "privacy_policy": "Politique de confidentialité", "short_hash": "({shortHash})", "whitepaper": "Papier blanc" }, From d4899c506b59a0222d02c43dd9e288106c179af3 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:25:21 +0200 Subject: [PATCH 29/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index cbade533a..9d145a4a3 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -122,7 +122,7 @@ "memo": "Note", "message": "Message", "new_balance": "Montant du solde après confirmation", - "no_gdd_available": "Vous n´avez pas à envoyer de GDD.", + "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", From 01c11f732589152975ee7a7a54ebcfe26452b8df Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:25:33 +0200 Subject: [PATCH 30/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 9d145a4a3..3e3ad80c6 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -128,7 +128,7 @@ "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", + "recipient": "Destinataire", "reset": "Réinitialiser", "save": "Sauvegarder", "scann_code": "QR Code Scanner - Scannez le code QR de votre partenaire", From f4b69b06d75258ef8a2078aad02232114cf82943 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:25:53 +0200 Subject: [PATCH 31/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 3e3ad80c6..56292b139 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -131,7 +131,7 @@ "recipient": "Destinataire", "reset": "Réinitialiser", "save": "Sauvegarder", - "scann_code": "QR Code Scanner - Scannez le code QR de votre partenaire", + "scann_code": "QR Code Scanner - 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", From b6bcdf9a1dc82777b23f973ee4a6d52910c2e721 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:26:05 +0200 Subject: [PATCH 32/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 56292b139..a7ccede9f 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -133,7 +133,7 @@ "save": "Sauvegarder", "scann_code": "QR Code Scanner - Scannez le QR code de votre partenaire", "sender": " Expéditeur", - "send_check": " Confirmez la transaction. Veuillez revérifier toutes les données svp!", + "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", From 7385703ae9728002b3310b7c88a5cfbdb09a6b1d Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:26:19 +0200 Subject: [PATCH 33/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index a7ccede9f..47fcb3f7b 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -132,7 +132,7 @@ "reset": "Réinitialiser", "save": "Sauvegarder", "scann_code": "QR Code Scanner - Scannez le QR code de votre partenaire", - "sender": " Expéditeur", + "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!", From 4fc6dca30a3492be904332ea94da91fb5740702c Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:26:31 +0200 Subject: [PATCH 34/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 47fcb3f7b..6cc363fb5 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -152,7 +152,7 @@ }, "GDD": "GDD", "gdd_per_link": { - "choose-amount": "Sélectionnez le montant que vous souhaitez envoyer via le lien. Vous pouvez également joindre un message. Cliquez sur ‘créer maintenant’ pour établir un lien que vous pourrez partager.", + "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éé!", From 4db5ca363f79ff6ff227e3fb4e6806d4c5691347 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:26:44 +0200 Subject: [PATCH 35/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 6cc363fb5..81755ab5f 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -158,7 +158,7 @@ "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?", + "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?", From ec76e1c488fecfdc75a4354f69549a39b44388a1 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:27:09 +0200 Subject: [PATCH 36/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 81755ab5f..05746b03f 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -170,7 +170,7 @@ "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 codes QR", + "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!", From a6843fe8db35ac699e9d80d26e01a0e330262dff Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:27:28 +0200 Subject: [PATCH 37/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 05746b03f..f8e92961c 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -173,7 +173,7 @@ "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!", + "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.", From cfce3a82dff5a6399b390db1d2ad3fbddfa918c9 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:27:39 +0200 Subject: [PATCH 38/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index f8e92961c..f96109062 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -174,7 +174,7 @@ "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": "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}.", From 16722f21ca7f1954ceb6e718a522c0f2831a6ed3 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:27:52 +0200 Subject: [PATCH 39/64] Update frontend/src/locales/fr.json Co-authored-by: Hannes Heine --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index f96109062..41ab899df 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -177,7 +177,7 @@ "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-at": "Le lien a déjà été perçu le {date}.", "redeemed-title": "encaisser", "to-login": "Connexion", "to-register": "Enregistrer un nouveau compte.", From d7a6d4e8af89ca66270e6410dbbc454240c13369 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:52:24 +0200 Subject: [PATCH 40/64] Update frontend/src/locales/en.json Co-authored-by: Moriz Wahl --- frontend/src/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 98d4d1237..49564e4eb 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -247,7 +247,7 @@ "de": "Deutsch", "en": "English", "es": "Spanish", - "fr": "French", + "fr": "Français", "nl": "Dutch", "success": "Your language has been successfully updated." }, From f1737179967ed3435670fdaf2c510201e7d0ebf3 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:52:31 +0200 Subject: [PATCH 41/64] Update frontend/src/locales/index.js Co-authored-by: Moriz Wahl --- frontend/src/locales/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/index.js b/frontend/src/locales/index.js index 64448acc7..741dbe02f 100644 --- a/frontend/src/locales/index.js +++ b/frontend/src/locales/index.js @@ -18,7 +18,7 @@ const locales = [ enabled: true, }, { - name: 'French', + name: 'Français', code: 'fr', iso: 'fr-FR', enabled: true, From 4dce60cca7e27009041a95e87c483b7e9eb8ca34 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 15:52:41 +0200 Subject: [PATCH 42/64] Update frontend/src/locales/index.js Co-authored-by: Moriz Wahl --- frontend/src/locales/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/index.js b/frontend/src/locales/index.js index 741dbe02f..aa27a2e32 100644 --- a/frontend/src/locales/index.js +++ b/frontend/src/locales/index.js @@ -24,7 +24,7 @@ const locales = [ enabled: true, }, { - name: 'Dutch', + name: 'Holandés', code: 'nl', iso: 'nl-NL', enabled: true, From 0edc3dfdc78b4b747a54945e8afda5bf790ac02b Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 16:01:03 +0200 Subject: [PATCH 43/64] Update frontend/src/locales/en.json Co-authored-by: Moriz Wahl --- frontend/src/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 49564e4eb..42d124261 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -248,7 +248,7 @@ "en": "English", "es": "Spanish", "fr": "Français", - "nl": "Dutch", + "nl": "Holandés", "success": "Your language has been successfully updated." }, "name": { From d61e18220ce8dd472f468ce1da10eedbc8656ff9 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 16:01:18 +0200 Subject: [PATCH 44/64] Update frontend/src/locales/en.json Co-authored-by: Moriz Wahl --- frontend/src/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 42d124261..55317c113 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -246,7 +246,7 @@ "changeLanguage": "Change language", "de": "Deutsch", "en": "English", - "es": "Spanish", + "es": "Español", "fr": "Français", "nl": "Holandés", "success": "Your language has been successfully updated." From 83590be51b088135ede8c9518c838fd1f29d3d21 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 16 Aug 2022 16:01:28 +0200 Subject: [PATCH 45/64] Update frontend/src/locales/de.json Co-authored-by: Moriz Wahl --- frontend/src/locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 317754674..7fc8e38a4 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -247,7 +247,7 @@ "de": "Deutsch", "en": "English", "es": "Español", - "fr": "French", + "fr": "Français", "nl": "Dutch", "success": "Deine Sprache wurde erfolgreich geändert." }, From 09c5a64f24b968b77aa031a894fdada82f235b7c Mon Sep 17 00:00:00 2001 From: ogerly Date: Wed, 17 Aug 2022 09:41:19 +0200 Subject: [PATCH 46/64] tests check --- .../src/components/LanguageSwitch2.spec.js | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/LanguageSwitch2.spec.js b/frontend/src/components/LanguageSwitch2.spec.js index be7498138..fb49a988d 100644 --- a/frontend/src/components/LanguageSwitch2.spec.js +++ b/frontend/src/components/LanguageSwitch2.spec.js @@ -141,7 +141,7 @@ describe('LanguageSwitch', () => { wrapper.vm.$store.state.language = 'nl' wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.findAll('span.locales').at(4).text()).toBe('Dutch') + expect(wrapper.findAll('span.locales').at(4).text()).toBe('Français') }) }) describe('language menu', () => { @@ -149,32 +149,28 @@ describe('LanguageSwitch', () => { expect(wrapper.findAll('span.locales')).toHaveLength(5) }) 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', () => { - 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', () => { - 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('French') + 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('Dutch') + expect(wrapper.findAll('span.locales').at(4).text()).toBe('Français') }) }) }) describe('calls the API', () => { it("with locale 'de'", () => { - wrapper.findAll('span.locales').at(1).trigger('click') + wrapper.findAll('span.locales').at(0).trigger('click') expect(updateUserInfosMutationMock).toBeCalledWith( - expect.objectContaining({ - variables: { - locale: 'de', - }, - }), + expect.objectContaining({ variables: { locale: 'de' } }), ) }) }) From 7e047ff36ffda883c0d97d1cd3cb66deb69d9b1c Mon Sep 17 00:00:00 2001 From: ogerly Date: Wed, 17 Aug 2022 10:01:03 +0200 Subject: [PATCH 47/64] fix tests for locales --- frontend/src/components/LanguageSwitch.spec.js | 12 ++++++------ frontend/src/components/LanguageSwitch2.spec.js | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frontend/src/components/LanguageSwitch.spec.js b/frontend/src/components/LanguageSwitch.spec.js index 7bdce0586..a6abc2359 100644 --- a/frontend/src/components/LanguageSwitch.spec.js +++ b/frontend/src/components/LanguageSwitch.spec.js @@ -87,7 +87,7 @@ describe('LanguageSwitch', () => { languageGetter.mockReturnValue('fr-FR') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.find('button.dropdown-toggle').text()).toBe('French - fr') + expect(wrapper.find('button.dropdown-toggle').text()).toBe('Français - fr') }) }) @@ -98,7 +98,7 @@ describe('LanguageSwitch', () => { languageGetter.mockReturnValue('nl-NL') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.find('button.dropdown-toggle').text()).toBe('Dutch - nl') + expect(wrapper.find('button.dropdown-toggle').text()).toBe('Holandés - nl') }) }) @@ -148,7 +148,7 @@ describe('LanguageSwitch', () => { wrapper.vm.$store.state.language = 'fr' wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.find('button.dropdown-toggle').text()).toBe('French - fr') + expect(wrapper.find('button.dropdown-toggle').text()).toBe('Français - fr') }) }) @@ -157,7 +157,7 @@ describe('LanguageSwitch', () => { wrapper.vm.$store.state.language = 'nl' wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.find('button.dropdown-toggle').text()).toBe('Dutch - nl') + expect(wrapper.find('button.dropdown-toggle').text()).toBe('Holandés - nl') }) }) @@ -179,11 +179,11 @@ describe('LanguageSwitch', () => { }) it('has French as second language to choose', () => { - expect(wrapper.findAll('li').at(3).text()).toBe('French') + 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('Dutch') + expect(wrapper.findAll('li').at(4).text()).toBe('Holandés') }) }) }) diff --git a/frontend/src/components/LanguageSwitch2.spec.js b/frontend/src/components/LanguageSwitch2.spec.js index fb49a988d..080cc9d42 100644 --- a/frontend/src/components/LanguageSwitch2.spec.js +++ b/frontend/src/components/LanguageSwitch2.spec.js @@ -81,7 +81,7 @@ describe('LanguageSwitch', () => { languageGetter.mockReturnValue('fr-FR') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.findAll('span.locales').at(3).text()).toBe('French') + expect(wrapper.findAll('span.locales').at(3).text()).toBe('Français') }) }) describe('navigator language is "nl-NL"', () => { @@ -90,7 +90,7 @@ describe('LanguageSwitch', () => { languageGetter.mockReturnValue('nl-NL') wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.findAll('span.locales').at(4).text()).toBe('Dutch') + expect(wrapper.findAll('span.locales').at(4).text()).toBe('Holandés') }) }) describe('navigator language is "it-IT" (not supported)', () => { @@ -117,7 +117,7 @@ describe('LanguageSwitch', () => { wrapper.vm.$store.state.language = 'de' wrapper.vm.setCurrentLanguage() 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', () => { @@ -125,7 +125,7 @@ describe('LanguageSwitch', () => { wrapper.vm.$store.state.language = 'es' wrapper.vm.setCurrentLanguage() 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', () => { @@ -133,7 +133,7 @@ describe('LanguageSwitch', () => { wrapper.vm.$store.state.language = 'fr' wrapper.vm.setCurrentLanguage() await wrapper.vm.$nextTick() - expect(wrapper.findAll('span.locales').at(3).text()).toBe('French') + expect(wrapper.findAll('span.locales').at(3).text()).toBe('Español') }) }) describe('language "nl" in store', () => { @@ -168,7 +168,7 @@ describe('LanguageSwitch', () => { describe('calls the API', () => { it("with locale 'de'", () => { - wrapper.findAll('span.locales').at(0).trigger('click') + wrapper.findAll('span.locales').at(2).trigger('click') expect(updateUserInfosMutationMock).toBeCalledWith( expect.objectContaining({ variables: { locale: 'de' } }), ) From ec6b35e09e40daad1b1218c7073da25e0590467f Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Wed, 17 Aug 2022 10:06:46 +0200 Subject: [PATCH 48/64] Update frontend/src/locales/nl.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- frontend/src/locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index b433065c6..6f5b6b996 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -157,7 +157,7 @@ "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 ", + "decay-14-day": "Vergankelijkheid voor 14 dagen", "delete-the-link": "De link verwijderen?", "deleted": "De link werd verwijderd!", "expiredOn": "Afgelopen op", From b592add9e7192094908f7c584f87c5af15f0f45b Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Wed, 17 Aug 2022 10:06:53 +0200 Subject: [PATCH 49/64] Update frontend/src/locales/nl.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- frontend/src/locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index 6f5b6b996..16fd3bfce 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -252,7 +252,7 @@ "success": "Jouw taal werd succesvol veranderd." }, "name": { - "change-name": "Naam veranderen ", + "change-name": "Naam veranderen", "change-success": "Jouw naam werd succesvol veranderd." }, "newsletter": { From 4f079ee2ca7bb4037c5be9629c3ecf7b17ad1260 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Wed, 17 Aug 2022 10:07:00 +0200 Subject: [PATCH 50/64] Update frontend/src/locales/nl.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- frontend/src/locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index 16fd3bfce..dfa629bb9 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -294,7 +294,7 @@ "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 ", + "no-whitespace": "Geen spaties en tabs", "one_number": "Getal noodzakelijk.", "special-char": "Speciaal teken noodzakelijk (bijv. _ of é)", "uppercase": "Hoofdletter noodzakelijk." From 799b03e373c315c37d2cb0603abb686669c091f1 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Wed, 17 Aug 2022 10:07:12 +0200 Subject: [PATCH 51/64] Update frontend/src/locales/nl.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- frontend/src/locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index dfa629bb9..3dc6fcb8e 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -316,7 +316,7 @@ "nullTransactions": "Je hebt nog geen transacties op jouw rekening.", "receiverDeleted": "De rekening van de ontvanger werd verwijderd", "receiverNotFound": "Ontvanger niet gevonden", - "show_all": "Alle {count} Transacties bekijken " + "show_all": "Alle {count} Transacties bekijken." }, "transaction-link": { "send_you": "stuurt jou" From f63c84fdb22ba8528b2f2b8962a5a29536d9ace1 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Wed, 17 Aug 2022 10:07:21 +0200 Subject: [PATCH 52/64] Update frontend/src/locales/nl.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- frontend/src/locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index 3dc6fcb8e..98c128e43 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -291,7 +291,7 @@ "signup": { "agree": "Ik ga akkoord met Datenschutzerklärung.", "dont_match": "De wachtwoorden zijn niet gelijk.", - "heading": " Schrijf je in door alle gegevens volledig en in de juiste velden in te vullen.", + "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", From f648420f08ebc87b0c35f2e1393f9d6640a86988 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Wed, 17 Aug 2022 10:07:41 +0200 Subject: [PATCH 53/64] Update frontend/src/locales/fr.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- frontend/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 41ab899df..e763c2f48 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -238,7 +238,7 @@ "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", + "logoutIn": "Se déconnecter ", "warningText": "Êtes-vous toujours connecté?" }, "settings": { From 21f79ece5982dec9cb0bc57e3f158472bb6c09cc Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Wed, 17 Aug 2022 10:07:54 +0200 Subject: [PATCH 54/64] Update frontend/src/locales/nl.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- frontend/src/locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index 98c128e43..a8b545296 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -145,7 +145,7 @@ "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-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" From a464f0862296ce1c5b670ea7218eab812f4aee98 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Wed, 17 Aug 2022 10:08:10 +0200 Subject: [PATCH 55/64] Update frontend/src/locales/nl.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Wolfgang Huß --- frontend/src/locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index a8b545296..201356600 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -143,7 +143,7 @@ "to": "tot", "to1": "aan", "validation": { - "gddSendAmount": " Het veld {_field_} moet een getal tussen {min} en {max} met maximaal twee cijfers achter de komma zijn", + "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." From 0a361e1ab9404510dfc07011ac8e0665e4401cd9 Mon Sep 17 00:00:00 2001 From: ogerly Date: Wed, 17 Aug 2022 12:43:00 +0200 Subject: [PATCH 56/64] change style --- frontend/src/components/LanguageSwitch2.vue | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/LanguageSwitch2.vue b/frontend/src/components/LanguageSwitch2.vue index 299748416..13ac72d18 100644 --- a/frontend/src/components/LanguageSwitch2.vue +++ b/frontend/src/components/LanguageSwitch2.vue @@ -1,16 +1,16 @@