From 7b94843bb870c8f88991260a94aedd9d95ad3d13 Mon Sep 17 00:00:00 2001
From: Sistason <c3infra@sistason.de>
Date: Fri, 13 Aug 2021 01:43:34 +0200
Subject: [PATCH] Updated translations readme, made some editorial translation
 changes and fixed some typos

This changes config key "LOGINNAME_BLACKLIST" to "LOGINNAME_BLOCKLIST".
---
 README.md                                     |   8 +-
 debian/control                                |   2 +-
 uffd/default_config.cfg                       |   2 +-
 .../templates/selfservice/self.html           |   4 -
 .../templates/selfservice/set_password.html   |   2 +-
 uffd/signup/templates/signup/start.html       |   2 +-
 uffd/translations/README.md                   |  21 ---
 uffd/translations/de/LC_MESSAGES/messages.mo  | Bin 30812 -> 30848 bytes
 uffd/translations/de/LC_MESSAGES/messages.po  | 165 +++++++++---------
 uffd/user/models.py                           |   6 +-
 uffd/user/templates/user/list.html            |   4 +-
 uffd/user/templates/user/show.html            |   6 +-
 uffd/user/views_user.py                       |   8 +-
 update_translations.sh                        |   5 +
 14 files changed, 109 insertions(+), 126 deletions(-)
 delete mode 100644 uffd/translations/README.md

diff --git a/README.md b/README.md
index 4efd31b5..5990afda 100644
--- a/README.md
+++ b/README.md
@@ -60,13 +60,13 @@ We ship a [pylint](https://pylint.org/) config to verify changes with.
 
 Uffd reads its default config from `uffd/default_config.cfg`.
 You can overwrite config variables by creating a config file in the `instance` folder.
-The file must be named `conifg.cfg` (Python syntax), `config.json` or `config.yml`/`config.yaml`.
+The file must be named `config.cfg` (Python syntax), `config.json` or `config.yml`/`config.yaml`.
 You can also set a custom file name with the environment variable `CONFIG_FILENAME`.
 
 ## Bind with LDAP service account or as user?
 
 Uffd can use a dedicated service account for LDAP operations by setting `LDAP_SERVICE_BIND_DN`.
-Leave that variable blank to use anonymouse bind.
+Leave that variable blank to use anonymous bind.
 Or set `LDAP_SERVICE_USER_BIND` to use the credentials of the currently logged in user.
 
 If you choose to run with user credentials, some features are not available, like password resets
@@ -108,7 +108,9 @@ The web frontend is initially written in English and translated in the following
 ![status](https://git.cccv.de/uffd/uffd/badges/master/coverage.svg?job=trans_de&key_text=DE)
 
 The selection uses the language browser header by default but can be overwritten via a UI element.
-You can specify the availble languages in the config.
+You can specify the available languages in the config.
+
+Use the `update_translations.sh` to update the translation files.
 
 ## License
 
diff --git a/debian/control b/debian/control
index f7414c84..4b7add38 100644
--- a/debian/control
+++ b/debian/control
@@ -16,7 +16,7 @@ Architecture: any
 Depends:
  ${misc:Depends},
 # Unlike most debian python packages, we depend directly on the deb packages and do not want to populate our dependencies from the setup.py .
-# Bacause of this we do not use the variable from pybild.
+# Because of this we do not use the variable from pybuild.
 # ${python3:Depends},
  python3-ldap3,
  python3-flask,
diff --git a/uffd/default_config.cfg b/uffd/default_config.cfg
index 0d10750a..6a27760b 100644
--- a/uffd/default_config.cfg
+++ b/uffd/default_config.cfg
@@ -80,7 +80,7 @@ SELF_SIGNUP=False
 
 INVITE_MAX_VALID_DAYS=21
 
-LOGINNAME_BLACKLIST=['^admin$', '^root$']
+LOGINNAME_BLOCKLIST=['^admin$', '^root$']
 
 #MFA_ICON_URL = 'https://example.com/logo.png'
 #MFA_RP_ID = 'example.com' # If unset, hostname from current request is used
diff --git a/uffd/selfservice/templates/selfservice/self.html b/uffd/selfservice/templates/selfservice/self.html
index 2ddcc9b4..8e080099 100644
--- a/uffd/selfservice/templates/selfservice/self.html
+++ b/uffd/selfservice/templates/selfservice/self.html
@@ -22,10 +22,6 @@
 					<label>{{_("Login Name")}}</label>
 					<input type="text" class="form-control" value="{{ user.loginname }}" readonly>
 				</div>
-				<div class="form-group col-12 col-md-3">
-					<label>{{_("User ID")}}</label>
-					<input type="text" class="form-control" value="{{ user.uid }}" readonly>
-				</div>
 			</div>
 			<div class="form-group">
 				<label>{{_("Display Name")}}</label>
diff --git a/uffd/selfservice/templates/selfservice/set_password.html b/uffd/selfservice/templates/selfservice/set_password.html
index 6288906b..42eaa866 100644
--- a/uffd/selfservice/templates/selfservice/set_password.html
+++ b/uffd/selfservice/templates/selfservice/set_password.html
@@ -14,7 +14,7 @@
 			<label for="user-password1">{{_("New Password")}}</label>
 			<input type="password" class="form-control" id="user-password1" name="password1" required="required" tabindex = "2">
 			<small class="form-text text-muted">
-				{{_("At least 8 and at most 256 characters, no other special requirements. But please don't be stupid, do use a password manager.")}}
+				{{_("At least 8 and at most 256 characters, no other special requirements. But please use a password manager.")}}
 			</small>
 		</div>
 		<div class="form-group col-12">
diff --git a/uffd/signup/templates/signup/start.html b/uffd/signup/templates/signup/start.html
index fd96d80f..a60dbdb2 100644
--- a/uffd/signup/templates/signup/start.html
+++ b/uffd/signup/templates/signup/start.html
@@ -46,7 +46,7 @@
 			<label for="user-password1">{{_('Password')}}</label>
 			<input type="password" class="form-control" id="user-password1" name="password1" minlength=8 maxlength=256 required>
 			<small class="form-text text-muted">
-				{{_("At least 8 and at most 256 characters, no other special requirements. But please don't be stupid, do use a password manager.")}}
+				{{_("At least 8 and at most 256 characters, no other special requirements. But please use a password manager.")}}
 			</small>
 		</div>
 		<div class="form-group col-12">
diff --git a/uffd/translations/README.md b/uffd/translations/README.md
deleted file mode 100644
index c5b74111..00000000
--- a/uffd/translations/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# How to add new translations
-
-Extract all translatable string from `.py` and `.html` files to a `.pot`.
-```bash
-pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .
-```
-Update the `messages.po` file to include the new / updated strings.
-```bash
-pybabel update -i messages.pot -d translations
-```
-Compile the `messages.po` file to a `messages.mo` file.
-```bash
-pybabel compile -d translations
-```
-Bonus:  
-Initialize a new language.
-```bash
-pybabel init -i messages.pot -d translations -l de
-```
-
-Complete Documentation of Flask-Babel: https://flask-babel.tkte.ch
\ No newline at end of file
diff --git a/uffd/translations/de/LC_MESSAGES/messages.mo b/uffd/translations/de/LC_MESSAGES/messages.mo
index 1d1ab4d5fdc5821051d0185373fc92a51b51a77b..6f193ab85ad4005a5b6702d5573c3f24fb05797e 100644
GIT binary patch
delta 5276
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
DSsV&O

delta 5244
zcmZqp$av=i<Ag2sH4F?4X`&1a?hFhJk3|_6Y8e<9w8a=0lo%KoR*Eq&xG^v=oDpMS
zkYr$B5Ef@(5My9q&=qH3;Adc9a1m!<uwY<d2oYys;9_84=oM#RU}Iolm;t5dL)9%4
zXJBw(U|`rL&cMLRz`*bwO8*sSsAn)_U|?XDfEZ{h!N4HPz`)=t!N4HOz`&3!!N4HR
zz`#%`!N4HMz`!t7f`Ng9fq`MU1jHd5Bp4Wk85kIjOE56-F)%RPmSAAuW?*1=B>{2J
zH>i3>Nr=O^Bq8PsN-{9;FfcHvOV&d)m`E}(h%hiPI6x&rp>&cY1A`?414BO4fR#}3
z4U!BDiVO@4dnF+bx(^k90kz<(Bm;vw0|NuM6a#}40|SGx6azyF0|SGf6vP3Wr63MI
zSr290kYZp^U|?W)F2%rL&A`CGA<e*G4+>&w28K)q28I@C1_pKp28MUi5DULaLwxjK
znt?%pfq{Wd1`>keG7t}`%P=r7gDjSTgrK<$1A`m`14FP3#QY)|1_oXR28Q}|G7y9I
z$Ut0lScZY&Dgy(<B^d^W3I+y-6|xKr6B!s76y+cWZI*+mKQG6?pv=I)a7_+k@h>@u
zelB?kUs4{DhBW0F7&bF7F!(^lLB0feL_h(Yrs^3a6c`x985kIh6d-Zwr2z3!9F(80
zz`!8Gz`)R~0I_(10>p>Qq4Jv*AQm52fJDhP1xU#KP=JJ(g(5_sgCYZiHUk5LyCNhJ
z7At}rP|v_nsmQ><!oa{VS&@N(6O?)tAyKhNk%2*#fq~($A|&WuDl#y*fTBhT61Toe
zkPs+Uf*3ec36kjML*-W~LG)izVqlPGU|{&6!~o7663Pq=8Vn2!^2!Vh3iS*O3?9l5
z2V^QkQe~bpBnYdOA&I41nSnu<fq`KmNCN`{!+B+hk3T3weE44(Vllf4M4ylfgs-Fm
z2`OC_h{r5d7#Q>!7#N&YAodljFfi1IGB7YyKsB6Gfh3xnDiDX<h0?E7AW`yNg@Hi`
z6auOcpG&Jk47OK=_|Q|8fkB0Vfgw{BlAHQe85pK8Ffc4uWnkFIz`$Uk21&fHp!8=o
zhI(-7{i6nndtP-022D_6Q-|blZzw-W9paN7b%?`es6*m-sX7BgIs*g4Q>eVJ1|&ox
zH6Z3CYCuA&RD*#bAC!wU7#P|Z7#O~2KvI9TW<A73oth8}Cuu??R%$XZ*fKCMY}bUu
z*;h?S(Eibc_?SlvVz8JNByFf_F)(O>va1$EK3@xBP9>Dzt_4XW6SW}a$#gA9xp1*w
z3z8V#XhGscR2yQUlr{rH1Sll5AwI9tW?+zDU|?v|hJ?U;ZAcKW(S~^7pf<!or=apT
zwHX*@FfcGYgUZ+IKpfPe1BuFMIuQN!%XJ_Y?$LoHn!`GfI6kKX36Y073=BS?)T;w2
z4_tL24%?^8z%Yq{fk9jkqJNbh1Gp&PsK>z23aU%=7#Jpi(t<uHn=vr_(uYKehyeq`
zVg?2V4Fhm4t7kZ4z`$U@z`*d<0223dhL9lgFoaY}O@<HyP8otVFg!72U~pt$U|=<Z
zR4VR9ki^(w1PQ@4Mv$Q1XavbU+l?3)-ZC&SoHc^fExV1OiQE_z67>uWca0%I_s$sN
zlfT9c40#L;3@j!L3?2*&48<l43|<Tj40}u<iHqHofx(7>fq~x?5*0qC5DOzsAyE}?
z3Mq)PO(72JHHD;+jiwOuFPK6+bREP8<^PYSkktIclz|}%lugVS7@|Q15|n;#1_^3!
za|VV~1_p+E<_rvGpu}duz!1a0z))?$z~IWjz;MF?Qo_kuGB6xtU|{gFgm^^I3Q~<X
zSTQh^fND!C1_omW1_m2z28Mc2wOL>d3DSCNNSS@mnt?%$fq~(PHN;?U8%RkOXalJO
z%54}JN<j{^ffU`GwvYl!(UyTBl7WH2-<E+P5!8Nw(%g0s{ke7w3`aov>=+oPGB7Yi
z*fZ3FYoT}ckRbVE4+%ms2Z%*V4v;vtbAY6BX9q|k^>JWeU}9ik2zP))NfeY$a)4yh
zEC&XLUPcCnDhEhn=5T@}K4~Y2Ir>hJkh5^A2PFaqhN(^vi<db;vdJbVh(!mSAO@Uv
zg2eGXCrF}t;snX>znmb6RMi=hXmgzz7^*=H6lX~GQg&frNCriz3nU8WxG*p@fN}?v
zpHlD2z)-}%z_8jCQZ~!EF)##!8VYWZ5Ln~}v2dRo#35JQ7#K`J?F2W717+PI1&)S0
zBqWU7As(`Fhgj(C4oRew+#%}cyF=32DtAaxUH{4*66gFL5ZcHCQZj{lK$=_y9*|Vq
z<N*npPN@8J4~P#pc|dZ{aSw<?u0iPs9+04Z<pHU_KYKttAm9mckg_LOe?5Z%RKOKV
z2YEt*G~N^9qvf6uhphL6loJO%AyM@SO8@hO6jWSZ3=Ddp64MKk&jY+5i7d|xQaQ1B
zL(+hXH^jjf-V6*n4D}2Q?%t5pU*Zi3`fc8jRxp<jB*;2^ATFNl198v-ABaIKd>}sB
z;{!=_=Y1dr%Y7e6?s@D3$rW6_3=AQlG~f&INUtx%ocX>C3<9A1zucFB;S~b|!wz2t
zhAL2X>BqpZnt_2q&L0vbr~Dy4e(TS`V9vn6@Y5e+v0(tjK$ieW(1!&;O2~u&28Kfn
z3=E9{5Qn)0LgYgNAt4hN2uV{lfeZ|w_9w%nK!|~B10gM&1A&l|>qQ_WsCa@Pv~&<8
zZD<8SLcleMfx(D@fgv)8fgyl_fuSb|V&UB&sDpzbwdl_vhy%=nA&Jg0m;v14N(*MF
z2e;?5gCRaG35EpS^k7JC*cZ&e5C>}Y1~V}DF)%RrhCmFM69P$G2SXrHb1DRqE3St?
z^znv5g5EY1qAoiWk~T_0A@YkuAs)IMS`T473Wa31kD-v%${WVOV8y_|pcMu&C^ZZc
z)RV&?X<{jq-T)Qf9R~67*)WKMZiYcZ=vf$~x&12);$yRLNWo(r4hiuY_2H02vpO8&
zkoDn^dVU{N!S!%R5&J3}(oSHCfLNd%0SO6<2#5n?BOtk;JA#2>Is*g4q6h|t0}Kod
zR*?_~|Bi%&1X~ouV*V(I`g)}(NYGeDL4rOb3R121M?oBPAqo<w_oE=S;rl2^C1Mc`
zDQMP4LsIiTDF0YA#KG6285nvP7#QA1Gcc@UU|^_;frOxTEW`u0vEZ~+&)^jcu_!f`
zfx(G^fuST8l32FKf(r<SgRu~e*J2?qeh~|)<^IP)s$uOohz~R3AW={Z<=4kS3a+j=
zNEA$rgGBAwI0gn2P#-Z4WKTT<gM2)Q!N8yy&%lri>N3Sc3|bfuskPR|LqgzkJS1u!
z$3uMlCms@%EC~>K@dO5jRiI8~0;Ht8lmPL-g9M1auL+P!jxQ0C{WKC87z9E2-!2hi
zQ9vRjPRkM@iDY&n1H&v((<>2DAWcq!wCMzsAwFA`3@X7G7&ay|Fw6wC3z8x2go+eM
zZsJabgsfgFq&%=qg;ZJ$X^@VLb{YdiJ*c@|kjB8^%)r1fD~*962xL$iq@XZNhgjgB
z&cNUeio<jU22TbCh7;+Kd@qy%NxZHZkksv&0r8n%1_Of#BLhQ91|-o|W<u00%7mD^
zEEA&cNG3x)xF3EilYt={RI6n&FxW9LFa&2oESi)BiHbW}5Qn|Uf@rkPhNR}eY>0eR
zHl*#CmJLbF6S5)Md4Dz}vE9ywl#DO3A!&s(2U5p~<kUl|-<TXoH~V}Jq?K!#%fPUK
zfq`LDE(1e6XdogFQk@>ogA~zR`3ww!3=9md`H&#Jp3lJWiGhKEsQ}V4`dR>K%4HWa
zFmy05FdQp{Bs%{hNMdd&f>guP>Wd($@>&tZ2cL@|E|V>W<m=R8NRUk~hQ#s4Vu;VY
zOCajgOCTPYSi-<i32L;KLily15OY74GBA8*U|`@YgLK20${`NeRu0a744x;-Awl%G
z9MVetP!5Sp{t8IYia=?F3W&H)1tjPVD<HYRssfU#oi^VTy2m7(lAotuqL7rTP+U@4
zkeQ;RkdnW7o9JH-#>CBA<ign*6F2jy?Umv%Fj6oyvNAT_e9^&?NjW7qGcU8aq$sf@
zzbG|Np)@Z=At*m5CpAykH$Np6EIirWS(OJ_-Q*@`BV(u3ywZ}Y)FNHS<mCL)ypm!a
zg_O)xh3wSKyi|qY)S|M?<W#tvLUCqZiq7U!&Vh_V#i^MJd6~%>B?>8}xw#-4H%qzB
zW@bt)n!LxukOOA!<}V&Sj0j%4moy8UH+iMsZ*iEyyu{qpJYA=p#N_Op%;J*Cr~KVG
z;c}ZL0uD1ul;$O+7NsU<lw_utq!uZ-78RGI=H#RnO$wUKQKFEVS5lsuGI?X5#N^FE
zkJ<ge-pZRiFZhd@Z)#3TszOR;a)v@uYNkRWC}0#^GE?)4OH%U`5|b44^z;}U^KwDT
z@)%&YPCguBjc_Y#s1BU7*&?)sQ4}7ssd)@=_U4~qmQ0**Z*2CBT)@Pby7_IiIKK$Y
qU<FSXge79x-g0n>#O#vN#GK6H%+#V1xRT9v*~-iayI17h-~<3KIREAV

diff --git a/uffd/translations/de/LC_MESSAGES/messages.po b/uffd/translations/de/LC_MESSAGES/messages.po
index 60b944e1..e7f52925 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: 2021-08-02 12:33+0200\n"
+"POT-Creation-Date: 2021-08-13 01:48+0200\n"
 "PO-Revision-Date: 2021-05-25 21:18+0200\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language: de\n"
@@ -59,7 +59,7 @@ msgstr "Dir fehlen Berechtigungen um diesen Einladungslink zu erstellen"
 #: uffd/invite/views.py:91
 msgid "Invite link must either allow signup or grant at least one role"
 msgstr ""
-"Einladungslink must entweder Account-Registrierung erlauben oder Rollen "
+"Einladungslink muss entweder Account-Registrierung erlauben oder Rollen "
 "vergeben"
 
 #: uffd/invite/views.py:119 uffd/invite/views.py:148
@@ -74,7 +74,7 @@ msgstr "Rollen erfolgreich geändert"
 msgid "Invite link does not allow signup"
 msgstr "Einladungslink erlaubt keine Account-Registrierung"
 
-#: uffd/invite/views.py:173 uffd/selfservice/views.py:53
+#: uffd/invite/views.py:173 uffd/selfservice/views.py:50
 #: uffd/signup/views.py:49
 msgid "Passwords do not match"
 msgstr "Die Passwörter stimmen nicht überein"
@@ -107,7 +107,7 @@ msgstr "Link"
 
 #: uffd/invite/templates/invite/list.html:13
 msgid "Created by"
-msgstr "Ersteller"
+msgstr "Erstellt durch"
 
 #: uffd/invite/templates/invite/list.html:14
 msgid "Permissions"
@@ -147,7 +147,7 @@ msgstr "Abgelaufen"
 
 #: uffd/invite/templates/invite/list.html:57
 msgid "Invalid, unpermitted creator"
-msgstr "Ungültig, unberechtigter Ersteller"
+msgstr "Ungültig, erstellt durch unberechtigten Account"
 
 #: uffd/invite/templates/invite/list.html:59
 msgid "Invalid"
@@ -205,7 +205,7 @@ msgstr "Keine Account-Registrierung möglich"
 #: uffd/invite/templates/invite/list.html:98
 #, python-format
 msgid "Link grants users the role \"%(name)s\""
-msgstr "Link gibt Nutzern die Rolle \"%(name)s\""
+msgstr "Link gibt Accounts die Rolle \"%(name)s\""
 
 #: uffd/invite/templates/invite/list.html:104
 msgid "Never used"
@@ -267,7 +267,7 @@ msgstr "Enthaltene Rollen"
 #: uffd/role/templates/role/list.html:14
 #: uffd/rolemod/templates/rolemod/list.html:9
 #: uffd/rolemod/templates/rolemod/show.html:46
-#: uffd/selfservice/templates/selfservice/self.html:107
+#: uffd/selfservice/templates/selfservice/self.html:103
 #: uffd/user/templates/group/list.html:10
 #: uffd/user/templates/group/show.html:11 uffd/user/templates/user/show.html:95
 #: uffd/user/templates/user/show.html:127
@@ -278,7 +278,7 @@ msgstr "Name"
 #: uffd/role/templates/role/list.html:15 uffd/role/templates/role/show.html:48
 #: uffd/rolemod/templates/rolemod/list.html:10
 #: uffd/rolemod/templates/rolemod/show.html:28
-#: uffd/selfservice/templates/selfservice/self.html:108
+#: uffd/selfservice/templates/selfservice/self.html:104
 #: uffd/user/templates/group/list.html:11 uffd/user/templates/user/show.html:96
 #: uffd/user/templates/user/show.html:128
 msgid "Description"
@@ -426,7 +426,7 @@ msgid "Two-factor authentication failed"
 msgstr "Zwei-Faktor-Authentifizierung fehlgeschlagen"
 
 #: uffd/mfa/templates/mfa/auth.html:12
-#: uffd/selfservice/templates/selfservice/self.html:73
+#: uffd/selfservice/templates/selfservice/self.html:69
 msgid "Two-Factor Authentication"
 msgstr "Zwei-Faktor-Authentifizierung"
 
@@ -473,12 +473,12 @@ msgid "Disable two-factor authentication"
 msgstr "Zwei-Faktor-Authentifizierung (2FA) deaktivieren"
 
 #: uffd/mfa/templates/mfa/setup.html:18
-#: uffd/selfservice/templates/selfservice/self.html:79
+#: uffd/selfservice/templates/selfservice/self.html:75
 msgid "Two-factor authentication is currently <strong>enabled</strong>."
 msgstr "Die Zwei-Faktor-Authentifizierung ist derzeit <strong>aktiviert</strong>."
 
 #: uffd/mfa/templates/mfa/setup.html:20
-#: uffd/selfservice/templates/selfservice/self.html:81
+#: uffd/selfservice/templates/selfservice/self.html:77
 msgid "Two-factor authentication is currently <strong>disabled</strong>."
 msgstr ""
 "Die Zwei-Faktor-Authentifizierung ist derzeit "
@@ -700,7 +700,7 @@ msgstr "Sekunden"
 msgid "Verify and complete setup"
 msgstr "Verifiziere und beende das Setup"
 
-#: uffd/oauth2/views.py:95 uffd/selfservice/views.py:79
+#: uffd/oauth2/views.py:95 uffd/selfservice/views.py:76
 #: uffd/session/views.py:93
 #, python-format
 msgid ""
@@ -740,7 +740,7 @@ msgstr ""
 
 #: uffd/oauth2/templates/oauth2/logout.html:34
 msgid "Logging you out on all services ..."
-msgstr "Melde dich bei allen Diensten ab ..."
+msgstr "Abmeldung bei allen Diensten ..."
 
 #: uffd/oauth2/templates/oauth2/logout.html:38
 msgid "Skip this and continue"
@@ -762,7 +762,7 @@ msgstr ""
 msgid "Access denied"
 msgstr "Zugriff verweigert"
 
-#: uffd/role/views.py:51 uffd/selfservice/templates/selfservice/self.html:92
+#: uffd/role/views.py:51 uffd/selfservice/templates/selfservice/self.html:88
 #: uffd/user/templates/user/list.html:20 uffd/user/templates/user/show.html:21
 #: uffd/user/templates/user/show.html:90
 msgid "Roles"
@@ -789,15 +789,15 @@ msgid ""
 "All non-service users will be removed as members from this role and get "
 "its permissions implicitly. Are you sure?"
 msgstr ""
-"Alle Benutzer-Accounts, die keine Service-Accounts sind, verlieren diese "
-"Rolle und erhalten dessen Berechtigungen implizit."
+"Alle Nicht-Service-Accounts verlieren diese Rolle und erhalten dessen "
+"Berechtigungen implizit."
 
 #: uffd/role/templates/role/show.html:17 uffd/role/templates/role/show.html:23
 msgid "Set as default"
 msgstr "Als Default setzen"
 
 #: uffd/role/templates/role/show.html:19 uffd/role/templates/role/show.html:21
-#: uffd/selfservice/templates/selfservice/self.html:123
+#: uffd/selfservice/templates/selfservice/self.html:119
 #: uffd/user/templates/user/show.html:11
 msgid "Are you sure?"
 msgstr "Wirklich fortfahren?"
@@ -832,7 +832,7 @@ msgstr "Keine Moderationsgruppe"
 
 #: uffd/role/templates/role/show.html:63
 msgid "Moderators"
-msgstr "Moderatoren"
+msgstr "Accounts mit Moderationsrechten"
 
 #: uffd/role/templates/role/show.html:71
 #: uffd/rolemod/templates/rolemod/show.html:18
@@ -886,7 +886,7 @@ msgstr "Rollenname"
 
 #: uffd/rolemod/templates/rolemod/show.html:32
 msgid "Moderators:"
-msgstr "Moderatoren:"
+msgstr "Accounts mit Moderationsrechten:"
 
 #: uffd/rolemod/templates/rolemod/show.html:42
 msgid "Role members:"
@@ -896,31 +896,31 @@ msgstr "Mitglieder:"
 msgid "Remove"
 msgstr "Entfernen"
 
-#: uffd/selfservice/views.py:25
+#: uffd/selfservice/views.py:22
 msgid "Selfservice"
 msgstr "Selfservice"
 
-#: uffd/selfservice/views.py:37
+#: uffd/selfservice/views.py:34
 msgid "Display name changed."
 msgstr "Anzeigename geändert."
 
-#: uffd/selfservice/views.py:39
+#: uffd/selfservice/views.py:36
 msgid "Display name is not valid."
 msgstr "Anzeigename ist nicht valide."
 
-#: uffd/selfservice/views.py:42
+#: uffd/selfservice/views.py:39
 msgid "We sent you an email, please verify your mail address."
 msgstr "Wir haben dir eine E-Mail gesendet, bitte prüfe deine E-Mail-Adresse."
 
-#: uffd/selfservice/views.py:56
+#: uffd/selfservice/views.py:53
 msgid "Password changed"
 msgstr "Passwort geändert"
 
-#: uffd/selfservice/views.py:59
+#: uffd/selfservice/views.py:56
 msgid "Invalid password"
 msgstr "Passwort ungültig"
 
-#: uffd/selfservice/views.py:77
+#: uffd/selfservice/views.py:74
 #, python-format
 msgid ""
 "We received too many password reset requests for this user! Please wait "
@@ -929,48 +929,48 @@ msgstr ""
 "Wir haben zu viele fehlgeschlagene Anmeldeversuche für diesen Account! "
 "Bitte warte mindestens %(delay)s."
 
-#: uffd/selfservice/views.py:83
+#: uffd/selfservice/views.py:80
 msgid ""
 "We sent a mail to this user's mail address if you entered the correct "
 "mail and login name combination"
 msgstr ""
-"Falls E-Mail-Adresse und Benutzername richtig waren, wurde eine E-Mail an"
-" die Adresse gesendet."
+"Falls E-Mail-Adresse und Anmeldename richtig waren, wurde eine E-Mail an "
+"die Adresse gesendet."
 
-#: uffd/selfservice/views.py:93 uffd/selfservice/views.py:121
+#: uffd/selfservice/views.py:90 uffd/selfservice/views.py:118
 msgid "Token expired, please try again."
 msgstr "Link abgelaufen, bitte versuche es erneut."
 
-#: uffd/selfservice/views.py:101
+#: uffd/selfservice/views.py:98
 msgid "You need to set a password, please try again."
 msgstr "Password fehlt, bitte versuche es erneut."
 
-#: uffd/selfservice/views.py:104
+#: uffd/selfservice/views.py:101
 msgid "Passwords do not match, please try again."
 msgstr "Die Passwörter stimmen nicht überein, bitte versuche es erneut"
 
-#: uffd/selfservice/views.py:108
+#: uffd/selfservice/views.py:105
 msgid "Password ist not valid, please try again."
 msgstr "Ungültiges Passwort, bitte versuche es erneut"
 
-#: uffd/selfservice/views.py:111
+#: uffd/selfservice/views.py:108
 msgid "New password set"
 msgstr "Passwort geändert"
 
-#: uffd/selfservice/views.py:129
+#: uffd/selfservice/views.py:126
 msgid "New mail set"
 msgstr "E-Mail-Adresse geändert"
 
-#: uffd/selfservice/views.py:140
+#: uffd/selfservice/views.py:137
 msgid "Leaving roles is disabled"
 msgstr "Verlassen von Rollen ist deaktiviert"
 
-#: uffd/selfservice/views.py:147
+#: uffd/selfservice/views.py:144
 #, python-format
 msgid "You left role %(role_name)s"
 msgstr "Rolle %(role_name)s verlassen"
 
-#: uffd/selfservice/views.py:211
+#: uffd/selfservice/views.py:161 uffd/selfservice/views.py:181
 #, python-format
 msgid "Mail to \"%(mail_address)s\" could not be sent!"
 msgstr "E-Mail an \"%(mail_address)s\" konnte nicht gesendet werden!"
@@ -985,7 +985,7 @@ msgstr "Passwort vergessen"
 #: uffd/signup/templates/signup/start.html:19
 #: uffd/user/templates/user/list.html:18 uffd/user/templates/user/show.html:48
 msgid "Login Name"
-msgstr "Benutzername"
+msgstr "Anmeldename"
 
 #: uffd/selfservice/templates/selfservice/forgot_password.html:18
 msgid "Mail Address"
@@ -1007,7 +1007,7 @@ msgstr ""
 #: uffd/selfservice/templates/selfservice/self.html:14
 #: uffd/user/templates/user/show.html:18
 msgid "Profile"
-msgstr "Profile"
+msgstr "Profil"
 
 #: uffd/selfservice/templates/selfservice/self.html:15
 msgid ""
@@ -1023,40 +1023,35 @@ msgstr ""
 msgid "Changes may take serveral minutes to be visible in all services."
 msgstr "Änderungen sind erst nach einigen Minuten in allen Diensten sichtbar."
 
-#: uffd/selfservice/templates/selfservice/self.html:26
-#: uffd/user/templates/user/show.html:28
-msgid "User ID"
-msgstr "Benutzer ID"
-
-#: uffd/selfservice/templates/selfservice/self.html:31
+#: uffd/selfservice/templates/selfservice/self.html:27
 #: uffd/signup/templates/signup/start.html:32
 #: uffd/user/templates/user/list.html:19 uffd/user/templates/user/show.html:63
 msgid "Display Name"
 msgstr "Anzeigename"
 
-#: uffd/selfservice/templates/selfservice/self.html:35
+#: uffd/selfservice/templates/selfservice/self.html:31
 #: uffd/signup/templates/signup/start.html:39
 msgid "E-Mail Address"
 msgstr "E-Mail-Adresse"
 
-#: uffd/selfservice/templates/selfservice/self.html:38
+#: uffd/selfservice/templates/selfservice/self.html:34
 msgid "We will send you a confirmation mail to this address if you change it"
 msgstr ""
 "Wir werden dir eine Bestätigungsmail zum Setzen der neuen E-Mail-Adresse "
 "senden."
 
-#: uffd/selfservice/templates/selfservice/self.html:41
+#: uffd/selfservice/templates/selfservice/self.html:37
 msgid "Update Profile"
 msgstr "Änderungen speichern"
 
-#: uffd/selfservice/templates/selfservice/self.html:50
+#: uffd/selfservice/templates/selfservice/self.html:46
 #: uffd/session/templates/session/login.html:18
 #: uffd/signup/templates/signup/start.html:46
 #: uffd/user/templates/user/show.html:77
 msgid "Password"
 msgstr "Passwort"
 
-#: uffd/selfservice/templates/selfservice/self.html:51
+#: uffd/selfservice/templates/selfservice/self.html:47
 msgid ""
 "Your login password for the Single-Sign-On. Only enter it on the Single-"
 "Sign-On login page! No other legit websites will ask you for this "
@@ -1067,27 +1062,27 @@ msgstr ""
 " Webseite wird dich nach diesem Passwort fragen. Es wird auch niemals für"
 " Support-Anfragen benötigt."
 
-#: uffd/selfservice/templates/selfservice/self.html:56
+#: uffd/selfservice/templates/selfservice/self.html:52
 #: uffd/selfservice/templates/selfservice/set_password.html:14
 msgid "New Password"
 msgstr "Neues Passwort"
 
-#: uffd/selfservice/templates/selfservice/self.html:58
+#: uffd/selfservice/templates/selfservice/self.html:54
 #: uffd/user/templates/user/show.html:84
 msgid "At least 8 and at most 256 characters, no other special requirements."
 msgstr "Mindestens 8 und maximal 256 Zeichen, keine weiteren Einschränkungen."
 
-#: uffd/selfservice/templates/selfservice/self.html:62
+#: uffd/selfservice/templates/selfservice/self.html:58
 #: uffd/selfservice/templates/selfservice/set_password.html:21
 #: uffd/signup/templates/signup/start.html:53
 msgid "Repeat Password"
 msgstr "Passwort wiederholen"
 
-#: uffd/selfservice/templates/selfservice/self.html:64
+#: uffd/selfservice/templates/selfservice/self.html:60
 msgid "Change Password"
 msgstr "Passwort ändern"
 
-#: uffd/selfservice/templates/selfservice/self.html:74
+#: uffd/selfservice/templates/selfservice/self.html:70
 msgid ""
 "Setting up Two-Factor Authentication (2FA) adds an additional step to the"
 " Single-Sign-On login and increases the security of your account "
@@ -1097,11 +1092,11 @@ msgstr ""
 "Anmeldung im Single-Sign-On hinzu und verbessert damit die Sicherheit "
 "deines Accounts erheblich."
 
-#: uffd/selfservice/templates/selfservice/self.html:84
+#: uffd/selfservice/templates/selfservice/self.html:80
 msgid "Manage two-factor authentication"
 msgstr "Zwei-Faktor-Authentifizierung (2FA) verwalten"
 
-#: uffd/selfservice/templates/selfservice/self.html:93
+#: uffd/selfservice/templates/selfservice/self.html:89
 msgid ""
 "Aside from a set of base permissions, your roles determine the "
 "permissions of your account."
@@ -1109,7 +1104,7 @@ msgstr ""
 "Deine Berechtigungen werden, von einigen Basis-Berechtigungen abgesehen, "
 "von deinen Rollen bestimmt"
 
-#: uffd/selfservice/templates/selfservice/self.html:95
+#: uffd/selfservice/templates/selfservice/self.html:91
 #, python-format
 msgid ""
 "See <a href=\"%(services_url)s\">Services</a> for an overview of your "
@@ -1118,15 +1113,17 @@ msgstr ""
 "Auf <a href=\"%(services_url)s\">Dienste</a> erhälst du einen Überblick "
 "über deine aktuellen Berechtigungen."
 
-#: uffd/selfservice/templates/selfservice/self.html:100
+#: uffd/selfservice/templates/selfservice/self.html:96
 msgid "Administrators and role moderators can invite you to new roles."
-msgstr "Administratoren und Rollen-Moderatoren können dich zu Rollen einladen."
+msgstr ""
+"Accounts mit Adminrechten oder Rollen-Moderationsrechten können dich zu "
+"Rollen einladen."
 
-#: uffd/selfservice/templates/selfservice/self.html:102
+#: uffd/selfservice/templates/selfservice/self.html:98
 msgid "Administrators can add new roles to your account."
-msgstr "Administratoren können dich zu neuen Rollen hinzufügen."
+msgstr "Accounts mit Adminrechten können dich zu neuen Rollen hinzufügen."
 
-#: uffd/selfservice/templates/selfservice/self.html:117
+#: uffd/selfservice/templates/selfservice/self.html:113
 msgid ""
 "Some permissions in this role require you to setup two-factor "
 "authentication"
@@ -1134,11 +1131,11 @@ msgstr ""
 "Einige Berechtigungen dieser Rolle erfordern das Einrichten von Zwei-"
 "Faktor-Authentifikation"
 
-#: uffd/selfservice/templates/selfservice/self.html:124
+#: uffd/selfservice/templates/selfservice/self.html:120
 msgid "Leave"
 msgstr "Verlassen"
 
-#: uffd/selfservice/templates/selfservice/self.html:132
+#: uffd/selfservice/templates/selfservice/self.html:128
 msgid "You currently don't have any roles"
 msgstr "Du hast derzeit keine Rollen"
 
@@ -1150,10 +1147,10 @@ msgstr "Passwort zurücksetzen"
 #: uffd/signup/templates/signup/start.html:49
 msgid ""
 "At least 8 and at most 256 characters, no other special requirements. But"
-" please don't be stupid, do use a password manager."
+" please use a password manager."
 msgstr ""
 "Mindestens 8 und maximal 256 Zeichen, keine weiteren Einschränkungen. "
-"Bitte sei nicht dumm und verwende einen Passwort-Manager."
+"Bitte verwende einen Passwort-Manager."
 
 #: uffd/selfservice/templates/selfservice/set_password.html:25
 msgid "Set password"
@@ -1191,7 +1188,7 @@ msgstr ""
 
 #: uffd/session/views.py:99
 msgid "Login name or password is wrong"
-msgstr "Der Benutzername oder das Passwort ist falsch"
+msgstr "Der Anmeldename oder das Passwort ist falsch"
 
 #: uffd/session/views.py:102
 msgid "You do not have access to this service"
@@ -1422,11 +1419,11 @@ msgstr "Gruppen"
 
 #: uffd/user/views_user.py:29
 msgid "Users"
-msgstr "Benutzer"
+msgstr "Accounts"
 
 #: uffd/user/views_user.py:49
 msgid "Login name does not meet requirements"
-msgstr "Benutzername entspricht nicht den Anforderungen"
+msgstr "Anmeldename entspricht nicht den Anforderungen"
 
 #: uffd/user/views_user.py:54
 msgid "Mail is invalid"
@@ -1447,16 +1444,16 @@ msgstr "Service-Account erstellt"
 #: uffd/user/views_user.py:80
 msgid "User created. We sent the user a password reset link by mail"
 msgstr ""
-"Benutzer erstellt. E-Mail mit einem Link zum Setzen des Passworts wurde "
+"Account erstellt. E-Mail mit einem Link zum Setzen des Passworts wurde "
 "versendet."
 
 #: uffd/user/views_user.py:82
 msgid "User updated"
-msgstr "Benutzer aktualisiert"
+msgstr "Account aktualisiert"
 
 #: uffd/user/views_user.py:93
 msgid "Deleted user"
-msgstr "Benutzer gelöscht"
+msgstr "Account gelöscht"
 
 #: uffd/user/templates/group/list.html:9 uffd/user/templates/group/show.html:7
 msgid "GID"
@@ -1476,7 +1473,7 @@ msgstr "service"
 
 #: uffd/user/templates/user/list.html:57
 msgid "Import a csv formated list of users"
-msgstr "Importiere eine als CSV formatierte Liste von Benutzern"
+msgstr "Importiere eine als CSV formatierte Liste von Accounts"
 
 #: uffd/user/templates/user/list.html:64
 msgid ""
@@ -1489,8 +1486,8 @@ msgstr ""
 "Beispiel:"
 
 #: uffd/user/templates/user/list.html:75 uffd/user/templates/user/show.html:58
-msgid "Ignore login name blacklist"
-msgstr "Benutzernamen-Blacklist ignorieren"
+msgid "Ignore login name blocklist"
+msgstr "Liste der nicht erlaubten Anmeldenamen ignorieren"
 
 #: uffd/user/templates/user/list.html:80
 msgid "Import"
@@ -1500,6 +1497,10 @@ msgstr "Importieren"
 msgid "Reset 2FA"
 msgstr "2FA zurücksetzen"
 
+#: uffd/user/templates/user/show.html:28
+msgid "User ID"
+msgstr "Account ID"
+
 #: uffd/user/templates/user/show.html:36
 msgid "will be choosen"
 msgstr "wird automatisch bestimmt"
@@ -1511,19 +1512,19 @@ msgstr "Service-Account"
 #: uffd/user/templates/user/show.html:51
 msgid ""
 "Only letters, numbers, dashes (\"-\") and underscores (\"_\") are "
-"allowed. At most 32, at least 2 characters. There is a word blacklist. "
+"allowed. At most 32, at least 2 characters. There is a word blocklist. "
 "Must be unique."
 msgstr ""
 "Nur Buchstaben, Zahlen, Binde- (\"-\") und Unterstriche (\"_\") sind "
-"erlaubt. Maximal 32, mindestens 2 Zeichen. Es gibt eine Blacklist. Muss "
-"einmalig sein."
+"erlaubt. Maximal 32, mindestens 2 Zeichen. Es gibt eine Liste nicht "
+"erlaubter Namen. Muss einmalig sein."
 
 #: uffd/user/templates/user/show.html:66
 msgid ""
 "If you leave this empty it will be set to the login name. At most 128, at"
 " least 2 characters. No character restrictions."
 msgstr ""
-"Wenn das Feld leer bleibt, wird der Benutzername verwendet. Maximal 128, "
+"Wenn das Feld leer bleibt, wird der Anmeldename verwendet. Maximal 128, "
 "mindestens 2 Zeichen. Keine Zeichenbeschränkung."
 
 #: uffd/user/templates/user/show.html:70
@@ -1535,7 +1536,7 @@ msgid ""
 "Do a sanity check here. A user can take over another account if both have"
 " the same mail address set."
 msgstr ""
-"Überprüfe, ob die E-Mail-Adresse plausibel ist! Ein Benutzer kann einen "
+"Überprüfe, ob die E-Mail-Adresse plausibel ist! Ein Account kann einen "
 "anderen Account übernehmen, wenn beide die selbe E-Mail-Adresse "
 "verwenden."
 
diff --git a/uffd/user/models.py b/uffd/user/models.py
index 2749884f..81a6e363 100644
--- a/uffd/user/models.py
+++ b/uffd/user/models.py
@@ -109,14 +109,14 @@ class BaseUser(ldap.Model):
 				return True
 		return False
 
-	def set_loginname(self, value, ignore_blacklist=False):
+	def set_loginname(self, value, ignore_blocklist=False):
 		if len(value) > 32 or len(value) < 1:
 			return False
 		for char in value:
 			if not char in string.ascii_lowercase + string.digits + '_-':
 				return False
-		if not ignore_blacklist:
-			for expr in current_app.config['LOGINNAME_BLACKLIST']:
+		if not ignore_blocklist:
+			for expr in current_app.config['LOGINNAME_BLOCKLIST']:
 				if re.match(expr, value):
 					return False
 		self.loginname = value
diff --git a/uffd/user/templates/user/list.html b/uffd/user/templates/user/list.html
index 013f6fb3..61f5b68d 100644
--- a/uffd/user/templates/user/list.html
+++ b/uffd/user/templates/user/list.html
@@ -71,8 +71,8 @@ testuser2,foobaadsfr@example.com,5;2
 				</pre>
 				<textarea rows="10" class="form-control" name="csv"></textarea>
 				<div class="form-check mt-2">
-					<input class="form-check-input" type="checkbox" id="ignore-loginname-blacklist" name="ignore-loginname-blacklist" value="1" aria-label="enabled">
-					<label class="form-check-label" for="ignore-loginname-blacklist">{{_("Ignore login name blacklist")}}</label>
+					<input class="form-check-input" type="checkbox" id="ignore-loginname-blocklist" name="ignore-loginname-blocklist" value="1" aria-label="enabled">
+					<label class="form-check-label" for="ignore-loginname-blocklist">{{_("Ignore login name blocklist")}}</label>
 				</div>
 			</div>
 			<div class="modal-footer">
diff --git a/uffd/user/templates/user/show.html b/uffd/user/templates/user/show.html
index 9fee26bf..59ef1bd1 100644
--- a/uffd/user/templates/user/show.html
+++ b/uffd/user/templates/user/show.html
@@ -48,14 +48,14 @@
 				<label for="user-loginname">{{_("Login Name")}}</label>
 				<input type="text" class="form-control" id="user-loginname" name="loginname" value="{{ user.loginname or '' }}" {% if user.uid %}readonly{% endif %}>
 				<small class="form-text text-muted">
-					{{_("Only letters, numbers, dashes (\"-\") and underscores (\"_\") are allowed. At most 32, at least 2 characters. There is a word blacklist. Must be unique.")}}
+					{{_("Only letters, numbers, dashes (\"-\") and underscores (\"_\") are allowed. At most 32, at least 2 characters. There is a word blocklist. Must be unique.")}}
 				</small>
 			</div>
 			{% if not user.uid %}
 			<div class="form-group col">
 				<div class="form-check">
-					<input class="form-check-input" type="checkbox" id="ignore-loginname-blacklist" name="ignore-loginname-blacklist" value="1" aria-label="enabled">
-					<label class="form-check-label" for="ignore-loginname-blacklist">{{_('Ignore login name blacklist')}}</label>
+					<input class="form-check-input" type="checkbox" id="ignore-loginname-blocklist" name="ignore-loginname-blocklist" value="1" aria-label="enabled">
+					<label class="form-check-label" for="ignore-loginname-blocklist">{{_('Ignore login name blocklist')}}</label>
 				</div>
 			</div>
 			{% endif %}
diff --git a/uffd/user/views_user.py b/uffd/user/views_user.py
index 80e91b05..ee5bc71e 100644
--- a/uffd/user/views_user.py
+++ b/uffd/user/views_user.py
@@ -42,10 +42,10 @@ def show(uid=None):
 def update(uid=None):
 	if uid is None:
 		user = User()
-		ignore_blacklist = request.form.get('ignore-loginname-blacklist', False)
+		ignore_blocklist = request.form.get('ignore-loginname-blocklist', False)
 		if request.form.get('serviceaccount'):
 			user.is_service_user = True
-		if not user.set_loginname(request.form['loginname'], ignore_blacklist=ignore_blacklist):
+		if not user.set_loginname(request.form['loginname'], ignore_blocklist=ignore_blocklist):
 			flash(_('Login name does not meet requirements'))
 			return redirect(url_for('user.show'))
 	else:
@@ -101,7 +101,7 @@ def csvimport():
 		flash('No data for csv import!')
 		return redirect(url_for('user.index'))
 
-	ignore_blacklist = request.values.get('ignore-loginname-blacklist', False)
+	ignore_blocklist = request.values.get('ignore-loginname-blocklist', False)
 
 	roles = Role.query.filter_by(is_default=False).all()
 	usersadded = 0
@@ -112,7 +112,7 @@ def csvimport():
 				flash("invalid line, ignored : {}".format(row))
 				continue
 			newuser = User()
-			if not newuser.set_loginname(row[0], ignore_blacklist=ignore_blacklist) or not newuser.set_displayname(row[0]):
+			if not newuser.set_loginname(row[0], ignore_blocklist=ignore_blocklist) or not newuser.set_displayname(row[0]):
 				flash("invalid login name, skipped : {}".format(row))
 				continue
 			if not newuser.set_mail(row[1]):
diff --git a/update_translations.sh b/update_translations.sh
index c3a80dee..69ca86f2 100755
--- a/update_translations.sh
+++ b/update_translations.sh
@@ -2,6 +2,11 @@
 set -e
 
 pybabel extract -F uffd/babel.cfg -k lazy_gettext -o messages.pot uffd
+
+# If you want to initialize a new message, use:
+#   pybabel init -i messages.pot -d uffd/translations -l fr
+# Complete Documentation of Flask-Babel: https://flask-babel.tkte.ch
+
 pybabel update -i messages.pot -d uffd/translations
 pybabel compile -d uffd/translations
 
-- 
GitLab