From d9e3661071a48f4c7e7772218a1bcb450c74789f Mon Sep 17 00:00:00 2001 From: aitzol Date: Sat, 16 Apr 2022 23:13:00 +0200 Subject: [PATCH] txukunketa --- app.py | 166 +++++------------- data/__pycache__/fnlist.cpython-39.pyc | Bin 29645 -> 0 bytes data/invite-codes.db | Bin 8192 -> 8192 bytes .../__pycache__/flist.cpython-39.pyc | Bin 21988 -> 21988 bytes libs/__pycache__/helper.cpython-39.pyc | Bin 0 -> 992 bytes libs/__pycache__/localization.cpython-39.pyc | Bin 0 -> 3293 bytes .../__pycache__/slist.cpython-39.pyc | Bin 8243 -> 8243 bytes {data => libs}/flist.py | 0 libs/helper.py | 25 +++ libs/localization.py | 68 +++++++ {data => libs}/slist.py | 0 locales/base.pot | 106 +++++------ locales/en/LC_MESSAGES/base.mo | Bin 3855 -> 4097 bytes locales/en/LC_MESSAGES/base.po | 117 ++++++------ locales/eu/LC_MESSAGES/base.mo | Bin 3967 -> 4185 bytes locales/eu/LC_MESSAGES/base.po | 125 ++++++------- 16 files changed, 322 insertions(+), 285 deletions(-) delete mode 100644 data/__pycache__/fnlist.cpython-39.pyc rename {data => libs}/__pycache__/flist.cpython-39.pyc (99%) create mode 100644 libs/__pycache__/helper.cpython-39.pyc create mode 100644 libs/__pycache__/localization.cpython-39.pyc rename {data => libs}/__pycache__/slist.cpython-39.pyc (98%) rename {data => libs}/flist.py (100%) create mode 100644 libs/helper.py create mode 100644 libs/localization.py rename {data => libs}/slist.py (100%) diff --git a/app.py b/app.py index 605ea97..b36029a 100644 --- a/app.py +++ b/app.py @@ -31,10 +31,10 @@ from ldap3.core.exceptions import LDAPBindError, LDAPConstraintViolationResult, import logging from os import getenv, environ, path import re -import sqlite3 -from data import flist, slist +from libs import flist, slist +from libs.localization import * +from libs.helper import * import random -import gettext BASE_DIR = path.dirname(__file__) LOG = logging.getLogger(__name__) @@ -134,6 +134,9 @@ def post_signup(): form = request.forms.getunicode isFake = False + manage_codes = Tools() + db = 'data/invite-codes.db' + def username_validation(e): regex = r'^\w+$' return(bool(re.fullmatch(regex, e))) @@ -142,23 +145,6 @@ def post_signup(): regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' return(bool(re.fullmatch(regex, e))) - def code_is_valid(code): - con = sqlite3.connect('data/invite-codes.db') - cur = con.cursor() - - codes=[] - for row in cur.execute('SELECT * FROM codes WHERE valid = 1'): - codes.append(row[0]) - - return(bool(code in codes)) - - def mark_code_as_used(code): - con = sqlite3.connect('data/invite-codes.db') - cur = con.cursor() - - cur.execute('''UPDATE codes SET valid=? WHERE code==?''',(0, code)) - con.commit() - def auto_complete(arg): if arg == 'firstname': result = random.choice(flist.firstname) @@ -169,7 +155,7 @@ def post_signup(): def error(msg): return signup_tpl(alerts=[('error', msg, 'fadeOut')], str=i18n.str) - if not code_is_valid(form('invite_code')): + if not manage_codes.code_is_valid(form('invite_code'), db): return(error(i18n.msg[4])) if len(form('username')) < 3: @@ -206,7 +192,7 @@ def post_signup(): return error(str(e)) try: - mark_code_as_used(form('invite_code')) + manage_codes.mark_code_as_used(form('invite_code'), db) except Error as e: LOG.warning("There was a problem verifying the invitation code, please try again later.", e) return error(str(e)) @@ -230,10 +216,10 @@ def post_edit_fullname(): return edit_fullname_tpl(alerts=[('error', msg, 'fadeOut')], data=newSession().get(), str=i18n.str) if len(form('firstname')) < 3: - return error(i18n.msg[10]) + return error(i18n.msg[11]) if len(form('surname')) < 3: - return error(i18n.msg[11]) + return error(i18n.msg[12]) try: edit_fullname(username, old_firstname, old_surname, form('firstname').lower(), form('surname').lower()) @@ -241,7 +227,7 @@ def post_edit_fullname(): LOG.warning("Unsuccessful attempt to edit fullname for %s: %s" % (username, e)) return error(str(e)) - return user_tpl(alerts=[('success', i18n.msg[12], 'fadeOut' )], data=newSession().get(), str=i18n.str) + return user_tpl(alerts=[('success', i18n.msg[13], 'fadeOut' )], data=newSession().get(), str=i18n.str) @post('/edit_email') def post_edit_email(): @@ -261,7 +247,7 @@ def post_edit_email(): return edit_email_tpl(alerts=[('error', msg, 'fadeOut')], data=newSession().get(), str=i18n.str) if not email_is_valid(form('email')): - return(error(i18n.msg[13])) + return(error(i18n.msg[14])) try: edit_email(username, old_email, form('email').lower()) @@ -269,7 +255,7 @@ def post_edit_email(): LOG.warning("Unsuccessful attempt to change email addres for %s: %s" % (username, e)) return error(str(e)) - return user_tpl(alerts=[('success', i18n.msg[14], 'fadeOut' )], data=newSession().get(), str=i18n.str) + return user_tpl(alerts=[('success', i18n.msg[16], 'fadeOut' )], data=newSession().get(), str=i18n.str) @post('/change_pwd') def post_change_pwd(): @@ -289,7 +275,7 @@ def post_change_pwd(): return error(i18n.msg[8]) if form('old-password') == form('confirm-password'): - return error(i18n.msg[15]) + return error(i18n.msg[17]) try: change_passwords(username, form('old-password'), form('new-password')) @@ -300,7 +286,7 @@ def post_change_pwd(): LOG.info("Password successfully changed for: %s" % username) - return index_tpl(alerts=[('success', i18n.msg[16], 'fadeOut')], username=username, str=i18n.str) + return index_tpl(alerts=[('success', i18n.msg[18], 'fadeOut')], username=username, str=i18n.str) @post('/delete') def post_delete(): @@ -314,14 +300,14 @@ def post_delete(): if(form('username').lower() == username): del_user(username) else: - return(error(i18n.msg[17])) + return(error(i18n.msg[19])) except Error as e: LOG.warning("Unsuccessful attempt to delete the account: %s" % e) return error(str(e)) LOG.info("Account successfully deleted") - return index_tpl(alerts=[('success', i18n.msg[18], 'fadeOut')], str=i18n.str) + return index_tpl(alerts=[('success', i18n.msg[20], 'fadeOut')], str=i18n.str) @route('/static/', name='static') def serve_static(filename): @@ -380,15 +366,15 @@ def login_user(conf, *args): login_user_ldap(conf, *args) except (LDAPBindError, LDAPInvalidCredentialsResult, LDAPUserNameIsMandatoryError): - raise Error(i18n.msg[19]) + raise Error(i18n.msg[21]) except LDAPSocketOpenError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[20]) + raise Error(i18n.msg[22]) except LDAPExceptionError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[21]) + raise Error(i18n.msg[23]) def login_user_ldap(conf, username, password): #set current LDAP @@ -428,15 +414,15 @@ def logout_user(conf, *args): logout_user_ldap(conf, *args) except (LDAPBindError, LDAPInvalidCredentialsResult, LDAPUserNameIsMandatoryError): - raise Error(i18n.msg[19]) + raise Error(i18n.msg[21]) except LDAPSocketOpenError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[20]) + raise Error(i18n.msg[22]) except LDAPExceptionError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[21]) + raise Error(i18n.msg[23]) def logout_user_ldap(conf, username): #set current LDAP @@ -475,15 +461,15 @@ def new_user_account(conf, *args): register(conf, *args) except (LDAPBindError, LDAPInvalidCredentialsResult, LDAPUserNameIsMandatoryError): - raise Error(i18n.msg[19]) + raise Error(i18n.msg[21]) except LDAPSocketOpenError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[20]) + raise Error(i18n.msg[22]) except LDAPExceptionError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[21]) + raise Error(i18n.msg[23]) def register(conf, username, firstname, surname, password, email, isFake): @@ -503,10 +489,10 @@ def register(conf, username, firstname, surname, password, email, isFake): try: if (find_user_dn(conf,c,username) is not None): - raise Error(i18n.msg[22]) + raise Error(i18n.msg[24]) if (find_email(conf,c,email)): - raise Error(i18n.msg[23]) + raise Error(i18n.msg[25]) except Error as e: raise e @@ -549,7 +535,7 @@ def new_fullname(conf, *args): update_fullname(conf, *args) except (LDAPBindError, LDAPInvalidCredentialsResult, LDAPUserNameIsMandatoryError): - raise Error(i18n.msg[24]) + raise Error(i18n.msg[26]) except LDAPConstraintViolationResult as e: # Extract useful part of the error message (for Samba 4 / AD). @@ -558,11 +544,11 @@ def new_fullname(conf, *args): except LDAPSocketOpenError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[20]) + raise Error(i18n.msg[22]) except LDAPExceptionError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[21]) + raise Error(i18n.msg[23]) def update_fullname(conf, username, firstname, surname): #set current LDAP @@ -581,7 +567,7 @@ def update_fullname(conf, username, firstname, surname): fakeFullName = user_dn[3:-len(base)].split(" ") if(user_dn == new_user_dn): - raise Error('Izen-abizenak ez dira aldatu.') + raise Error(i18n.msg[10]) c.modify(new_user_dn, {'fakeCn': [(MODIFY_REPLACE, 'false' )]}) newSession().set(get_user_data(new_user_dn, c)) @@ -612,7 +598,7 @@ def new_email_address(conf, *args): update_email_address(conf, *args) except (LDAPBindError, LDAPInvalidCredentialsResult, LDAPUserNameIsMandatoryError): - raise Error(i18n.msg[24]) + raise Error(i18n.msg[26]) except LDAPConstraintViolationResult as e: # Extract useful part of the error message (for Samba 4 / AD). @@ -621,16 +607,16 @@ def new_email_address(conf, *args): except LDAPSocketOpenError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[20]) + raise Error(i18n.msg[22]) except LDAPExceptionError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[21]) + raise Error(i18n.msg[23]) def update_email_address(conf, username, old_email, new_email): if(old_email == new_email): - raise Error('Email helbidea ez da aldatu.') + raise Error(i18n.msg[15]) #set current LDAP superUser = SuperUsers(conf) @@ -670,7 +656,7 @@ def change_password(conf, *args): change_password_ldap(conf, *args) except (LDAPBindError, LDAPInvalidCredentialsResult, LDAPUserNameIsMandatoryError): - raise Error(i18n.msg[24]) + raise Error(i18n.msg[26]) except LDAPConstraintViolationResult as e: # Extract useful part of the error message (for Samba 4 / AD). @@ -679,11 +665,11 @@ def change_password(conf, *args): except LDAPSocketOpenError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[20]) + raise Error(i18n.msg[22]) except LDAPExceptionError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[21]) + raise Error(i18n.msg[23]) def change_password_ldap(conf, username, old_pass, new_pass): @@ -729,11 +715,11 @@ def del_account(conf, *args): except LDAPSocketOpenError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[20]) + raise Error(i18n.msg[22]) except LDAPExceptionError as e: LOG.error('{}: {!s}'.format(e.__class__.__name__, e)) - raise Error(i18n.msg[21]) + raise Error(i18n.msg[23]) def delete(conf, username): #set current LDAP @@ -831,8 +817,9 @@ def newSession(): self.data = bottle.request.environ.get('beaker.session') self.lang = self.get_lang() #localization + self.lang = self.get_lang() global i18n - i18n = LocalizeTo(self.lang) + i18n = LocalizeTo(self.lang, CONF) def get_lang(self): if 'HTTP_ACCEPT_LANGUAGE' in bottle.request.environ: @@ -845,7 +832,7 @@ def newSession(): if 'username' in self.data: return(self.data) else: - raise Error(i18n.msg[25]) + raise Error(i18n.msg[27]) def set(self, data): self.active = data[0] @@ -871,71 +858,6 @@ def newSession(): s=Session() return s -class LocalizeTo(object): - """docstring for Session""" - def __init__(self, lang): - super(LocalizeTo, self).__init__() - translate = gettext.translation('base', localedir=CONF['locale']['dir'], languages=[lang]) - translate.install() - _ = translate.gettext - - #generic strings - str_00 = _("User") - str_01 = _("Username") - str_02 = _("Firstname") - str_03 = _("Surname") - str_04 = _("Password") - str_05 = _("Old password") - str_06 = _("New password") - str_07 = _("Confirm password") - str_08 = _("Email") - str_09 = _("edit") - str_10 = _("Login") - str_11 = _("Logout") - str_12 = _("Delete") - str_13 = _("Sign Up") - str_14 = _("Back") - str_15 = _("Update") - str_16 = _("Or Sign In") - str_17 = _("Or Sign Up") - str_18 = _("Invite code") - str_19 = _("Edit your fullname") - str_20 = _("Edit your email") - str_21 = _("Change your password") - str_22 = _("Delete your account") - str_23 = _("Welcome") - - #messages - msg_00 = _("The session was closed.") - msg_01 = _("Username must be at least 3 characters long!") - msg_02 = _("Please enter your password!") - msg_03 = _("Welcome") - msg_04 = _("The code is invalid or has expired.") - msg_05 = _("A bit short, don't you think?!") - msg_06 = _("Not allowed characters for the username field.") - msg_07 = _("Passwords do not match!") - msg_08 = _("Password must be at least 8 characters long!") - msg_09 = _("Congratulations, your account has been created!") - msg_10 = _("Your firstname is a bit short, don't you think?") - msg_11 = _("Your surname is a bit short, don't you think?") - msg_12 = _("Your first and last name have been successfully updated.") - msg_13 = _("Invalid email address. Please try again.") - msg_14 = _("Your email has been successfully updated.") - msg_15 = _("The password entered is the same as the current password.") - msg_16 = _("Password has been changed!") - msg_17 = _("Please, type your username for account deletion.") - msg_18 = _("Account successfully deleted!") - msg_19 = _("Username or password is incorrect!") - msg_20 = _("Unable to connect to the remote server.") - msg_21 = _("Encountered an unexpected error while communicating with the remote server.") - msg_22 = _("User already exists.") - msg_23 = _("Email already exists.") - msg_24 = _("Forgot your password? Please try again.") - msg_25 = _("The session has expired.") - - self.str = {'usr':str_00, 'usrn':str_01, 'fn':str_02, 'sn':str_03, 'pwd':str_04, 'old-pwd':str_05, 'new-pwd':str_06, 'conf-pwd':str_07, 'email':str_08, 'edit':str_09, 'login':str_10, 'log-out':str_11, 'del':str_12, 'sign-up':str_13, 'back':str_14, 'update':str_15, 'or-sign-in':str_16, 'or-sign-up':str_17, 'inv-code':str_18, 'edit-fn':str_19, 'edit-email':str_20, 'ch-pwd':str_21, 'del-account':str_22, 'welcome':str_23} - self.msg = (msg_00, msg_01, msg_02, msg_03, msg_04, msg_05, msg_06, msg_07, msg_08, msg_09, msg_10, msg_11, msg_12, msg_13, msg_14, msg_15, msg_16, msg_17, msg_18, msg_19, msg_20, msg_21, msg_22, msg_23, msg_24, msg_25) - if environ.get('DEBUG'): bottle.debug(True) diff --git a/data/__pycache__/fnlist.cpython-39.pyc b/data/__pycache__/fnlist.cpython-39.pyc deleted file mode 100644 index d4bb04f133eddf3f64c79323e23abd6ab82e4fb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29645 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 A*Z=?k diff --git a/data/invite-codes.db b/data/invite-codes.db index 80a141baedb1c8f1bd837a7d469074e0fef1df9e..bb2c159c67a5687a104df5a5cb37693e900021ba 100644 GIT binary patch delta 23 ecmZp0XmFSy&B#7c#+i|QV?wn&Bgf=B@+tsN;0BTa delta 23 ecmZp0XmFSy&B!uQ#+i|2V?wn&Bj@Bh@+tsNlm?9e diff --git a/data/__pycache__/flist.cpython-39.pyc b/libs/__pycache__/flist.cpython-39.pyc similarity index 99% rename from data/__pycache__/flist.cpython-39.pyc rename to libs/__pycache__/flist.cpython-39.pyc index 0ff74a1146377d3a4c962da591bc4695d7518817..fd0bc85af4427ac45ee3cd6dc46dd3c8588be541 100644 GIT binary patch delta 30 kcmaE|n(@hMMy^C&UM>b8&{(mNYgZ^sPG(Z^b8kXyWwYgZ^sN@7Xk^DF3A9H}8bXXP#4|}-G9RvxIrO<;H zAh~qTKsu+q$0R#~y88?5(1{6`1!Gq4@1ddqy`je?ll%;Nj&!7pyDL5E0vZbsJlj`$3H;(==poA(M*%RX?|Ae zNa@DtyA6a$hDk0&jlxk}VAG8mssb1?+RLf=GI`|M_qI+JM$vQgwS`t(NwP@GLBoZUa030j&B@q~`v+w+GL3!+TDtg*6uk! zl)Tm2t=RGO3MSDs6`D%cR5J3D4F*YG_evu4CK!Y{4)`B#rPK5P literal 0 HcmV?d00001 diff --git a/libs/__pycache__/localization.cpython-39.pyc b/libs/__pycache__/localization.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd9f3a1b17a28c0d77fa99dd43a8f2865cfab6f8 GIT binary patch literal 3293 zcmb7{TW{OQ6~{@Dy7-ohFY(GpvaNLgd$ZA z8O6lpDGTh=euF-2ANOrP4`27GU!hO^&u}C=?IOU+5Px(1&zU)Aj%a6LVOGQE=HB1C zzbt6lucC7KW1{j0eAyNrp62O+W@&%cypm^puXzU5KN(iZ)8A+f^WPYuy>i9#^2bmW zMo^%drF)u~VHrPYJzeV5Eb|A=)U2{l$!A|it`qnf{VvK@yvSuq?1z2Qi(>MIGUi92 zJCPL1r}zrnL>qfu(zHZNbgq3W{Z#swrfZ4u*7S5<@=EJ4cU|LpU-!%(jgJO5ekzL* z+<0qzG`Z=OKj|OKU-yz#2FM&VaMvEI0?wf%D)zxBxDISHLUaRq!f!4ZH?k z2d{&R;3BvLE`iJ7GPnY+fH%M!;3~KZu7PXdI=BvQfE(Z@xCw57Ti`ah4eo$D;7#zR z>L(yUy$;sFTi`8l7u*GJgSWvu;2rQTco*CQ_rQDLJ+J{b!295R@B#P$+z0o;CfEd9 zU<*6|55Pn45Nv~Oumg6$Bk%}(2tEWKfseq);A8L@JO)pAnOAs~*Z2&d<#T+VFYqh; zD!<0B^F_YIm-!06!B_bjU*{WqlW%z^|6JpmUE$k&hu`Fc*ZD2J%Wv~L{4U?)_jrTf z=MVTkZ}JvD;D@};JN$@0RavWu7q_TQ%_voguYmzVTz0$YS+PD%7_v+jLxoJv{A8ow)|{>&C+7n z)byod`J&Zv-6#zctNK?OxDiBFzZ+1(irY)Z4kK<5G3vFl{mD6zVagKHrNl`{Kpm8i zh&ym%$4zL=NDzhndbasmbWuV>G=6SCJ=+y)h;0y`5kGv79O4lqjRBUUA4YyG*4ueX zy4WHcL~*iDyeQn0`z6W158pkhXRTLJLYyFo#?-sKzQ{fa^i$m)uWPT%pvR<qcPXQ9&#C`lsRfiOgyC<^0a zI*f3^5xDPZ+{*s)Jd~G{;yxgBNE+gDU^r?tj?4SbFEUWj;$-D_c>1`k&^#Z=$#lf1QiaoowUDZ}@pl_+^qUE??iqnq{OcwoE+2 zywt;&g}E^rds#IKyrwLKbSw)soI_8P^0JJExQaJ~yc~$EnN@+NNSg*uIjb^c#%79~ z*+tIGD@AN(vr*iXJ(w^pr=zTf?9!A8vnn!ivxjb3kn3a>cOVUzgLHG63dcn%Y}E2H zOGh|rysBt<&9?o}Pi#A{_GyyP4~aFG#7@YHM37hgkR`}Rxq;W9+!(Tc<1{xJ4SKmL zesgkD>@uI3%%Qn%TNRA84-XaFiXFux#fOTI6dx-dE1oEx7HliMw$f`Wy|&V8E4{YT zYb(9B(rYWdw$ke;y^hlBD7_B!uuW;dB>E-MFFEPQda{o7B(a_()|13~l2}hr*e|K{ zg#EIv^o0GguJnZcvaa-m{j#p~g#Dr}?3Yw}6Z<<#ucP!jO0RSLv!2h`wu_X_Z2M>J zKQ~$jf!}2Z@^!+`a#R-#dPyT{_XTrHfbb z)+A6H6%n-JHv~aDYum%fO9N4!x9xwVj(lkl;cVM@ceic1i+n-t*QG&#wr%XEcx;N& yj(CXcAm8D|e;hU4)MZP3Qv|!jP|Z)R+*fmHrETbo9yq literal 0 HcmV?d00001 diff --git a/data/__pycache__/slist.cpython-39.pyc b/libs/__pycache__/slist.cpython-39.pyc similarity index 98% rename from data/__pycache__/slist.cpython-39.pyc rename to libs/__pycache__/slist.cpython-39.pyc index 28a698f7e6305ff963e8dde4ab2edec2aafd1e3b..0b0bb150110ca5aa016bbfbe4e6fbfae0c0bf0d5 100644 GIT binary patch delta 52 zcmdn&u-Sntk(ZZ?0SGi!Y~E2zB1VUwGmQks)$#|TvM8KevV DfldxT delta 52 zcmdn&u-Sntk(ZZ?0SM$4Z{*@sP)JEENz^aS$t*6>E2zB1VUwGmQks)$#|TvM8KevV DeIyPb diff --git a/data/flist.py b/libs/flist.py similarity index 100% rename from data/flist.py rename to libs/flist.py diff --git a/libs/helper.py b/libs/helper.py new file mode 100644 index 0000000..f3e8eb9 --- /dev/null +++ b/libs/helper.py @@ -0,0 +1,25 @@ +#!/usr/bin/python3 + +import sqlite3 + +class Tools(): + + def __init__(self): + self.username = '' + + #check code + def code_is_valid(self, code, db): + con = sqlite3.connect(db) + cur = con.cursor() + + codes=[] + for row in cur.execute('SELECT * FROM codes WHERE valid = 1'): + codes.append(row[0]) + return(bool(code in codes)) + + def mark_code_as_used(self, code, db): + con = sqlite3.connect(db) + cur = con.cursor() + + cur.execute('''UPDATE codes SET valid=? WHERE code==?''',(0, code)) + con.commit() \ No newline at end of file diff --git a/libs/localization.py b/libs/localization.py new file mode 100644 index 0000000..8468404 --- /dev/null +++ b/libs/localization.py @@ -0,0 +1,68 @@ +import gettext + +class LocalizeTo(object): + """docstring for Session""" + def __init__(self, lang, conf): + super(LocalizeTo, self).__init__() + translate = gettext.translation('base', localedir=conf['locale']['dir'], languages=[lang]) + translate.install() + _ = translate.gettext + + #generic strings + str_00 = _("User") + str_01 = _("Username") + str_02 = _("Firstname") + str_03 = _("Surname") + str_04 = _("Password") + str_05 = _("Old password") + str_06 = _("New password") + str_07 = _("Confirm password") + str_08 = _("Email") + str_09 = _("edit") + str_10 = _("Login") + str_11 = _("Logout") + str_12 = _("Delete") + str_13 = _("Sign Up") + str_14 = _("Back") + str_15 = _("Update") + str_16 = _("Or Sign In") + str_17 = _("Or Sign Up") + str_18 = _("Invite code") + str_19 = _("Edit your fullname") + str_20 = _("Edit your email") + str_21 = _("Change your password") + str_22 = _("Delete your account") + str_23 = _("Welcome") + + #messages + msg_00 = _("The session was closed.") + msg_01 = _("Username must be at least 3 characters long!") + msg_02 = _("Please enter your password!") + msg_03 = _("Welcome") + msg_04 = _("The code is invalid or has expired.") + msg_05 = _("A bit short, don't you think?!") + msg_06 = _("Not allowed characters for the username field.") + msg_07 = _("Passwords do not match!") + msg_08 = _("Password must be at least 8 characters long!") + msg_09 = _("Congratulations, your account has been created!") + msg_10 = _("Your first and last name have not been changed.") + msg_11 = _("Your firstname is a bit short, don't you think?") + msg_12 = _("Your surname is a bit short, don't you think?") + msg_13 = _("Your first and last name have been successfully updated.") + msg_14 = _("Invalid email address. Please try again.") + msg_15 = _("Email address has not been changed.") + msg_16 = _("Your email has been successfully updated.") + msg_17 = _("The password entered is the same as the current password.") + msg_18 = _("Password has been changed!") + msg_19 = _("Please, type your username for account deletion.") + msg_20 = _("Account successfully deleted!") + msg_21 = _("Username or password is incorrect!") + msg_22 = _("Unable to connect to the remote server.") + msg_23 = _("Encountered an unexpected error while communicating with the remote server.") + msg_24 = _("User already exists.") + msg_25 = _("Email already exists.") + msg_26 = _("Forgot your password? Please try again.") + msg_27 = _("The session has expired.") + + self.str = {'usr':str_00, 'usrn':str_01, 'fn':str_02, 'sn':str_03, 'pwd':str_04, 'old-pwd':str_05, 'new-pwd':str_06, 'conf-pwd':str_07, 'email':str_08, 'edit':str_09, 'login':str_10, 'log-out':str_11, 'del':str_12, 'sign-up':str_13, 'back':str_14, 'update':str_15, 'or-sign-in':str_16, 'or-sign-up':str_17, 'inv-code':str_18, 'edit-fn':str_19, 'edit-email':str_20, 'ch-pwd':str_21, 'del-account':str_22, 'welcome':str_23} + self.msg = (msg_00, msg_01, msg_02, msg_03, msg_04, msg_05, msg_06, msg_07, msg_08, msg_09, msg_10, msg_11, msg_12, msg_13, msg_14, msg_15, msg_16, msg_17, msg_18, msg_19, msg_20, msg_21, msg_22, msg_23, msg_24, msg_25, msg_26, msg_27) diff --git a/data/slist.py b/libs/slist.py similarity index 100% rename from data/slist.py rename to libs/slist.py diff --git a/locales/base.pot b/locales/base.pot index 642cbd6..634d4af 100644 --- a/locales/base.pot +++ b/locales/base.pot @@ -17,199 +17,207 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: app.py:880 +#: libs/localization.py:12 msgid "User" msgstr "" -#: app.py:881 +#: libs/localization.py:13 msgid "Username" msgstr "" -#: app.py:882 +#: libs/localization.py:14 msgid "Firstname" msgstr "" -#: app.py:883 +#: libs/localization.py:15 msgid "Surname" msgstr "" -#: app.py:884 +#: libs/localization.py:16 msgid "Password" msgstr "" -#: app.py:885 +#: libs/localization.py:17 msgid "Old password" msgstr "" -#: app.py:886 +#: libs/localization.py:18 msgid "New password" msgstr "" -#: app.py:887 +#: libs/localization.py:19 msgid "Confirm password" msgstr "" -#: app.py:888 +#: libs/localization.py:20 msgid "Email" msgstr "" -#: app.py:889 +#: libs/localization.py:21 msgid "edit" msgstr "" -#: app.py:890 +#: libs/localization.py:22 msgid "Login" msgstr "" -#: app.py:891 +#: libs/localization.py:23 msgid "Logout" msgstr "" -#: app.py:892 +#: libs/localization.py:24 msgid "Delete" msgstr "" -#: app.py:893 +#: libs/localization.py:25 msgid "Sign Up" msgstr "" -#: app.py:894 +#: libs/localization.py:26 msgid "Back" msgstr "" -#: app.py:895 +#: libs/localization.py:27 msgid "Update" msgstr "" -#: app.py:896 +#: libs/localization.py:28 msgid "Or Sign In" msgstr "" -#: app.py:897 +#: libs/localization.py:29 msgid "Or Sign Up" msgstr "" -#: app.py:898 +#: libs/localization.py:30 msgid "Invite code" msgstr "" -#: app.py:899 +#: libs/localization.py:31 msgid "Edit your fullname" msgstr "" -#: app.py:900 +#: libs/localization.py:32 msgid "Edit your email" msgstr "" -#: app.py:901 +#: libs/localization.py:33 msgid "Change your password" msgstr "" -#: app.py:902 +#: libs/localization.py:34 msgid "Delete your account" msgstr "" -#: app.py:903 app.py:909 +#: libs/localization.py:35 libs/localization.py:41 msgid "Welcome" msgstr "" -#: app.py:906 +#: libs/localization.py:38 msgid "The session was closed." msgstr "" -#: app.py:907 +#: libs/localization.py:39 msgid "Username must be at least 3 characters long!" msgstr "" -#: app.py:908 +#: libs/localization.py:40 msgid "Please enter your password!" msgstr "" -#: app.py:910 +#: libs/localization.py:42 msgid "The code is invalid or has expired." msgstr "" -#: app.py:911 +#: libs/localization.py:43 msgid "A bit short, don't you think?!" msgstr "" -#: app.py:912 +#: libs/localization.py:44 msgid "Not allowed characters for the username field." msgstr "" -#: app.py:913 +#: libs/localization.py:45 msgid "Passwords do not match!" msgstr "" -#: app.py:914 +#: libs/localization.py:46 msgid "Password must be at least 8 characters long!" msgstr "" -#: app.py:915 +#: libs/localization.py:47 msgid "Congratulations, your account has been created!" msgstr "" -#: app.py:916 +#: libs/localization.py:48 +msgid "Your first and last name have not been changed." +msgstr "" + +#: libs/localization.py:49 msgid "Your firstname is a bit short, don't you think?" msgstr "" -#: app.py:917 +#: libs/localization.py:50 msgid "Your surname is a bit short, don't you think?" msgstr "" -#: app.py:918 +#: libs/localization.py:51 msgid "Your first and last name have been successfully updated." msgstr "" -#: app.py:919 +#: libs/localization.py:52 msgid "Invalid email address. Please try again." msgstr "" -#: app.py:920 +#: libs/localization.py:53 +msgid "Email address has not been changed." +msgstr "" + +#: libs/localization.py:54 msgid "Your email has been successfully updated." msgstr "" -#: app.py:921 +#: libs/localization.py:55 msgid "The password entered is the same as the current password." msgstr "" -#: app.py:922 +#: libs/localization.py:56 msgid "Password has been changed!" msgstr "" -#: app.py:923 +#: libs/localization.py:57 msgid "Please, type your username for account deletion." msgstr "" -#: app.py:924 +#: libs/localization.py:58 msgid "Account successfully deleted!" msgstr "" -#: app.py:925 +#: libs/localization.py:59 msgid "Username or password is incorrect!" msgstr "" -#: app.py:926 +#: libs/localization.py:60 msgid "Unable to connect to the remote server." msgstr "" -#: app.py:927 +#: libs/localization.py:61 msgid "" "Encountered an unexpected error while communicating with the remote server." msgstr "" -#: app.py:928 +#: libs/localization.py:62 msgid "User already exists." msgstr "" -#: app.py:929 +#: libs/localization.py:63 msgid "Email already exists." msgstr "" -#: app.py:930 +#: libs/localization.py:64 msgid "Forgot your password? Please try again." msgstr "" -#: app.py:931 +#: libs/localization.py:65 msgid "The session has expired." msgstr "" \ No newline at end of file diff --git a/locales/en/LC_MESSAGES/base.mo b/locales/en/LC_MESSAGES/base.mo index ddd17cca49433b49725f30e2bc246a07fc353825..c6e35c11540c8f19c89278a924ef7c9e4b558f05 100644 GIT binary patch delta 1350 zcmbu;KTK0m6vy!c1ucIC1ox{ zR1)Gqj6??#T$-p+CkF=yH7pE9ql1Gnu1qHS{Xro*d-Klw+;?B!yZ4^+I@NT|Nq?>? zm^NA$(MY_?Gwa7;A1B(?0<$KZ#BDf(9QKq`HNM0O{D7VK6*pjIq1k4v!%Y~#D%_78 zHppqGS=xr^)G#oK12~06_z_$28@6E?Z!N)YWXKMqCOXQg6bCVc!@28QSj_cI&N=jR z{RA8E83vf&7U|S7@Ef;c?M5>fqsU?LoEMN4TMBz|2J3JU_52TPMIW>9D(gU!VG&fO zdXU48a|+-PHZ#9nr^B=M2-|T1_u&#Mr4^(@9>gGCM7?+xqm*k7RiY)fs}e1v?pKp8 zOWiF|8V1rlT6&MAhg%D#Z(^9cNJ`TEYSRiOgxeDnk%M8f8veguoqH0uw0d!F*K8-5TB~*#-qB8e7=Udc* z7f~fzMwQ4dUw!@wBkxa8PQ~GExgu2?J`2_&W&lY`unOZ z%9J*<)*L$Z1bZ+Nva&&yOQlY$UR^|#=p?ofYWk2=0yWi=jjXqh_1p1yFn!;QFZ=1S2>zL&^+DmvA0GT84W ayzy8nIo{`-NP6*eDJK$&7XSa`qkjNoevb11 delta 1178 zcmZwGPe{{Y9LMpmI(1vqEpz#|ZT+#C`(uTWe}WiIaE1--((EWiCoe%A0_PC&(4pdo z1r=1sND%QPbPMWMREIjmBI_U|fzUzFgYVBaPxaR?$FcHUTR7szrB3VI2@)4QqyL%5tUU6Z^02e*x$aDPuT}s5Ms63oBV)4w diff --git a/locales/en/LC_MESSAGES/base.po b/locales/en/LC_MESSAGES/base.po index 0dc32d1..a7831ec 100644 --- a/locales/en/LC_MESSAGES/base.po +++ b/locales/en/LC_MESSAGES/base.po @@ -3,213 +3,220 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , 2022. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-04-07 17:23+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2022-04-16 17:11+0200\n" "Last-Translator: Aitzol Berasategi \n" "Language-Team: LANGUAGE \n" -"Language: \n" +"Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3\n" -#: app.py:880 +#: libs/localization.py:12 msgid "User" msgstr "User" -#: app.py:881 +#: libs/localization.py:13 msgid "Username" msgstr "Username" -#: app.py:882 +#: libs/localization.py:14 msgid "Firstname" msgstr "Firstname" -#: app.py:883 +#: libs/localization.py:15 msgid "Surname" msgstr "Surname" -#: app.py:884 +#: libs/localization.py:16 msgid "Password" msgstr "Password" -#: app.py:885 +#: libs/localization.py:17 msgid "Old password" msgstr "Old password" -#: app.py:886 +#: libs/localization.py:18 msgid "New password" msgstr "New password" -#: app.py:887 +#: libs/localization.py:19 msgid "Confirm password" msgstr "Confirm password" -#: app.py:888 +#: libs/localization.py:20 msgid "Email" msgstr "Email" -#: app.py:889 +#: libs/localization.py:21 msgid "edit" msgstr "edit" -#: app.py:890 +#: libs/localization.py:22 msgid "Login" msgstr "Login" -#: app.py:891 +#: libs/localization.py:23 msgid "Logout" msgstr "Logout" -#: app.py:892 +#: libs/localization.py:24 msgid "Delete" msgstr "Delete" -#: app.py:893 +#: libs/localization.py:25 msgid "Sign Up" msgstr "Sign Up" -#: app.py:894 +#: libs/localization.py:26 msgid "Back" msgstr "Back" -#: app.py:895 +#: libs/localization.py:27 msgid "Update" msgstr "Update" -#: app.py:896 +#: libs/localization.py:28 msgid "Or Sign In" msgstr "Or Sign In" -#: app.py:897 +#: libs/localization.py:29 msgid "Or Sign Up" msgstr "Or Sign Up" -#: app.py:898 +#: libs/localization.py:30 msgid "Invite code" msgstr "Invite code" -#: app.py:899 +#: libs/localization.py:31 msgid "Edit your fullname" msgstr "Edit your fullname" -#: app.py:900 +#: libs/localization.py:32 msgid "Edit your email" msgstr "Edit your email" -#: app.py:901 +#: libs/localization.py:33 msgid "Change your password" msgstr "Change your password" -#: app.py:902 +#: libs/localization.py:34 msgid "Delete your account" msgstr "Delete your account" -#: app.py:903 app.py:909 +#: libs/localization.py:35 libs/localization.py:41 msgid "Welcome" msgstr "Welcome" -#: app.py:906 +#: libs/localization.py:38 msgid "The session was closed." msgstr "The session was closed." -#: app.py:907 +#: libs/localization.py:39 msgid "Username must be at least 3 characters long!" msgstr "Username must be at least 3 characters long!" -#: app.py:908 +#: libs/localization.py:40 msgid "Please enter your password!" msgstr "Please enter your password!" -#: app.py:910 +#: libs/localization.py:42 msgid "The code is invalid or has expired." msgstr "The code is invalid or has expired." -#: app.py:911 +#: libs/localization.py:43 msgid "A bit short, don't you think?!" msgstr "A bit short, don't you think?!" -#: app.py:912 +#: libs/localization.py:44 msgid "Not allowed characters for the username field." msgstr "Not allowed characters for the username field." -#: app.py:913 +#: libs/localization.py:45 msgid "Passwords do not match!" msgstr "Passwords do not match!" -#: app.py:914 +#: libs/localization.py:46 msgid "Password must be at least 8 characters long!" msgstr "Password must be at least 8 characters long!" -#: app.py:915 +#: libs/localization.py:47 msgid "Congratulations, your account has been created!" msgstr "Congratulations, your account has been created!" -#: app.py:916 +#: libs/localization.py:48 +msgid "Your first and last name have not been changed." +msgstr "Your first and last name have not been changed." + +#: libs/localization.py:49 msgid "Your firstname is a bit short, don't you think?" msgstr "Your firstname is a bit short, don't you think?" -#: app.py:917 +#: libs/localization.py:50 msgid "Your surname is a bit short, don't you think?" msgstr "Your surname is a bit short, don't you think?" -#: app.py:918 +#: libs/localization.py:51 msgid "Your first and last name have been successfully updated." msgstr "Your first and last name have been successfully updated." -#: app.py:919 +#: libs/localization.py:52 msgid "Invalid email address. Please try again." msgstr "Invalid email address. Please try again." -#: app.py:920 +#: libs/localization.py:53 +msgid "Email address has not been changed." +msgstr "Email address has not been changed." + +#: libs/localization.py:54 msgid "Your email has been successfully updated." msgstr "Your email has been successfully updated." -#: app.py:921 +#: libs/localization.py:55 msgid "The password entered is the same as the current password." msgstr "The password entered is the same as the current password." -#: app.py:922 +#: libs/localization.py:56 msgid "Password has been changed!" msgstr "Password has been changed!" -#: app.py:923 +#: libs/localization.py:57 msgid "Please, type your username for account deletion." msgstr "Please, type your username for account deletion." -#: app.py:924 +#: libs/localization.py:58 msgid "Account successfully deleted!" msgstr "Account successfully deleted!" -#: app.py:925 +#: libs/localization.py:59 msgid "Username or password is incorrect!" msgstr "Username or password is incorrect!" -#: app.py:926 +#: libs/localization.py:60 msgid "Unable to connect to the remote server." msgstr "Unable to connect to the remote server." -#: app.py:927 -msgid "" -"Encountered an unexpected error while communicating with the remote server." +#: libs/localization.py:61 +msgid "Encountered an unexpected error while communicating with the remote server." msgstr "Encountered an unexpected error while communicating with the remote server." -#: app.py:928 +#: libs/localization.py:62 msgid "User already exists." msgstr "User already exists." -#: app.py:929 +#: libs/localization.py:63 msgid "Email already exists." msgstr "Email already exists." -#: app.py:930 +#: libs/localization.py:64 msgid "Forgot your password? Please try again." msgstr "Forgot your password? Please try again." -#: app.py:931 +#: libs/localization.py:65 msgid "The session has expired." -msgstr "The session has expired." +msgstr "The session has expired." \ No newline at end of file diff --git a/locales/eu/LC_MESSAGES/base.mo b/locales/eu/LC_MESSAGES/base.mo index 0f92fda0108e1c8cdf5478c1dab23720e8231c8e..ac5e52ff4278fea552033b7b0afd27324571473e 100644 GIT binary patch delta 1382 zcmY+^OKeP09LMp~7t5Ou@EE@-3ZdKBbFjfLp;O6hP8zi-(Sr%oZNFi=bqd-=luWY-1*)0&MJRi+<47U zHc~sO&+3dB!lMn`C}$dt>B0$Ii528BkGZwtQ(TCzaRYwEdAO*_m?hYOEf~SYxE;C7 z0d8xIDVq@*ZFEfFUc8FU_yK$I8}?z4Q3E)DbeUbKiS}??fCn&!N2|}5(a&?G>TUG# zJc-Nk2}YRTOw(wm<2SCr_W8!dF@;>lshUMrY)ZHlE7*b4sNeso#g@-V&}B@)Nay zAnDQ;w4zeqhpTWKYQ7^_4$&B;u@noat+<35;1=pk+{I=19Eb1|Y75qqcP%tr)j^$w z8>rMzR-Hnfffu+5XHf6?gXCWeSP}f&(T@aUwxJ^0jhbK-mFnxL!}tgXaRwR7v@nPw z>cl?m!4&RC1$G{}OodxN-b2kZ9U}jXVLsAf;dj(?faPj}Wf;R@BxrLHwScSGi<7t- z-=GHmg%Ru_JT2%DvO{wvN=xr)(aLmO`>(xJ>85H>MY@Qp6t1V%N}|?49mFJcUA0e> zYO55L&VUYFtyna)eZ)2!9LH)lOF9!}MWt_F>DoY5x>S^YeI_c}YXX}q;knk|?DYKe zyq0!7Rp&>U(HEtR=^!d2DmsMvdm%Zn(|hIX^u`)rCLO2X7K_$#yJ+R|B`fW^IcxN| zojc|_F|+%moyl5uw&2>%gyo*e6ida}!>vtM8oVpM*3kby@SgbYwfLegWAl;r!_gr(=N9ZzzA$JV%)3seWF=!MZ@}MG*X<4ar`p_X zI^(#u<({=1o5>x!G#>Ms0`DJw37o6IW&~ETw{FLjBAy5qghWz#?j5 z-K+x}3z**=pwoayumvxmLOFvrE}%YGO?awFj}Miq7PhGc970Vzhzj`#D%2Ozk2jII z%?y^}W30qkOjpqPNJk%7!fMPX-h0tPg}fiNupv|grcgPbM_w_XGyX#5x{y3<$12ow zU8sqVXYPkksZP6zzYf(U1~kDGDzxuVhwdAOu&QJ^w+B%>If3=qkK6D%YDZ5{6TQJr zxPY3dl0mx0LJNba2t`YYzb5EqAc(h+O_&#`1-!xlE}}l@XM0W9fm+BJBqPg{Adi_w zs-7il|B9ldGxWEt$aM0Re;qnD`lsmQIvfhSiWZ?<*HLvym2Z``R7Fa^ts=37s-paB zXDZr=ic(@xH&PV^9ZLP(N=SAq;SQ+0lnLPco<)r6h% zt{P_|_i4%LL_F4a){2h~437*?U(LIc<8-(tD|%YP-F9cx-V?UkqM^?A#-q`$R_BN7 zlykD^SgqL~>rE!?(b!-tk%%=}@s!n, 2022. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-04-07 17:23+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2022-04-16 17:13+0200\n" "Last-Translator: Aitzol Berasategi \n" "Language-Team: LANGUAGE \n" -"Language: \n" +"Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3\n" -#: app.py:880 +#: libs/localization.py:12 msgid "User" msgstr "Erabiltzailea" -#: app.py:881 +#: libs/localization.py:13 msgid "Username" -msgstr "Erabiltzaile izena" +msgstr "Erabiltzailea" -#: app.py:882 +#: libs/localization.py:14 msgid "Firstname" msgstr "Izena" -#: app.py:883 +#: libs/localization.py:15 msgid "Surname" msgstr "Abizena" -#: app.py:884 +#: libs/localization.py:16 msgid "Password" msgstr "Pasahitza" -#: app.py:885 +#: libs/localization.py:17 msgid "Old password" msgstr "Pasahitz zaharra" -#: app.py:886 +#: libs/localization.py:18 msgid "New password" msgstr "Pasahitz berria" -#: app.py:887 +#: libs/localization.py:19 msgid "Confirm password" msgstr "Pasahitza berretsi" -#: app.py:888 +#: libs/localization.py:20 msgid "Email" msgstr "Emaila" -#: app.py:889 +#: libs/localization.py:21 msgid "edit" msgstr "editatu" -#: app.py:890 +#: libs/localization.py:22 msgid "Login" msgstr "Saioa hasi" -#: app.py:891 +#: libs/localization.py:23 msgid "Logout" msgstr "Saioa itxi" -#: app.py:892 +#: libs/localization.py:24 msgid "Delete" msgstr "Ezabatu" -#: app.py:893 +#: libs/localization.py:25 msgid "Sign Up" msgstr "Kontua sortu" -#: app.py:894 +#: libs/localization.py:26 msgid "Back" msgstr "Itzuli" -#: app.py:895 +#: libs/localization.py:27 msgid "Update" msgstr "Eguneratu" -#: app.py:896 +#: libs/localization.py:28 msgid "Or Sign In" msgstr "Edo Saioa hasi" -#: app.py:897 +#: libs/localization.py:29 msgid "Or Sign Up" msgstr "Edo Kontua sortu" -#: app.py:898 +#: libs/localization.py:30 msgid "Invite code" msgstr "Gonbidapen kodea" -#: app.py:899 +#: libs/localization.py:31 msgid "Edit your fullname" msgstr "Izen-abizenak editatu" -#: app.py:900 +#: libs/localization.py:32 msgid "Edit your email" msgstr "Email helbidea editatu" -#: app.py:901 +#: libs/localization.py:33 msgid "Change your password" msgstr "Pasahitza eguneratu" -#: app.py:902 +#: libs/localization.py:34 msgid "Delete your account" msgstr "Kontua ezabatu" -#: app.py:903 app.py:909 +#: libs/localization.py:35 libs/localization.py:41 msgid "Welcome" msgstr "Ongi etorri" -#: app.py:906 +#: libs/localization.py:38 msgid "The session was closed." msgstr "Saioa itxi da." -#: app.py:907 +#: libs/localization.py:39 msgid "Username must be at least 3 characters long!" msgstr "Erabiltzaile izenak gutxienez 3 karaktere izan behar ditu!" -#: app.py:908 +#: libs/localization.py:40 msgid "Please enter your password!" msgstr "Sartu zure pasahitza, mesedez!" -#: app.py:910 +#: libs/localization.py:42 msgid "The code is invalid or has expired." msgstr "Kodea baliogabea da edo iraungi egin da." -#: app.py:911 +#: libs/localization.py:43 msgid "A bit short, don't you think?!" -msgstr "Labur-xamarra, ez duzu uste?" +msgstr "Labur-xamarra, ez duzu uste?!" -#: app.py:912 +#: libs/localization.py:44 msgid "Not allowed characters for the username field." msgstr "Erabiltzaile izenerako onartzen ez diren karaktereak." -#: app.py:913 +#: libs/localization.py:45 msgid "Passwords do not match!" msgstr "Pasahitzak ez datoz bat!" -#: app.py:914 +#: libs/localization.py:46 msgid "Password must be at least 8 characters long!" msgstr "Pasahitzak gutxienez 8 karaktereko luzera izan behar du!" -#: app.py:915 +#: libs/localization.py:47 msgid "Congratulations, your account has been created!" msgstr "Zorionak, zure kontua sortu da!" -#: app.py:916 +#: libs/localization.py:48 +msgid "Your first and last name have not been changed." +msgstr "Zure izen-abizenak ez dira aldatu." + +#: libs/localization.py:49 msgid "Your firstname is a bit short, don't you think?" msgstr "Zure izena labur-xamarra da, ez duzu uste?" -#: app.py:917 +#: libs/localization.py:50 msgid "Your surname is a bit short, don't you think?" msgstr "Zure abizena labur-xamarra da, ez duzu uste?" -#: app.py:918 +#: libs/localization.py:51 msgid "Your first and last name have been successfully updated." msgstr "Zure izen-abizenak ongi eguneratu dira." -#: app.py:919 +#: libs/localization.py:52 msgid "Invalid email address. Please try again." -msgstr "Baliogabeko email helbidea. Saia zaitez berriz, mesedez. " +msgstr "Baliogabeko email helbidea. Saia zaitez berriz, mesedez." -#: app.py:920 +#: libs/localization.py:53 +msgid "Email address has not been changed." +msgstr "Email helbidea ez da aldatu." + +#: libs/localization.py:54 msgid "Your email has been successfully updated." msgstr "Zure emaila ongi eguneratu da." -#: app.py:921 +#: libs/localization.py:55 msgid "The password entered is the same as the current password." msgstr "Sartutako pasahitza egungo pasahitzaren berdina da." -#: app.py:922 +#: libs/localization.py:56 msgid "Password has been changed!" msgstr "Pasahitza eguneratua izan da!" -#: app.py:923 +#: libs/localization.py:57 msgid "Please, type your username for account deletion." msgstr "Kontua ezabatzeko idatzi zure erabiltzaile izena, mesedez." -#: app.py:924 +#: libs/localization.py:58 msgid "Account successfully deleted!" msgstr "Kontua ongi ezabatu da!" -#: app.py:925 +#: libs/localization.py:59 msgid "Username or password is incorrect!" msgstr "Erabiltzaile izena edo pasahitza okerrak dira!" -#: app.py:926 +#: libs/localization.py:60 msgid "Unable to connect to the remote server." msgstr "Ezinezkoa urruneko zerbitzara konektatzea." -#: app.py:927 -msgid "" -"Encountered an unexpected error while communicating with the remote server." +#: libs/localization.py:61 +msgid "Encountered an unexpected error while communicating with the remote server." msgstr "Ezusteko errore bat gertatu da urruneko zerbitzariarekin komunikatzean." -#: app.py:928 +#: libs/localization.py:62 msgid "User already exists." msgstr "Erabiltzaile hori existitzen da." -#: app.py:929 -msgid "Email already exists" +#: libs/localization.py:63 +msgid "Email already exists." msgstr "Email hori existitzen da." -#: app.py:930 +#: libs/localization.py:64 msgid "Forgot your password? Please try again." msgstr "Zure pasahitza ahaztu duzu? Saia zeitez berriz, mesedez." -#: app.py:931 +#: libs/localization.py:65 msgid "The session has expired." -msgstr "Saioa iraungi egin da." +msgstr "Saioa iraungi egin da." \ No newline at end of file