From 851575949ae89f34af9a1730475f8f3f2b71d0f4 Mon Sep 17 00:00:00 2001
From: Julian Rother <julian@cccv.de>
Date: Sun, 14 Aug 2022 13:20:34 +0200
Subject: [PATCH] Fix/complete mfa translations

---
 uffd/mfa/templates/mfa/auth.html             |  32 ++--
 uffd/mfa/templates/mfa/setup.html            |  28 +--
 uffd/mfa/templates/mfa/setup_recovery.html   |   2 +-
 uffd/mfa/templates/mfa/setup_totp.html       |   2 +-
 uffd/translations/de/LC_MESSAGES/messages.mo | Bin 34435 -> 36213 bytes
 uffd/translations/de/LC_MESSAGES/messages.po | 185 ++++++++++++++-----
 6 files changed, 170 insertions(+), 79 deletions(-)

diff --git a/uffd/mfa/templates/mfa/auth.html b/uffd/mfa/templates/mfa/auth.html
index 31e92dcc..8b64a597 100644
--- a/uffd/mfa/templates/mfa/auth.html
+++ b/uffd/mfa/templates/mfa/auth.html
@@ -40,7 +40,7 @@
 function begin_webauthn() {
 	$('#webauthn-alert').addClass('d-none');
 	$('#webauthn-spinner').removeClass('d-none');
-	$('#webauthn-btn-text').text('Fetching credential data');
+	$('#webauthn-btn-text').text({{ _('Contacting server')|tojson }});
 	$('#webauthn-btn').prop('disabled', true);
 	fetch({{ url_for('mfa.auth_webauthn_begin')|tojson }}, {
 		method: 'POST',
@@ -49,17 +49,17 @@ function begin_webauthn() {
 			return response.arrayBuffer();
 		} else if (response.status == 403) {
 			window.location = {{ request.url|tojson }}; /* reload */
-			throw new Error('Session timed out');
+			throw new Error({{ _('Session timed out')|tojson }});
 		} else if (response.status == 404) {
-			throw new Error('You have not registered any U2F/FIDO2 devices for your account');
+			throw new Error({{ _('You have not registered any U2F/FIDO2 devices for your account')|tojson }});
 		} else {
-			throw new Error('Server error');
+			throw new Error({{ _('Server error')|tojson }});
 		}
 	}).then(CBOR.decode).then(function(options) {
-		$('#webauthn-btn-text').text('Waiting for response from your device');
+		$('#webauthn-btn-text').text({{ _('Waiting for device')|tojson }});
 		return navigator.credentials.get(options);
 	}).then(function(assertion) {
-		$('#webauthn-btn-text').text('Verifing response');
+		$('#webauthn-btn-text').text({{ _('Verifing response')|tojson }});
 		return fetch({{ url_for('mfa.auth_webauthn_complete')|tojson }}, {
 			method: 'POST',
 			headers: {'Content-Type': 'application/cbor'},
@@ -73,37 +73,37 @@ function begin_webauthn() {
 	}).then(function(response) {
 		if (response.ok) {
 			$('#webauthn-spinner').addClass('d-none');
-			$('#webauthn-btn-text').text('Success, redirecting');
+			$('#webauthn-btn-text').text({{ _('Success, redirecting')|tojson }});
 			window.location = {{ (ref or url_for('index'))|tojson }};
 		} else if (response.status == 403) {
 			window.location = {{ request.url|tojson }}; /* reload */
-			throw new Error('Session timed out');
+			throw new Error({{ _('Session timed out')|tojson }});
 		} else {
-			throw new Error('Response from authenticator rejected');
+			throw new Error({{ _('Invalid response from device')|tojson }});
 		}
 	}).catch(function(err) {
 		console.log(err);
 		/* various webauthn errors */
 		if (err.name == 'NotAllowedError')
-			$('#webauthn-alert').text('Authentication timed out, was aborted or not allowed');
+			$('#webauthn-alert').text({{ _('Authentication timed out, was aborted or not allowed')|tojson }});
 		else if (err.name == 'InvalidStateError')
-			$('#webauthn-alert').text('Device is not registered for your account');
+			$('#webauthn-alert').text({{ _('Device is not registered for your account')|tojson }});
 		else if (err.name == 'AbortError')
-			$('#webauthn-alert').text('Authentication was aborted');
+			$('#webauthn-alert').text({{ _('Authentication was aborted')|tojson }});
 		else if (err.name == 'NotSupportedError')
-			$('#webauthn-alert').text('U2F and FIDO2 devices are not supported by your browser');
+			$('#webauthn-alert').text({{ _('U2F and FIDO2 devices are not supported by your browser')|tojson }});
 		/* errors from fetch() */
 		else if (err.name == 'TypeError')
-			$('#webauthn-alert').text('Could not connect to server');
+			$('#webauthn-alert').text({{ _('Could not connect to server')|tojson }});
 		/* our own errors */
 		else if (err.name == 'Error')
 			$('#webauthn-alert').text(err.message);
 		/* fallback */
 		else
-			$('#webauthn-alert').text('Authentication failed ('+err+')');
+			$('#webauthn-alert').text({{ _('Authentication failed ')|tojson }}+'('+err+')');
 		$('#webauthn-alert').removeClass('d-none');
 		$('#webauthn-spinner').addClass('d-none');
-		$('#webauthn-btn-text').text('Try FIDO token again');
+		$('#webauthn-btn-text').text({{ _('Retry authenticate with U2F/FIDO2 device')|tojson }});
 		$('#webauthn-btn').prop('disabled', false);
 	});
 }
diff --git a/uffd/mfa/templates/mfa/setup.html b/uffd/mfa/templates/mfa/setup.html
index 04b90a4a..5d5aefaa 100644
--- a/uffd/mfa/templates/mfa/setup.html
+++ b/uffd/mfa/templates/mfa/setup.html
@@ -196,7 +196,7 @@ mfa_enabled: The user has setup at least one two-factor method. Two-factor authe
 $('#webauthn-form').on('submit', function(e) {
 	$('#webauthn-alert').addClass('d-none');
 	$('#webauthn-spinner').removeClass('d-none');
-	$('#webauthn-btn-text').text('Contacting server');
+	$('#webauthn-btn-text').text({{ _('Contacting server')|tojson }});
 	$('#webauthn-btn').prop('disabled', true);
 	fetch({{ url_for('mfa.setup_webauthn_begin')|tojson }}, {
 		method: 'POST',
@@ -204,10 +204,10 @@ $('#webauthn-form').on('submit', function(e) {
 		if (response.ok)
 			return response.arrayBuffer();
 		if (response.status == 403)
-			throw new Error('You need to generate recovery codes first');
-		throw new Error('Server error');
+			throw new Error({{ _('You need to generate recovery codes first')|tojson }});
+		throw new Error({{ _('Server error')|tojson }});
 	}).then(CBOR.decode).then(function(options) {
-		$('#webauthn-btn-text').text('Waiting for response from your device');
+		$('#webauthn-btn-text').text({{ _('Waiting for device')|tojson }});
 		return navigator.credentials.create(options);
 	}).then(function(attestation) {
 		return fetch({{ url_for('mfa.setup_webauthn_complete')|tojson }}, {
@@ -222,34 +222,34 @@ $('#webauthn-form').on('submit', function(e) {
 	}).then(function(response) {
 		if (response.ok) {
 			$('#webauthn-spinner').addClass('d-none');
-			$('#webauthn-btn-text').text('Success');
+			$('#webauthn-btn-text').text({{ _('Success')|tojson }});
 			window.location = {{ url_for('mfa.setup')|tojson }};
 		} else {
-			throw new Error('Response from authenticator rejected');
+			throw new Error({{ _('Invalid response from device')|tojson }});
 		}
 	}, function(err) {
 		console.log(err);
 		/* various webauthn errors */
 		if (err.name == 'NotAllowedError')
-			$('#webauthn-alert').text('Registration timed out, was aborted or not allowed');
+			$('#webauthn-alert').text({{ _('Registration timed out, was aborted or not allowed')|tojson }});
 		else if (err.name == 'InvalidStateError')
-			$('#webauthn-alert').text('You attempted to register a device that is already registered');
+			$('#webauthn-alert').text({{ _('Device already registered')|tojson }});
 		else if (err.name == 'AbortError')
-			$('#webauthn-alert').text('Registration was aborted');
+			$('#webauthn-alert').text({{ _('Registration was aborted')|tojson }});
 		else if (err.name == 'NotSupportedError')
-			$('#webauthn-alert').text('U2F and FIDO2 devices are not supported by your browser');
+			$('#webauthn-alert').text({{ _('U2F and FIDO2 devices are not supported by your browser')|tojson }});
 		/* errors from fetch() */
 		else if (err.name == 'TypeError')
-			$('#webauthn-alert').text('Could not connect to server');
+			$('#webauthn-alert').text({{ _('Could not connect to server')|tojson }});
 		/* our own errors */
 		else if (err.name == 'Error')
 			$('#webauthn-alert').text(err.message);
 		/* fallback */
 		else
-			$('#webauthn-alert').text('Registration failed ('+err+')');
+			$('#webauthn-alert').text({{ _('Registration failed')|tojson }}+' ('+err+')');
 		$('#webauthn-alert').removeClass('d-none');
 		$('#webauthn-spinner').addClass('d-none');
-		$('#webauthn-btn-text').text('Retry registration');
+		$('#webauthn-btn-text').text({{ _('Retry registration')|tojson }});
 		$('#webauthn-btn').prop('disabled', false);
 	});
 	return false;
@@ -261,7 +261,7 @@ if (typeof(PublicKeyCredential) != "undefined") {
 	$('#webauthn-name').prop('disabled', false);
 	{% endif %}
 } else {
-	$('#webauthn-alert').text('U2F and FIDO2 devices are not supported by your browser');
+	$('#webauthn-alert').text({{ _('U2F and FIDO2 devices are not supported by your browser')|tojson }});
 	$('#webauthn-alert').removeClass('d-none');
 }
 
diff --git a/uffd/mfa/templates/mfa/setup_recovery.html b/uffd/mfa/templates/mfa/setup_recovery.html
index a4dbf9cf..2f70cbbd 100644
--- a/uffd/mfa/templates/mfa/setup_recovery.html
+++ b/uffd/mfa/templates/mfa/setup_recovery.html
@@ -23,7 +23,7 @@
 </p>
 
 <div class="btn-toolbar">
-	<a class="ml-auto mb-2 btn btn-primary d-print-none" href="{{ url_for('mfa.setup') }}">Continue</a>
+	<a class="ml-auto mb-2 btn btn-primary d-print-none" href="{{ url_for('mfa.setup') }}">{{_("Continue")}}</a>
 	<a class="ml-2 mb-2 btn btn-light d-print-none" href="{{ methods|map(attribute='code')|join('\n')|datauri }}" download="uffd-recovery-codes">
 		{{_("Download codes")}}
 	</a>
diff --git a/uffd/mfa/templates/mfa/setup_totp.html b/uffd/mfa/templates/mfa/setup_totp.html
index d4d44702..da2e3317 100644
--- a/uffd/mfa/templates/mfa/setup_totp.html
+++ b/uffd/mfa/templates/mfa/setup_totp.html
@@ -34,7 +34,7 @@
 
 <form action="{{ url_for('mfa.setup_totp_finish', name=name) }}" method="POST" class="form">
 	<div class="row m-0">
-		<input type="text" name="code" class="form-control mb-2 mr-2 col-auto col-md" id="code" placeholder="Code" required autofocus>
+		<input type="text" name="code" class="form-control mb-2 mr-2 col-auto col-md" id="code" placeholder="{{_('Code')}}" required autofocus>
 		<button type="submit" class="btn btn-primary mb-2 col col-md-auto">{{_("Verify and complete setup")}}</button>
 	</div>
 </form>
diff --git a/uffd/translations/de/LC_MESSAGES/messages.mo b/uffd/translations/de/LC_MESSAGES/messages.mo
index cfb6bee2a20599943ba6d4931b82cbe99bdf845a..2675ce774b0fd969fc54ba5df443f0e0a845295a 100644
GIT binary patch
delta 7297
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

delta 5825
zcmex5i>bMnss5f2%Txvi28IYm1_l`h28KIaARYqG5oKWDXJBBME6Tti%)r2~R+NE(
zje&vTpeO@_4+8_k2~h?H9tH*mQ85MvkX9uz2wzu>fkBIbfx!wYo+`$`z{|kEP$0&@
zAjH7HP$vd9ubyF|7z2Y80|UcSF$M;91_p)$Vhju-AcMsi7!(;8819NOFxWFNF#H!|
zU?^l@V6YcwV31>AVAv=QG4O&o14A?e1H(OW28QJz3ndsB+!+`c9!W4T)G{zIXh||K
zC^0ZFtdL}25NBXuI1QyAOENIHG1N0K{FY>3kYr$BaFSwR5My9qh>?Q$xLAsT!GeK-
zp;-#zvprG}pC5<P=b-AYN<kd>REmLtm4SglRhoezkAZ<fTbhA^lYxO@mNdknOQa$4
zo1_^S3>g?0c1SZY@YgdiFuamxV31{CVE84?z#z)Nz#t*Rz#z@Qz@R6?z#z!Lz~Cjr
zz`y}=m<+^$sWRZ8W2li~VBlk5V3;7oz`)JGz%XA1;?UJl_1k114&E;ValkPdi1}A!
zAW`&6hJm3Tr1859B*>X%ArcZ$T2&Tek&!F|gCzq4gPSbGzy_#%yDTJ%rpQ7ZxD6`4
zUlwA~8CeDfbx>5uLV})44ieQ$au9i2Ifi<$4}#?&K1q^eU{GLSU?`MhV6bLjV3;Ha
z3EFdVkhH-k&%lt$z`!6T58*e+LoDu)hd6AaJOhIO0|Ubhc}Ntll!t`OPI(3fW(Ed^
zqw<iDJt+@KLr>-FAr`SHK!V6Y0b-yZlphYIQxzB(G#MBeiWMLh%~gOnc!>fe1U4%$
zFkEF|V7RKlz)-=!z_418fng#81A~eZ#KLV#5Pg@F7#Nfp7#MCUK^*wEUI}6luQEhH
zMj4V?b(9$xHZw3V_(R2+RUkeVR)Hi|X%$G2nyNse$X5jtb%`pF5Xe)3IJh1vzfuK~
zcJ``3viTJih=b}ssz8G12UH=8D#Sq&st}*4t1>WXFfcH9sxmOBFfcF_sX`2zt_q2o
zb*d1Dy;Fr4_)V38L7Rbr;jbzrwQH&|Ft9K%FzBl>fOCV18YGJC)EF3485rsr;?*EN
zX;p*7$y_xC1{VefhCOPK#KWi#2{KJ}h=IQ9kW?P54v~*j2OGrDrVdF|Yt$JS<QW(k
z4yi*z>XAAm(fv_}I8a;z;$b-rkjLs77_>AXE(+FwxU@tA5|ou15QnvCK%!=z2E>AO
z8Vn4&3=9lMG$7gb6I8!|CM4txH6bD5pb1gup$TztnI^=XMks%xCIbUEDF4sVgapkB
zO$G*i1_p*rnh=LP(qv!=Wnf@<4%J|*1xdvoS`Y{NK<P*=NSvo>L5kLLEl7xUX+g|g
zrv(X-9a@kmya84BSBrt69+X`Kv>6y285kH8wHX*185kInwISufQ*8!@DWHN$n}J~?
z0|P_94kULt>OyEQU5LfOx{ySeq6<lM6}pf#vIxrGsS646$GQ-Qzt@GNoj<w^^$h6@
z3=B4U5Cu#0AVIf54`SdBJxGwA(PLo9XJBBst;fL7#=yYftq;krm!R|meTakJ=|e33
z4i)D!U|_IiU|^6jfW&>20VE0%4Im*?XiyKapxOYE___=riDjh$r1m-jRruZjV&P9H
zpWP6W7zGU>C8M|@L|>pGC{Zym<QPJtaH=81;#r0a3=s?r3=0h*9{pv=z#zfEz`#~-
z1PKy(BS?_z7(smEXasSX7gRpdh=E}S0|P@ERQ|sa#6cX!kSGu{hUix}hFEB03`q;l
z#*oApW(*0LL}N&`U11C<sOpazLtJKO!oV<zfq`MV3B&*`Q%F=8LTO7=NUh~)%D~VH
zDhW*)7$z_<F#I%yWV0?aNR%xxV_;Yes@=>O7y>|*mN^514XE8<&cI**s_e`mX++ur
z9CGyxt`?B`y50g}&~Xb$c6?|7Nt8^M3=9qo3=A%okW}4j2?^SjmXIh|X9>xcTPztE
z-ZC&SoU(*u%N<sb+;Ytd5<<7EAR+qN3gW?ER-kISo`HeUnt{Os)H1PVVDMsKVAyF5
z@i~hP#N|9TkSOxBfmj#@rDJR$ahYTTDJk=8AP$^h14&C;Y#<h0wt;x;mJP(AU!dY#
zwhRpRp!_dr%fJxDz`zh_3u(!$fzljykSIy9V_-;SU|{%e$G~95z`zh|&%hAFz`!uY
zo`J!Yfq~(pJp;JNHFscOI0nkT4j`W~Flae~S~v_0GaVTiN*EXz9yl^E7&9<1ggQY&
zqSJ|ip&pd)XE;GBom)-}3~HdV+X<3LRGb+Yj6l_~GsL1L&XA(^l`{jlfg<3-z);G-
zz@Xy-DJd7ZKvMrM7f8wX*oA>1l7WFi(3OE9k%56B8%m#bg_xrcYJVL8xyX%y0n`eW
za)+eq4epR2+vg4m;v4P|3!k_{;vN)VpcWCU2PAd#c`z_AF)%PldO)I121=`VK%!2^
z1CsA8Js22z85tNnJs>Ts>z?(HRQu8slI{L_LV}jf3zBG(y&w)K@q#$4!Ha>xl!1Yv
z&kJJl5idwKJMRSvfk$4D#QVz&5|Yy1kTm1u4T*aXZ%DZk=M4#&&U$YKhByWWhR5EJ
zAaU}6<l_t<28Lt?28LQ628J~Z3=9u_AaU8}%fL_sYH0XE>Ix4(NWoL#2g%=){TLX6
z85kH=`9VVLpC80xDSwDV4g4V<aQ26IpuW-{QWUoMLxQf)AL8?A{tye7`$K~8oj(J^
zOa=yq-%#~a10W$XKLBFT+5kwIz9Rrq$@~a_q$$}z2<;FEacFWNB<Sk`!MUTJVL~9p
zpy^NrO9LSxa3BzpO0PocCxH-$eh!32RUpKnY(bC~jd&2mV3Qz-gWZB4<^)6e8Bn@3
z2of?)L7;M{o`GRr5X9%tpa#4Pf|OLCa0IoE4TB+Rz&02X#Gb(n40;R<3<<%IMA{z=
zDR5Q>L#o;1!H_idJQ(7E-@yzFIt&a9Tp^GG%{&AWMU^2846LC1e>MctQ@I=h3Ch4w
zh!0{yAr8w7g&0^E3W>wkP)KT?5eg~cR)j(l+nP{Fw!0k4z!1W~z`z&=36Zcch`AYI
z5PijA5c8VD7#KjMF2nRNh(#B|AVGQ~4AQiE8OFfy3Y34t85k-V7#RM9Gcc@XU|=YV
zfYb#_k&uuHiG&nP36T&7PLG6GyebkBWqTqSz|Hz&kqiunKn<Emh(lIIG1P+_g}b64
zL3ktzl3E`{K@!W4D2RiEqag;XL_>noJR0J_6e!&j4T-WX(U2g23Z=h9L(E~0f%sT1
z22!9I#Xz!QYD_&OwN8kEB%-Y`kXq|f48(=Xu@D~`$3hws_OTEj)y6^!qV`xwV(f{9
zr1Gh;5Qpu6@*l)PvMF;MB%2$@F);XnIyP~T5P4W12Qh#t9%2!9JS2aL$3qgCZ#*QC
z)x<-5J}n*+QitOqsrX?$ME~D-NSa|wfanuWfLQF5011&IDBYL<(Ki7~*RM%{`20iy
z1A`R<1H;n<NNuK&2uVy%iIBJ~NQ5M!rbGq?69xu`UMT+%RQ_xtB=z4<g!t@#A|%Ka
zk{~@SlO#xp6(m7Q*wQ3$l-4s`N`j=~r%4c(zD$BNjebBBFbF0?idL0mNabRa4Do4d
zG9>DXk|7SAo($1<G#P9#!@Xn%hHy~rn9RUX2kOA2K(g<N6b6Qs3=9nSQy3TyfcpQP
zsSuxer9px+G!0@vTpC0}VHzYzJJKN8Y<n7{L2@q*;$Zo7NLtZLhqNQ?(jnDtdpacX
z{z(UybPT*15WYwT#6zkX3=BP>{BN7Vz_1R~a>;;{gq4|)AaBov_;h9_Bo!~qgjjem
zlYzmBfq~&dCL}QmXF*Cj*(``Yqb!KSU9uqUg6J$r)U;<o8Z^tZARc~_1?~U8hYI}8
zg1D3|8xm){*^sp1nGK2av}}llv!V3TYzBs01_p-p*^tC5n**uDG;<&!;-3SFlK31*
z`BISs3E2jy{Nx;ldWKaD3=E5NAU^lYh4>^U7oxE+7n1tBav|lyl3a)dyK*5ueUJ-D
z1D|psiAp?=fngQ{14Bt3q(tS<X8^aFd-EY4Q!9WtM7IFqVAFznNVak;fYfez1&}5e
zM<FCX&n|=n`MyF($#u36(h-?Z1c?HMVn}Dzxfs%_?I>noa0YeZiWwM!7#JA76+^PC
zX9>if^b!UJZ&1^%gn_{m)Fi7ffs{yErI1_@TMEf0iKP%9r<F1=h%hoR)RaO}|HLwg
zx?N=ugZGs|)ZHnAq?J!)3=G+z(XuiI20Kubs~lp{s&Yu2e<^2R2n5NOLqfVfumY0m
z(<&fAlV1S|n(_*WkD4nWsef$+q~N$y0kP;u1tg!dRzeb)S|!ASph{4+%D@m?32CS-
zt%MBONK`>O98FaW3>!f0h$?W2SkJJg8q(0<u3=!PVqjnhs)4xhYz?H0mak=C_yigS
ztA#W+ZR;Sd<;`^r3>^#%41D#F#5uhlk|xg7LmDFY>LH0&t^wi^>jnk}Uj_z-)CNdp
zwYdT0(0T@jR}GK?#HbMxqzR3Xv{2Uw@v%e`q~11Zf*4fR1o7E|CP=L)+zjFOHbX3A
zXklRZ%)r1P+X5NF5p0Dx>}V?_8((jQgy5%E1_n7$`~80_B+lj9AVIGTrS;n&;?`}D
zC~|0nM3HA3qyPzQgXE6Pw#~o93Rot8RS?_!TzU>8t3p~)e(vP^hSHN)$hJ(jlT(}A
zAh&sQxqJotW*+ql?#VNZj3<j5Pucw3*qCv$x~b;oB-5`<n{zCxSU1br$udp$b+DQ|
z(NSdcI)`^`lW)7v+C1Om4>Omku91;~p_!G5(dMN-a*WKDdWM^i`OaoxRG6F;<h)rf
zn1gAucIXwM@YKwb)FK9-%)D%c?EHev)S}5=Vb3<#gg<3rQ7FwznOqQ~ym?y8E#}GF
z64W<uO|a&he5hD#vU0xe<i+_HH=ilUXPoR&q`SGJ=pggvxUyij%^zw~m?me`r)|Dp
Q&%`lVvE$%o;m#x$0B*toIRF3v

diff --git a/uffd/translations/de/LC_MESSAGES/messages.po b/uffd/translations/de/LC_MESSAGES/messages.po
index e4434e76..87a74d14 100644
--- a/uffd/translations/de/LC_MESSAGES/messages.po
+++ b/uffd/translations/de/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2022-05-22 16:42+0200\n"
+"POT-Creation-Date: 2022-08-14 13:15+0200\n"
 "PO-Revision-Date: 2021-05-25 21:18+0200\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language: de\n"
@@ -16,7 +16,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.9.1\n"
+"Generated-By: Babel 2.8.0\n"
 
 #: uffd/ratelimit.py:76
 msgid "a few seconds"
@@ -56,7 +56,8 @@ msgstr "Einladungslink weist keine Rollen zu"
 msgid "Invite link does not grant any new roles"
 msgstr "Einladungslink weist keine neuen Rollen zu"
 
-#: uffd/invite/models.py:90 uffd/signup/models.py:115
+#: uffd/invite/models.py:90 uffd/mfa/templates/mfa/setup.html:225
+#: uffd/signup/models.py:115
 msgid "Success"
 msgstr "Erfolgreich"
 
@@ -95,19 +96,19 @@ msgstr "Einladungslink erlaubt keine Account-Registrierung"
 msgid "Passwords do not match"
 msgstr "Die Passwörter stimmen nicht überein"
 
-#: uffd/invite/views.py:180 uffd/signup/views.py:54
+#: uffd/invite/views.py:181 uffd/signup/views.py:55
 #, python-format
 msgid "Too many signup requests with this mail address! Please wait %(delay)s."
 msgstr ""
 "Zu viele Account-Registrierungen mit dieser E-Mail-Adresse! Bitte warte "
 "%(delay)s."
 
-#: uffd/invite/views.py:182 uffd/signup/views.py:56 uffd/signup/views.py:96
+#: uffd/invite/views.py:184 uffd/signup/views.py:58
 #, python-format
 msgid "Too many requests! Please wait %(delay)s."
 msgstr "Zu viele Anfragen! Bitte warte %(delay)s."
 
-#: uffd/invite/views.py:195 uffd/signup/views.py:72
+#: uffd/invite/views.py:199 uffd/signup/views.py:76
 msgid "Could not send mail"
 msgstr "Mailversand fehlgeschlagen"
 
@@ -451,7 +452,7 @@ msgstr "Generiere zuerst die Wiederherstellungscodes!"
 msgid "Code is invalid"
 msgstr "Wiederherstellungscode ist ungültig"
 
-#: uffd/mfa/views.py:123
+#: uffd/mfa/views.py:107
 #, python-format
 msgid ""
 "2FA WebAuthn support disabled because import of the fido2 module failed "
@@ -460,16 +461,16 @@ msgstr ""
 "2FA WebAuthn Unterstützung deaktiviert, da das fido2 Modul nicht geladen "
 "werden konnte (%s)"
 
-#: uffd/mfa/views.py:232
+#: uffd/mfa/views.py:216
 #, python-format
 msgid "We received too many invalid attempts! Please wait at least %s."
 msgstr "Wir haben zu viele fehlgeschlagene Versuche! Bitte warte mindestens %s."
 
-#: uffd/mfa/views.py:246
+#: uffd/mfa/views.py:230
 msgid "You have exhausted your recovery codes. Please generate new ones now!"
 msgstr "Du hast keine Wiederherstellungscode mehr. Bitte generiere diese jetzt!"
 
-#: uffd/mfa/views.py:249
+#: uffd/mfa/views.py:233
 msgid ""
 "You only have a few recovery codes remaining. Make sure to generate new "
 "ones before they run out."
@@ -477,7 +478,7 @@ msgstr ""
 "Du hast nur noch wenige Wiederherstellungscodes übrig. Bitte generiere "
 "diese erneut bevor keine mehr übrig sind."
 
-#: uffd/mfa/views.py:253
+#: uffd/mfa/views.py:237
 msgid "Two-factor authentication failed"
 msgstr "Zwei-Faktor-Authentifizierung fehlgeschlagen"
 
@@ -499,7 +500,7 @@ msgstr ""
 
 #: uffd/mfa/templates/mfa/auth.html:21
 msgid "Authenticate with U2F/FIDO2 device"
-msgstr "Authentifiziere dich mit einem U2F/FIDO2 Gerät"
+msgstr "Authentifiziere dich mit einem U2F/FIDO2-Gerät"
 
 #: uffd/mfa/templates/mfa/auth.html:24
 msgid "or"
@@ -513,6 +514,67 @@ msgstr "Code aus deiner Authentifikator-App oder Wiederherstellungscode"
 msgid "Verify"
 msgstr "Verifizieren"
 
+#: uffd/mfa/templates/mfa/auth.html:43 uffd/mfa/templates/mfa/setup.html:199
+msgid "Contacting server"
+msgstr "Verbinde mit Server"
+
+#: uffd/mfa/templates/mfa/auth.html:52 uffd/mfa/templates/mfa/auth.html:80
+msgid "Session timed out"
+msgstr "Sitzung abgelaufen"
+
+#: uffd/mfa/templates/mfa/auth.html:54
+msgid "You have not registered any U2F/FIDO2 devices for your account"
+msgstr "Es sind keine U2F/FIDO2-Geräte für deinen Account registriert"
+
+#: uffd/mfa/templates/mfa/auth.html:56 uffd/mfa/templates/mfa/setup.html:208
+msgid "Server error"
+msgstr "Serverfehler"
+
+#: uffd/mfa/templates/mfa/auth.html:59 uffd/mfa/templates/mfa/setup.html:210
+msgid "Waiting for device"
+msgstr "Warte auf Gerät"
+
+#: uffd/mfa/templates/mfa/auth.html:62
+msgid "Verifing response"
+msgstr "Überprüfe Antwort"
+
+#: uffd/mfa/templates/mfa/auth.html:76
+msgid "Success, redirecting"
+msgstr "Erfolg, leite weiter"
+
+#: uffd/mfa/templates/mfa/auth.html:82 uffd/mfa/templates/mfa/setup.html:228
+msgid "Invalid response from device"
+msgstr "Ungültige Antwort von Gerät"
+
+#: uffd/mfa/templates/mfa/auth.html:88
+msgid "Authentication timed out, was aborted or not allowed"
+msgstr "Authentifikation abgelaufen, abgebrochen oder nicht erlaubt"
+
+#: uffd/mfa/templates/mfa/auth.html:90
+msgid "Device is not registered for your account"
+msgstr "Gerät ist nicht für deinen Account registriert"
+
+#: uffd/mfa/templates/mfa/auth.html:92
+msgid "Authentication was aborted"
+msgstr "Authentifikation abgebrochen"
+
+#: uffd/mfa/templates/mfa/auth.html:94 uffd/mfa/templates/mfa/setup.html:240
+#: uffd/mfa/templates/mfa/setup.html:264
+msgid "U2F and FIDO2 devices are not supported by your browser"
+msgstr "U2F- und FIDO2-Geräte werden vom Webbrowser nicht unterstüzt"
+
+#: uffd/mfa/templates/mfa/auth.html:97 uffd/mfa/templates/mfa/setup.html:243
+msgid "Could not connect to server"
+msgstr "Verbindung zum Server fehlgeschlagen"
+
+#: uffd/mfa/templates/mfa/auth.html:103
+msgid "Authentication failed "
+msgstr "Authentifikation fehlgeschlagen"
+
+#: uffd/mfa/templates/mfa/auth.html:106
+msgid "Retry authenticate with U2F/FIDO2 device"
+msgstr "Authentifikation mit U2F/FIDO2-Gerät nochmal versuchen"
+
 #: uffd/mfa/templates/mfa/disable.html:6
 msgid ""
 "When you proceed, all recovery codes, registered authenticator "
@@ -671,6 +733,30 @@ msgstr "Neues Gerät hinzufügen"
 msgid "No U2F/FIDO2 devices registered yet"
 msgstr "Bisher kein U2F/FIDO2 Gerät registriert"
 
+#: uffd/mfa/templates/mfa/setup.html:207
+msgid "You need to generate recovery codes first"
+msgstr "Du musst erst Wiederherstellungscodes generieren"
+
+#: uffd/mfa/templates/mfa/setup.html:234
+msgid "Registration timed out, was aborted or not allowed"
+msgstr "Registrierung abgelaufen, abgebrochen oder nicht erlaubt"
+
+#: uffd/mfa/templates/mfa/setup.html:236
+msgid "Device already registered"
+msgstr "Gerät bereits registriert"
+
+#: uffd/mfa/templates/mfa/setup.html:238
+msgid "Registration was aborted"
+msgstr "Registrierung abgebrochen"
+
+#: uffd/mfa/templates/mfa/setup.html:249
+msgid "Registration failed"
+msgstr "Registrierung fehlgeschlagen"
+
+#: uffd/mfa/templates/mfa/setup.html:252
+msgid "Retry registration"
+msgstr "Registrierung nochmal versuchen"
+
 #: uffd/mfa/templates/mfa/setup_recovery.html:8
 msgid ""
 "Recovery codes allow you to login when you lose access to your "
@@ -691,6 +777,12 @@ msgstr ""
 "Ort, sonst könntest du den Zugriff auf dein Konto verlieren. Alle "
 "vorherigen Wiederherstellungscodes sind nun ungültig."
 
+#: uffd/mfa/templates/mfa/setup_recovery.html:26
+#: uffd/session/templates/session/deviceauth.html:36
+#: uffd/session/templates/session/devicelogin.html:25
+msgid "Continue"
+msgstr "Weiter"
+
 #: uffd/mfa/templates/mfa/setup_recovery.html:28
 msgid "Download codes"
 msgstr "Codes herunterladen"
@@ -718,9 +810,9 @@ msgid ""
 "\t\t\tapp:"
 msgstr ""
 "Falls du ein Mobilgerät verwendest und den Code nicht scannen kannst, "
-"kannst du drauf klick und direkt in der Authentifikator-App öffnen. Wenn "
-"das nicht funktioniert, gib die folgenden Angaben manuell in die "
-"Authentifikator-App ein:"
+"kannst du drauf klicken um ihn damit direkt in der Authentifikator-App zu"
+" öffnen. Wenn das nicht funktioniert, gib die folgenden Angaben manuell "
+"in die Authentifikator-App ein:"
 
 #: uffd/mfa/templates/mfa/setup_totp.html:23
 msgid "Issuer"
@@ -754,12 +846,16 @@ msgstr "Intervall/Dauer"
 msgid "seconds"
 msgstr "Sekunden"
 
+#: uffd/mfa/templates/mfa/setup_totp.html:37
+msgid "Code"
+msgstr "Code"
+
 #: uffd/mfa/templates/mfa/setup_totp.html:38
 msgid "Verify and complete setup"
 msgstr "Verifiziere und beende das Setup"
 
 #: uffd/oauth2/views.py:169 uffd/selfservice/views.py:71
-#: uffd/session/views.py:73
+#: uffd/session/views.py:74
 #, python-format
 msgid ""
 "We received too many requests from your ip address/network! Please wait "
@@ -1059,7 +1155,7 @@ msgstr "Passwort vergessen"
 #: uffd/selfservice/templates/selfservice/forgot_password.html:9
 #: uffd/selfservice/templates/selfservice/self.html:21
 #: uffd/session/templates/session/login.html:12
-#: uffd/signup/templates/signup/start.html:14
+#: uffd/signup/templates/signup/start.html:9
 #: uffd/user/templates/user/list.html:18 uffd/user/templates/user/show.html:47
 msgid "Login Name"
 msgstr "Anmeldename"
@@ -1101,13 +1197,13 @@ msgid "Changes may take several minutes to be visible in all services."
 msgstr "Änderungen sind erst nach einigen Minuten in allen Diensten sichtbar."
 
 #: uffd/selfservice/templates/selfservice/self.html:25
-#: uffd/signup/templates/signup/start.html:27
+#: uffd/signup/templates/signup/start.html:22
 #: uffd/user/templates/user/list.html:19 uffd/user/templates/user/show.html:62
 msgid "Display Name"
 msgstr "Anzeigename"
 
 #: uffd/selfservice/templates/selfservice/self.html:29
-#: uffd/signup/templates/signup/start.html:34
+#: uffd/signup/templates/signup/start.html:29
 msgid "E-Mail Address"
 msgstr "E-Mail-Adresse"
 
@@ -1123,7 +1219,7 @@ msgstr "Änderungen speichern"
 
 #: uffd/selfservice/templates/selfservice/self.html:44
 #: uffd/session/templates/session/login.html:16
-#: uffd/signup/templates/signup/start.html:41
+#: uffd/signup/templates/signup/start.html:36
 #: uffd/user/templates/user/show.html:76
 msgid "Password"
 msgstr "Passwort"
@@ -1146,7 +1242,7 @@ msgstr "Neues Passwort"
 
 #: uffd/selfservice/templates/selfservice/self.html:56
 #: uffd/selfservice/templates/selfservice/set_password.html:16
-#: uffd/signup/templates/signup/start.html:48
+#: uffd/signup/templates/signup/start.html:43
 msgid "Repeat Password"
 msgstr "Passwort wiederholen"
 
@@ -1328,7 +1424,7 @@ msgstr "Mitglieder der Gruppe \"%(group_name)s\" haben Zugriff"
 msgid "Hide mail addresses with remailer"
 msgstr "Verstecke Mailadressen mit dem Remailer"
 
-#: uffd/session/views.py:71
+#: uffd/session/views.py:72
 #, python-format
 msgid ""
 "We received too many invalid login attempts for this user! Please wait at"
@@ -1337,27 +1433,27 @@ msgstr ""
 "Wir haben zu viele fehlgeschlagene Anmeldeversuche für diesen Account "
 "erhalten! Bitte warte mindestens %(delay)s."
 
-#: uffd/session/views.py:79
+#: uffd/session/views.py:80
 msgid "Login name or password is wrong"
 msgstr "Der Anmeldename oder das Passwort ist falsch"
 
-#: uffd/session/views.py:85
+#: uffd/session/views.py:86
 msgid "You do not have access to this service"
 msgstr "Du hast keinen Zugriff auf diesen Service"
 
-#: uffd/session/views.py:97 uffd/session/views.py:108
+#: uffd/session/views.py:98 uffd/session/views.py:109
 msgid "You need to login first"
 msgstr "Du musst dich erst anmelden"
 
-#: uffd/session/views.py:129 uffd/session/views.py:139
+#: uffd/session/views.py:130 uffd/session/views.py:140
 msgid "Initiation code is no longer valid"
 msgstr "Startcode ist nicht mehr gültig"
 
-#: uffd/session/views.py:143
+#: uffd/session/views.py:144
 msgid "Invalid confirmation code"
 msgstr "Ungültiger Bestätigungscode"
 
-#: uffd/session/views.py:155 uffd/session/views.py:166
+#: uffd/session/views.py:156 uffd/session/views.py:167
 msgid "Invalid initiation code"
 msgstr "Ungültiger Startcode"
 
@@ -1392,11 +1488,6 @@ msgstr ""
 "\"Gerätelogin\" auf der Anmeldeseite aus. Gib den angezeigten Startcode "
 "oben ein."
 
-#: uffd/session/templates/session/deviceauth.html:36
-#: uffd/session/templates/session/devicelogin.html:25
-msgid "Continue"
-msgstr "Weiter"
-
 #: uffd/session/templates/session/deviceauth.html:43
 #, python-format
 msgid "Authorize the login for service <b>%(service_name)s</b>?"
@@ -1482,7 +1573,7 @@ msgstr "Ein Account mit diesem Anmeldenamen existiert bereits"
 msgid "Valid"
 msgstr "Gültig"
 
-#: uffd/signup/models.py:104 uffd/signup/views.py:100
+#: uffd/signup/models.py:104 uffd/signup/views.py:106
 msgid "Wrong password"
 msgstr "Falsches Passwort"
 
@@ -1490,16 +1581,16 @@ msgstr "Falsches Passwort"
 msgid "Signup not enabled"
 msgstr "Account-Registrierung ist deaktiviert"
 
-#: uffd/signup/views.py:81 uffd/signup/views.py:89
+#: uffd/signup/views.py:86 uffd/signup/views.py:94
 msgid "Invalid signup link"
 msgstr "Ungültiger Account-Registrierungs-Link"
 
-#: uffd/signup/views.py:94
+#: uffd/signup/views.py:99
 #, python-format
 msgid "Too many failed attempts! Please wait %(delay)s."
 msgstr "Zu viele fehlgeschlagene Versuche! Bitte warte mindestens %(delay)s."
 
-#: uffd/signup/views.py:106
+#: uffd/signup/views.py:114
 msgid "Your account was successfully created"
 msgstr "Account erfolgreich erstellt"
 
@@ -1507,19 +1598,19 @@ msgstr "Account erfolgreich erstellt"
 msgid "Complete Registration"
 msgstr "Account-Registrierung abschließen"
 
-#: uffd/signup/templates/signup/confirm.html:12
+#: uffd/signup/templates/signup/confirm.html:9
 msgid "Please enter your password to complete the account registration"
 msgstr "Bitte gib dein Passwort ein, um die Account-Registrierung abzuschließen"
 
-#: uffd/signup/templates/signup/confirm.html:16
+#: uffd/signup/templates/signup/confirm.html:13
 msgid "Complete Account Registration"
 msgstr "Account-Registrierung abschließen"
 
-#: uffd/signup/templates/signup/start.html:18
+#: uffd/signup/templates/signup/start.html:13
 msgid "Check"
 msgstr "Überprüfen"
 
-#: uffd/signup/templates/signup/start.html:23
+#: uffd/signup/templates/signup/start.html:18
 #: uffd/user/templates/group/show.html:29
 msgid ""
 "At least one and at most 32 lower-case characters, digits, dashes (\"-\")"
@@ -1528,11 +1619,11 @@ msgstr ""
 "1 bis 32 Kleinbuchstaben, Zahlen, Binde- (\"-\") und Unterstriche "
 "(\"_\"). <b>Kann später nicht geändert werden!</b>"
 
-#: uffd/signup/templates/signup/start.html:30
+#: uffd/signup/templates/signup/start.html:25
 msgid "At least one and at most 128 characters, no other special requirements."
 msgstr "Mindestens 1 und maximal 128 Zeichen, keine weiteren Einschränkungen."
 
-#: uffd/signup/templates/signup/start.html:37
+#: uffd/signup/templates/signup/start.html:32
 msgid ""
 "We will send a confirmation mail to this address that you need to "
 "complete the registration."
@@ -1540,19 +1631,19 @@ msgstr ""
 "Wir werden eine Bestätigungsmail an diese Adresse senden. Du benötigst "
 "sie, um die Account-Registrierung abzuschließen."
 
-#: uffd/signup/templates/signup/start.html:52
+#: uffd/signup/templates/signup/start.html:47
 msgid "Create Account"
 msgstr "Account registrieren"
 
-#: uffd/signup/templates/signup/start.html:79
+#: uffd/signup/templates/signup/start.html:74
 msgid "The name is already taken"
 msgstr "Dieser Name wird bereits verwendet"
 
-#: uffd/signup/templates/signup/start.html:82
+#: uffd/signup/templates/signup/start.html:77
 msgid "Too many requests! Please wait a bit before trying again!"
 msgstr "Zu viele Anfragen! Bitte warte etwas, bevor du es erneut versuchst!"
 
-#: uffd/signup/templates/signup/start.html:85
+#: uffd/signup/templates/signup/start.html:80
 msgid "The name is invalid"
 msgstr "Name ungültig"
 
-- 
GitLab