first commit

This commit is contained in:
root
2026-03-14 09:42:12 +00:00
commit 0adbd20c2c
10991 changed files with 1646955 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html xmlns:py="http://genshi.edgewall.org/" xmlns:i18n="http://genshi.edgewall.org/i18n">
<head>
<title>Reset Password</title>
</head>
<body>
<py:for each="user in records">
<div style="display: block; text-align: center">
<div>
<h1>Reset Password</h1>
<p i18n:msg="email,url">
Hello, we received a request to reset the password for the account associated with <strong>${user.email}</strong>. No changes have been made to your account yet.<br/>
You can reset your password by clicking the link below:<br/>
<a href="${user.get_email_reset_password_url()}"
style="display: block; text-decoration: none; width: max-content; margin: 0.5em auto; padding: 0.5em 1em; font-size:1em; border: 1px solid #2E6DA4; border-radius: 4px; color: #FFF; background-color: #337AB7;">
Reset Password
</a>
</p>
</div>
<hr style="margin-top: 20px; border-style: solid none none; border-color: #EEE"></hr>
<div style="font-size: 80%; color: #777">
<p i18n:msg="datetime,expire_delay">
The link will expire in <time datetime="${record.reset_password_token_expire.isoformat()}">${format_timedelta(expire_delay)}</time>.
</p>
<p>Button not working? Paste this into your browser:</p>
<p>${user.get_email_reset_password_url()}</p>
<p>If you didn't make this request, you can ignore this email.</p>
</div>
</div>
</py:for>
</body>
</html>

View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html xmlns:py="http://genshi.edgewall.org/" xmlns:i18n="http://genshi.edgewall.org/i18n">
<head>
<title>Email Validation</title>
</head>
<body>
<py:for each="user in records">
<div style="display: block; text-align: center">
<div>
<h1>Just one more step..</h1>
<p i18n:msg="email">${user.email}</p>
<a href="${user.get_email_validation_url()}"
style="display: block; text-decoration: none; width: max-content; margin: 0 auto; padding: 0.5em 1em; font-size:2em; border: 1px solid #2E6DA4; border-radius: 4px; color: #FFF; background-color: #337AB7;">
Validate
</a>
</div>
<hr style="margin-top: 20px; border-style: solid none none; border-color: #EEE"></hr>
<div style="font-size: 80%; color: #777">
<p>Button is not working? Paste this into your browser:</p>
<p>${user.get_email_validation_url()}</p>
<p>If you received this email by mistake, just ignore it.</p>
</div>
</div>
</py:for>
</body>
</html>

View File

@@ -0,0 +1,8 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model.exceptions import ValidationError
class UserValidationError(ValidationError):
pass

55
modules/web_user/ir.py Normal file
View File

@@ -0,0 +1,55 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import Pool, PoolMeta
from trytond.tools import escape_wildcard
class Email(metaclass=PoolMeta):
__name__ = 'ir.email'
@classmethod
def _match(cls, name, email):
pool = Pool()
User = pool.get('web.user')
yield from super()._match(name, email)
domain = ['OR']
for field in ['party.name', 'email']:
for value in [name, email]:
if value and len(value) >= 3:
domain.append(
(field, 'ilike', '%' + escape_wildcard(value) + '%'))
for user in User.search([
('email', '!=', ''),
domain,
], order=[]):
yield user.party.name if user.party else '', user.email
class EmailTemplate(metaclass=PoolMeta):
__name__ = 'ir.email.template'
@classmethod
def email_models(cls):
return super().email_models() + ['web.user']
@classmethod
def _get_address(cls, record):
pool = Pool()
User = pool.get('web.user')
address = super()._get_address(record)
if isinstance(record, User):
name = None
if record.party:
name = record.party.name
address = (name, record.email)
return address
@classmethod
def _get_language(cls, record):
pool = Pool()
User = pool.get('web.user')
language = super()._get_language(record)
if isinstance(record, User):
if record.party:
language = cls._get_language(record.party)
return language

View File

@@ -0,0 +1,195 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr ""
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Email Validation"
#, fuzzy
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Управление на партньор"
#, fuzzy
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Парола"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Управление на партньор"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Потребител"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
#, fuzzy
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Потребителско име"
#, fuzzy
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Ключ"
#, fuzzy
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Потребител"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Reset Password"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web Users"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Web Users"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset Password"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email Validation"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Проверка"

View File

@@ -0,0 +1,185 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "Correu electrònic"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "Token del correu electrònic"
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Correu electrònic vàlid"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Tercer"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Contrasenya"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Hash de la contrasenya"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Token restableix la contrasenya"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Expiració token restableix contrasenya"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Tercers secundaris"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Tercer"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Usuari"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "Galeta de dispositiu"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "Adreça IP"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "Xarxa IP"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Nom usuari"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Clau"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Usuari"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Usuaris web"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Usuaris web"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Restableix la contrasenya"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Validació correu electrònic"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr "El correu electrònic \"%(email)s\" de l'usuari \"%(user)s\" no es vàlid."
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "El correu electrònic de l'usuari web actiu ha de ser únic."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "La clau de sessió de l'usuari web ha de ser única."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Restableix la contrasenya"
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Valida el correu electrònic"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Usuaris web"
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Usuari web"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Usuari Web - Tercers Secundaris"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr "Intent d'inici de sessió de l'usuari"
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Sessió usuari web"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "El botó no funciona? Empega això al teu navegador:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
"Hola, hem rebut una sol·licitud per restablir la contrasenya del compte associat a [1:%(email)s]. Encara no s'ha fet cap canvi al vostre compte.[2:]\n"
" Podeu restablir la vostra contrasenya fent clic a l'enllaç següent:[3:]\n"
" [4:\n"
" Restablir la contrasenya\n"
" ]"
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "Si no heu fet aquesta petició, podeu ignorar aquest correu."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Restableix la contrasenya"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "L'enllaç caducarà en [1:%(datetime)s]."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "El botó no funciona? Empega això al teu navegador:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Validació correu electrònic"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Si heu rebut aquest correu per error, ignoreu-lo."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Només un pas més..."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Valida"

View File

@@ -0,0 +1,188 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr ""
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Email Validation"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr ""
msgctxt "field:web.user,password:"
msgid "Password"
msgstr ""
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Web Users"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr ""
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr ""
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr ""
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Reset Password"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web Users"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Web Users"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset Password"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email Validation"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr ""

View File

@@ -0,0 +1,193 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-Mail"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "E-Mail Token"
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "E-Mail gültig"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Partei"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Passwort"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Passwort Hash"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Passwortrücksetzungstoken"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Passwortrücksetzungstoken Verfall"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Sekundäre Parteien"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Partei"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Benutzer"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "Geräte Cookie"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "IP-Adresse"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "IP-Netz"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Benutzername"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Schlüssel"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Benutzer"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Webbenutzer"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Webbenutzer"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "E-Mail-Validierung"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr "Die E-Mail-Adresse \"%(email)s\" für \"%(user)s\" ist ungültig."
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "Die E-Mail eines aktiven Webbenutzers muss eindeutig sein."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
"Der Sitzungsschlüssel eines Webbenutzers kann nur einmal vergeben werden."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "E-Mail validieren"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Webbenutzer"
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Webbenutzer"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Webbenutzer - Sekundäre Partei"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr "Benutzeranmeldeversuch"
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Webbenutzer Sitzung"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
"Sollte der Button nicht funktionieren, kopieren Sie bitte den folgenden Text"
" in die Adresszeile Ihres Browsers:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
"Hallo, wir haben eine Anfrage zum Zurücksetzen des Passworts für das mit [1:%(email)s) verknüpfte Konto erhalten. An Ihrem Konto wurden noch keine Änderungen vorgenommen.[2:]\n"
" Sie können Ihr Passwort zurücksetzen, indem Sie auf den folgenden Link klicken:[3:]\n"
" [4:\n"
" Passwort zurücksetzen\n"
" ]"
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
"Ignorieren Sie bitte diese E-Mail, wenn Sie nicht der Urheber dieser Anfrage"
" sind."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "Der Hyperlink wird in [1:%(datetime)s] ablaufen."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
"Wenn der Button nicht funktioniert, kopieren Sie bitte die folgende Zeile in"
" die Adresszeile Ihres Browsers:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "E-Mail-Validierung"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
"Ignorieren Sie bitte diese E-Mail, wenn Sie sie irrtümlich erhalten haben."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Nur noch ein Schritt..."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Prüfen"

View File

@@ -0,0 +1,187 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "Correo electrónico"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "Token de correo electrónico"
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Correo electrónico válido"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Tercero"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Contraseña"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Hash de la contraseña"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Restablecer el token de la contraseña"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Restablecer el token de expiración de la contraseña"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Terceros secundarios"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Tercero"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Usuario"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "Cookie del dispositivo"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "Dirección IP"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "Red IP"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Nombre usuario"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Clave"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Usuario"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Usuarios web"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Usuarios web"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Restablecer contraseña"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Validación correo electrónico"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr "El correo electrónico \"%(email)s\" del usuario \"%(user)s\" no es valido."
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "El correo electrónico del usuario web activo debe ser único."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "La clave de sesión del usuario web debe ser única."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Restablecer contraseña"
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validar correo electrónico"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Usuarios web"
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Usuario web"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Usuario web - Tercero secundario"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr "Intento de inicio de sesión del usuario"
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Sesión usuario web"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "¿El botón no funciona? Pega esto en tu navegador:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
"Hola, recibimos una solicitud para restablecer la contraseña de la cuenta asociada con [1:%(email)s]. Aún no se han realizado cambios en su cuenta.[2:]\n"
" Puede restablecer su contraseña haciendo clic en el siguiente enlace:[3:]\n"
" [4:\n"
" Restablecer la contraseña\n"
" ]"
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
"Si no habéis realizado esta petición, podéis ignorar este correo "
"electrónico."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Restablecer contraseña"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "El enlace caducará en [1:%(datetime)s]."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "¿El botón no funciona? Pega esto en tu navegador:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Validación correo electrónico"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Si ha recibido este correo electrónico por error, por favor ignórelo."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Solo un paso mas..."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Validar"

View File

@@ -0,0 +1,180 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr ""
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr ""
msgctxt "field:web.user,party:"
msgid "Party"
msgstr ""
msgctxt "field:web.user,password:"
msgid "Password"
msgstr ""
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr ""
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr ""
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr ""
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr ""
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr ""
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr ""
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr ""
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr ""
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr ""
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr ""
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr ""

View File

@@ -0,0 +1,187 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-kiri"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr ""
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Osapool"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Salasõna"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Salasõna räsi"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Osapool"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Kasutaja"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "IP-aadress"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "IP-võrk"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Logi sisse"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Võti"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Kasutaja"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr ""
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Muutja"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Lähtesta salasõna"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Lähtesta salasõna"
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr ""
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Muutja"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Muutja"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "Nupp ei tööta? Aseta see link brauseri aadressreale:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "Kui sa ei teinud seda päringut, siis ignoreeri seda e-kirja."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Lähtesta salasõna"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "Nupp ei tööta? Aseta see link brauseri aadressreale:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr ""

View File

@@ -0,0 +1,192 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "ایمیل"
#, fuzzy
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "نشانه(Token) ایمیل"
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "ایمیل معتبر است"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "نهاد/سازمان"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "کلمه عبور"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "کلمه عبور درهم"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "بازنشانی نشانه(Token) کلمه عبور"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "بازنشانی انقضای نشانه(Token) کلمه عبور"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "نهاد/سازمان"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "کاربر"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "آدرس آی پی"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "آی پی شبکه"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "ورود به سیستم"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "کلید"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "کاربر"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "کاربران وب"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "کاربران وب"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "بازنشانی رمز عبور"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "اعتبار سنجی ایمیل"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
#, fuzzy
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "پست الکترونیکی کاربر فعال وب سایت باید منحصر به فرد باشد."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "کلید جلسه کاربر وب باید منحصر به فرد باشد."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "کاربران وب"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "کاربر وب"
#, fuzzy
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "جلسه کاری کاربر وب"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "جلسه کاری کاربر وب"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "دکمه کار نمی کند؟ این آدرس را در مرورگر خود مرور کنید:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "اگراین درخواست را نکرده باشید، می توانید این ایمیل را نادیده بگیرید."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "بازنشانی کلمه عبور"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "دکمه کار نمی کند؟ این آدرس را در مرورگر خود مرور کنید:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "اعتبار سنجی ایمیل"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "اگر این ایمیل را به اشتباه دریافت کردید، فقط آن را نادیده بگیرید."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "فقط یک گام دیگه.."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "تایید اعتبار"

View File

@@ -0,0 +1,188 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr ""
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Email Validation"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr ""
msgctxt "field:web.user,password:"
msgid "Password"
msgstr ""
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Web Users"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr ""
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr ""
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr ""
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Reset Password"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web Users"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Web Users"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset Password"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email Validation"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr ""

View File

@@ -0,0 +1,187 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "Adresse électronique"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "Jeton de courriel"
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Adresse électronique valide"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Tiers"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Mot de passe"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Hachage de mot de passe"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Jeton de réinitialisation du mot de passe"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Expiration du jeton de réinitialisation du mot de passe"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Tiers secondaires"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Tiers"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Utilisateur"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "Cookie de l'appareil"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "Adresse IP"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "Réseau IP"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Identifiant"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Clé"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Utilisateur"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Utilisateurs web"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Utilisateurs web"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Courriel de validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
"L'adresse de courriel « %(email)s » pour « %(user)s » n'est pas valide."
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "L'adresse électronique d'un utilisateur web actif doit être unique."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "La session d'un utilisateur web doit être unique."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Valider l'adresse électronique"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Utilisateurs web"
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Utilisateur web"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Utilisateur web - Tiers secondaire"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr "Tentative de connexion de l'utilisateur"
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Session d'utilisateur web"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "Le bouton ne fonctionne pas ? Copier ceci dans votre navigateur :"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
"Bonjour, nous avons reçu une demande de réinitialisation du mot de passe du compte associé à [1:%(email)s]. Aucune modification n'a encore été apportée à votre compte.[2:]\n"
" Vous pouvez réinitialiser votre mot de passe en cliquant sur le lien ci-dessous:[3:]\n"
" [4:\n"
" Réinitialiser le mot de passe\n"
" ]"
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
"Si vous n'avez pas fait cette demande, vous pouvez ignorer ce courriel."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "Le lien expirera dans [1:%(datetime)s]."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "Le bouton ne fonctionne pas ? Copier ceci dans votre navigateur :"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Validation de courriel"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Si vous avez reçu ce courriel par erreur, ignorez le."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Encore une étape.."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Valider"

View File

@@ -0,0 +1,190 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-mail"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "E-mail cím leellenőrizve"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Ügyfél"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Jelszó"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Jelszó hash"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Másodlagos ügyfelek"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Ügyfél"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Felhasználó"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Bejelentkezés"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Kulcs"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Felhasználó"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Webáruház felhasználók"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Webáruház felhasználók"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Jelszó visszaállítása"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "E-mail cím ellenőrzés"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
#, fuzzy
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "Nem lehet több aktív webes felhasználónak ugyanaz az e-mail címe."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Jelszó visszaállítása"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "E-mail cím leellenőrzése"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Webáruház felhasználók"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Webáruház felhasználó"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Webáruház felhasználók"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "A gomb nem működik? Másolja be ezt a böngészőjébe:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
"Ha nem Ön küldte ezt a kérés, akkor nyugodtan hagyja figyelmen kívül ezt az "
"e-mailt."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Jelszó visszaállítása"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "A gomb nem működik? Másolja be ezt a böngészőjébe:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "E-mail cím ellenőrzés"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Ha tévedésből kapta ezt az e-mailt, hagyja nyugodtan figyelmen kívül."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Csak még egy lépés.."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Ellenőrzés"

View File

@@ -0,0 +1,188 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-mail"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Validasi Email"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Pihak"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Kata sandi"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Pihak"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Pengguna"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "Alamat IP"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr ""
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Kunci"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Pengguna"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Pengguna Web"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Pengguna Web"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Atur Ulang Kata Sandi"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr ""
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Atur Ulang Kata Sandi"
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr ""
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr ""
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Pengguna Web"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Pengguna Web"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "Tombol tidak berfungsi? Lekatkan ini pada browser Anda:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "Jika bukan Anda yang membuat permintaan ini, abaikan email ini."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Atur Ulang Kata Sandi"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "Tombol tidak berfungsi? Lekatkan ini pada browser Anda:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Validasi Email"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Jika Anda menerima email ini karena kesalahan, abaikan saja."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Tinggal satu langkah lagi..."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr ""

View File

@@ -0,0 +1,199 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-mail"
#, fuzzy
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "_E-Mail..."
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "_E-Mail..."
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Controparte"
#, fuzzy
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Password"
#, fuzzy
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Hash della Password"
#, fuzzy
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Reset Password"
#, fuzzy
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Reset Password"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Controparte"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Utente"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "Indirizzo IP"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
#, fuzzy
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Login"
#, fuzzy
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Chiave"
#, fuzzy
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Utente"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Reset Password"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Sessione"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Sessione"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset Password"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email Validation"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Verifica"

View File

@@ -0,0 +1,198 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "ອີ-ເມວລ໌"
#, fuzzy
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "ອີ-ເມວລ໌ ຢັງຢືນຕົວຕົນ"
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "ອີ-ເມວລ໌ ຖືກຕ້ອງ"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "ພາກສ່ວນ"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "ລະຫັດຜ່ານ"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "ລະຫັດຜ່ານປະສົມ"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "ຕັ້ງລະຫັດຢັ້ງຢືນຜ່ານຄືນໃໝ່"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "ການຕັ້ງລະຫັດຢັ້ງຢືນຜ່ານຄືນໃໝ່ໝົດເວລາແລ້ວ"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "ພາກສ່ວນ"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "ຜູ້ໃຊ້"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "ເຊື່ອມຕໍ່ເຂົ້າລະບົບ"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "ຄຳສຳຄັນ"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "ຜູ້ໃຊ້"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
#, fuzzy
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "ຜູ້ໃຊ້ງານເວັບ"
#, fuzzy
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "ເທື່ອເຂົ້າໃຊ້ຂອງຜູ້ໃຊ້ງານເວັບ"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "ເທື່ອເຂົ້າໃຊ້ຂອງຜູ້ໃຊ້ງານເວັບ"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "ປຸ່ມບໍ່ເຮັດວຽກບໍ? ໃຫ້ ວາງ ອັນນີ້ລົງໃສ່ ໂຕທ່ອງເວັບຂອງທ່ານ:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "ຖ້າຫາກທ່ານບໍ່ໄດ້ຮ້ອງຂໍ ອ-ເມວລ໌ ນີ້, ທ່ານບໍ່ຕ້ອງຮັບຮູ້ ອີ-ເມວລ໌ ນີ້."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "ຕັ້ງຄ່າລະຫັດຜ່ານຄືນໃໝ່"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "ປຸ່ມບໍ່ເຮັດວຽກບໍ? ໃຫ້ ວາງ ອັນນີ້ລົງໃສ່ ໂຕທ່ອງເວັບຂອງທ່ານ:"
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "ການຢືນຢັນຄວາມຖືກຕ້ອງ ອີ-ເມວລ໌"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
"ຖ້າຫາກທ່ານໄດ້ຮັບ ອີ-ເມວລ໌ ນີ້ ໂດຍຄວາມຜິດພາດໃດໜຶ່ງ, ພຽງແຕ່ໃຫ້ທ່ານ ບໍ່ຮັບຮູ້ "
"ອີ-ເມວລ໌ ນີ້ກໍພໍ."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "ພຽງແຕ່ອີກບາດກ້າວໜຶ່ງທໍ່ນັ້ນ.."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "ກວດສອບຄວາມຖືກຕ້ອງ"

View File

@@ -0,0 +1,189 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr ""
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Email Validation"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Kontrahentas"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr ""
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Kontrahentas"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Naudotojas"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "IP adresas"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr ""
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr ""
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Naudotojas"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Atstatyti slaptažodį"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Atstatyti slaptažodį"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web Users"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Web Users"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset Password"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email Validation"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr ""

View File

@@ -0,0 +1,185 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "Email"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "Email token"
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Email geldig"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Relatie"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Wachtwoord"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Wachtwoord Hash"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Reset wachtwoord token"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Reset wachtwoord token verlopen"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Secundaire Relaties"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Relatie"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Gebruiker"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "Apparaatcookie"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "IP Adres"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "IP-netwerk"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Loginnaam"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Sleutel"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Gebruiker"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Webgebruikers"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Webgebruikers"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Reset wachtwoord"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "E-mailvalidatie"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr "Het email adres \"%(email)s\" voor \"%(user)s\" is niet geldig."
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "Email van actieve webgebruiker moet uniek zijn."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "Webgebruikerssessiesleutel moet uniek zijn."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset wachtwoord"
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Email valideren"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Webgebruikers"
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web gebruiker"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Web gebruiker - Secundaire relatie"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr "Login poging"
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Web gebruikerssessie"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "Werkt de knop niet? Plak dit in uw browser:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
"Hallo, we hebben een aanvraag ontvangen om het wachtwoord voor gebruiker [1:%(email)s] te resetten. Op dit moment zijn er nog geen wijzigingen gedaan aan de gebruiker.[2:]\n"
" U kunt het wachtwoord resetten door op de onderstaande link te klikken:[3:]\n"
" [4:\n"
" Reset wachtwoord\n"
" ]"
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "Indien u dit verzoek niet hebt gedaan, kunt u deze e-mail negeren."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset wachtwoord"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "De link vervalt in [1:%(datetime)s]."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "Knop werkt niet? Plak dit in uw browser:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "E-mailvalidatie"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Negeer deze email, als u deze per ongeluk hebt ontvangen."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Nog maar één stap.."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Goedkeuren"

View File

@@ -0,0 +1,189 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-mail"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Email Validation"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr ""
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Hasło"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Hash hasła"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Web Users"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "Adres IP"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Login"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Klucz"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Użytkownik"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Zresetuj hasło"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset hasła"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web Users"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Web Users"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset Password"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email Validation"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr ""

View File

@@ -0,0 +1,185 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-mail"
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "Token do E-mail"
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "E-mail Válido"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Pessoa"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Senha"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Hash da Senha"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Redefinir Token da Senha"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Redefinir Validade do Token da Senha"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Pessoas Adicionais"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Pessoa"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Usuário"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "Cookie do Dispositivo"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "Endereço IP"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "Rede IP"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Entrar"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Chave"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Usuário"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Usuários Web"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Usuários Web"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Restaurar Senha"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Validação do Email"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr "O endereço de email \"%(email)s\" do usuário \"%(user)s\" não é válido."
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "O email de usuário web ativo deve ser único."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "A sessão de um usuário web deve ser única."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Resetar Senha"
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validar e-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Usuários Web"
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Usuário Web"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Usuário da Web - Pessoa Secundária"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr "Tentativa de Login do Usuário"
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Sessão de Usuário Web"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "O botão não está funcionando? Cole isso no seu navegador:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
"Olá, Nós recebemos uma solicitação para restaurar a senha da conta associada ao email [1:%(email)s]. Ainda não foram aplicadas alterações a essa conta.[2:]\n"
" É possível restaurar a senha clicando no link abaixo:[3:]\n"
" [4:\n"
" Restaurar Senha\n"
" ]"
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "Se você não fez esta solicitação, você pode ignorar esse email."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Redefinir senha"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "O link irá expirar em [1:%(datetime)s]."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "Botão não está funcionando? Cole isso no seu navegador:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email de Validação"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Se você recebeu esse email por engano, apenas ignore-o."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Apenas mais um passo..."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Validar"

View File

@@ -0,0 +1,192 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-mail"
#, fuzzy
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "Token de e-mail"
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "E-mail Valabil"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Parte"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Parola"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
#, fuzzy
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Resetare Token Parolă"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
#, fuzzy
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Părți Secundare"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Parte"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Utilizator"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "Adresă IP"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "Rețea IP"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Autentificare"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Cheie"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Utilizator"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Utilizatori Web"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Utilizatori Web"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Resetare parola"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Validarea e-mailului"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr "Adresa de email \"%(email)s\" pentru \"%(user)s\" nu este valid."
#, fuzzy
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "E-mailul utilizatorului web activ trebuie să fie unic."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "Cheia de sesiune a utilizatorului web trebuie să fie unică."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Resetare Parola"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validare e-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Utilizatori Web"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Utilizator Web"
#, fuzzy
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Utilizator Web - Parte secundară"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Sesiune a Utilizatorului Web"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "Butonul nu funcționează? Copiați asta în browser:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "Dacă nu ați făcut această solicitare, puteți ignora acest e-mail."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Resetare Parolă"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "Linkul va expira în [1:%(datetime)s]."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "Butonul nu funcționează? Copiați asta în browser:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Validarea e-mailului"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Dacă ați primit acest e-mail din greșeală, ignorați-l."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Încă un pas."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Validare"

View File

@@ -0,0 +1,195 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr ""
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Email Validation"
#, fuzzy
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Организации"
#, fuzzy
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Пароль"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Организации"
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Пользователь"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
#, fuzzy
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Логин"
#, fuzzy
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Ключ"
#, fuzzy
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Пользователь"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Reset Password"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web Users"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Web Users"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset Password"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email Validation"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Утвержденный"

View File

@@ -0,0 +1,189 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "E-pošta"
#, fuzzy
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "Žeton e-pošte"
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "E-pošta veljavna"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Partner"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Geslo"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Zgoščena vrednost gesla"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Žeton za ponastavitev gesla"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Zapadlost ponastavitvenga žetona"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Sekundarni partnerji"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Partner"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Uporabnik"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "Piškotek naprave"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "IP naslov"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "IP omrežje"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Prijava"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Ključ"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Uporabnik"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Spletni uporabniki"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Spletni uporabniki"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Ponastavi gesla"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Preverjanje e-poštnega naslova"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr "E-poštni naslov \"%(email)s\" uporabnika \"%(user)s\" ni veljaven."
#, fuzzy
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "E-poštni naslov aktivnega spletnega uporabnika mora biti edinstven."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "Ključ seje spletnega uporabnika mora biti edinstven."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Potrdi e-pošto"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Spletni uporabniki"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Spletni uporabnik"
#, fuzzy
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Spletni uporabnik - sekundarni partner"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Seja spletnega uporabnika"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "Gumb ne deluje? Prilepite sledeče v vaš brskalnik:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "Če niste zahtevali tega sporočila, ga preprosto prezrite."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Ponastavitev gesla"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "Povezava bo potekla čez [1:%(datetime)s]."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "Gumb ne deluje? Prilepite to povezavo v vaš brskalnik:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Preverjanje elektronskega naslova"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Če ste po pomoti prejeli to sporočilo, ga preprosto prezrite."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Samo še en korak ..."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Preveri veljavnost"

View File

@@ -0,0 +1,188 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
msgctxt "field:web.user,email:"
msgid "Email"
msgstr ""
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr ""
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Email Validation"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr ""
msgctxt "field:web.user,password:"
msgid "Password"
msgstr ""
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr ""
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr ""
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr ""
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr ""
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr ""
#, fuzzy
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Web Users"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr ""
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr ""
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr ""
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr ""
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web Users"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Reset Password"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Email Validation"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr ""
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr ""
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Reset Password"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Validate E-mail"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web Users"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web Users"
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr ""
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Web Users"
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr ""
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Reset Password"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr ""
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr ""
#, fuzzy
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Email Validation"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr ""
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr ""

View File

@@ -0,0 +1,189 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "Ел.пошта"
#, fuzzy
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "Токен ел.пошти"
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "Ел.пошта дійсна"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "Особа"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "Пароль"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "Хеш пароля"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "Скинути токен пароля"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "Термін скидання токена пароля закінчується"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "Вторинні особи"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "Особа"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "Користувач"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "Куки пристрою"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "IP-адреса"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "IP-мережа"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "Логін"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "Ключ"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "Користувач"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Веб-користувачі"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Веб-користувачі"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "Скинути пароль"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "Перевірка ел.пошти"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr ""
#, fuzzy
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "Ел.пошта активного веб-користувача має бути унікальною."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "Ключ сеансу веб-користувача має бути унікальним."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "Скинути пароль"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "Перевірити ел.пошту"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Веб-користувачі"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Веб-користувач"
#, fuzzy
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "Веб-користувач - Вторинна особа"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "Сеанс веб-користувача"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "Кнопка не працює? Вставте це у свій браузер:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "Якщо ви не робили цей запит, можете проігнорувати цей ел.лист."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "Скинути пароль"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "Термін посилання завершиться через [1:%(datetime)s]."
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "Кнопка не працює? Вставте це у свій браузер:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "Перевірка ел.пошти"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "Якщо ви отримали цей ел.лист помилково, просто проігноруйте його."
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "Ще один крок.."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "Перевірити"

View File

@@ -0,0 +1,189 @@
#
msgid ""
msgstr "Content-Type: text/plain; charset=utf-8\n"
#, fuzzy
msgctxt "field:web.user,email:"
msgid "Email"
msgstr "电子邮件"
#, fuzzy
msgctxt "field:web.user,email_token:"
msgid "Email Token"
msgstr "电子邮件令牌"
#, fuzzy
msgctxt "field:web.user,email_valid:"
msgid "Email Valid"
msgstr "电子邮件有效"
msgctxt "field:web.user,party:"
msgid "Party"
msgstr "参与者"
msgctxt "field:web.user,password:"
msgid "Password"
msgstr "密码"
msgctxt "field:web.user,password_hash:"
msgid "Password Hash"
msgstr "密码HASH"
msgctxt "field:web.user,reset_password_token:"
msgid "Reset Password Token"
msgstr "重置密码令牌"
msgctxt "field:web.user,reset_password_token_expire:"
msgid "Reset Password Token Expire"
msgstr "重置密码令牌过期"
msgctxt "field:web.user,secondary_parties:"
msgid "Secondary Parties"
msgstr "第二参与者"
msgctxt "field:web.user-party.party.secondary,party:"
msgid "Party"
msgstr "参与者"
msgctxt "field:web.user-party.party.secondary,user:"
msgid "User"
msgstr "用户"
msgctxt "field:web.user.authenticate.attempt,device_cookie:"
msgid "Device Cookie"
msgstr "设备 Cookie"
msgctxt "field:web.user.authenticate.attempt,ip_address:"
msgid "IP Address"
msgstr "IP地址"
msgctxt "field:web.user.authenticate.attempt,ip_network:"
msgid "IP Network"
msgstr "IP网络"
msgctxt "field:web.user.authenticate.attempt,login:"
msgid "Login"
msgstr "登录"
msgctxt "field:web.user.session,key:"
msgid "Key"
msgstr "密匙"
msgctxt "field:web.user.session,user:"
msgid "User"
msgstr "用户"
msgctxt "model:ir.action,name:act_user_form"
msgid "Web Users"
msgstr "Web 用户"
msgctxt "model:ir.action,name:act_user_form_party"
msgid "Web Users"
msgstr "Web 用户"
msgctxt "model:ir.action,name:report_email_reset_password"
msgid "Reset Password"
msgstr "重置密码"
msgctxt "model:ir.action,name:report_email_validation"
msgid "Email Validation"
msgstr "电子邮件验证"
#, python-format
msgctxt "model:ir.message,text:msg_user_email_invalid"
msgid "The email address \"%(email)s\" for \"%(user)s\" is not valid."
msgstr "用户 \"%(user)s\" 的电子邮件地址 \"%(email)s\" 无效。"
#, fuzzy
msgctxt "model:ir.message,text:msg_user_email_unique"
msgid "Email of active web user must be unique."
msgstr "已经激活的Web用户电子邮件不能重复."
msgctxt "model:ir.message,text:msg_user_session_key_unique"
msgid "Web user session key must be unique."
msgstr "Web用户会话密钥必须唯一."
msgctxt "model:ir.model.button,string:user_reset_password_button"
msgid "Reset Password"
msgstr "重置密码"
#, fuzzy
msgctxt "model:ir.model.button,string:user_validate_email_button"
msgid "Validate Email"
msgstr "验证电子邮件"
msgctxt "model:ir.ui.menu,name:menu_user_form"
msgid "Web Users"
msgstr "Web 用户"
#, fuzzy
msgctxt "model:web.user,string:"
msgid "Web User"
msgstr "Web 用户"
#, fuzzy
msgctxt "model:web.user-party.party.secondary,string:"
msgid "Web User - Party Secondary"
msgstr "web 用户 - 第二参与者"
msgctxt "model:web.user.authenticate.attempt,string:"
msgid "User Login Attempt"
msgstr ""
#, fuzzy
msgctxt "model:web.user.session,string:"
msgid "Web User Session"
msgstr "web 用户会话"
#, fuzzy
msgctxt "report:web.user.email_reset_password:"
msgid "Button not working? Paste this into your browser:"
msgstr "按钮不起作用? 将此粘贴到浏览器的地址栏中:"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid ""
"Hello, we received a request to reset the password for the account associated with [1:%(email)s]. No changes have been made to your account yet.[2:]\n"
" You can reset your password by clicking the link below:[3:]\n"
" [4:\n"
" Reset Password\n"
" ]"
msgstr ""
msgctxt "report:web.user.email_reset_password:"
msgid "If you didn't make this request, you can ignore this email."
msgstr "如果你没有发出过此请求,就忽略此电子邮件."
msgctxt "report:web.user.email_reset_password:"
msgid "Reset Password"
msgstr "重置密码"
#, python-format
msgctxt "report:web.user.email_reset_password:"
msgid "The link will expire in [1:%(datetime)s]."
msgstr "链接过期时间: [1:%(datetime)s]。"
#, python-format
msgctxt "report:web.user.email_validation:"
msgid "%(email)s"
msgstr "%(email)s"
msgctxt "report:web.user.email_validation:"
msgid "Button is not working? Paste this into your browser:"
msgstr "按钮不起作用? 将此粘贴到浏览器的地址栏中:"
msgctxt "report:web.user.email_validation:"
msgid "Email Validation"
msgstr "电子邮件验证"
msgctxt "report:web.user.email_validation:"
msgid "If you received this email by mistake, just ignore it."
msgstr "如果误收到此电子邮件,请忽略它。"
msgctxt "report:web.user.email_validation:"
msgid "Just one more step.."
msgstr "仅一步之遥.."
msgctxt "report:web.user.email_validation:"
msgid "Validate"
msgstr "验证"

View File

@@ -0,0 +1,16 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data grouped="1">
<record model="ir.message" id="msg_user_email_unique">
<field name="text">Email of active web user must be unique.</field>
</record>
<record model="ir.message" id="msg_user_session_key_unique">
<field name="text">Web user session key must be unique.</field>
</record>
<record model="ir.message" id="msg_user_email_invalid">
<field name="text">The email address "%(email)s" for "%(user)s" is not valid.</field>
</record>
</data>
</tryton>

28
modules/web_user/party.py Normal file
View File

@@ -0,0 +1,28 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pool import Pool, PoolMeta
class Replace(metaclass=PoolMeta):
__name__ = 'party.replace'
@classmethod
def fields_to_replace(cls):
return super().fields_to_replace() + [
('web.user', 'party'),
('web.user-party.party.secondary', 'party'),
]
class Erase(metaclass=PoolMeta):
__name__ = 'party.erase'
def to_erase(self, party_id):
pool = Pool()
User = pool.get('web.user')
to_erase = super().to_erase(party_id)
to_erase.append(
(User, [('party', '=', party_id)], True,
['email'],
[None]))
return to_erase

View File

@@ -0,0 +1,2 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.

View File

@@ -0,0 +1,204 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from unittest.mock import patch
import trytond.config as config
from trytond.modules.party.tests import (
PartyCheckEraseMixin, PartyCheckReplaceMixin)
from trytond.modules.web_user import user as user_module
from trytond.pool import Pool
from trytond.tests.test_tryton import ModuleTestCase, with_transaction
VALIDATION_URL = 'http://www.example.com/validation'
RESET_PASSWORD_URL = 'http://www.example.com/reset_password'
FROM = 'tryton@example.com'
class WebUserTestCase(
PartyCheckEraseMixin, PartyCheckReplaceMixin, ModuleTestCase):
'Test Web User module'
module = 'web_user'
def setUp(self):
super().setUp()
validation_url = config.get('web', 'email_validation_url', default='')
config.set('web', 'email_validation_url', VALIDATION_URL)
self.addCleanup(
lambda: config.set('web', 'email_validation_url', validation_url))
reset_password_url = config.get(
'web', 'reset_password_url', default='')
config.set('web', 'reset_password_url', RESET_PASSWORD_URL)
self.addCleanup(lambda: config.set(
'web', 'reset_password_url', reset_password_url))
reset_from = config.get('email', 'from', default='')
config.set('email', 'from', FROM)
self.addCleanup(lambda: config.set('email', 'from', reset_from))
length = config.get('password', 'length', default='')
config.set('password', 'length', '4')
self.addCleanup(config.set, 'password', 'length', length)
entropy = config.get('password', 'entropy', default='')
config.set('password', 'entropy', '0.8')
self.addCleanup(config.set, 'password', 'entropy', entropy)
def create_user(self, email, password):
pool = Pool()
User = pool.get('web.user')
user = User(email=email)
user.password = password
user.save()
self.assertEqual(user.password, 'x' * 10)
self.assertNotEqual(user.password_hash, password)
def check_user(self, email, password):
pool = Pool()
User = pool.get('web.user')
user, = User.search([('email', '=', email)])
auth_user = User.authenticate(email, password)
self.assertEqual(auth_user, user)
bad_user = User.authenticate(email, password + 'wrong')
self.assertEqual(bad_user, None)
bad_user = User.authenticate(email + 'wrong', password)
self.assertEqual(bad_user, None)
@with_transaction()
def test_default_hash(self):
'Test default hash'
self.create_user('user@example.com', 'secret')
self.check_user('user@example.com', 'secret')
@with_transaction()
def test_session(self):
'Test session'
pool = Pool()
User = pool.get('web.user')
user = User(email='user@example.com')
user.save()
key = user.new_session()
self.assertTrue(key)
session_user = User.get_user(key)
self.assertEqual(session_user, user)
wrong_session_user = User.get_user('foo')
self.assertEqual(wrong_session_user, None)
@with_transaction()
def test_validate_email(self):
'Test email validation'
pool = Pool()
User = pool.get('web.user')
user = User(email='user@example.com')
user.save()
self.assertFalse(user.email_valid)
self.assertFalse(user.email_token)
with patch.object(
user_module, 'send_message_transactional') as send_message:
User.validate_email([user])
send_message.assert_called_once()
token = user.email_token
self.assertTrue(token)
self.assertEqual(
user.get_email_validation_url(),
'%s?token=%s' % (VALIDATION_URL, token))
self.assertFalse(
User.validate_email_url(VALIDATION_URL))
self.assertFalse(
User.validate_email_url('%s?token=12345' % VALIDATION_URL))
self.assertTrue(
User.validate_email_url(user.get_email_validation_url()))
self.assertTrue(user.email_valid)
self.assertFalse(user.email_token)
@with_transaction()
def test_reset_password(self):
'Test reset password'
pool = Pool()
User = pool.get('web.user')
user = User(email='user@example.com', email_valid=True)
user.save()
self.assertFalse(user.password_hash)
with patch.object(
user_module, 'send_message_transactional') as send_message:
User.reset_password([user])
send_message.assert_called_once()
token = user.reset_password_token
self.assertTrue(token)
self.assertTrue(user.reset_password_token_expire)
self.assertEqual(
user.get_email_reset_password_url(),
'%s?email=user%%40example.com&token=%s'
% (RESET_PASSWORD_URL, token))
self.assertFalse(
User.set_password_token('foo@example.com', '12345', 'secret'))
self.assertFalse(
User.set_password_token('user@example.com', '12345', 'secret'))
self.assertFalse(
User.set_password_token('foo@example.com', token, 'secret'))
self.assertFalse(user.password_hash)
self.assertTrue(User.set_password_url(
user.get_email_reset_password_url(), 'secret'))
self.assertTrue(user.password_hash)
self.assertFalse(user.reset_password_token)
self.assertFalse(user.reset_password_token_expire)
@with_transaction()
def test_create_format_email(self):
"Test create format email"
pool = Pool()
User = pool.get('web.user')
user = User(email='FOO@Example.com')
user.save()
self.assertEqual(user.email, 'foo@example.com')
@with_transaction()
def test_write_format_email(self):
"Test write format email"
pool = Pool()
User = pool.get('web.user')
user = User(email='foo@example.com')
user.save()
User.write([user], {'email': 'BAR@Example.com'})
self.assertEqual(user.email, 'bar@example.com')
@with_transaction()
def test_authenticate_case_insensitive(self):
"Test authenticate case insensitive"
pool = Pool()
User = pool.get('web.user')
user = User(email='foo@example.com', password='secret')
user.save()
auth_user = User.authenticate('FOO@Example.com', 'secret')
self.assertEqual(auth_user, user)
del ModuleTestCase

View File

@@ -0,0 +1,23 @@
[tryton]
version=7.8.1
depends:
ir
party
xml:
user.xml
message.xml
[register]
model:
ir.Email
ir.EmailTemplate
user.User
user.User_PartySecondary
user.UserAuthenticateAttempt
user.UserSession
wizard:
party.Replace
party.Erase
report:
user.EmailValidation
user.EmailResetPassword

489
modules/web_user/user.py Normal file
View File

@@ -0,0 +1,489 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import datetime
import logging
import random
import time
import urllib.parse
from secrets import token_hex
from sql import Literal, Null
from sql.conditionals import Coalesce
from sql.functions import CurrentTimestamp
from sql.operators import Equal
import trytond.config as config
from trytond.exceptions import RateLimitException
from trytond.i18n import gettext
from trytond.model import (
DeactivableMixin, Exclude, Index, ModelSQL, ModelView, Unique,
avatar_mixin, fields)
from trytond.pool import Pool
from trytond.pyson import Eval
from trytond.report import Report, get_email
from trytond.res.user import PASSWORD_HASH, LoginAttempt
from trytond.sendmail import send_message_transactional
from trytond.tools.email_ import (
EmailNotValidError, normalize_email, set_from_header, validate_email)
from trytond.transaction import Transaction, without_check_access
from .exceptions import UserValidationError
logger = logging.getLogger(__name__)
def _send_email(from_, users, email_func):
from_cfg = config.get('email', 'from')
for user in users:
msg, title = email_func(user)
set_from_header(msg, from_cfg, from_ or from_cfg)
msg['To'] = user.email
msg['Subject'] = title
send_message_transactional(msg)
def _add_params(url, **params):
parts = urllib.parse.urlsplit(url)
query = urllib.parse.parse_qsl(parts.query)
for key, value in sorted(params.items()):
query.append((key, value))
parts = list(parts)
parts[3] = urllib.parse.urlencode(query)
return urllib.parse.urlunsplit(parts)
def _extract_params(url):
return urllib.parse.parse_qsl(urllib.parse.urlsplit(url).query)
class User(avatar_mixin(100), DeactivableMixin, ModelSQL, ModelView):
__name__ = 'web.user'
_rec_name = 'email'
email = fields.Char(
"Email",
states={
'required': Eval('active', True),
})
email_valid = fields.Boolean('Email Valid')
email_token = fields.Char("Email Token", strip=False)
password_hash = fields.Char('Password Hash')
password = fields.Function(
fields.Char('Password'), 'get_password', setter='set_password')
reset_password_token = fields.Char("Reset Password Token", strip=False)
reset_password_token_expire = fields.Timestamp(
'Reset Password Token Expire')
party = fields.Many2One('party.party', 'Party', ondelete='RESTRICT')
secondary_parties = fields.Many2Many(
'web.user-party.party.secondary', 'user', 'party', "Secondary Parties")
@classmethod
def __setup__(cls):
super().__setup__()
table = cls.__table__()
cls._sql_constraints += [
('email_exclude',
Exclude(table, (table.email, Equal),
where=table.active == Literal(True)),
'web_user.msg_user_email_unique'),
]
cls._sql_indexes.update({
Index(
table, (table.email, Index.Equality(cardinality='high'))),
Index(
table,
(table.email_token, Index.Equality(cardinality='high')),
where=table.email_token != Null),
})
cls._buttons.update({
'validate_email': {
'readonly': Eval('email_valid', False),
'depends': ['email_valid'],
},
'reset_password': {
'readonly': ~Eval('email_valid', False),
'depends': ['email_valid'],
},
})
@classmethod
def default_email_valid(cls):
return False
def get_password(self, name):
return 'x' * 10
@classmethod
def set_password(cls, users, name, value):
pool = Pool()
User = pool.get('res.user')
if value == 'x' * 10:
return
if Transaction().user and value:
User.validate_password(value, users)
to_write = []
for user in users:
to_write.extend([[user], {
'password_hash': cls.hash_password(value),
}])
cls.write(*to_write)
@fields.depends('party', 'email')
def on_change_party(self):
if not self.email and self.party:
self.email = self.party.email
@classmethod
def copy(cls, users, default=None):
default = default.copy() if default is not None else {}
default['password_hash'] = None
default['reset_password_token'] = None
return super().copy(users, default=default)
@classmethod
def preprocess_values(cls, mode, values):
values = super().preprocess_values(mode, values)
if values.get('email'):
values['email'] = normalize_email(values['email']).lower()
return values
@classmethod
def validate_fields(cls, users, fields_names):
super().validate_fields(users, fields_names)
cls.check_valid_email(users, fields_names)
@classmethod
def check_valid_email(cls, users, fields_names=None):
if fields_names and 'email' not in fields_names:
return
for user in users:
if user.email:
try:
validate_email(user.email)
except EmailNotValidError as e:
raise UserValidationError(gettext(
'web_user.msg_user_email_invalid',
user=user.rec_name,
email=user.email),
str(e)) from e
@classmethod
def authenticate(cls, email, password):
pool = Pool()
Attempt = pool.get('web.user.authenticate.attempt')
email = email.lower()
count_ip = Attempt.count_ip()
if count_ip > config.getint(
'session', 'max_attempt_ip_network', default=300):
# Do not add attempt as the goal is to prevent flooding
raise RateLimitException()
count = Attempt.count(email)
if count > config.getint('session', 'max_attempt', default=5):
Attempt.add(email)
raise RateLimitException()
# Prevent brute force attack
Transaction().atexit(time.sleep, 2 ** count - 1)
users = cls.search([('email', '=', email)])
if users:
user, = users
valid, new_hash = cls.check_password(password, user.password_hash)
if valid:
if new_hash:
logger.info("Update password hash for %s", user.id)
with Transaction().new_transaction():
with without_check_access():
cls.write([cls(user.id)], {
'password_hash': new_hash,
})
Attempt.remove(email)
return user
Attempt.add(email)
@classmethod
def hash_password(cls, password):
'''Hash given password in the form
<hash_method>$<password>$<salt>...'''
if not password:
return None
return PASSWORD_HASH.hash(password)
@classmethod
def check_password(cls, password, hash_):
return PASSWORD_HASH.verify_and_update(password, hash_)
def new_session(self):
pool = Pool()
Session = pool.get('web.user.session')
return Session.add(self)
@classmethod
def get_user(cls, session):
pool = Pool()
Session = pool.get('web.user.session')
return Session.get_user(session)
@classmethod
@ModelView.button
def validate_email(cls, users, from_=None):
for user in users:
user.set_email_token()
cls.save(users)
_send_email(from_, users, cls.get_email_validation)
def set_email_token(self, nbytes=None):
self.email_token = token_hex(nbytes)
def get_email_validation(self):
return get_email(
'web.user.email_validation', self, self.languages)
def get_email_validation_url(self, url=None):
if url is None:
url = config.get('web', 'email_validation_url')
if url is not None:
return _add_params(url, token=self.email_token)
else:
return ''
@classmethod
def validate_email_url(cls, url):
parts = urllib.parse.urlsplit(url)
tokens = filter(
None, urllib.parse.parse_qs(parts.query).get('token', [None]))
return cls.validate_email_token(list(tokens))
@classmethod
def validate_email_token(cls, tokens):
users = cls.search([
('email_token', 'in', tokens),
])
cls.write(users, {
'email_valid': True,
'email_token': None,
})
return users
@classmethod
@ModelView.button
def reset_password(cls, users, from_=None):
now = datetime.datetime.now()
# Prevent abusive reset
def reset(user):
return not (user.reset_password_token_expire
and user.reset_password_token_expire > now)
users = list(filter(reset, users))
for user in users:
user.set_reset_password_token()
cls.save(users)
_send_email(from_, users, cls.get_email_reset_password)
def set_reset_password_token(self, nbytes=None):
self.reset_password_token = token_hex(nbytes)
self.reset_password_token_expire = (
datetime.datetime.now() + datetime.timedelta(
seconds=config.getint(
'session', 'web_timeout_reset', default=24 * 60 * 60)))
def clear_reset_password_token(self):
self.reset_password_token = None
self.reset_password_token_expire = None
def get_email_reset_password(self):
return get_email(
'web.user.email_reset_password', self, self.languages)
def get_email_reset_password_url(self, url=None):
if url is None:
url = config.get('web', 'reset_password_url')
if url is not None:
return _add_params(
url, token=self.reset_password_token, email=self.email)
else:
return ''
@classmethod
def set_password_url(cls, url, password):
parts = urllib.parse.urlsplit(url)
query = urllib.parse.parse_qs(parts.query)
email = query.get('email', [None])[0]
token = query.get('token', [None])[0]
return cls.set_password_token(email, token, password)
@classmethod
def set_password_token(cls, email, token, password):
pool = Pool()
Attempt = pool.get('web.user.authenticate.attempt')
email = email.lower()
# Prevent brute force attack
Transaction().atexit(
time.sleep, random.randint(0, 2 ** Attempt.count(email) - 1))
users = cls.search([
('email', '=', email),
])
if users:
user, = users
if user.reset_password_token == token:
now = datetime.datetime.now()
expire = user.reset_password_token_expire
user.clear_reset_password_token()
if expire > now:
user.password = password
user.save()
Attempt.remove(email)
return True
Attempt.add(email)
return False
@property
def languages(self):
pool = Pool()
Language = pool.get('ir.lang')
if self.party and self.party.lang:
languages = [self.party.lang]
else:
languages = Language.search([
('code', '=', Transaction().language),
])
return languages
class User_PartySecondary(ModelSQL):
__name__ = 'web.user-party.party.secondary'
user = fields.Many2One(
'web.user', "User", required=True, ondelete='CASCADE')
party = fields.Many2One(
'party.party', "Party", required=True, ondelete='CASCADE')
class UserAuthenticateAttempt(LoginAttempt):
__name__ = 'web.user.authenticate.attempt'
_table = None # Needed to reset LoginAttempt._table
class UserSession(ModelSQL):
__name__ = 'web.user.session'
_rec_name = 'key'
key = fields.Char("Key", required=True, strip=False)
user = fields.Many2One(
'web.user', "User", required=True, ondelete='CASCADE')
@classmethod
def __setup__(cls):
super().__setup__()
table = cls.__table__()
cls.__rpc__ = {}
cls._sql_constraints += [
('key_unique', Unique(table, table.key),
'web_user.msg_user_session_key_unique'),
]
cls._sql_indexes.update({
Index(
table,
(Coalesce(table.write_date, table.create_date),
Index.Range())),
Index(table, (table.key, Index.Equality(cardinality='high'))),
})
@classmethod
def default_key(cls, nbytes=None):
return token_hex(nbytes)
@classmethod
def add(cls, user):
cursor = Transaction().connection.cursor()
table = cls.__table__()
cursor.execute(*table.delete(
where=(
Coalesce(table.write_date, table.create_date)
< CurrentTimestamp() - cls.timeout())))
session = cls(user=user)
session.save()
return session.key
@classmethod
def remove(cls, key):
sessions = cls.search([
('key', '=', key),
])
cls.delete(sessions)
@classmethod
def get_user(cls, session):
transaction = Transaction()
sessions = cls.search([
('key', '=', session),
])
if not sessions:
return
session, = sessions
if not session.expired:
return session.user
elif not transaction.readonly:
cls.delete([session])
@classmethod
def timeout(cls):
return datetime.timedelta(seconds=config.getint(
'session', 'web_timeout', default=30 * 24 * 60 * 60))
@property
def expired(self):
now = datetime.datetime.now()
timestamp = self.write_date or self.create_date
return abs(timestamp - now) > self.timeout()
@classmethod
def reset(cls, session):
sessions = cls.search([
('key', '=', session),
])
cls.write(sessions, {})
@classmethod
def preprocess_values(cls, mode, values):
values = super().preprocess_values(mode, values)
if mode == 'create':
# Ensure to get a different key for each record
# default methods are called only once
values.setdefault('key', cls.default_key())
return values
class EmailValidation(Report):
__name__ = 'web.user.email_validation'
@classmethod
def get_context(cls, records, header, data):
context = super().get_context(records, header, data)
context['extract_params'] = _extract_params
return context
class EmailResetPassword(Report):
__name__ = 'web.user.email_reset_password'
@classmethod
def get_context(cls, records, header, data):
context = super().get_context(records, header, data)
context['extract_params'] = _extract_params
expire_delay = (
records[0].reset_password_token_expire - datetime.datetime.now())
# Use a precision of minutes
expire_delay = datetime.timedelta(
days=expire_delay.days,
minutes=round(expire_delay.seconds / 60))
context['expire_delay'] = expire_delay
return context

115
modules/web_user/user.xml Normal file
View File

@@ -0,0 +1,115 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.ui.view" id="user_view_form">
<field name="model">web.user</field>
<field name="type">form</field>
<field name="name">user_form</field>
</record>
<record model="ir.ui.view" id="user_view_list">
<field name="model">web.user</field>
<field name="type">tree</field>
<field name="name">user_list</field>
</record>
<record model="ir.action.act_window" id="act_user_form">
<field name="name">Web Users</field>
<field name="res_model">web.user</field>
</record>
<record model="ir.action.act_window.view" id="act_user_form_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="user_view_list"/>
<field name="act_window" ref="act_user_form"/>
</record>
<record model="ir.action.act_window.view" id="act_user_form_view2">
<field name="sequence" eval="20"/>
<field name="view" ref="user_view_form"/>
<field name="act_window" ref="act_user_form"/>
</record>
<menuitem
parent="res.menu_res"
action="act_user_form"
sequence="50"
id="menu_user_form"/>
<record model="ir.action.act_window" id="act_user_form_party">
<field name="name">Web Users</field>
<field name="res_model">web.user</field>
<field
name="domain"
eval="['OR', ('party', 'in', Eval('active_ids', [])), ('secondary_parties', 'in', Eval('active_ids', []))]"
pyson="1"/>
</record>
<record model="ir.action.act_window.view" id="act_user_form_party_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="user_view_list"/>
<field name="act_window" ref="act_user_form_party"/>
</record>
<record model="ir.action.act_window.view" id="act_user_form_party_view2">
<field name="sequence" eval="20"/>
<field name="view" ref="user_view_form"/>
<field name="act_window" ref="act_user_form_party"/>
</record>
<record model="ir.action.keyword" id="act_user_form_party_keyword1">
<field name="keyword">form_relate</field>
<field name="model">party.party,-1</field>
<field name="action" ref="act_user_form_party"/>
</record>
<record model="ir.model.access" id="access_user">
<field name="model">web.user</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_user_admin">
<field name="model">web.user</field>
<field name="group" ref="res.group_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_user_party_admin">
<field name="model">web.user</field>
<field name="group" ref="party.group_party_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.button" id="user_validate_email_button">
<field name="model">web.user</field>
<field name="name">validate_email</field>
<field name="string">Validate Email</field>
</record>
<record model="ir.model.button" id="user_reset_password_button">
<field name="model">web.user</field>
<field name="name">reset_password</field>
<field name="string">Reset Password</field>
</record>
<record model="ir.action.report" id="report_email_validation">
<field name="name">Email Validation</field>
<field name="model">web.user</field>
<field name="report_name">web.user.email_validation</field>
<field name="report">web_user/email_validation.html</field>
<field name="template_extension">html</field>
</record>
<record model="ir.action.report" id="report_email_reset_password">
<field name="name">Reset Password</field>
<field name="model">web.user</field>
<field name="report_name">web.user.email_reset_password</field>
<field name="report">web_user/email_reset_password.html</field>
<field name="template_extension">html</field>
</record>
</data>
</tryton>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<form>
<group col="4" colspan="3" yalign="0" id="header">
<label name="party"/>
<field name="party"/>
<label name="active"/>
<field name="active"/>
<label name="email"/>
<field name="email" widget="email"/>
<newline/>
<label name="password"/>
<field name="password" widget="password"/>
<button name="reset_password" colspan="2"/>
<label name="email_valid"/>
<field name="email_valid"/>
<button name="validate_email" colspan="2"/>
</group>
<field name="avatar" widget="image" height="100" width="100" xexpand="0" border="circle"/>
<field name="secondary_parties" colspan="4"/>
</form>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tree>
<field name="email" expand="1">
<prefix id="avatar" icon="avatar_url" icon_type="url" url_size="s" border="circle"/>
</field>
<field name="email_valid"/>
<field name="party" expand="2"/>
<button name="validate_email" multiple="1"/>
<button name="reset_password" multiple="1"/>
</tree>